diff --git a/adaptive_app/codelab_rebuild.yaml b/adaptive_app/codelab_rebuild.yaml index 272d927869..19847353f5 100644 --- a/adaptive_app/codelab_rebuild.yaml +++ b/adaptive_app/codelab_rebuild.yaml @@ -93,7 +93,8 @@ steps: _fillTableRow( context: context, property: 'Window Size', - value: '${mediaQuery.size.width.toStringAsFixed(1)} x ' + value: + '${mediaQuery.size.width.toStringAsFixed(1)} x ' '${mediaQuery.size.height.toStringAsFixed(1)}', ), _fillTableRow( @@ -120,10 +121,11 @@ steps: ); } - TableRow _fillTableRow( - {required BuildContext context, - required String property, - required String value}) { + TableRow _fillTableRow({ + required BuildContext context, + required String property, + required String value, + }) { return TableRow( children: [ TableCell( @@ -268,24 +270,24 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:io'; - + import 'package:flex_color_scheme/flex_color_scheme.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; - + import 'src/app_state.dart'; import 'src/playlist_details.dart'; import 'src/playlists.dart'; - + // From https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw const flutterDevAccountId = 'UCwXdFgeE9KYzlDdR7TG9cMw'; - + // TODO: Replace with your YouTube API Key const youTubeApiKey = 'AIzaNotAnApiKey'; - + final _router = GoRouter( routes: [ GoRoute( @@ -299,45 +301,41 @@ steps: builder: (context, state) { final title = state.uri.queryParameters['title']!; final id = state.pathParameters['id']!; - return PlaylistDetails( - playlistId: id, - playlistName: title, - ); + return PlaylistDetails(playlistId: id, playlistName: title); }, ), ], ), ], ); - + void main() { if (youTubeApiKey == 'AIzaNotAnApiKey') { print('youTubeApiKey has not been configured.'); exit(1); } - - runApp(ChangeNotifierProvider( - create: (context) => FlutterDevPlaylists( - flutterDevAccountId: flutterDevAccountId, - youTubeApiKey: youTubeApiKey, + + runApp( + ChangeNotifierProvider( + create: + (context) => FlutterDevPlaylists( + flutterDevAccountId: flutterDevAccountId, + youTubeApiKey: youTubeApiKey, + ), + child: const PlaylistsApp(), ), - child: const PlaylistsApp(), - )); + ); } - + class PlaylistsApp extends StatelessWidget { const PlaylistsApp({super.key}); - + @override Widget build(BuildContext context) { return MaterialApp.router( title: 'FlutterDev Playlists', - theme: FlexColorScheme.light( - scheme: FlexScheme.red, - ).toTheme, - darkTheme: FlexColorScheme.dark( - scheme: FlexScheme.red, - ).toTheme, + theme: FlexColorScheme.light(scheme: FlexScheme.red).toTheme, + darkTheme: FlexColorScheme.dark(scheme: FlexScheme.red).toTheme, themeMode: ThemeMode.dark, // Or ThemeMode.System if you'd prefer debugShowCheckedModeBanner: false, routerConfig: _router, @@ -353,7 +351,7 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:collection'; import 'package:flutter/foundation.dart'; @@ -365,12 +363,7 @@ steps: required String flutterDevAccountId, required String youTubeApiKey, }) : _flutterDevAccountId = flutterDevAccountId { - _api = YouTubeApi( - _ApiKeyClient( - client: http.Client(), - key: youTubeApiKey, - ), - ); + _api = YouTubeApi(_ApiKeyClient(client: http.Client(), key: youTubeApiKey)); _loadPlaylists(); } @@ -386,9 +379,11 @@ steps: pageToken: nextPageToken, ); _playlists.addAll(response.items!); - _playlists.sort((a, b) => a.snippet!.title! - .toLowerCase() - .compareTo(b.snippet!.title!.toLowerCase())); + _playlists.sort( + (a, b) => a.snippet!.title!.toLowerCase().compareTo( + b.snippet!.title!.toLowerCase(), + ), + ); notifyListeners(); nextPageToken = response.nextPageToken; } while (nextPageToken != null); @@ -436,10 +431,12 @@ steps: @override Future send(http.BaseRequest request) { - final url = request.url.replace(queryParameters: >{ - ...request.url.queryParametersAll, - 'key': [key] - }); + final url = request.url.replace( + queryParameters: >{ + ...request.url.queryParametersAll, + 'key': [key], + }, + ); return client.send(http.Request(request.method, url)); } @@ -450,44 +447,45 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:googleapis/youtube/v3.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/link.dart'; - + import 'app_state.dart'; - + class PlaylistDetails extends StatelessWidget { - const PlaylistDetails( - {required this.playlistId, required this.playlistName, super.key}); + const PlaylistDetails({ + required this.playlistId, + required this.playlistName, + super.key, + }); final String playlistId; final String playlistName; - + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: Text(playlistName), - ), + appBar: AppBar(title: Text(playlistName)), body: Consumer( builder: (context, playlists, _) { final playlistItems = playlists.playlistItems(playlistId: playlistId); if (playlistItems.isEmpty) { return const Center(child: CircularProgressIndicator()); } - + return _PlaylistDetailsListView(playlistItems: playlistItems); }, ), ); } } - + class _PlaylistDetailsListView extends StatelessWidget { const _PlaylistDetailsListView({required this.playlistItems}); final List playlistItems; - + @override Widget build(BuildContext context) { return ListView.builder( @@ -513,16 +511,13 @@ steps: }, ); } - + Widget _buildGradient(BuildContext context) { return Positioned.fill( child: DecoratedBox( decoration: BoxDecoration( gradient: LinearGradient( - colors: [ - Colors.transparent, - Theme.of(context).colorScheme.surface, - ], + colors: [Colors.transparent, Theme.of(context).colorScheme.surface], begin: Alignment.topCenter, end: Alignment.bottomCenter, stops: const [0.5, 0.95], @@ -531,9 +526,11 @@ steps: ), ); } - + Widget _buildTitleAndSubtitle( - BuildContext context, PlaylistItem playlistItem) { + BuildContext context, + PlaylistItem playlistItem, + ) { return Positioned( left: 20, right: 0, @@ -545,22 +542,22 @@ steps: Text( playlistItem.snippet!.title!, style: Theme.of(context).textTheme.bodyLarge!.copyWith( - fontSize: 18, - // fontWeight: FontWeight.bold, - ), + fontSize: 18, + // fontWeight: FontWeight.bold, + ), ), if (playlistItem.snippet!.videoOwnerChannelTitle != null) Text( playlistItem.snippet!.videoOwnerChannelTitle!, - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - fontSize: 12, - ), + style: Theme.of( + context, + ).textTheme.bodyMedium!.copyWith(fontSize: 12), ), ], ), ); } - + Widget _buildPlayButton(BuildContext context, PlaylistItem playlistItem) { return Stack( alignment: AlignmentDirectional.center, @@ -570,20 +567,20 @@ steps: height: 42, decoration: const BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.all( - Radius.circular(21), - ), + borderRadius: BorderRadius.all(Radius.circular(21)), ), ), Link( uri: Uri.parse( - 'https://www.youtube.com/watch?v=${playlistItem.snippet!.resourceId!.videoId}'), - builder: (context, followLink) => IconButton( - onPressed: followLink, - color: Colors.red, - icon: const Icon(Icons.play_circle_fill), - iconSize: 45, + 'https://www.youtube.com/watch?v=${playlistItem.snippet!.resourceId!.videoId}', ), + builder: + (context, followLink) => IconButton( + onPressed: followLink, + color: Colors.red, + icon: const Icon(Icons.play_circle_fill), + iconSize: 45, + ), ), ], ); @@ -595,44 +592,40 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:googleapis/youtube/v3.dart'; import 'package:provider/provider.dart'; - + import 'app_state.dart'; - + class Playlists extends StatelessWidget { const Playlists({super.key}); - + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('FlutterDev Playlists'), - ), + appBar: AppBar(title: const Text('FlutterDev Playlists')), body: Consumer( builder: (context, flutterDev, child) { final playlists = flutterDev.playlists; if (playlists.isEmpty) { - return const Center( - child: CircularProgressIndicator(), - ); + return const Center(child: CircularProgressIndicator()); } - + return _PlaylistsListView(items: playlists); }, ), ); } } - + class _PlaylistsListView extends StatelessWidget { const _PlaylistsListView({required this.items}); - + final List items; - + @override Widget build(BuildContext context) { return ListView.builder( @@ -646,15 +639,13 @@ steps: playlist.snippet!.thumbnails!.default_!.url!, ), title: Text(playlist.snippet!.title!), - subtitle: Text( - playlist.snippet!.description!, - ), + subtitle: Text(playlist.snippet!.description!), onTap: () { context.go( Uri( path: '/playlist/${playlist.id}', queryParameters: { - 'title': playlist.snippet!.title! + 'title': playlist.snippet!.title!, }, ).toString(), ); @@ -765,28 +756,24 @@ steps: }, routes: [ GoRoute( - @@ -32,9 +32,12 @@ final _router = GoRouter( + @@ -32,7 +32,10 @@ final _router = GoRouter( builder: (context, state) { final title = state.uri.queryParameters['title']!; final id = state.pathParameters['id']!; - - return PlaylistDetails( - - playlistId: id, - - playlistName: title, + - return PlaylistDetails(playlistId: id, playlistName: title); + return Scaffold( + appBar: AppBar(title: Text(title)), - + body: PlaylistDetails( - + playlistId: id, - + playlistName: title, - + ), - ); + + body: PlaylistDetails(playlistId: id, playlistName: title), + + ); }, ), + ], - name: Patch lib/src/playlists.dart path: adaptive_app/lib/src/playlists.dart patch-u: | --- b/adaptive_app/step_05/lib/src/playlists.dart +++ a/adaptive_app/step_05/lib/src/playlists.dart - @@ -3,48 +3,73 @@ + @@ -3,44 +3,71 @@ // found in the LICENSE file. import 'package:flutter/material.dart'; @@ -805,24 +792,18 @@ steps: @override Widget build(BuildContext context) { - return Scaffold( - - appBar: AppBar( - - title: const Text('FlutterDev Playlists'), - - ), + - appBar: AppBar(title: const Text('FlutterDev Playlists')), - body: Consumer( - builder: (context, flutterDev, child) { - final playlists = flutterDev.playlists; - if (playlists.isEmpty) { - - return const Center( - - child: CircularProgressIndicator(), - - ); + - return const Center(child: CircularProgressIndicator()); - } + return Consumer( + builder: (context, flutterDev, child) { + final playlists = flutterDev.playlists; + if (playlists.isEmpty) { - + return const Center( - + child: CircularProgressIndicator(), - + ); + + return const Center(child: CircularProgressIndicator()); + } - return _PlaylistsListView(items: playlists); @@ -881,15 +862,15 @@ steps: return Padding( padding: const EdgeInsets.all(8.0), child: ListTile( - @@ -56,14 +81,7 @@ class _PlaylistsListView extends StatelessWidget { - playlist.snippet!.description!, - ), + @@ -50,14 +77,7 @@ class _PlaylistsListView extends StatelessWidget { + title: Text(playlist.snippet!.title!), + subtitle: Text(playlist.snippet!.description!), onTap: () { - context.go( - Uri( - path: '/playlist/${playlist.id}', - queryParameters: { - - 'title': playlist.snippet!.title! + - 'title': playlist.snippet!.title!, - }, - ).toString(), - ); @@ -902,14 +883,12 @@ steps: patch-u: | --- b/adaptive_app/step_05/lib/src/playlist_details.dart +++ a/adaptive_app/step_05/lib/src/playlist_details.dart - @@ -17,34 +17,50 @@ class PlaylistDetails extends StatelessWidget { + @@ -20,32 +20,50 @@ class PlaylistDetails extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( - - appBar: AppBar( - - title: Text(playlistName), - - ), + - appBar: AppBar(title: Text(playlistName)), - body: Consumer( - builder: (context, playlists, _) { - final playlistItems = playlists.playlistItems(playlistId: playlistId); @@ -975,23 +954,23 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:googleapis/youtube/v3.dart'; import 'package:split_view/split_view.dart'; - + import 'playlist_details.dart'; import 'playlists.dart'; - + class AdaptivePlaylists extends StatelessWidget { const AdaptivePlaylists({super.key}); - + @override Widget build(BuildContext context) { final screenWidth = MediaQuery.of(context).size.width; final targetPlatform = Theme.of(context).platform; - + if (targetPlatform == TargetPlatform.android || targetPlatform == TargetPlatform.iOS || screenWidth <= 600) { @@ -1001,10 +980,10 @@ steps: } } } - + class NarrowDisplayPlaylists extends StatelessWidget { const NarrowDisplayPlaylists({super.key}); - + @override Widget build(BuildContext context) { return Scaffold( @@ -1015,7 +994,7 @@ steps: Uri( path: '/playlist/${playlist.id}', queryParameters: { - 'title': playlist.snippet!.title! + 'title': playlist.snippet!.title!, }, ).toString(), ); @@ -1024,14 +1003,14 @@ steps: ); } } - + class WideDisplayPlaylists extends StatefulWidget { const WideDisplayPlaylists({super.key}); - + @override State createState() => _WideDisplayPlaylistsState(); } - + class _WideDisplayPlaylistsState extends State { Playlist? selectedPlaylist; @override @@ -1046,14 +1025,18 @@ steps: body: SplitView( viewMode: SplitViewMode.Horizontal, children: [ - Playlists(playlistSelected: (playlist) { - setState(() { - selectedPlaylist = playlist; - }); - }), + Playlists( + playlistSelected: (playlist) { + setState(() { + selectedPlaylist = playlist; + }); + }, + ), switch ((selectedPlaylist?.id, selectedPlaylist?.snippet?.title)) { - (String id, String title) => - PlaylistDetails(playlistId: id, playlistName: title), + (String id, String title) => PlaylistDetails( + playlistId: id, + playlistName: title, + ), _ => const Center(child: Text('Select a playlist')), }, ], @@ -1092,7 +1075,6 @@ steps: +description: A YouTube CORS Proxy Server. version: 1.0.0 -# repository: https://github.com/my_org/my_repo - - name: Remove yt_cors_proxy/CHANGELOG.md path: adaptive_app/yt_cors_proxy rm: CHANGELOG.md @@ -1165,17 +1147,18 @@ steps: import 'app_state.dart'; class PlaylistDetails extends StatelessWidget { - @@ -69,7 +71,8 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { + @@ -72,7 +74,9 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { alignment: Alignment.center, children: [ if (playlistItem.snippet!.thumbnails!.high != null) - Image.network(playlistItem.snippet!.thumbnails!.high!.url!), + AdaptiveImage.network( - + playlistItem.snippet!.thumbnails!.high!.url!), + + playlistItem.snippet!.thumbnails!.high!.url!, + + ), _buildGradient(context), _buildTitleAndSubtitle(context, playlistItem), _buildPlayButton(context, playlistItem), - @@ -109,7 +112,7 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { + @@ -111,7 +115,7 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -1183,16 +1166,16 @@ steps: + AdaptiveText( playlistItem.snippet!.title!, style: Theme.of(context).textTheme.bodyLarge!.copyWith( - fontSize: 18, - @@ -117,7 +120,7 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { - ), + fontSize: 18, + @@ -119,7 +123,7 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { + ), ), if (playlistItem.snippet!.videoOwnerChannelTitle != null) - Text( + AdaptiveText( playlistItem.snippet!.videoOwnerChannelTitle!, - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - fontSize: 12, + style: Theme.of( + context, - name: Patch playlists.dart path: adaptive_app/lib/src/playlists.dart patch-u: | @@ -1206,7 +1189,7 @@ steps: import 'app_state.dart'; class Playlists extends StatelessWidget { - @@ -73,7 +74,7 @@ class _PlaylistsListViewState extends State<_PlaylistsListView> { + @@ -71,7 +72,7 @@ class _PlaylistsListViewState extends State<_PlaylistsListView> { return Padding( padding: const EdgeInsets.all(8.0), child: ListTile( @@ -1221,16 +1204,17 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class AdaptiveImage extends StatelessWidget { AdaptiveImage.network(String url, {super.key}) { if (kIsWeb) { - _url = Uri.parse(url) - .replace(host: 'localhost', port: 8080, scheme: 'http') - .toString(); + _url = + Uri.parse( + url, + ).replace(host: 'localhost', port: 8080, scheme: 'http').toString(); } else { _url = url; } @@ -1249,7 +1233,7 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; class AdaptiveText extends StatelessWidget { @@ -1261,7 +1245,7 @@ steps: Widget build(BuildContext context) { return switch (Theme.of(context).platform) { TargetPlatform.android || TargetPlatform.iOS => Text(data, style: style), - _ => SelectableText(data, style: style) + _ => SelectableText(data, style: style), }; } } @@ -1314,9 +1298,9 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:io' show Platform; - + import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -1325,13 +1309,12 @@ steps: import 'package:googleapis_auth/auth_io.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/link.dart'; - + import 'app_state.dart'; - - typedef _AdaptiveLoginButtonWidget = Widget Function({ - required VoidCallback? onPressed, - }); - + + typedef _AdaptiveLoginButtonWidget = + Widget Function({required VoidCallback? onPressed}); + class AdaptiveLogin extends StatelessWidget { const AdaptiveLogin({ super.key, @@ -1339,18 +1322,15 @@ steps: required this.scopes, required this.loginButtonChild, }); - + final ClientId clientId; final List scopes; final Widget loginButtonChild; - + @override Widget build(BuildContext context) { if (kIsWeb || Platform.isAndroid || Platform.isIOS) { - return _GoogleSignInLogin( - button: _loginButton, - scopes: scopes, - ); + return _GoogleSignInLogin(button: _loginButton, scopes: scopes); } else { return _GoogleApisAuthLogin( button: _loginButton, @@ -1359,33 +1339,26 @@ steps: ); } } - - Widget _loginButton({required VoidCallback? onPressed}) => ElevatedButton( - onPressed: onPressed, - child: loginButtonChild, - ); + + Widget _loginButton({required VoidCallback? onPressed}) => + ElevatedButton(onPressed: onPressed, child: loginButtonChild); } - + class _GoogleSignInLogin extends StatefulWidget { - const _GoogleSignInLogin({ - required this.button, - required this.scopes, - }); - + const _GoogleSignInLogin({required this.button, required this.scopes}); + final _AdaptiveLoginButtonWidget button; final List scopes; - + @override State<_GoogleSignInLogin> createState() => _GoogleSignInLoginState(); } - + class _GoogleSignInLoginState extends State<_GoogleSignInLogin> { @override initState() { super.initState(); - _googleSignIn = GoogleSignIn( - scopes: widget.scopes, - ); + _googleSignIn = GoogleSignIn(scopes: widget.scopes); _googleSignIn.onCurrentUserChanged.listen((account) { if (account != null) { _googleSignIn.authenticatedClient().then((authClient) { @@ -1398,36 +1371,38 @@ steps: } }); } - + late final GoogleSignIn _googleSignIn; - + @override Widget build(BuildContext context) { return Scaffold( body: Center( - child: widget.button(onPressed: () { - _googleSignIn.signIn(); - }), + child: widget.button( + onPressed: () { + _googleSignIn.signIn(); + }, + ), ), ); } } - + class _GoogleApisAuthLogin extends StatefulWidget { const _GoogleApisAuthLogin({ required this.button, required this.scopes, required this.clientId, }); - + final _AdaptiveLoginButtonWidget button; final List scopes; final ClientId clientId; - + @override State<_GoogleApisAuthLogin> createState() => _GoogleApisAuthLoginState(); } - + class _GoogleApisAuthLoginState extends State<_GoogleApisAuthLogin> { @override initState() { @@ -1444,9 +1419,9 @@ steps: } }); } - + Uri? _authUrl; - + @override Widget build(BuildContext context) { final authUrl = _authUrl; @@ -1455,18 +1430,14 @@ steps: body: Center( child: Link( uri: authUrl, - builder: (context, followLink) => - widget.button(onPressed: followLink), + builder: + (context, followLink) => widget.button(onPressed: followLink), ), ), ); } - - return const Scaffold( - body: Center( - child: CircularProgressIndicator(), - ), - ); + + return const Scaffold(body: Center(child: CircularProgressIndicator())); } } - name: Patch Info.plist @@ -1498,7 +1469,7 @@ steps: patch-u: | --- b/adaptive_app/step_07/lib/main.dart +++ a/adaptive_app/step_07/lib/main.dart - @@ -2,22 +2,27 @@ + @@ -2,22 +2,25 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -1518,9 +1489,7 @@ steps: -// From https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw -const flutterDevAccountId = 'UCwXdFgeE9KYzlDdR7TG9cMw'; +// From https://developers.google.com/youtube/v3/guides/auth/installed-apps#identify-access-scopes - +final scopes = [ - + 'https://www.googleapis.com/auth/youtube.readonly', - +]; + +final scopes = ['https://www.googleapis.com/auth/youtube.readonly']; -// TODO: Replace with your YouTube API Key -const youTubeApiKey = 'AIzaNotAnApiKey'; @@ -1532,7 +1501,7 @@ steps: final _router = GoRouter( routes: [ - @@ -26,7 +31,24 @@ final _router = GoRouter( + @@ -26,7 +29,24 @@ final _router = GoRouter( builder: (context, state) { return const AdaptivePlaylists(); }, @@ -1557,7 +1526,7 @@ steps: GoRoute( path: 'playlist/:id', builder: (context, state) { - @@ -47,16 +69,8 @@ final _router = GoRouter( + @@ -44,18 +64,9 @@ final _router = GoRouter( ); void main() { @@ -1566,25 +1535,27 @@ steps: - exit(1); - } - - - runApp(ChangeNotifierProvider( - - create: (context) => FlutterDevPlaylists( - - flutterDevAccountId: flutterDevAccountId, - - youTubeApiKey: youTubeApiKey, - - ), - + runApp(ChangeNotifierProvider( - + create: (context) => AuthedUserPlaylists(), - child: const PlaylistsApp(), - )); - } - @@ -67,7 +81,7 @@ class PlaylistsApp extends StatelessWidget { + runApp( + - ChangeNotifierProvider( + - create: + - (context) => FlutterDevPlaylists( + - flutterDevAccountId: flutterDevAccountId, + - youTubeApiKey: youTubeApiKey, + - ), + + ChangeNotifierProvider( + + create: (context) => AuthedUserPlaylists(), + child: const PlaylistsApp(), + ), + ); + @@ -67,7 +78,7 @@ class PlaylistsApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp.router( - title: 'FlutterDev Playlists', + title: 'Your Playlists', - theme: FlexColorScheme.light( - scheme: FlexScheme.red, - ).toTheme, + theme: FlexColorScheme.light(scheme: FlexScheme.red).toTheme, + darkTheme: FlexColorScheme.dark(scheme: FlexScheme.red).toTheme, + themeMode: ThemeMode.dark, // Or ThemeMode.System if you'd prefer - name: Patch lib/src/adaptive_playlists.dart path: adaptive_app/lib/src/adaptive_playlists.dart patch-u: | @@ -1615,7 +1586,7 @@ steps: patch-u: | --- b/adaptive_app/step_07/lib/src/app_state.dart +++ a/adaptive_app/step_07/lib/src/app_state.dart - @@ -8,28 +8,22 @@ import 'package:flutter/foundation.dart'; + @@ -8,23 +8,22 @@ import 'package:flutter/foundation.dart'; import 'package:googleapis/youtube/v3.dart'; import 'package:http/http.dart' as http; @@ -1624,12 +1595,7 @@ steps: - required String flutterDevAccountId, - required String youTubeApiKey, - }) : _flutterDevAccountId = flutterDevAccountId { - - _api = YouTubeApi( - - _ApiKeyClient( - - client: http.Client(), - - key: youTubeApiKey, - - ), - - ); + - _api = YouTubeApi(_ApiKeyClient(client: http.Client(), key: youTubeApiKey)); +class AuthedUserPlaylists extends ChangeNotifier { + set authClient(http.Client client) { + _api = YouTubeApi(client); @@ -1651,7 +1617,7 @@ steps: maxResults: 50, pageToken: nextPageToken, ); - @@ -42,8 +36,7 @@ class FlutterDevPlaylists extends ChangeNotifier { + @@ -39,8 +38,7 @@ class FlutterDevPlaylists extends ChangeNotifier { } while (nextPageToken != null); } @@ -1661,7 +1627,7 @@ steps: final List _playlists = []; List get playlists => UnmodifiableListView(_playlists); - @@ -60,7 +53,7 @@ class FlutterDevPlaylists extends ChangeNotifier { + @@ -57,7 +55,7 @@ class FlutterDevPlaylists extends ChangeNotifier { Future _retrievePlaylist(String playlistId) async { String? nextPageToken; do { @@ -1670,7 +1636,7 @@ steps: ['snippet', 'contentDetails'], playlistId: playlistId, maxResults: 25, - @@ -75,20 +68,3 @@ class FlutterDevPlaylists extends ChangeNotifier { + @@ -72,22 +70,3 @@ class FlutterDevPlaylists extends ChangeNotifier { } while (nextPageToken != null); } } @@ -1683,10 +1649,12 @@ steps: - - @override - Future send(http.BaseRequest request) { - - final url = request.url.replace(queryParameters: >{ - - ...request.url.queryParametersAll, - - 'key': [key] - - }); + - final url = request.url.replace( + - queryParameters: >{ + - ...request.url.queryParametersAll, + - 'key': [key], + - }, + - ); - - return client.send(http.Request(request.method, url)); - } @@ -1696,7 +1664,7 @@ steps: patch-u: | --- b/adaptive_app/step_07/lib/src/playlist_details.dart +++ a/adaptive_app/step_07/lib/src/playlist_details.dart - @@ -19,7 +19,7 @@ class PlaylistDetails extends StatelessWidget { + @@ -22,7 +22,7 @@ class PlaylistDetails extends StatelessWidget { @override Widget build(BuildContext context) { diff --git a/adaptive_app/step_03/android/.gitignore b/adaptive_app/step_03/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/adaptive_app/step_03/android/.gitignore +++ b/adaptive_app/step_03/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/adaptive_app/step_03/android/app/build.gradle b/adaptive_app/step_03/android/app/build.gradle deleted file mode 100644 index 8853b72ac2..0000000000 --- a/adaptive_app/step_03/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.adaptive_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.adaptive_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/adaptive_app/step_03/android/app/build.gradle.kts b/adaptive_app/step_03/android/app/build.gradle.kts new file mode 100644 index 0000000000..d9e5650b42 --- /dev/null +++ b/adaptive_app/step_03/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.adaptive_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.adaptive_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/adaptive_app/step_03/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt b/adaptive_app/step_03/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt index 2fd5d1107d..eff7feefc3 100644 --- a/adaptive_app/step_03/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt +++ b/adaptive_app/step_03/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.adaptive_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/adaptive_app/step_03/android/build.gradle b/adaptive_app/step_03/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/adaptive_app/step_03/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/adaptive_app/step_03/android/build.gradle.kts b/adaptive_app/step_03/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/adaptive_app/step_03/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/adaptive_app/step_03/android/gradle.properties b/adaptive_app/step_03/android/gradle.properties index 2597170821..f018a61817 100644 --- a/adaptive_app/step_03/android/gradle.properties +++ b/adaptive_app/step_03/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/adaptive_app/step_03/android/gradle/wrapper/gradle-wrapper.properties b/adaptive_app/step_03/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/adaptive_app/step_03/android/gradle/wrapper/gradle-wrapper.properties +++ b/adaptive_app/step_03/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/adaptive_app/step_03/android/settings.gradle b/adaptive_app/step_03/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/adaptive_app/step_03/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/adaptive_app/step_03/android/settings.gradle.kts b/adaptive_app/step_03/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/adaptive_app/step_03/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/adaptive_app/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/adaptive_app/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/adaptive_app/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/adaptive_app/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/adaptive_app/step_03/lib/main.dart b/adaptive_app/step_03/lib/main.dart index 0b1e5bf900..5ab483c932 100644 --- a/adaptive_app/step_03/lib/main.dart +++ b/adaptive_app/step_03/lib/main.dart @@ -51,7 +51,8 @@ class ResizeablePage extends StatelessWidget { _fillTableRow( context: context, property: 'Window Size', - value: '${mediaQuery.size.width.toStringAsFixed(1)} x ' + value: + '${mediaQuery.size.width.toStringAsFixed(1)} x ' '${mediaQuery.size.height.toStringAsFixed(1)}', ), _fillTableRow( @@ -78,10 +79,11 @@ class ResizeablePage extends StatelessWidget { ); } - TableRow _fillTableRow( - {required BuildContext context, - required String property, - required String value}) { + TableRow _fillTableRow({ + required BuildContext context, + required String property, + required String value, + }) { return TableRow( children: [ TableCell( diff --git a/adaptive_app/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/adaptive_app/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3d3910c182..aba90e32e9 100644 --- a/adaptive_app/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/adaptive_app/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/adaptive_app/step_03/pubspec.yaml b/adaptive_app/step_03/pubspec.yaml index 1270c5e0ab..62083e3ffe 100644 --- a/adaptive_app/step_03/pubspec.yaml +++ b/adaptive_app/step_03/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/adaptive_app/step_04/android/.gitignore b/adaptive_app/step_04/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/adaptive_app/step_04/android/.gitignore +++ b/adaptive_app/step_04/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/adaptive_app/step_04/android/app/build.gradle b/adaptive_app/step_04/android/app/build.gradle deleted file mode 100644 index 8853b72ac2..0000000000 --- a/adaptive_app/step_04/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.adaptive_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.adaptive_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/adaptive_app/step_04/android/app/build.gradle.kts b/adaptive_app/step_04/android/app/build.gradle.kts new file mode 100644 index 0000000000..d9e5650b42 --- /dev/null +++ b/adaptive_app/step_04/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.adaptive_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.adaptive_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/adaptive_app/step_04/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt b/adaptive_app/step_04/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt index 2fd5d1107d..eff7feefc3 100644 --- a/adaptive_app/step_04/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt +++ b/adaptive_app/step_04/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.adaptive_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/adaptive_app/step_04/android/build.gradle b/adaptive_app/step_04/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/adaptive_app/step_04/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/adaptive_app/step_04/android/build.gradle.kts b/adaptive_app/step_04/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/adaptive_app/step_04/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/adaptive_app/step_04/android/gradle.properties b/adaptive_app/step_04/android/gradle.properties index 2597170821..f018a61817 100644 --- a/adaptive_app/step_04/android/gradle.properties +++ b/adaptive_app/step_04/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/adaptive_app/step_04/android/gradle/wrapper/gradle-wrapper.properties b/adaptive_app/step_04/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/adaptive_app/step_04/android/gradle/wrapper/gradle-wrapper.properties +++ b/adaptive_app/step_04/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/adaptive_app/step_04/android/settings.gradle b/adaptive_app/step_04/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/adaptive_app/step_04/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/adaptive_app/step_04/android/settings.gradle.kts b/adaptive_app/step_04/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/adaptive_app/step_04/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/adaptive_app/step_04/ios/Podfile b/adaptive_app/step_04/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/adaptive_app/step_04/ios/Podfile +++ b/adaptive_app/step_04/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/adaptive_app/step_04/ios/Runner.xcodeproj/project.pbxproj b/adaptive_app/step_04/ios/Runner.xcodeproj/project.pbxproj index 0632d87fdb..98e245e1d5 100644 --- a/adaptive_app/step_04/ios/Runner.xcodeproj/project.pbxproj +++ b/adaptive_app/step_04/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3A5675FFC2937C968C518A63 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5EA6F047FA8259556D57DA8 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 4B6A3705E8D4B68FD9A302EC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D81801979DB09E374D0DAFEE /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 7F136E744F6141F7DC1415A8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EBA1574037A0976245BAE3A /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B93857134A6CAFC701445895 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7E26A6E3274500A97C21D67 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,18 +42,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 09539EF14EA8A3B030315E5E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 09754DA854BA7579435277C9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 316943CCF19F2BA899763CA7 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1FBFBFB383A13603BEC7D989 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 4AD194F0BA14D00EBE2AA11B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 4934BA1CEC5F681907487167 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 4A68A82821EBCDB541D60678 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7EBA1574037A0976245BAE3A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -61,10 +61,10 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B9CA8C51D5D7BD69BC58806C /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - D81801979DB09E374D0DAFEE /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DE2EDC1E627438477BCFE87B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - E7E26A6E3274500A97C21D67 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C5EA6F047FA8259556D57DA8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D430F600F97FAF73CA9CAADC /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + D6833F8E5AAA3DCD65683FAC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F366267C8F36CE3B70A3DED1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,15 +72,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4B6A3705E8D4B68FD9A302EC /* Pods_Runner.framework in Frameworks */, + 3A5675FFC2937C968C518A63 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - ACDF6490D89421356CAFEB1A /* Frameworks */ = { + D6F317953E834198940439C1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B93857134A6CAFC701445895 /* Pods_RunnerTests.framework in Frameworks */, + 7F136E744F6141F7DC1415A8 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,20 +95,6 @@ path = RunnerTests; sourceTree = ""; }; - 939E3FB01B4D0E4908CA4B4A /* Pods */ = { - isa = PBXGroup; - children = ( - 09539EF14EA8A3B030315E5E /* Pods-Runner.debug.xcconfig */, - 4AD194F0BA14D00EBE2AA11B /* Pods-Runner.release.xcconfig */, - 316943CCF19F2BA899763CA7 /* Pods-Runner.profile.xcconfig */, - B9CA8C51D5D7BD69BC58806C /* Pods-RunnerTests.debug.xcconfig */, - DE2EDC1E627438477BCFE87B /* Pods-RunnerTests.release.xcconfig */, - 09754DA854BA7579435277C9 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -127,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 939E3FB01B4D0E4908CA4B4A /* Pods */, - BA66650AC66D3E5945595944 /* Frameworks */, + 98E0CD01001899F4291831B6 /* Pods */, + CCEAF294A8B19058BEDA41AB /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +142,25 @@ path = Runner; sourceTree = ""; }; - BA66650AC66D3E5945595944 /* Frameworks */ = { + 98E0CD01001899F4291831B6 /* Pods */ = { + isa = PBXGroup; + children = ( + 4934BA1CEC5F681907487167 /* Pods-Runner.debug.xcconfig */, + D6833F8E5AAA3DCD65683FAC /* Pods-Runner.release.xcconfig */, + 4A68A82821EBCDB541D60678 /* Pods-Runner.profile.xcconfig */, + D430F600F97FAF73CA9CAADC /* Pods-RunnerTests.debug.xcconfig */, + F366267C8F36CE3B70A3DED1 /* Pods-RunnerTests.release.xcconfig */, + 1FBFBFB383A13603BEC7D989 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + CCEAF294A8B19058BEDA41AB /* Frameworks */ = { isa = PBXGroup; children = ( - D81801979DB09E374D0DAFEE /* Pods_Runner.framework */, - E7E26A6E3274500A97C21D67 /* Pods_RunnerTests.framework */, + C5EA6F047FA8259556D57DA8 /* Pods_Runner.framework */, + 7EBA1574037A0976245BAE3A /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 69485C118CA1A9DE9CA650D2 /* [CP] Check Pods Manifest.lock */, + EA86C7EFC7B6029650FB41F6 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - ACDF6490D89421356CAFEB1A /* Frameworks */, + D6F317953E834198940439C1 /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9C1BAF2FA9F391C61BAC375A /* [CP] Check Pods Manifest.lock */, + C9DD27B3B832EF1D0988B3A4 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A9848A19ECAD6D2FF9B3095E /* [CP] Embed Pods Frameworks */, + E84223876C47B2C5549A810F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -286,28 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 69485C118CA1A9DE9CA650D2 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -323,7 +301,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9C1BAF2FA9F391C61BAC375A /* [CP] Check Pods Manifest.lock */ = { + C9DD27B3B832EF1D0988B3A4 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -345,7 +323,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - A9848A19ECAD6D2FF9B3095E /* [CP] Embed Pods Frameworks */ = { + E84223876C47B2C5549A810F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -362,6 +340,28 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; + EA86C7EFC7B6029650FB41F6 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B9CA8C51D5D7BD69BC58806C /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = D430F600F97FAF73CA9CAADC /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DE2EDC1E627438477BCFE87B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = F366267C8F36CE3B70A3DED1 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 09754DA854BA7579435277C9 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 1FBFBFB383A13603BEC7D989 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/adaptive_app/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/adaptive_app/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/adaptive_app/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/adaptive_app/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/adaptive_app/step_04/lib/main.dart b/adaptive_app/step_04/lib/main.dart index 8e7eb2941b..b761039c89 100644 --- a/adaptive_app/step_04/lib/main.dart +++ b/adaptive_app/step_04/lib/main.dart @@ -32,10 +32,7 @@ final _router = GoRouter( builder: (context, state) { final title = state.uri.queryParameters['title']!; final id = state.pathParameters['id']!; - return PlaylistDetails( - playlistId: id, - playlistName: title, - ); + return PlaylistDetails(playlistId: id, playlistName: title); }, ), ], @@ -49,13 +46,16 @@ void main() { exit(1); } - runApp(ChangeNotifierProvider( - create: (context) => FlutterDevPlaylists( - flutterDevAccountId: flutterDevAccountId, - youTubeApiKey: youTubeApiKey, + runApp( + ChangeNotifierProvider( + create: + (context) => FlutterDevPlaylists( + flutterDevAccountId: flutterDevAccountId, + youTubeApiKey: youTubeApiKey, + ), + child: const PlaylistsApp(), ), - child: const PlaylistsApp(), - )); + ); } class PlaylistsApp extends StatelessWidget { @@ -65,12 +65,8 @@ class PlaylistsApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp.router( title: 'FlutterDev Playlists', - theme: FlexColorScheme.light( - scheme: FlexScheme.red, - ).toTheme, - darkTheme: FlexColorScheme.dark( - scheme: FlexScheme.red, - ).toTheme, + theme: FlexColorScheme.light(scheme: FlexScheme.red).toTheme, + darkTheme: FlexColorScheme.dark(scheme: FlexScheme.red).toTheme, themeMode: ThemeMode.dark, // Or ThemeMode.System if you'd prefer debugShowCheckedModeBanner: false, routerConfig: _router, diff --git a/adaptive_app/step_04/lib/src/app_state.dart b/adaptive_app/step_04/lib/src/app_state.dart index c09296fcb6..5a23a7a826 100644 --- a/adaptive_app/step_04/lib/src/app_state.dart +++ b/adaptive_app/step_04/lib/src/app_state.dart @@ -13,12 +13,7 @@ class FlutterDevPlaylists extends ChangeNotifier { required String flutterDevAccountId, required String youTubeApiKey, }) : _flutterDevAccountId = flutterDevAccountId { - _api = YouTubeApi( - _ApiKeyClient( - client: http.Client(), - key: youTubeApiKey, - ), - ); + _api = YouTubeApi(_ApiKeyClient(client: http.Client(), key: youTubeApiKey)); _loadPlaylists(); } @@ -34,9 +29,11 @@ class FlutterDevPlaylists extends ChangeNotifier { pageToken: nextPageToken, ); _playlists.addAll(response.items!); - _playlists.sort((a, b) => a.snippet!.title! - .toLowerCase() - .compareTo(b.snippet!.title!.toLowerCase())); + _playlists.sort( + (a, b) => a.snippet!.title!.toLowerCase().compareTo( + b.snippet!.title!.toLowerCase(), + ), + ); notifyListeners(); nextPageToken = response.nextPageToken; } while (nextPageToken != null); @@ -84,10 +81,12 @@ class _ApiKeyClient extends http.BaseClient { @override Future send(http.BaseRequest request) { - final url = request.url.replace(queryParameters: >{ - ...request.url.queryParametersAll, - 'key': [key] - }); + final url = request.url.replace( + queryParameters: >{ + ...request.url.queryParametersAll, + 'key': [key], + }, + ); return client.send(http.Request(request.method, url)); } diff --git a/adaptive_app/step_04/lib/src/playlist_details.dart b/adaptive_app/step_04/lib/src/playlist_details.dart index 1405725698..8ba8a70e85 100644 --- a/adaptive_app/step_04/lib/src/playlist_details.dart +++ b/adaptive_app/step_04/lib/src/playlist_details.dart @@ -10,17 +10,18 @@ import 'package:url_launcher/link.dart'; import 'app_state.dart'; class PlaylistDetails extends StatelessWidget { - const PlaylistDetails( - {required this.playlistId, required this.playlistName, super.key}); + const PlaylistDetails({ + required this.playlistId, + required this.playlistName, + super.key, + }); final String playlistId; final String playlistName; @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: Text(playlistName), - ), + appBar: AppBar(title: Text(playlistName)), body: Consumer( builder: (context, playlists, _) { final playlistItems = playlists.playlistItems(playlistId: playlistId); @@ -70,10 +71,7 @@ class _PlaylistDetailsListView extends StatelessWidget { child: DecoratedBox( decoration: BoxDecoration( gradient: LinearGradient( - colors: [ - Colors.transparent, - Theme.of(context).colorScheme.surface, - ], + colors: [Colors.transparent, Theme.of(context).colorScheme.surface], begin: Alignment.topCenter, end: Alignment.bottomCenter, stops: const [0.5, 0.95], @@ -84,7 +82,9 @@ class _PlaylistDetailsListView extends StatelessWidget { } Widget _buildTitleAndSubtitle( - BuildContext context, PlaylistItem playlistItem) { + BuildContext context, + PlaylistItem playlistItem, + ) { return Positioned( left: 20, right: 0, @@ -96,16 +96,16 @@ class _PlaylistDetailsListView extends StatelessWidget { Text( playlistItem.snippet!.title!, style: Theme.of(context).textTheme.bodyLarge!.copyWith( - fontSize: 18, - // fontWeight: FontWeight.bold, - ), + fontSize: 18, + // fontWeight: FontWeight.bold, + ), ), if (playlistItem.snippet!.videoOwnerChannelTitle != null) Text( playlistItem.snippet!.videoOwnerChannelTitle!, - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - fontSize: 12, - ), + style: Theme.of( + context, + ).textTheme.bodyMedium!.copyWith(fontSize: 12), ), ], ), @@ -121,20 +121,20 @@ class _PlaylistDetailsListView extends StatelessWidget { height: 42, decoration: const BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.all( - Radius.circular(21), - ), + borderRadius: BorderRadius.all(Radius.circular(21)), ), ), Link( uri: Uri.parse( - 'https://www.youtube.com/watch?v=${playlistItem.snippet!.resourceId!.videoId}'), - builder: (context, followLink) => IconButton( - onPressed: followLink, - color: Colors.red, - icon: const Icon(Icons.play_circle_fill), - iconSize: 45, + 'https://www.youtube.com/watch?v=${playlistItem.snippet!.resourceId!.videoId}', ), + builder: + (context, followLink) => IconButton( + onPressed: followLink, + color: Colors.red, + icon: const Icon(Icons.play_circle_fill), + iconSize: 45, + ), ), ], ); diff --git a/adaptive_app/step_04/lib/src/playlists.dart b/adaptive_app/step_04/lib/src/playlists.dart index e044c60852..ab08250be1 100644 --- a/adaptive_app/step_04/lib/src/playlists.dart +++ b/adaptive_app/step_04/lib/src/playlists.dart @@ -15,16 +15,12 @@ class Playlists extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('FlutterDev Playlists'), - ), + appBar: AppBar(title: const Text('FlutterDev Playlists')), body: Consumer( builder: (context, flutterDev, child) { final playlists = flutterDev.playlists; if (playlists.isEmpty) { - return const Center( - child: CircularProgressIndicator(), - ); + return const Center(child: CircularProgressIndicator()); } return _PlaylistsListView(items: playlists); @@ -52,15 +48,13 @@ class _PlaylistsListView extends StatelessWidget { playlist.snippet!.thumbnails!.default_!.url!, ), title: Text(playlist.snippet!.title!), - subtitle: Text( - playlist.snippet!.description!, - ), + subtitle: Text(playlist.snippet!.description!), onTap: () { context.go( Uri( path: '/playlist/${playlist.id}', queryParameters: { - 'title': playlist.snippet!.title! + 'title': playlist.snippet!.title!, }, ).toString(), ); diff --git a/adaptive_app/step_04/macos/Podfile b/adaptive_app/step_04/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/adaptive_app/step_04/macos/Podfile +++ b/adaptive_app/step_04/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/adaptive_app/step_04/macos/Runner.xcodeproj/project.pbxproj b/adaptive_app/step_04/macos/Runner.xcodeproj/project.pbxproj index 6badfeb318..86e6f54834 100644 --- a/adaptive_app/step_04/macos/Runner.xcodeproj/project.pbxproj +++ b/adaptive_app/step_04/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 15FAE2C9E48D97F816FE7AAC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DA02336E8F1487E9B375435 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 5C563E01FC4342F697981465 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 630D668D805E62376CB9190A /* Pods_Runner.framework */; }; - 6B83D3F011AB08A33E8899EB /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD4CCCFF71106E4755C592CA /* Pods_RunnerTests.framework */; }; + CFAE0DF45B2E69DA16BF61C7 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0652362B598C89B8444477A8 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0652362B598C89B8444477A8 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 125146DFAA9BDF2A1AF3A29B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -78,16 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 58A0D1CB97B545667483F9AA /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 5AD0058EB60106F078831A65 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 630D668D805E62376CB9190A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 63A16E27EEF0E0989EA5D951 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 3BF0B3BDCD316067673F3606 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4791554B4F7768779D66C960 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6DA02336E8F1487E9B375435 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 8B9570A040891AF4DD76AA7F /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A683F0B26DED5CC9C0A8B680 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - B24938091A5FBF7E1E9C2D6A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - BD4CCCFF71106E4755C592CA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BE32D43244B667623CFAB6CC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + EBC9BD8644A32D235EC86F50 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + F4EEE8A5CACA9837864B829E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6B83D3F011AB08A33E8899EB /* Pods_RunnerTests.framework in Frameworks */, + CFAE0DF45B2E69DA16BF61C7 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5C563E01FC4342F697981465 /* Pods_Runner.framework in Frameworks */, + 15FAE2C9E48D97F816FE7AAC /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 297A1F8245437C7A0C4B186B /* Pods */ = { + isa = PBXGroup; + children = ( + F4EEE8A5CACA9837864B829E /* Pods-Runner.debug.xcconfig */, + 125146DFAA9BDF2A1AF3A29B /* Pods-Runner.release.xcconfig */, + 8B9570A040891AF4DD76AA7F /* Pods-Runner.profile.xcconfig */, + 4791554B4F7768779D66C960 /* Pods-RunnerTests.debug.xcconfig */, + EBC9BD8644A32D235EC86F50 /* Pods-RunnerTests.release.xcconfig */, + 3BF0B3BDCD316067673F3606 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - B76675DB7D377F4342E9A046 /* Pods */, + 297A1F8245437C7A0C4B186B /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - B76675DB7D377F4342E9A046 /* Pods */ = { - isa = PBXGroup; - children = ( - 5AD0058EB60106F078831A65 /* Pods-Runner.debug.xcconfig */, - A683F0B26DED5CC9C0A8B680 /* Pods-Runner.release.xcconfig */, - BE32D43244B667623CFAB6CC /* Pods-Runner.profile.xcconfig */, - B24938091A5FBF7E1E9C2D6A /* Pods-RunnerTests.debug.xcconfig */, - 58A0D1CB97B545667483F9AA /* Pods-RunnerTests.release.xcconfig */, - 63A16E27EEF0E0989EA5D951 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 630D668D805E62376CB9190A /* Pods_Runner.framework */, - BD4CCCFF71106E4755C592CA /* Pods_RunnerTests.framework */, + 6DA02336E8F1487E9B375435 /* Pods_Runner.framework */, + 0652362B598C89B8444477A8 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - F74BF9FAA0CF4B40BB0C5EB2 /* [CP] Check Pods Manifest.lock */, + F06FD72241C439C417CA7C56 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 195598630E531F1E4FE0DBFB /* [CP] Check Pods Manifest.lock */, + CDD2CB4C9C9DFD6C1B8504F0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - B6D538B68803FB5E6BFC29A0 /* [CP] Embed Pods Frameworks */, + 62B7F04DF2209B7EF609793F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,28 +323,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 195598630E531F1E4FE0DBFB /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -383,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - B6D538B68803FB5E6BFC29A0 /* [CP] Embed Pods Frameworks */ = { + 62B7F04DF2209B7EF609793F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -400,7 +378,29 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - F74BF9FAA0CF4B40BB0C5EB2 /* [CP] Check Pods Manifest.lock */ = { + CDD2CB4C9C9DFD6C1B8504F0 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + F06FD72241C439C417CA7C56 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B24938091A5FBF7E1E9C2D6A /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4791554B4F7768779D66C960 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 58A0D1CB97B545667483F9AA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = EBC9BD8644A32D235EC86F50 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 63A16E27EEF0E0989EA5D951 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 3BF0B3BDCD316067673F3606 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/adaptive_app/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/adaptive_app/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3d3910c182..aba90e32e9 100644 --- a/adaptive_app/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/adaptive_app/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/adaptive_app/step_04/pubspec.yaml b/adaptive_app/step_04/pubspec.yaml index 16abd78b8c..4b1377fb75 100644 --- a/adaptive_app/step_04/pubspec.yaml +++ b/adaptive_app/step_04/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -39,7 +39,7 @@ dependencies: provider: ^6.1.2 url_launcher: ^6.3.1 flex_color_scheme: ^8.1.0 - go_router: ^14.7.2 + go_router: ^14.8.0 dev_dependencies: flutter_test: diff --git a/adaptive_app/step_05/android/.gitignore b/adaptive_app/step_05/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/adaptive_app/step_05/android/.gitignore +++ b/adaptive_app/step_05/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/adaptive_app/step_05/android/app/build.gradle b/adaptive_app/step_05/android/app/build.gradle deleted file mode 100644 index 8853b72ac2..0000000000 --- a/adaptive_app/step_05/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.adaptive_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.adaptive_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/adaptive_app/step_05/android/app/build.gradle.kts b/adaptive_app/step_05/android/app/build.gradle.kts new file mode 100644 index 0000000000..d9e5650b42 --- /dev/null +++ b/adaptive_app/step_05/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.adaptive_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.adaptive_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/adaptive_app/step_05/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt b/adaptive_app/step_05/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt index 2fd5d1107d..eff7feefc3 100644 --- a/adaptive_app/step_05/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt +++ b/adaptive_app/step_05/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.adaptive_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/adaptive_app/step_05/android/build.gradle b/adaptive_app/step_05/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/adaptive_app/step_05/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/adaptive_app/step_05/android/build.gradle.kts b/adaptive_app/step_05/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/adaptive_app/step_05/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/adaptive_app/step_05/android/gradle.properties b/adaptive_app/step_05/android/gradle.properties index 2597170821..f018a61817 100644 --- a/adaptive_app/step_05/android/gradle.properties +++ b/adaptive_app/step_05/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/adaptive_app/step_05/android/gradle/wrapper/gradle-wrapper.properties b/adaptive_app/step_05/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/adaptive_app/step_05/android/gradle/wrapper/gradle-wrapper.properties +++ b/adaptive_app/step_05/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/adaptive_app/step_05/android/settings.gradle b/adaptive_app/step_05/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/adaptive_app/step_05/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/adaptive_app/step_05/android/settings.gradle.kts b/adaptive_app/step_05/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/adaptive_app/step_05/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/adaptive_app/step_05/ios/Podfile b/adaptive_app/step_05/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/adaptive_app/step_05/ios/Podfile +++ b/adaptive_app/step_05/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/adaptive_app/step_05/ios/Runner.xcodeproj/project.pbxproj b/adaptive_app/step_05/ios/Runner.xcodeproj/project.pbxproj index 0632d87fdb..98e245e1d5 100644 --- a/adaptive_app/step_05/ios/Runner.xcodeproj/project.pbxproj +++ b/adaptive_app/step_05/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3A5675FFC2937C968C518A63 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5EA6F047FA8259556D57DA8 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 4B6A3705E8D4B68FD9A302EC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D81801979DB09E374D0DAFEE /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 7F136E744F6141F7DC1415A8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EBA1574037A0976245BAE3A /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B93857134A6CAFC701445895 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7E26A6E3274500A97C21D67 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,18 +42,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 09539EF14EA8A3B030315E5E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 09754DA854BA7579435277C9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 316943CCF19F2BA899763CA7 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1FBFBFB383A13603BEC7D989 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 4AD194F0BA14D00EBE2AA11B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 4934BA1CEC5F681907487167 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 4A68A82821EBCDB541D60678 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7EBA1574037A0976245BAE3A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -61,10 +61,10 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B9CA8C51D5D7BD69BC58806C /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - D81801979DB09E374D0DAFEE /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DE2EDC1E627438477BCFE87B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - E7E26A6E3274500A97C21D67 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C5EA6F047FA8259556D57DA8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D430F600F97FAF73CA9CAADC /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + D6833F8E5AAA3DCD65683FAC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F366267C8F36CE3B70A3DED1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,15 +72,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4B6A3705E8D4B68FD9A302EC /* Pods_Runner.framework in Frameworks */, + 3A5675FFC2937C968C518A63 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - ACDF6490D89421356CAFEB1A /* Frameworks */ = { + D6F317953E834198940439C1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B93857134A6CAFC701445895 /* Pods_RunnerTests.framework in Frameworks */, + 7F136E744F6141F7DC1415A8 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,20 +95,6 @@ path = RunnerTests; sourceTree = ""; }; - 939E3FB01B4D0E4908CA4B4A /* Pods */ = { - isa = PBXGroup; - children = ( - 09539EF14EA8A3B030315E5E /* Pods-Runner.debug.xcconfig */, - 4AD194F0BA14D00EBE2AA11B /* Pods-Runner.release.xcconfig */, - 316943CCF19F2BA899763CA7 /* Pods-Runner.profile.xcconfig */, - B9CA8C51D5D7BD69BC58806C /* Pods-RunnerTests.debug.xcconfig */, - DE2EDC1E627438477BCFE87B /* Pods-RunnerTests.release.xcconfig */, - 09754DA854BA7579435277C9 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -127,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 939E3FB01B4D0E4908CA4B4A /* Pods */, - BA66650AC66D3E5945595944 /* Frameworks */, + 98E0CD01001899F4291831B6 /* Pods */, + CCEAF294A8B19058BEDA41AB /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +142,25 @@ path = Runner; sourceTree = ""; }; - BA66650AC66D3E5945595944 /* Frameworks */ = { + 98E0CD01001899F4291831B6 /* Pods */ = { + isa = PBXGroup; + children = ( + 4934BA1CEC5F681907487167 /* Pods-Runner.debug.xcconfig */, + D6833F8E5AAA3DCD65683FAC /* Pods-Runner.release.xcconfig */, + 4A68A82821EBCDB541D60678 /* Pods-Runner.profile.xcconfig */, + D430F600F97FAF73CA9CAADC /* Pods-RunnerTests.debug.xcconfig */, + F366267C8F36CE3B70A3DED1 /* Pods-RunnerTests.release.xcconfig */, + 1FBFBFB383A13603BEC7D989 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + CCEAF294A8B19058BEDA41AB /* Frameworks */ = { isa = PBXGroup; children = ( - D81801979DB09E374D0DAFEE /* Pods_Runner.framework */, - E7E26A6E3274500A97C21D67 /* Pods_RunnerTests.framework */, + C5EA6F047FA8259556D57DA8 /* Pods_Runner.framework */, + 7EBA1574037A0976245BAE3A /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 69485C118CA1A9DE9CA650D2 /* [CP] Check Pods Manifest.lock */, + EA86C7EFC7B6029650FB41F6 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - ACDF6490D89421356CAFEB1A /* Frameworks */, + D6F317953E834198940439C1 /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9C1BAF2FA9F391C61BAC375A /* [CP] Check Pods Manifest.lock */, + C9DD27B3B832EF1D0988B3A4 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A9848A19ECAD6D2FF9B3095E /* [CP] Embed Pods Frameworks */, + E84223876C47B2C5549A810F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -286,28 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 69485C118CA1A9DE9CA650D2 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -323,7 +301,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9C1BAF2FA9F391C61BAC375A /* [CP] Check Pods Manifest.lock */ = { + C9DD27B3B832EF1D0988B3A4 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -345,7 +323,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - A9848A19ECAD6D2FF9B3095E /* [CP] Embed Pods Frameworks */ = { + E84223876C47B2C5549A810F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -362,6 +340,28 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; + EA86C7EFC7B6029650FB41F6 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B9CA8C51D5D7BD69BC58806C /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = D430F600F97FAF73CA9CAADC /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DE2EDC1E627438477BCFE87B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = F366267C8F36CE3B70A3DED1 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 09754DA854BA7579435277C9 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 1FBFBFB383A13603BEC7D989 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/adaptive_app/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/adaptive_app/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/adaptive_app/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/adaptive_app/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/adaptive_app/step_05/lib/main.dart b/adaptive_app/step_05/lib/main.dart index e995e97514..71fe3ce9ff 100644 --- a/adaptive_app/step_05/lib/main.dart +++ b/adaptive_app/step_05/lib/main.dart @@ -34,10 +34,7 @@ final _router = GoRouter( final id = state.pathParameters['id']!; return Scaffold( appBar: AppBar(title: Text(title)), - body: PlaylistDetails( - playlistId: id, - playlistName: title, - ), + body: PlaylistDetails(playlistId: id, playlistName: title), ); }, ), @@ -52,13 +49,16 @@ void main() { exit(1); } - runApp(ChangeNotifierProvider( - create: (context) => FlutterDevPlaylists( - flutterDevAccountId: flutterDevAccountId, - youTubeApiKey: youTubeApiKey, + runApp( + ChangeNotifierProvider( + create: + (context) => FlutterDevPlaylists( + flutterDevAccountId: flutterDevAccountId, + youTubeApiKey: youTubeApiKey, + ), + child: const PlaylistsApp(), ), - child: const PlaylistsApp(), - )); + ); } class PlaylistsApp extends StatelessWidget { @@ -68,12 +68,8 @@ class PlaylistsApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp.router( title: 'FlutterDev Playlists', - theme: FlexColorScheme.light( - scheme: FlexScheme.red, - ).toTheme, - darkTheme: FlexColorScheme.dark( - scheme: FlexScheme.red, - ).toTheme, + theme: FlexColorScheme.light(scheme: FlexScheme.red).toTheme, + darkTheme: FlexColorScheme.dark(scheme: FlexScheme.red).toTheme, themeMode: ThemeMode.dark, // Or ThemeMode.System if you'd prefer debugShowCheckedModeBanner: false, routerConfig: _router, diff --git a/adaptive_app/step_05/lib/src/adaptive_playlists.dart b/adaptive_app/step_05/lib/src/adaptive_playlists.dart index f19c347d0e..98acbbec56 100644 --- a/adaptive_app/step_05/lib/src/adaptive_playlists.dart +++ b/adaptive_app/step_05/lib/src/adaptive_playlists.dart @@ -41,7 +41,7 @@ class NarrowDisplayPlaylists extends StatelessWidget { Uri( path: '/playlist/${playlist.id}', queryParameters: { - 'title': playlist.snippet!.title! + 'title': playlist.snippet!.title!, }, ).toString(), ); @@ -72,14 +72,18 @@ class _WideDisplayPlaylistsState extends State { body: SplitView( viewMode: SplitViewMode.Horizontal, children: [ - Playlists(playlistSelected: (playlist) { - setState(() { - selectedPlaylist = playlist; - }); - }), + Playlists( + playlistSelected: (playlist) { + setState(() { + selectedPlaylist = playlist; + }); + }, + ), switch ((selectedPlaylist?.id, selectedPlaylist?.snippet?.title)) { - (String id, String title) => - PlaylistDetails(playlistId: id, playlistName: title), + (String id, String title) => PlaylistDetails( + playlistId: id, + playlistName: title, + ), _ => const Center(child: Text('Select a playlist')), }, ], diff --git a/adaptive_app/step_05/lib/src/app_state.dart b/adaptive_app/step_05/lib/src/app_state.dart index c09296fcb6..5a23a7a826 100644 --- a/adaptive_app/step_05/lib/src/app_state.dart +++ b/adaptive_app/step_05/lib/src/app_state.dart @@ -13,12 +13,7 @@ class FlutterDevPlaylists extends ChangeNotifier { required String flutterDevAccountId, required String youTubeApiKey, }) : _flutterDevAccountId = flutterDevAccountId { - _api = YouTubeApi( - _ApiKeyClient( - client: http.Client(), - key: youTubeApiKey, - ), - ); + _api = YouTubeApi(_ApiKeyClient(client: http.Client(), key: youTubeApiKey)); _loadPlaylists(); } @@ -34,9 +29,11 @@ class FlutterDevPlaylists extends ChangeNotifier { pageToken: nextPageToken, ); _playlists.addAll(response.items!); - _playlists.sort((a, b) => a.snippet!.title! - .toLowerCase() - .compareTo(b.snippet!.title!.toLowerCase())); + _playlists.sort( + (a, b) => a.snippet!.title!.toLowerCase().compareTo( + b.snippet!.title!.toLowerCase(), + ), + ); notifyListeners(); nextPageToken = response.nextPageToken; } while (nextPageToken != null); @@ -84,10 +81,12 @@ class _ApiKeyClient extends http.BaseClient { @override Future send(http.BaseRequest request) { - final url = request.url.replace(queryParameters: >{ - ...request.url.queryParametersAll, - 'key': [key] - }); + final url = request.url.replace( + queryParameters: >{ + ...request.url.queryParametersAll, + 'key': [key], + }, + ); return client.send(http.Request(request.method, url)); } diff --git a/adaptive_app/step_05/lib/src/playlist_details.dart b/adaptive_app/step_05/lib/src/playlist_details.dart index b2c0f74a14..c9f399efdf 100644 --- a/adaptive_app/step_05/lib/src/playlist_details.dart +++ b/adaptive_app/step_05/lib/src/playlist_details.dart @@ -10,8 +10,11 @@ import 'package:url_launcher/link.dart'; import 'app_state.dart'; class PlaylistDetails extends StatelessWidget { - const PlaylistDetails( - {required this.playlistId, required this.playlistName, super.key}); + const PlaylistDetails({ + required this.playlistId, + required this.playlistName, + super.key, + }); final String playlistId; final String playlistName; @@ -86,10 +89,7 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { child: DecoratedBox( decoration: BoxDecoration( gradient: LinearGradient( - colors: [ - Colors.transparent, - Theme.of(context).colorScheme.surface, - ], + colors: [Colors.transparent, Theme.of(context).colorScheme.surface], begin: Alignment.topCenter, end: Alignment.bottomCenter, stops: const [0.5, 0.95], @@ -100,7 +100,9 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { } Widget _buildTitleAndSubtitle( - BuildContext context, PlaylistItem playlistItem) { + BuildContext context, + PlaylistItem playlistItem, + ) { return Positioned( left: 20, right: 0, @@ -112,16 +114,16 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { Text( playlistItem.snippet!.title!, style: Theme.of(context).textTheme.bodyLarge!.copyWith( - fontSize: 18, - // fontWeight: FontWeight.bold, - ), + fontSize: 18, + // fontWeight: FontWeight.bold, + ), ), if (playlistItem.snippet!.videoOwnerChannelTitle != null) Text( playlistItem.snippet!.videoOwnerChannelTitle!, - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - fontSize: 12, - ), + style: Theme.of( + context, + ).textTheme.bodyMedium!.copyWith(fontSize: 12), ), ], ), @@ -137,20 +139,20 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { height: 42, decoration: const BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.all( - Radius.circular(21), - ), + borderRadius: BorderRadius.all(Radius.circular(21)), ), ), Link( uri: Uri.parse( - 'https://www.youtube.com/watch?v=${playlistItem.snippet!.resourceId!.videoId}'), - builder: (context, followLink) => IconButton( - onPressed: followLink, - color: Colors.red, - icon: const Icon(Icons.play_circle_fill), - iconSize: 45, + 'https://www.youtube.com/watch?v=${playlistItem.snippet!.resourceId!.videoId}', ), + builder: + (context, followLink) => IconButton( + onPressed: followLink, + color: Colors.red, + icon: const Icon(Icons.play_circle_fill), + iconSize: 45, + ), ), ], ); diff --git a/adaptive_app/step_05/lib/src/playlists.dart b/adaptive_app/step_05/lib/src/playlists.dart index 7a6fe2ae51..36a9633e6f 100644 --- a/adaptive_app/step_05/lib/src/playlists.dart +++ b/adaptive_app/step_05/lib/src/playlists.dart @@ -19,9 +19,7 @@ class Playlists extends StatelessWidget { builder: (context, flutterDev, child) { final playlists = flutterDev.playlists; if (playlists.isEmpty) { - return const Center( - child: CircularProgressIndicator(), - ); + return const Center(child: CircularProgressIndicator()); } return _PlaylistsListView( @@ -77,9 +75,7 @@ class _PlaylistsListViewState extends State<_PlaylistsListView> { playlist.snippet!.thumbnails!.default_!.url!, ), title: Text(playlist.snippet!.title!), - subtitle: Text( - playlist.snippet!.description!, - ), + subtitle: Text(playlist.snippet!.description!), onTap: () { widget.playlistSelected(playlist); }, diff --git a/adaptive_app/step_05/macos/Podfile b/adaptive_app/step_05/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/adaptive_app/step_05/macos/Podfile +++ b/adaptive_app/step_05/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/adaptive_app/step_05/macos/Runner.xcodeproj/project.pbxproj b/adaptive_app/step_05/macos/Runner.xcodeproj/project.pbxproj index 6badfeb318..86e6f54834 100644 --- a/adaptive_app/step_05/macos/Runner.xcodeproj/project.pbxproj +++ b/adaptive_app/step_05/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 15FAE2C9E48D97F816FE7AAC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DA02336E8F1487E9B375435 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 5C563E01FC4342F697981465 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 630D668D805E62376CB9190A /* Pods_Runner.framework */; }; - 6B83D3F011AB08A33E8899EB /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD4CCCFF71106E4755C592CA /* Pods_RunnerTests.framework */; }; + CFAE0DF45B2E69DA16BF61C7 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0652362B598C89B8444477A8 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0652362B598C89B8444477A8 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 125146DFAA9BDF2A1AF3A29B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -78,16 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 58A0D1CB97B545667483F9AA /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 5AD0058EB60106F078831A65 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 630D668D805E62376CB9190A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 63A16E27EEF0E0989EA5D951 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 3BF0B3BDCD316067673F3606 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4791554B4F7768779D66C960 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6DA02336E8F1487E9B375435 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 8B9570A040891AF4DD76AA7F /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A683F0B26DED5CC9C0A8B680 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - B24938091A5FBF7E1E9C2D6A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - BD4CCCFF71106E4755C592CA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BE32D43244B667623CFAB6CC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + EBC9BD8644A32D235EC86F50 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + F4EEE8A5CACA9837864B829E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6B83D3F011AB08A33E8899EB /* Pods_RunnerTests.framework in Frameworks */, + CFAE0DF45B2E69DA16BF61C7 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5C563E01FC4342F697981465 /* Pods_Runner.framework in Frameworks */, + 15FAE2C9E48D97F816FE7AAC /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 297A1F8245437C7A0C4B186B /* Pods */ = { + isa = PBXGroup; + children = ( + F4EEE8A5CACA9837864B829E /* Pods-Runner.debug.xcconfig */, + 125146DFAA9BDF2A1AF3A29B /* Pods-Runner.release.xcconfig */, + 8B9570A040891AF4DD76AA7F /* Pods-Runner.profile.xcconfig */, + 4791554B4F7768779D66C960 /* Pods-RunnerTests.debug.xcconfig */, + EBC9BD8644A32D235EC86F50 /* Pods-RunnerTests.release.xcconfig */, + 3BF0B3BDCD316067673F3606 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - B76675DB7D377F4342E9A046 /* Pods */, + 297A1F8245437C7A0C4B186B /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - B76675DB7D377F4342E9A046 /* Pods */ = { - isa = PBXGroup; - children = ( - 5AD0058EB60106F078831A65 /* Pods-Runner.debug.xcconfig */, - A683F0B26DED5CC9C0A8B680 /* Pods-Runner.release.xcconfig */, - BE32D43244B667623CFAB6CC /* Pods-Runner.profile.xcconfig */, - B24938091A5FBF7E1E9C2D6A /* Pods-RunnerTests.debug.xcconfig */, - 58A0D1CB97B545667483F9AA /* Pods-RunnerTests.release.xcconfig */, - 63A16E27EEF0E0989EA5D951 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 630D668D805E62376CB9190A /* Pods_Runner.framework */, - BD4CCCFF71106E4755C592CA /* Pods_RunnerTests.framework */, + 6DA02336E8F1487E9B375435 /* Pods_Runner.framework */, + 0652362B598C89B8444477A8 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - F74BF9FAA0CF4B40BB0C5EB2 /* [CP] Check Pods Manifest.lock */, + F06FD72241C439C417CA7C56 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 195598630E531F1E4FE0DBFB /* [CP] Check Pods Manifest.lock */, + CDD2CB4C9C9DFD6C1B8504F0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - B6D538B68803FB5E6BFC29A0 /* [CP] Embed Pods Frameworks */, + 62B7F04DF2209B7EF609793F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,28 +323,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 195598630E531F1E4FE0DBFB /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -383,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - B6D538B68803FB5E6BFC29A0 /* [CP] Embed Pods Frameworks */ = { + 62B7F04DF2209B7EF609793F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -400,7 +378,29 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - F74BF9FAA0CF4B40BB0C5EB2 /* [CP] Check Pods Manifest.lock */ = { + CDD2CB4C9C9DFD6C1B8504F0 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + F06FD72241C439C417CA7C56 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B24938091A5FBF7E1E9C2D6A /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4791554B4F7768779D66C960 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 58A0D1CB97B545667483F9AA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = EBC9BD8644A32D235EC86F50 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 63A16E27EEF0E0989EA5D951 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 3BF0B3BDCD316067673F3606 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/adaptive_app/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/adaptive_app/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3d3910c182..aba90e32e9 100644 --- a/adaptive_app/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/adaptive_app/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/adaptive_app/step_05/pubspec.yaml b/adaptive_app/step_05/pubspec.yaml index f7f39239cc..ccfba61b0e 100644 --- a/adaptive_app/step_05/pubspec.yaml +++ b/adaptive_app/step_05/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -39,7 +39,7 @@ dependencies: provider: ^6.1.2 url_launcher: ^6.3.1 flex_color_scheme: ^8.1.0 - go_router: ^14.7.2 + go_router: ^14.8.0 split_view: ^3.2.1 dev_dependencies: diff --git a/adaptive_app/step_06/android/.gitignore b/adaptive_app/step_06/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/adaptive_app/step_06/android/.gitignore +++ b/adaptive_app/step_06/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/adaptive_app/step_06/android/app/build.gradle b/adaptive_app/step_06/android/app/build.gradle deleted file mode 100644 index 8853b72ac2..0000000000 --- a/adaptive_app/step_06/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.adaptive_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.adaptive_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/adaptive_app/step_06/android/app/build.gradle.kts b/adaptive_app/step_06/android/app/build.gradle.kts new file mode 100644 index 0000000000..d9e5650b42 --- /dev/null +++ b/adaptive_app/step_06/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.adaptive_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.adaptive_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/adaptive_app/step_06/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt b/adaptive_app/step_06/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt index 2fd5d1107d..eff7feefc3 100644 --- a/adaptive_app/step_06/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt +++ b/adaptive_app/step_06/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.adaptive_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/adaptive_app/step_06/android/build.gradle b/adaptive_app/step_06/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/adaptive_app/step_06/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/adaptive_app/step_06/android/build.gradle.kts b/adaptive_app/step_06/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/adaptive_app/step_06/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/adaptive_app/step_06/android/gradle.properties b/adaptive_app/step_06/android/gradle.properties index 2597170821..f018a61817 100644 --- a/adaptive_app/step_06/android/gradle.properties +++ b/adaptive_app/step_06/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/adaptive_app/step_06/android/gradle/wrapper/gradle-wrapper.properties b/adaptive_app/step_06/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/adaptive_app/step_06/android/gradle/wrapper/gradle-wrapper.properties +++ b/adaptive_app/step_06/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/adaptive_app/step_06/android/settings.gradle b/adaptive_app/step_06/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/adaptive_app/step_06/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/adaptive_app/step_06/android/settings.gradle.kts b/adaptive_app/step_06/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/adaptive_app/step_06/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/adaptive_app/step_06/ios/Podfile b/adaptive_app/step_06/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/adaptive_app/step_06/ios/Podfile +++ b/adaptive_app/step_06/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/adaptive_app/step_06/ios/Runner.xcodeproj/project.pbxproj b/adaptive_app/step_06/ios/Runner.xcodeproj/project.pbxproj index 0632d87fdb..98e245e1d5 100644 --- a/adaptive_app/step_06/ios/Runner.xcodeproj/project.pbxproj +++ b/adaptive_app/step_06/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3A5675FFC2937C968C518A63 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5EA6F047FA8259556D57DA8 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 4B6A3705E8D4B68FD9A302EC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D81801979DB09E374D0DAFEE /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 7F136E744F6141F7DC1415A8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EBA1574037A0976245BAE3A /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B93857134A6CAFC701445895 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7E26A6E3274500A97C21D67 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,18 +42,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 09539EF14EA8A3B030315E5E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 09754DA854BA7579435277C9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 316943CCF19F2BA899763CA7 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1FBFBFB383A13603BEC7D989 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 4AD194F0BA14D00EBE2AA11B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 4934BA1CEC5F681907487167 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 4A68A82821EBCDB541D60678 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7EBA1574037A0976245BAE3A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -61,10 +61,10 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B9CA8C51D5D7BD69BC58806C /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - D81801979DB09E374D0DAFEE /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DE2EDC1E627438477BCFE87B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - E7E26A6E3274500A97C21D67 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C5EA6F047FA8259556D57DA8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D430F600F97FAF73CA9CAADC /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + D6833F8E5AAA3DCD65683FAC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F366267C8F36CE3B70A3DED1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,15 +72,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4B6A3705E8D4B68FD9A302EC /* Pods_Runner.framework in Frameworks */, + 3A5675FFC2937C968C518A63 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - ACDF6490D89421356CAFEB1A /* Frameworks */ = { + D6F317953E834198940439C1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B93857134A6CAFC701445895 /* Pods_RunnerTests.framework in Frameworks */, + 7F136E744F6141F7DC1415A8 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,20 +95,6 @@ path = RunnerTests; sourceTree = ""; }; - 939E3FB01B4D0E4908CA4B4A /* Pods */ = { - isa = PBXGroup; - children = ( - 09539EF14EA8A3B030315E5E /* Pods-Runner.debug.xcconfig */, - 4AD194F0BA14D00EBE2AA11B /* Pods-Runner.release.xcconfig */, - 316943CCF19F2BA899763CA7 /* Pods-Runner.profile.xcconfig */, - B9CA8C51D5D7BD69BC58806C /* Pods-RunnerTests.debug.xcconfig */, - DE2EDC1E627438477BCFE87B /* Pods-RunnerTests.release.xcconfig */, - 09754DA854BA7579435277C9 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -127,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 939E3FB01B4D0E4908CA4B4A /* Pods */, - BA66650AC66D3E5945595944 /* Frameworks */, + 98E0CD01001899F4291831B6 /* Pods */, + CCEAF294A8B19058BEDA41AB /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +142,25 @@ path = Runner; sourceTree = ""; }; - BA66650AC66D3E5945595944 /* Frameworks */ = { + 98E0CD01001899F4291831B6 /* Pods */ = { + isa = PBXGroup; + children = ( + 4934BA1CEC5F681907487167 /* Pods-Runner.debug.xcconfig */, + D6833F8E5AAA3DCD65683FAC /* Pods-Runner.release.xcconfig */, + 4A68A82821EBCDB541D60678 /* Pods-Runner.profile.xcconfig */, + D430F600F97FAF73CA9CAADC /* Pods-RunnerTests.debug.xcconfig */, + F366267C8F36CE3B70A3DED1 /* Pods-RunnerTests.release.xcconfig */, + 1FBFBFB383A13603BEC7D989 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + CCEAF294A8B19058BEDA41AB /* Frameworks */ = { isa = PBXGroup; children = ( - D81801979DB09E374D0DAFEE /* Pods_Runner.framework */, - E7E26A6E3274500A97C21D67 /* Pods_RunnerTests.framework */, + C5EA6F047FA8259556D57DA8 /* Pods_Runner.framework */, + 7EBA1574037A0976245BAE3A /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 69485C118CA1A9DE9CA650D2 /* [CP] Check Pods Manifest.lock */, + EA86C7EFC7B6029650FB41F6 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - ACDF6490D89421356CAFEB1A /* Frameworks */, + D6F317953E834198940439C1 /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9C1BAF2FA9F391C61BAC375A /* [CP] Check Pods Manifest.lock */, + C9DD27B3B832EF1D0988B3A4 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A9848A19ECAD6D2FF9B3095E /* [CP] Embed Pods Frameworks */, + E84223876C47B2C5549A810F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -286,28 +286,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 69485C118CA1A9DE9CA650D2 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -323,7 +301,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9C1BAF2FA9F391C61BAC375A /* [CP] Check Pods Manifest.lock */ = { + C9DD27B3B832EF1D0988B3A4 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -345,7 +323,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - A9848A19ECAD6D2FF9B3095E /* [CP] Embed Pods Frameworks */ = { + E84223876C47B2C5549A810F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -362,6 +340,28 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; + EA86C7EFC7B6029650FB41F6 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B9CA8C51D5D7BD69BC58806C /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = D430F600F97FAF73CA9CAADC /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DE2EDC1E627438477BCFE87B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = F366267C8F36CE3B70A3DED1 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 09754DA854BA7579435277C9 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 1FBFBFB383A13603BEC7D989 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/adaptive_app/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/adaptive_app/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/adaptive_app/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/adaptive_app/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/adaptive_app/step_06/lib/main.dart b/adaptive_app/step_06/lib/main.dart index e995e97514..71fe3ce9ff 100644 --- a/adaptive_app/step_06/lib/main.dart +++ b/adaptive_app/step_06/lib/main.dart @@ -34,10 +34,7 @@ final _router = GoRouter( final id = state.pathParameters['id']!; return Scaffold( appBar: AppBar(title: Text(title)), - body: PlaylistDetails( - playlistId: id, - playlistName: title, - ), + body: PlaylistDetails(playlistId: id, playlistName: title), ); }, ), @@ -52,13 +49,16 @@ void main() { exit(1); } - runApp(ChangeNotifierProvider( - create: (context) => FlutterDevPlaylists( - flutterDevAccountId: flutterDevAccountId, - youTubeApiKey: youTubeApiKey, + runApp( + ChangeNotifierProvider( + create: + (context) => FlutterDevPlaylists( + flutterDevAccountId: flutterDevAccountId, + youTubeApiKey: youTubeApiKey, + ), + child: const PlaylistsApp(), ), - child: const PlaylistsApp(), - )); + ); } class PlaylistsApp extends StatelessWidget { @@ -68,12 +68,8 @@ class PlaylistsApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp.router( title: 'FlutterDev Playlists', - theme: FlexColorScheme.light( - scheme: FlexScheme.red, - ).toTheme, - darkTheme: FlexColorScheme.dark( - scheme: FlexScheme.red, - ).toTheme, + theme: FlexColorScheme.light(scheme: FlexScheme.red).toTheme, + darkTheme: FlexColorScheme.dark(scheme: FlexScheme.red).toTheme, themeMode: ThemeMode.dark, // Or ThemeMode.System if you'd prefer debugShowCheckedModeBanner: false, routerConfig: _router, diff --git a/adaptive_app/step_06/lib/src/adaptive_image.dart b/adaptive_app/step_06/lib/src/adaptive_image.dart index db9e8e2b68..4f6f96a22c 100644 --- a/adaptive_app/step_06/lib/src/adaptive_image.dart +++ b/adaptive_app/step_06/lib/src/adaptive_image.dart @@ -8,9 +8,10 @@ import 'package:flutter/material.dart'; class AdaptiveImage extends StatelessWidget { AdaptiveImage.network(String url, {super.key}) { if (kIsWeb) { - _url = Uri.parse(url) - .replace(host: 'localhost', port: 8080, scheme: 'http') - .toString(); + _url = + Uri.parse( + url, + ).replace(host: 'localhost', port: 8080, scheme: 'http').toString(); } else { _url = url; } diff --git a/adaptive_app/step_06/lib/src/adaptive_playlists.dart b/adaptive_app/step_06/lib/src/adaptive_playlists.dart index f19c347d0e..98acbbec56 100644 --- a/adaptive_app/step_06/lib/src/adaptive_playlists.dart +++ b/adaptive_app/step_06/lib/src/adaptive_playlists.dart @@ -41,7 +41,7 @@ class NarrowDisplayPlaylists extends StatelessWidget { Uri( path: '/playlist/${playlist.id}', queryParameters: { - 'title': playlist.snippet!.title! + 'title': playlist.snippet!.title!, }, ).toString(), ); @@ -72,14 +72,18 @@ class _WideDisplayPlaylistsState extends State { body: SplitView( viewMode: SplitViewMode.Horizontal, children: [ - Playlists(playlistSelected: (playlist) { - setState(() { - selectedPlaylist = playlist; - }); - }), + Playlists( + playlistSelected: (playlist) { + setState(() { + selectedPlaylist = playlist; + }); + }, + ), switch ((selectedPlaylist?.id, selectedPlaylist?.snippet?.title)) { - (String id, String title) => - PlaylistDetails(playlistId: id, playlistName: title), + (String id, String title) => PlaylistDetails( + playlistId: id, + playlistName: title, + ), _ => const Center(child: Text('Select a playlist')), }, ], diff --git a/adaptive_app/step_06/lib/src/adaptive_text.dart b/adaptive_app/step_06/lib/src/adaptive_text.dart index 4d03d37526..407e9dce65 100644 --- a/adaptive_app/step_06/lib/src/adaptive_text.dart +++ b/adaptive_app/step_06/lib/src/adaptive_text.dart @@ -13,7 +13,7 @@ class AdaptiveText extends StatelessWidget { Widget build(BuildContext context) { return switch (Theme.of(context).platform) { TargetPlatform.android || TargetPlatform.iOS => Text(data, style: style), - _ => SelectableText(data, style: style) + _ => SelectableText(data, style: style), }; } } diff --git a/adaptive_app/step_06/lib/src/app_state.dart b/adaptive_app/step_06/lib/src/app_state.dart index c09296fcb6..5a23a7a826 100644 --- a/adaptive_app/step_06/lib/src/app_state.dart +++ b/adaptive_app/step_06/lib/src/app_state.dart @@ -13,12 +13,7 @@ class FlutterDevPlaylists extends ChangeNotifier { required String flutterDevAccountId, required String youTubeApiKey, }) : _flutterDevAccountId = flutterDevAccountId { - _api = YouTubeApi( - _ApiKeyClient( - client: http.Client(), - key: youTubeApiKey, - ), - ); + _api = YouTubeApi(_ApiKeyClient(client: http.Client(), key: youTubeApiKey)); _loadPlaylists(); } @@ -34,9 +29,11 @@ class FlutterDevPlaylists extends ChangeNotifier { pageToken: nextPageToken, ); _playlists.addAll(response.items!); - _playlists.sort((a, b) => a.snippet!.title! - .toLowerCase() - .compareTo(b.snippet!.title!.toLowerCase())); + _playlists.sort( + (a, b) => a.snippet!.title!.toLowerCase().compareTo( + b.snippet!.title!.toLowerCase(), + ), + ); notifyListeners(); nextPageToken = response.nextPageToken; } while (nextPageToken != null); @@ -84,10 +81,12 @@ class _ApiKeyClient extends http.BaseClient { @override Future send(http.BaseRequest request) { - final url = request.url.replace(queryParameters: >{ - ...request.url.queryParametersAll, - 'key': [key] - }); + final url = request.url.replace( + queryParameters: >{ + ...request.url.queryParametersAll, + 'key': [key], + }, + ); return client.send(http.Request(request.method, url)); } diff --git a/adaptive_app/step_06/lib/src/playlist_details.dart b/adaptive_app/step_06/lib/src/playlist_details.dart index 724778c235..f558a55791 100644 --- a/adaptive_app/step_06/lib/src/playlist_details.dart +++ b/adaptive_app/step_06/lib/src/playlist_details.dart @@ -12,8 +12,11 @@ import 'adaptive_text.dart'; import 'app_state.dart'; class PlaylistDetails extends StatelessWidget { - const PlaylistDetails( - {required this.playlistId, required this.playlistName, super.key}); + const PlaylistDetails({ + required this.playlistId, + required this.playlistName, + super.key, + }); final String playlistId; final String playlistName; @@ -72,7 +75,8 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { children: [ if (playlistItem.snippet!.thumbnails!.high != null) AdaptiveImage.network( - playlistItem.snippet!.thumbnails!.high!.url!), + playlistItem.snippet!.thumbnails!.high!.url!, + ), _buildGradient(context), _buildTitleAndSubtitle(context, playlistItem), _buildPlayButton(context, playlistItem), @@ -89,10 +93,7 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { child: DecoratedBox( decoration: BoxDecoration( gradient: LinearGradient( - colors: [ - Colors.transparent, - Theme.of(context).colorScheme.surface, - ], + colors: [Colors.transparent, Theme.of(context).colorScheme.surface], begin: Alignment.topCenter, end: Alignment.bottomCenter, stops: const [0.5, 0.95], @@ -103,7 +104,9 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { } Widget _buildTitleAndSubtitle( - BuildContext context, PlaylistItem playlistItem) { + BuildContext context, + PlaylistItem playlistItem, + ) { return Positioned( left: 20, right: 0, @@ -115,16 +118,16 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { AdaptiveText( playlistItem.snippet!.title!, style: Theme.of(context).textTheme.bodyLarge!.copyWith( - fontSize: 18, - // fontWeight: FontWeight.bold, - ), + fontSize: 18, + // fontWeight: FontWeight.bold, + ), ), if (playlistItem.snippet!.videoOwnerChannelTitle != null) AdaptiveText( playlistItem.snippet!.videoOwnerChannelTitle!, - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - fontSize: 12, - ), + style: Theme.of( + context, + ).textTheme.bodyMedium!.copyWith(fontSize: 12), ), ], ), @@ -140,20 +143,20 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { height: 42, decoration: const BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.all( - Radius.circular(21), - ), + borderRadius: BorderRadius.all(Radius.circular(21)), ), ), Link( uri: Uri.parse( - 'https://www.youtube.com/watch?v=${playlistItem.snippet!.resourceId!.videoId}'), - builder: (context, followLink) => IconButton( - onPressed: followLink, - color: Colors.red, - icon: const Icon(Icons.play_circle_fill), - iconSize: 45, + 'https://www.youtube.com/watch?v=${playlistItem.snippet!.resourceId!.videoId}', ), + builder: + (context, followLink) => IconButton( + onPressed: followLink, + color: Colors.red, + icon: const Icon(Icons.play_circle_fill), + iconSize: 45, + ), ), ], ); diff --git a/adaptive_app/step_06/lib/src/playlists.dart b/adaptive_app/step_06/lib/src/playlists.dart index f1a259378a..50fd2c729e 100644 --- a/adaptive_app/step_06/lib/src/playlists.dart +++ b/adaptive_app/step_06/lib/src/playlists.dart @@ -20,9 +20,7 @@ class Playlists extends StatelessWidget { builder: (context, flutterDev, child) { final playlists = flutterDev.playlists; if (playlists.isEmpty) { - return const Center( - child: CircularProgressIndicator(), - ); + return const Center(child: CircularProgressIndicator()); } return _PlaylistsListView( @@ -78,9 +76,7 @@ class _PlaylistsListViewState extends State<_PlaylistsListView> { playlist.snippet!.thumbnails!.default_!.url!, ), title: Text(playlist.snippet!.title!), - subtitle: Text( - playlist.snippet!.description!, - ), + subtitle: Text(playlist.snippet!.description!), onTap: () { widget.playlistSelected(playlist); }, diff --git a/adaptive_app/step_06/macos/Podfile b/adaptive_app/step_06/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/adaptive_app/step_06/macos/Podfile +++ b/adaptive_app/step_06/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/adaptive_app/step_06/macos/Runner.xcodeproj/project.pbxproj b/adaptive_app/step_06/macos/Runner.xcodeproj/project.pbxproj index 6badfeb318..86e6f54834 100644 --- a/adaptive_app/step_06/macos/Runner.xcodeproj/project.pbxproj +++ b/adaptive_app/step_06/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 15FAE2C9E48D97F816FE7AAC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DA02336E8F1487E9B375435 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 5C563E01FC4342F697981465 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 630D668D805E62376CB9190A /* Pods_Runner.framework */; }; - 6B83D3F011AB08A33E8899EB /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD4CCCFF71106E4755C592CA /* Pods_RunnerTests.framework */; }; + CFAE0DF45B2E69DA16BF61C7 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0652362B598C89B8444477A8 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0652362B598C89B8444477A8 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 125146DFAA9BDF2A1AF3A29B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -78,16 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 58A0D1CB97B545667483F9AA /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 5AD0058EB60106F078831A65 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 630D668D805E62376CB9190A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 63A16E27EEF0E0989EA5D951 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 3BF0B3BDCD316067673F3606 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4791554B4F7768779D66C960 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6DA02336E8F1487E9B375435 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 8B9570A040891AF4DD76AA7F /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A683F0B26DED5CC9C0A8B680 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - B24938091A5FBF7E1E9C2D6A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - BD4CCCFF71106E4755C592CA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BE32D43244B667623CFAB6CC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + EBC9BD8644A32D235EC86F50 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + F4EEE8A5CACA9837864B829E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6B83D3F011AB08A33E8899EB /* Pods_RunnerTests.framework in Frameworks */, + CFAE0DF45B2E69DA16BF61C7 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5C563E01FC4342F697981465 /* Pods_Runner.framework in Frameworks */, + 15FAE2C9E48D97F816FE7AAC /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 297A1F8245437C7A0C4B186B /* Pods */ = { + isa = PBXGroup; + children = ( + F4EEE8A5CACA9837864B829E /* Pods-Runner.debug.xcconfig */, + 125146DFAA9BDF2A1AF3A29B /* Pods-Runner.release.xcconfig */, + 8B9570A040891AF4DD76AA7F /* Pods-Runner.profile.xcconfig */, + 4791554B4F7768779D66C960 /* Pods-RunnerTests.debug.xcconfig */, + EBC9BD8644A32D235EC86F50 /* Pods-RunnerTests.release.xcconfig */, + 3BF0B3BDCD316067673F3606 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - B76675DB7D377F4342E9A046 /* Pods */, + 297A1F8245437C7A0C4B186B /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - B76675DB7D377F4342E9A046 /* Pods */ = { - isa = PBXGroup; - children = ( - 5AD0058EB60106F078831A65 /* Pods-Runner.debug.xcconfig */, - A683F0B26DED5CC9C0A8B680 /* Pods-Runner.release.xcconfig */, - BE32D43244B667623CFAB6CC /* Pods-Runner.profile.xcconfig */, - B24938091A5FBF7E1E9C2D6A /* Pods-RunnerTests.debug.xcconfig */, - 58A0D1CB97B545667483F9AA /* Pods-RunnerTests.release.xcconfig */, - 63A16E27EEF0E0989EA5D951 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 630D668D805E62376CB9190A /* Pods_Runner.framework */, - BD4CCCFF71106E4755C592CA /* Pods_RunnerTests.framework */, + 6DA02336E8F1487E9B375435 /* Pods_Runner.framework */, + 0652362B598C89B8444477A8 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - F74BF9FAA0CF4B40BB0C5EB2 /* [CP] Check Pods Manifest.lock */, + F06FD72241C439C417CA7C56 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 195598630E531F1E4FE0DBFB /* [CP] Check Pods Manifest.lock */, + CDD2CB4C9C9DFD6C1B8504F0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - B6D538B68803FB5E6BFC29A0 /* [CP] Embed Pods Frameworks */, + 62B7F04DF2209B7EF609793F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,28 +323,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 195598630E531F1E4FE0DBFB /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -383,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - B6D538B68803FB5E6BFC29A0 /* [CP] Embed Pods Frameworks */ = { + 62B7F04DF2209B7EF609793F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -400,7 +378,29 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - F74BF9FAA0CF4B40BB0C5EB2 /* [CP] Check Pods Manifest.lock */ = { + CDD2CB4C9C9DFD6C1B8504F0 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + F06FD72241C439C417CA7C56 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B24938091A5FBF7E1E9C2D6A /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4791554B4F7768779D66C960 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 58A0D1CB97B545667483F9AA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = EBC9BD8644A32D235EC86F50 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 63A16E27EEF0E0989EA5D951 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 3BF0B3BDCD316067673F3606 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/adaptive_app/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/adaptive_app/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3d3910c182..aba90e32e9 100644 --- a/adaptive_app/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/adaptive_app/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/adaptive_app/step_06/pubspec.yaml b/adaptive_app/step_06/pubspec.yaml index f7f39239cc..ccfba61b0e 100644 --- a/adaptive_app/step_06/pubspec.yaml +++ b/adaptive_app/step_06/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -39,7 +39,7 @@ dependencies: provider: ^6.1.2 url_launcher: ^6.3.1 flex_color_scheme: ^8.1.0 - go_router: ^14.7.2 + go_router: ^14.8.0 split_view: ^3.2.1 dev_dependencies: diff --git a/adaptive_app/step_06/yt_cors_proxy/pubspec.yaml b/adaptive_app/step_06/yt_cors_proxy/pubspec.yaml index c9e7b4be80..62d859166c 100644 --- a/adaptive_app/step_06/yt_cors_proxy/pubspec.yaml +++ b/adaptive_app/step_06/yt_cors_proxy/pubspec.yaml @@ -3,7 +3,7 @@ description: A YouTube CORS Proxy Server. version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: shelf: ^1.4.0 diff --git a/adaptive_app/step_07/android/.gitignore b/adaptive_app/step_07/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/adaptive_app/step_07/android/.gitignore +++ b/adaptive_app/step_07/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/adaptive_app/step_07/android/app/build.gradle b/adaptive_app/step_07/android/app/build.gradle deleted file mode 100644 index 8853b72ac2..0000000000 --- a/adaptive_app/step_07/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.adaptive_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.adaptive_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/adaptive_app/step_07/android/app/build.gradle.kts b/adaptive_app/step_07/android/app/build.gradle.kts new file mode 100644 index 0000000000..d9e5650b42 --- /dev/null +++ b/adaptive_app/step_07/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.adaptive_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.adaptive_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/adaptive_app/step_07/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt b/adaptive_app/step_07/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt index 2fd5d1107d..eff7feefc3 100644 --- a/adaptive_app/step_07/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt +++ b/adaptive_app/step_07/android/app/src/main/kotlin/com/example/adaptive_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.adaptive_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/adaptive_app/step_07/android/build.gradle b/adaptive_app/step_07/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/adaptive_app/step_07/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/adaptive_app/step_07/android/build.gradle.kts b/adaptive_app/step_07/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/adaptive_app/step_07/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/adaptive_app/step_07/android/gradle.properties b/adaptive_app/step_07/android/gradle.properties index 2597170821..f018a61817 100644 --- a/adaptive_app/step_07/android/gradle.properties +++ b/adaptive_app/step_07/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/adaptive_app/step_07/android/gradle/wrapper/gradle-wrapper.properties b/adaptive_app/step_07/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/adaptive_app/step_07/android/gradle/wrapper/gradle-wrapper.properties +++ b/adaptive_app/step_07/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/adaptive_app/step_07/android/settings.gradle b/adaptive_app/step_07/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/adaptive_app/step_07/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/adaptive_app/step_07/android/settings.gradle.kts b/adaptive_app/step_07/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/adaptive_app/step_07/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/adaptive_app/step_07/ios/Podfile b/adaptive_app/step_07/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/adaptive_app/step_07/ios/Podfile +++ b/adaptive_app/step_07/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/adaptive_app/step_07/ios/Runner.xcodeproj/project.pbxproj b/adaptive_app/step_07/ios/Runner.xcodeproj/project.pbxproj index 28067249bf..75255f3a73 100644 --- a/adaptive_app/step_07/ios/Runner.xcodeproj/project.pbxproj +++ b/adaptive_app/step_07/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3A5675FFC2937C968C518A63 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5EA6F047FA8259556D57DA8 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 4B6A3705E8D4B68FD9A302EC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D81801979DB09E374D0DAFEE /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 7F136E744F6141F7DC1415A8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EBA1574037A0976245BAE3A /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B93857134A6CAFC701445895 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7E26A6E3274500A97C21D67 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,18 +42,18 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 09539EF14EA8A3B030315E5E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 09754DA854BA7579435277C9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 316943CCF19F2BA899763CA7 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1FBFBFB383A13603BEC7D989 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 4AD194F0BA14D00EBE2AA11B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 4934BA1CEC5F681907487167 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 4A68A82821EBCDB541D60678 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7EBA1574037A0976245BAE3A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -61,10 +61,10 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B9CA8C51D5D7BD69BC58806C /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - D81801979DB09E374D0DAFEE /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DE2EDC1E627438477BCFE87B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - E7E26A6E3274500A97C21D67 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C5EA6F047FA8259556D57DA8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D430F600F97FAF73CA9CAADC /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + D6833F8E5AAA3DCD65683FAC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F366267C8F36CE3B70A3DED1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,15 +72,15 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4B6A3705E8D4B68FD9A302EC /* Pods_Runner.framework in Frameworks */, + 3A5675FFC2937C968C518A63 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - ACDF6490D89421356CAFEB1A /* Frameworks */ = { + D6F317953E834198940439C1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B93857134A6CAFC701445895 /* Pods_RunnerTests.framework in Frameworks */, + 7F136E744F6141F7DC1415A8 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,20 +95,6 @@ path = RunnerTests; sourceTree = ""; }; - 939E3FB01B4D0E4908CA4B4A /* Pods */ = { - isa = PBXGroup; - children = ( - 09539EF14EA8A3B030315E5E /* Pods-Runner.debug.xcconfig */, - 4AD194F0BA14D00EBE2AA11B /* Pods-Runner.release.xcconfig */, - 316943CCF19F2BA899763CA7 /* Pods-Runner.profile.xcconfig */, - B9CA8C51D5D7BD69BC58806C /* Pods-RunnerTests.debug.xcconfig */, - DE2EDC1E627438477BCFE87B /* Pods-RunnerTests.release.xcconfig */, - 09754DA854BA7579435277C9 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -127,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 939E3FB01B4D0E4908CA4B4A /* Pods */, - BA66650AC66D3E5945595944 /* Frameworks */, + 98E0CD01001899F4291831B6 /* Pods */, + CCEAF294A8B19058BEDA41AB /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +142,25 @@ path = Runner; sourceTree = ""; }; - BA66650AC66D3E5945595944 /* Frameworks */ = { + 98E0CD01001899F4291831B6 /* Pods */ = { isa = PBXGroup; children = ( - D81801979DB09E374D0DAFEE /* Pods_Runner.framework */, - E7E26A6E3274500A97C21D67 /* Pods_RunnerTests.framework */, + 4934BA1CEC5F681907487167 /* Pods-Runner.debug.xcconfig */, + D6833F8E5AAA3DCD65683FAC /* Pods-Runner.release.xcconfig */, + 4A68A82821EBCDB541D60678 /* Pods-Runner.profile.xcconfig */, + D430F600F97FAF73CA9CAADC /* Pods-RunnerTests.debug.xcconfig */, + F366267C8F36CE3B70A3DED1 /* Pods-RunnerTests.release.xcconfig */, + 1FBFBFB383A13603BEC7D989 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + CCEAF294A8B19058BEDA41AB /* Frameworks */ = { + isa = PBXGroup; + children = ( + C5EA6F047FA8259556D57DA8 /* Pods_Runner.framework */, + 7EBA1574037A0976245BAE3A /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 69485C118CA1A9DE9CA650D2 /* [CP] Check Pods Manifest.lock */, + EA86C7EFC7B6029650FB41F6 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - ACDF6490D89421356CAFEB1A /* Frameworks */, + D6F317953E834198940439C1 /* Frameworks */, ); buildRules = ( ); @@ -191,15 +191,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9C1BAF2FA9F391C61BAC375A /* [CP] Check Pods Manifest.lock */, + C9DD27B3B832EF1D0988B3A4 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A9848A19ECAD6D2FF9B3095E /* [CP] Embed Pods Frameworks */, - 4EBC016D691A7CF04EAF967A /* [CP] Copy Pods Resources */, + E84223876C47B2C5549A810F /* [CP] Embed Pods Frameworks */, + 3889044429C88A02D5701963 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -271,23 +271,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 4EBC016D691A7CF04EAF967A /* [CP] Copy Pods Resources */ = { + 3889044429C88A02D5701963 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -304,27 +288,21 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 69485C118CA1A9DE9CA650D2 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -341,7 +319,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9C1BAF2FA9F391C61BAC375A /* [CP] Check Pods Manifest.lock */ = { + C9DD27B3B832EF1D0988B3A4 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -363,7 +341,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - A9848A19ECAD6D2FF9B3095E /* [CP] Embed Pods Frameworks */ = { + E84223876C47B2C5549A810F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -380,6 +358,28 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; + EA86C7EFC7B6029650FB41F6 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -505,7 +505,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B9CA8C51D5D7BD69BC58806C /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = D430F600F97FAF73CA9CAADC /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -523,7 +523,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DE2EDC1E627438477BCFE87B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = F366267C8F36CE3B70A3DED1 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -539,7 +539,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 09754DA854BA7579435277C9 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 1FBFBFB383A13603BEC7D989 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/adaptive_app/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/adaptive_app/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/adaptive_app/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/adaptive_app/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/adaptive_app/step_07/lib/main.dart b/adaptive_app/step_07/lib/main.dart index 6b89943cb5..956e29a0cc 100644 --- a/adaptive_app/step_07/lib/main.dart +++ b/adaptive_app/step_07/lib/main.dart @@ -14,9 +14,7 @@ import 'src/app_state.dart'; import 'src/playlist_details.dart'; // From https://developers.google.com/youtube/v3/guides/auth/installed-apps#identify-access-scopes -final scopes = [ - 'https://www.googleapis.com/auth/youtube.readonly', -]; +final scopes = ['https://www.googleapis.com/auth/youtube.readonly']; // TODO: Replace with your Client ID and Client Secret for Desktop configuration final clientId = ClientId( @@ -56,10 +54,7 @@ final _router = GoRouter( final id = state.pathParameters['id']!; return Scaffold( appBar: AppBar(title: Text(title)), - body: PlaylistDetails( - playlistId: id, - playlistName: title, - ), + body: PlaylistDetails(playlistId: id, playlistName: title), ); }, ), @@ -69,10 +64,12 @@ final _router = GoRouter( ); void main() { - runApp(ChangeNotifierProvider( - create: (context) => AuthedUserPlaylists(), - child: const PlaylistsApp(), - )); + runApp( + ChangeNotifierProvider( + create: (context) => AuthedUserPlaylists(), + child: const PlaylistsApp(), + ), + ); } class PlaylistsApp extends StatelessWidget { @@ -82,12 +79,8 @@ class PlaylistsApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp.router( title: 'Your Playlists', - theme: FlexColorScheme.light( - scheme: FlexScheme.red, - ).toTheme, - darkTheme: FlexColorScheme.dark( - scheme: FlexScheme.red, - ).toTheme, + theme: FlexColorScheme.light(scheme: FlexScheme.red).toTheme, + darkTheme: FlexColorScheme.dark(scheme: FlexScheme.red).toTheme, themeMode: ThemeMode.dark, // Or ThemeMode.System if you'd prefer debugShowCheckedModeBanner: false, routerConfig: _router, diff --git a/adaptive_app/step_07/lib/src/adaptive_image.dart b/adaptive_app/step_07/lib/src/adaptive_image.dart index db9e8e2b68..4f6f96a22c 100644 --- a/adaptive_app/step_07/lib/src/adaptive_image.dart +++ b/adaptive_app/step_07/lib/src/adaptive_image.dart @@ -8,9 +8,10 @@ import 'package:flutter/material.dart'; class AdaptiveImage extends StatelessWidget { AdaptiveImage.network(String url, {super.key}) { if (kIsWeb) { - _url = Uri.parse(url) - .replace(host: 'localhost', port: 8080, scheme: 'http') - .toString(); + _url = + Uri.parse( + url, + ).replace(host: 'localhost', port: 8080, scheme: 'http').toString(); } else { _url = url; } diff --git a/adaptive_app/step_07/lib/src/adaptive_login.dart b/adaptive_app/step_07/lib/src/adaptive_login.dart index 634496682c..bcce2c64da 100644 --- a/adaptive_app/step_07/lib/src/adaptive_login.dart +++ b/adaptive_app/step_07/lib/src/adaptive_login.dart @@ -15,9 +15,8 @@ import 'package:url_launcher/link.dart'; import 'app_state.dart'; -typedef _AdaptiveLoginButtonWidget = Widget Function({ - required VoidCallback? onPressed, -}); +typedef _AdaptiveLoginButtonWidget = + Widget Function({required VoidCallback? onPressed}); class AdaptiveLogin extends StatelessWidget { const AdaptiveLogin({ @@ -34,10 +33,7 @@ class AdaptiveLogin extends StatelessWidget { @override Widget build(BuildContext context) { if (kIsWeb || Platform.isAndroid || Platform.isIOS) { - return _GoogleSignInLogin( - button: _loginButton, - scopes: scopes, - ); + return _GoogleSignInLogin(button: _loginButton, scopes: scopes); } else { return _GoogleApisAuthLogin( button: _loginButton, @@ -47,17 +43,12 @@ class AdaptiveLogin extends StatelessWidget { } } - Widget _loginButton({required VoidCallback? onPressed}) => ElevatedButton( - onPressed: onPressed, - child: loginButtonChild, - ); + Widget _loginButton({required VoidCallback? onPressed}) => + ElevatedButton(onPressed: onPressed, child: loginButtonChild); } class _GoogleSignInLogin extends StatefulWidget { - const _GoogleSignInLogin({ - required this.button, - required this.scopes, - }); + const _GoogleSignInLogin({required this.button, required this.scopes}); final _AdaptiveLoginButtonWidget button; final List scopes; @@ -70,9 +61,7 @@ class _GoogleSignInLoginState extends State<_GoogleSignInLogin> { @override initState() { super.initState(); - _googleSignIn = GoogleSignIn( - scopes: widget.scopes, - ); + _googleSignIn = GoogleSignIn(scopes: widget.scopes); _googleSignIn.onCurrentUserChanged.listen((account) { if (account != null) { _googleSignIn.authenticatedClient().then((authClient) { @@ -92,9 +81,11 @@ class _GoogleSignInLoginState extends State<_GoogleSignInLogin> { Widget build(BuildContext context) { return Scaffold( body: Center( - child: widget.button(onPressed: () { - _googleSignIn.signIn(); - }), + child: widget.button( + onPressed: () { + _googleSignIn.signIn(); + }, + ), ), ); } @@ -142,17 +133,13 @@ class _GoogleApisAuthLoginState extends State<_GoogleApisAuthLogin> { body: Center( child: Link( uri: authUrl, - builder: (context, followLink) => - widget.button(onPressed: followLink), + builder: + (context, followLink) => widget.button(onPressed: followLink), ), ), ); } - return const Scaffold( - body: Center( - child: CircularProgressIndicator(), - ), - ); + return const Scaffold(body: Center(child: CircularProgressIndicator())); } } diff --git a/adaptive_app/step_07/lib/src/adaptive_playlists.dart b/adaptive_app/step_07/lib/src/adaptive_playlists.dart index c5cf08901b..39b38720e2 100644 --- a/adaptive_app/step_07/lib/src/adaptive_playlists.dart +++ b/adaptive_app/step_07/lib/src/adaptive_playlists.dart @@ -41,7 +41,7 @@ class NarrowDisplayPlaylists extends StatelessWidget { Uri( path: '/playlist/${playlist.id}', queryParameters: { - 'title': playlist.snippet!.title! + 'title': playlist.snippet!.title!, }, ).toString(), ); @@ -72,14 +72,18 @@ class _WideDisplayPlaylistsState extends State { body: SplitView( viewMode: SplitViewMode.Horizontal, children: [ - Playlists(playlistSelected: (playlist) { - setState(() { - selectedPlaylist = playlist; - }); - }), + Playlists( + playlistSelected: (playlist) { + setState(() { + selectedPlaylist = playlist; + }); + }, + ), switch ((selectedPlaylist?.id, selectedPlaylist?.snippet?.title)) { - (String id, String title) => - PlaylistDetails(playlistId: id, playlistName: title), + (String id, String title) => PlaylistDetails( + playlistId: id, + playlistName: title, + ), _ => const Center(child: Text('Select a playlist')), }, ], diff --git a/adaptive_app/step_07/lib/src/adaptive_text.dart b/adaptive_app/step_07/lib/src/adaptive_text.dart index 4d03d37526..407e9dce65 100644 --- a/adaptive_app/step_07/lib/src/adaptive_text.dart +++ b/adaptive_app/step_07/lib/src/adaptive_text.dart @@ -13,7 +13,7 @@ class AdaptiveText extends StatelessWidget { Widget build(BuildContext context) { return switch (Theme.of(context).platform) { TargetPlatform.android || TargetPlatform.iOS => Text(data, style: style), - _ => SelectableText(data, style: style) + _ => SelectableText(data, style: style), }; } } diff --git a/adaptive_app/step_07/lib/src/app_state.dart b/adaptive_app/step_07/lib/src/app_state.dart index cf2ccabbe4..8c9fc9bff5 100644 --- a/adaptive_app/step_07/lib/src/app_state.dart +++ b/adaptive_app/step_07/lib/src/app_state.dart @@ -28,9 +28,11 @@ class AuthedUserPlaylists extends ChangeNotifier { pageToken: nextPageToken, ); _playlists.addAll(response.items!); - _playlists.sort((a, b) => a.snippet!.title! - .toLowerCase() - .compareTo(b.snippet!.title!.toLowerCase())); + _playlists.sort( + (a, b) => a.snippet!.title!.toLowerCase().compareTo( + b.snippet!.title!.toLowerCase(), + ), + ); notifyListeners(); nextPageToken = response.nextPageToken; } while (nextPageToken != null); diff --git a/adaptive_app/step_07/lib/src/playlist_details.dart b/adaptive_app/step_07/lib/src/playlist_details.dart index 966bff06cf..393ed9f7e5 100644 --- a/adaptive_app/step_07/lib/src/playlist_details.dart +++ b/adaptive_app/step_07/lib/src/playlist_details.dart @@ -12,8 +12,11 @@ import 'adaptive_text.dart'; import 'app_state.dart'; class PlaylistDetails extends StatelessWidget { - const PlaylistDetails( - {required this.playlistId, required this.playlistName, super.key}); + const PlaylistDetails({ + required this.playlistId, + required this.playlistName, + super.key, + }); final String playlistId; final String playlistName; @@ -72,7 +75,8 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { children: [ if (playlistItem.snippet!.thumbnails!.high != null) AdaptiveImage.network( - playlistItem.snippet!.thumbnails!.high!.url!), + playlistItem.snippet!.thumbnails!.high!.url!, + ), _buildGradient(context), _buildTitleAndSubtitle(context, playlistItem), _buildPlayButton(context, playlistItem), @@ -89,10 +93,7 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { child: DecoratedBox( decoration: BoxDecoration( gradient: LinearGradient( - colors: [ - Colors.transparent, - Theme.of(context).colorScheme.surface, - ], + colors: [Colors.transparent, Theme.of(context).colorScheme.surface], begin: Alignment.topCenter, end: Alignment.bottomCenter, stops: const [0.5, 0.95], @@ -103,7 +104,9 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { } Widget _buildTitleAndSubtitle( - BuildContext context, PlaylistItem playlistItem) { + BuildContext context, + PlaylistItem playlistItem, + ) { return Positioned( left: 20, right: 0, @@ -115,16 +118,16 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { AdaptiveText( playlistItem.snippet!.title!, style: Theme.of(context).textTheme.bodyLarge!.copyWith( - fontSize: 18, - // fontWeight: FontWeight.bold, - ), + fontSize: 18, + // fontWeight: FontWeight.bold, + ), ), if (playlistItem.snippet!.videoOwnerChannelTitle != null) AdaptiveText( playlistItem.snippet!.videoOwnerChannelTitle!, - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - fontSize: 12, - ), + style: Theme.of( + context, + ).textTheme.bodyMedium!.copyWith(fontSize: 12), ), ], ), @@ -140,20 +143,20 @@ class _PlaylistDetailsListViewState extends State<_PlaylistDetailsListView> { height: 42, decoration: const BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.all( - Radius.circular(21), - ), + borderRadius: BorderRadius.all(Radius.circular(21)), ), ), Link( uri: Uri.parse( - 'https://www.youtube.com/watch?v=${playlistItem.snippet!.resourceId!.videoId}'), - builder: (context, followLink) => IconButton( - onPressed: followLink, - color: Colors.red, - icon: const Icon(Icons.play_circle_fill), - iconSize: 45, + 'https://www.youtube.com/watch?v=${playlistItem.snippet!.resourceId!.videoId}', ), + builder: + (context, followLink) => IconButton( + onPressed: followLink, + color: Colors.red, + icon: const Icon(Icons.play_circle_fill), + iconSize: 45, + ), ), ], ); diff --git a/adaptive_app/step_07/lib/src/playlists.dart b/adaptive_app/step_07/lib/src/playlists.dart index 3b6b7d8673..92aa6b73a4 100644 --- a/adaptive_app/step_07/lib/src/playlists.dart +++ b/adaptive_app/step_07/lib/src/playlists.dart @@ -20,9 +20,7 @@ class Playlists extends StatelessWidget { builder: (context, flutterDev, child) { final playlists = flutterDev.playlists; if (playlists.isEmpty) { - return const Center( - child: CircularProgressIndicator(), - ); + return const Center(child: CircularProgressIndicator()); } return _PlaylistsListView( @@ -78,9 +76,7 @@ class _PlaylistsListViewState extends State<_PlaylistsListView> { playlist.snippet!.thumbnails!.default_!.url!, ), title: Text(playlist.snippet!.title!), - subtitle: Text( - playlist.snippet!.description!, - ), + subtitle: Text(playlist.snippet!.description!), onTap: () { widget.playlistSelected(playlist); }, diff --git a/adaptive_app/step_07/macos/Podfile b/adaptive_app/step_07/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/adaptive_app/step_07/macos/Podfile +++ b/adaptive_app/step_07/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/adaptive_app/step_07/macos/Runner.xcodeproj/project.pbxproj b/adaptive_app/step_07/macos/Runner.xcodeproj/project.pbxproj index ef3fc8a71e..78ef9a30a0 100644 --- a/adaptive_app/step_07/macos/Runner.xcodeproj/project.pbxproj +++ b/adaptive_app/step_07/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 15FAE2C9E48D97F816FE7AAC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DA02336E8F1487E9B375435 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 5C563E01FC4342F697981465 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 630D668D805E62376CB9190A /* Pods_Runner.framework */; }; - 6B83D3F011AB08A33E8899EB /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD4CCCFF71106E4755C592CA /* Pods_RunnerTests.framework */; }; + CFAE0DF45B2E69DA16BF61C7 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0652362B598C89B8444477A8 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0652362B598C89B8444477A8 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 125146DFAA9BDF2A1AF3A29B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -78,16 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 58A0D1CB97B545667483F9AA /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 5AD0058EB60106F078831A65 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 630D668D805E62376CB9190A /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 63A16E27EEF0E0989EA5D951 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 3BF0B3BDCD316067673F3606 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4791554B4F7768779D66C960 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6DA02336E8F1487E9B375435 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 8B9570A040891AF4DD76AA7F /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A683F0B26DED5CC9C0A8B680 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - B24938091A5FBF7E1E9C2D6A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - BD4CCCFF71106E4755C592CA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BE32D43244B667623CFAB6CC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + EBC9BD8644A32D235EC86F50 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + F4EEE8A5CACA9837864B829E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6B83D3F011AB08A33E8899EB /* Pods_RunnerTests.framework in Frameworks */, + CFAE0DF45B2E69DA16BF61C7 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5C563E01FC4342F697981465 /* Pods_Runner.framework in Frameworks */, + 15FAE2C9E48D97F816FE7AAC /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 297A1F8245437C7A0C4B186B /* Pods */ = { + isa = PBXGroup; + children = ( + F4EEE8A5CACA9837864B829E /* Pods-Runner.debug.xcconfig */, + 125146DFAA9BDF2A1AF3A29B /* Pods-Runner.release.xcconfig */, + 8B9570A040891AF4DD76AA7F /* Pods-Runner.profile.xcconfig */, + 4791554B4F7768779D66C960 /* Pods-RunnerTests.debug.xcconfig */, + EBC9BD8644A32D235EC86F50 /* Pods-RunnerTests.release.xcconfig */, + 3BF0B3BDCD316067673F3606 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - B76675DB7D377F4342E9A046 /* Pods */, + 297A1F8245437C7A0C4B186B /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - B76675DB7D377F4342E9A046 /* Pods */ = { - isa = PBXGroup; - children = ( - 5AD0058EB60106F078831A65 /* Pods-Runner.debug.xcconfig */, - A683F0B26DED5CC9C0A8B680 /* Pods-Runner.release.xcconfig */, - BE32D43244B667623CFAB6CC /* Pods-Runner.profile.xcconfig */, - B24938091A5FBF7E1E9C2D6A /* Pods-RunnerTests.debug.xcconfig */, - 58A0D1CB97B545667483F9AA /* Pods-RunnerTests.release.xcconfig */, - 63A16E27EEF0E0989EA5D951 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 630D668D805E62376CB9190A /* Pods_Runner.framework */, - BD4CCCFF71106E4755C592CA /* Pods_RunnerTests.framework */, + 6DA02336E8F1487E9B375435 /* Pods_Runner.framework */, + 0652362B598C89B8444477A8 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - F74BF9FAA0CF4B40BB0C5EB2 /* [CP] Check Pods Manifest.lock */, + F06FD72241C439C417CA7C56 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,14 +234,14 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 195598630E531F1E4FE0DBFB /* [CP] Check Pods Manifest.lock */, + CDD2CB4C9C9DFD6C1B8504F0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - B6D538B68803FB5E6BFC29A0 /* [CP] Embed Pods Frameworks */, - FC21BBBB9AC44488CDC65F84 /* [CP] Copy Pods Resources */, + 62B7F04DF2209B7EF609793F /* [CP] Embed Pods Frameworks */, + 10EA63813CDB982B34EDB760 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -324,26 +324,21 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 195598630E531F1E4FE0DBFB /* [CP] Check Pods Manifest.lock */ = { + 10EA63813CDB982B34EDB760 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -384,7 +379,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - B6D538B68803FB5E6BFC29A0 /* [CP] Embed Pods Frameworks */ = { + 62B7F04DF2209B7EF609793F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -401,7 +396,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - F74BF9FAA0CF4B40BB0C5EB2 /* [CP] Check Pods Manifest.lock */ = { + CDD2CB4C9C9DFD6C1B8504F0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -416,28 +411,33 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - FC21BBBB9AC44488CDC65F84 /* [CP] Copy Pods Resources */ = { + F06FD72241C439C417CA7C56 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Copy Pods Resources"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -491,7 +491,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B24938091A5FBF7E1E9C2D6A /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4791554B4F7768779D66C960 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -506,7 +506,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 58A0D1CB97B545667483F9AA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = EBC9BD8644A32D235EC86F50 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -521,7 +521,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 63A16E27EEF0E0989EA5D951 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 3BF0B3BDCD316067673F3606 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/adaptive_app/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/adaptive_app/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3d3910c182..aba90e32e9 100644 --- a/adaptive_app/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/adaptive_app/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/adaptive_app/step_07/pubspec.yaml b/adaptive_app/step_07/pubspec.yaml index b797617144..9efa90ecb4 100644 --- a/adaptive_app/step_07/pubspec.yaml +++ b/adaptive_app/step_07/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -38,7 +38,7 @@ dependencies: provider: ^6.1.2 url_launcher: ^6.3.1 flex_color_scheme: ^8.1.0 - go_router: ^14.7.2 + go_router: ^14.8.0 split_view: ^3.2.1 googleapis_auth: ^1.6.0 google_sign_in: ^6.2.2 diff --git a/adaptive_app/step_07/yt_cors_proxy/pubspec.yaml b/adaptive_app/step_07/yt_cors_proxy/pubspec.yaml index c9e7b4be80..62d859166c 100644 --- a/adaptive_app/step_07/yt_cors_proxy/pubspec.yaml +++ b/adaptive_app/step_07/yt_cors_proxy/pubspec.yaml @@ -3,7 +3,7 @@ description: A YouTube CORS Proxy Server. version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: shelf: ^1.4.0 diff --git a/animated-responsive-layout/codelab_rebuild.yaml b/animated-responsive-layout/codelab_rebuild.yaml index d3502a1b11..27982f9905 100644 --- a/animated-responsive-layout/codelab_rebuild.yaml +++ b/animated-responsive-layout/codelab_rebuild.yaml @@ -49,6 +49,9 @@ steps: await tester.pumpWidget(const MainApp()); }); } + - name: Dart format + path: animated_responsive_layout + dart: format . - name: Build iOS simulator bundle platforms: [ macos ] path: animated_responsive_layout @@ -145,15 +148,13 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + class Attachment { - const Attachment({ - required this.url, - }); - + const Attachment({required this.url}); + final String url; } - + class Email { const Email({ required this.sender, @@ -163,7 +164,7 @@ steps: this.replies = 0, this.attachments = const [], }); - + final User sender; final List recipients; final String subject; @@ -171,25 +172,22 @@ steps: final List attachments; final double replies; } - + class Name { - const Name({ - required this.first, - required this.last, - }); - + const Name({required this.first, required this.last}); + final String first; final String last; String get fullName => '$first $last'; } - + class User { const User({ required this.name, required this.avatarUrl, required this.lastActive, }); - + final Name name; final String avatarUrl; final DateTime lastActive; @@ -200,30 +198,35 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'models.dart'; - + final User user_0 = User( - name: const Name(first: 'Me', last: ''), - avatarUrl: 'assets/avatar_1.png', - lastActive: DateTime.now()); + name: const Name(first: 'Me', last: ''), + avatarUrl: 'assets/avatar_1.png', + lastActive: DateTime.now(), + ); final User user_1 = User( - name: const Name(first: '老', last: '强'), - avatarUrl: 'assets/avatar_2.png', - lastActive: DateTime.now().subtract(const Duration(minutes: 10))); + name: const Name(first: '老', last: '强'), + avatarUrl: 'assets/avatar_2.png', + lastActive: DateTime.now().subtract(const Duration(minutes: 10)), + ); final User user_2 = User( - name: const Name(first: 'So', last: 'Duri'), - avatarUrl: 'assets/avatar_3.png', - lastActive: DateTime.now().subtract(const Duration(minutes: 20))); + name: const Name(first: 'So', last: 'Duri'), + avatarUrl: 'assets/avatar_3.png', + lastActive: DateTime.now().subtract(const Duration(minutes: 20)), + ); final User user_3 = User( - name: const Name(first: 'Lily', last: 'MacDonald'), - avatarUrl: 'assets/avatar_4.png', - lastActive: DateTime.now().subtract(const Duration(hours: 2))); + name: const Name(first: 'Lily', last: 'MacDonald'), + avatarUrl: 'assets/avatar_4.png', + lastActive: DateTime.now().subtract(const Duration(hours: 2)), + ); final User user_4 = User( - name: const Name(first: 'Ziad', last: 'Aouad'), - avatarUrl: 'assets/avatar_5.png', - lastActive: DateTime.now().subtract(const Duration(hours: 6))); - + name: const Name(first: 'Ziad', last: 'Aouad'), + avatarUrl: 'assets/avatar_5.png', + lastActive: DateTime.now().subtract(const Duration(hours: 6)), + ); + final List emails = [ Email( sender: user_1, @@ -239,12 +242,13 @@ steps: 'I think it’s time for us to finally try that new noodle shop downtown that doesn’t use menus. Anyone else have other suggestions for dinner club this week? I’m so intrigued by this idea of a noodle restaurant where no one gets to order for themselves - could be fun, or terrible, or both :)\n\nSo', ), Email( - sender: user_3, - recipients: [], - subject: 'This food show is made for you', - content: - 'Ping– you’d love this new food show I started watching. It’s produced by a Thai drummer who started getting recognized for the amazing vegan food she always brought to shows.', - attachments: [const Attachment(url: 'assets/thumbnail_1.png')]), + sender: user_3, + recipients: [], + subject: 'This food show is made for you', + content: + 'Ping– you’d love this new food show I started watching. It’s produced by a Thai drummer who started getting recognized for the amazing vegan food she always brought to shows.', + attachments: [const Attachment(url: 'assets/thumbnail_1.png')], + ), Email( sender: user_4, recipients: [], @@ -253,24 +257,18 @@ steps: 'What do you think about training to be volunteer EMTs? We could do it together for moral support. Think about it??', ), ]; - + final List replies = [ Email( sender: user_2, - recipients: [ - user_3, - user_2, - ], + recipients: [user_3, user_2], subject: 'Dinner Club', content: 'I think it’s time for us to finally try that new noodle shop downtown that doesn’t use menus. Anyone else have other suggestions for dinner club this week? I’m so intrigued by this idea of a noodle restaurant where no one gets to order for themselves - could be fun, or terrible, or both :)\n\nSo', ), Email( sender: user_0, - recipients: [ - user_3, - user_2, - ], + recipients: [user_3, user_2], subject: 'Dinner Club', content: 'Yes! I forgot about that place! I’m definitely up for taking a risk this week and handing control over to this mysterious noodle chef. I wonder what happens if you have allergies though? Lucky none of us have any otherwise I’d be a bit concerned.\n\nThis is going to be great. See you all at the usual time?', @@ -284,14 +282,14 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import '../models/data.dart' as data; import '../models/models.dart'; import 'email_widget.dart'; import 'search_bar.dart' as search_bar; - + class EmailListView extends StatelessWidget { const EmailListView({ super.key, @@ -299,11 +297,11 @@ steps: this.onSelected, required this.currentUser, }); - + final int? selectedIndex; final ValueChanged? onSelected; final User currentUser; - + @override Widget build(BuildContext context) { return Padding( @@ -313,23 +311,21 @@ steps: const SizedBox(height: 8), search_bar.SearchBar(currentUser: currentUser), const SizedBox(height: 8), - ...List.generate( - data.emails.length, - (index) { - return Padding( - padding: const EdgeInsets.only(bottom: 8.0), - child: EmailWidget( - email: data.emails[index], - onSelected: onSelected != null - ? () { + ...List.generate(data.emails.length, (index) { + return Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: EmailWidget( + email: data.emails[index], + onSelected: + onSelected != null + ? () { onSelected!(index); } - : null, - isSelected: selectedIndex == index, - ), - ); - }, - ), + : null, + isSelected: selectedIndex == index, + ), + ); + }), ], ), ); @@ -346,11 +342,7 @@ steps: import '../models/models.dart'; import 'star_button.dart'; - enum EmailType { - preview, - threaded, - primaryThreaded, - } + enum EmailType { preview, threaded, primaryThreaded } class EmailWidget extends StatefulWidget { const EmailWidget({ @@ -382,10 +374,10 @@ steps: ); Color get _surfaceColor => switch (widget) { - EmailWidget(isPreview: false) => _colorScheme.surface, - EmailWidget(isSelected: true) => _colorScheme.primaryContainer, - _ => unselectedColor, - }; + EmailWidget(isPreview: false) => _colorScheme.surface, + EmailWidget(isSelected: true) => _colorScheme.primaryContainer, + _ => unselectedColor, + }; @override Widget build(BuildContext context) { @@ -400,10 +392,7 @@ steps: mainAxisSize: MainAxisSize.min, children: [ if (widget.showHeadline) ...[ - EmailHeadline( - email: widget.email, - isSelected: widget.isSelected, - ), + EmailHeadline(email: widget.email, isSelected: widget.isSelected), ], EmailContent( email: widget.email, @@ -457,12 +446,12 @@ steps: } TextStyle? get contentTextStyle => switch (widget) { - EmailContent(isThreaded: true) => _textTheme.bodyLarge, - EmailContent(isSelected: true) => _textTheme.bodyMedium - ?.copyWith(color: _colorScheme.onPrimaryContainer), - _ => - _textTheme.bodyMedium?.copyWith(color: _colorScheme.onSurfaceVariant), - }; + EmailContent(isThreaded: true) => _textTheme.bodyLarge, + EmailContent(isSelected: true) => _textTheme.bodyMedium?.copyWith( + color: _colorScheme.onPrimaryContainer, + ), + _ => _textTheme.bodyMedium?.copyWith(color: _colorScheme.onSurfaceVariant), + }; @override Widget build(BuildContext context) { @@ -471,49 +460,59 @@ steps: child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - LayoutBuilder(builder: (context, constraints) { - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - if (constraints.maxWidth - 200 > 0) ...[ - CircleAvatar( - backgroundImage: AssetImage(widget.email.sender.avatarUrl), - ), - const Padding(padding: EdgeInsets.symmetric(horizontal: 6.0)), - ], - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.email.sender.name.fullName, - overflow: TextOverflow.fade, - maxLines: 1, - style: widget.isSelected - ? _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSecondaryContainer) - : _textTheme.labelMedium - ?.copyWith(color: _colorScheme.onSurface), - ), - Text( - lastActiveLabel, - overflow: TextOverflow.fade, - maxLines: 1, - style: widget.isSelected - ? _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSecondaryContainer) - : _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSurfaceVariant), + LayoutBuilder( + builder: (context, constraints) { + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (constraints.maxWidth - 200 > 0) ...[ + CircleAvatar( + backgroundImage: AssetImage( + widget.email.sender.avatarUrl, ), - ], + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 6.0), + ), + ], + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.email.sender.name.fullName, + overflow: TextOverflow.fade, + maxLines: 1, + style: + widget.isSelected + ? _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSecondaryContainer, + ) + : _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSurface, + ), + ), + Text( + lastActiveLabel, + overflow: TextOverflow.fade, + maxLines: 1, + style: + widget.isSelected + ? _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSecondaryContainer, + ) + : _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSurfaceVariant, + ), + ), + ], + ), ), - ), - if (constraints.maxWidth - 200 > 0) ...[ - const StarButton(), - ] - ], - ); - }), + if (constraints.maxWidth - 200 > 0) ...[const StarButton()], + ], + ); + }, + ), const SizedBox(width: 8), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -521,8 +520,9 @@ steps: if (widget.isPreview) ...[ Text( widget.email.subject, - style: const TextStyle(fontSize: 18) - .copyWith(color: _colorScheme.onSurface), + style: const TextStyle( + fontSize: 18, + ).copyWith(color: _colorScheme.onSurface), ), ], if (widget.isThreaded) ...[ @@ -530,7 +530,7 @@ steps: Text( "To ${widget.email.recipients.map((recipient) => recipient.name.first).join(", ")}", style: _textTheme.bodyMedium, - ) + ), ], contentSpacer, Text( @@ -544,19 +544,17 @@ steps: const SizedBox(width: 12), widget.email.attachments.isNotEmpty ? Container( - height: 96, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8.0), - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage(widget.email.attachments.first.url), - ), + height: 96, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage(widget.email.attachments.first.url), ), - ) + ), + ) : const SizedBox.shrink(), - if (!widget.isPreview) ...[ - const EmailReplyOptions(), - ], + if (!widget.isPreview) ...[const EmailReplyOptions()], ], ), ); @@ -583,71 +581,76 @@ steps: @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - return Container( - height: 84, - color: Color.alphaBlend( - _colorScheme.primary.withAlpha(12), - _colorScheme.surface, - ), - child: Padding( - padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), - child: Row( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.email.subject, - maxLines: 1, - overflow: TextOverflow.fade, - style: const TextStyle( - fontSize: 18, fontWeight: FontWeight.w400), - ), - Text( - '${widget.email.replies.toString()} Messages', - maxLines: 1, - overflow: TextOverflow.fade, - style: _textTheme.labelMedium - ?.copyWith(fontWeight: FontWeight.w500), - ), - ], - ), - ), - // Display a "condensed" version if the widget in the row are - // expected to overflow. - if (constraints.maxWidth - 200 > 0) ...[ - SizedBox( - height: 40, - width: 40, - child: FloatingActionButton( - onPressed: () {}, - elevation: 0, - backgroundColor: _colorScheme.surface, - child: const Icon(Icons.delete_outline), + return LayoutBuilder( + builder: (context, constraints) { + return Container( + height: 84, + color: Color.alphaBlend( + _colorScheme.primary.withAlpha(12), + _colorScheme.surface, + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), + child: Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.email.subject, + maxLines: 1, + overflow: TextOverflow.fade, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w400, + ), + ), + Text( + '${widget.email.replies.toString()} Messages', + maxLines: 1, + overflow: TextOverflow.fade, + style: _textTheme.labelMedium?.copyWith( + fontWeight: FontWeight.w500, + ), + ), + ], ), ), - const Padding(padding: EdgeInsets.only(right: 8.0)), - SizedBox( - height: 40, - width: 40, - child: FloatingActionButton( - onPressed: () {}, - elevation: 0, - backgroundColor: _colorScheme.surface, - child: const Icon(Icons.more_vert), + // Display a "condensed" version if the widget in the row are + // expected to overflow. + if (constraints.maxWidth - 200 > 0) ...[ + SizedBox( + height: 40, + width: 40, + child: FloatingActionButton( + onPressed: () {}, + elevation: 0, + backgroundColor: _colorScheme.surface, + child: const Icon(Icons.delete_outline), + ), ), - ), - ] - ], + const Padding(padding: EdgeInsets.only(right: 8.0)), + SizedBox( + height: 40, + width: 40, + child: FloatingActionButton( + onPressed: () {}, + elevation: 0, + backgroundColor: _colorScheme.surface, + child: const Icon(Icons.more_vert), + ), + ), + ], + ], + ), ), - ), - ); - }); + ); + }, + ); } } @@ -673,8 +676,9 @@ steps: Expanded( child: TextButton( style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(_colorScheme.onInverseSurface), + backgroundColor: WidgetStateProperty.all( + _colorScheme.onInverseSurface, + ), ), onPressed: () {}, child: Text( @@ -687,8 +691,9 @@ steps: Expanded( child: TextButton( style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(_colorScheme.onInverseSurface), + backgroundColor: WidgetStateProperty.all( + _colorScheme.onInverseSurface, + ), ), onPressed: () {}, child: Text( @@ -709,19 +714,16 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import '../models/models.dart'; - + class SearchBar extends StatelessWidget { - const SearchBar({ - super.key, - required this.currentUser, - }); - + const SearchBar({super.key, required this.currentUser}); + final User currentUser; - + @override Widget build(BuildContext context) { return SizedBox( @@ -748,9 +750,7 @@ steps: ), ), ), - CircleAvatar( - backgroundImage: AssetImage(currentUser.avatarUrl), - ), + CircleAvatar(backgroundImage: AssetImage(currentUser.avatarUrl)), ], ), ), @@ -763,38 +763,34 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + class StarButton extends StatefulWidget { const StarButton({super.key}); - + @override State createState() => _StarButtonState(); } - + class _StarButtonState extends State { bool state = false; late final ColorScheme _colorScheme = Theme.of(context).colorScheme; - + Icon get icon { final IconData iconData = state ? Icons.star : Icons.star_outline; - - return Icon( - iconData, - color: Colors.grey, - size: 20, - ); + + return Icon(iconData, color: Colors.grey, size: 20); } - + void _toggle() { setState(() { state = !state; }); } - + double get turns => state ? 1 : 0; - + @override Widget build(BuildContext context) { return AnimatedRotation( @@ -806,10 +802,7 @@ steps: shape: const CircleBorder(), backgroundColor: _colorScheme.surface, onPressed: () => _toggle(), - child: Padding( - padding: const EdgeInsets.all(10.0), - child: icon, - ), + child: Padding(padding: const EdgeInsets.all(10.0), child: icon), ), ); } @@ -820,20 +813,20 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import 'models/data.dart' as data; import 'models/models.dart'; import 'widgets/email_list_view.dart'; - + void main() { runApp(const MainApp()); } - + class MainApp extends StatelessWidget { const MainApp({super.key}); - + @override Widget build(BuildContext context) { return MaterialApp( @@ -842,32 +835,29 @@ steps: ); } } - + class Feed extends StatefulWidget { - const Feed({ - super.key, - required this.currentUser, - }); - + const Feed({super.key, required this.currentUser}); + final User currentUser; - + @override State createState() => _FeedState(); } - + class _FeedState extends State { late final _colorScheme = Theme.of(context).colorScheme; late final _backgroundColor = Color.alphaBlend( - _colorScheme.primary.withAlpha(36), _colorScheme.surface); - + _colorScheme.primary.withAlpha(36), + _colorScheme.surface, + ); + @override Widget build(BuildContext context) { return Scaffold( body: Container( color: _backgroundColor, - child: EmailListView( - currentUser: widget.currentUser, - ), + child: EmailListView(currentUser: widget.currentUser), ), floatingActionButton: FloatingActionButton( backgroundColor: _colorScheme.tertiaryContainer, @@ -913,8 +903,8 @@ steps: - name: Patch lib/main.dart path: animated_responsive_layout/lib/main.dart patch-u: | - --- b/material-3-codelab/step_05/lib/main.dart - +++ a/material-3-codelab/step_05/lib/main.dart + --- b/animated-responsive-layout/step_05/lib/main.dart + +++ a/animated-responsive-layout/step_05/lib/main.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; @@ -923,9 +913,9 @@ steps: import 'models/data.dart' as data; import 'models/models.dart'; import 'widgets/email_list_view.dart'; - @@ -41,12 +42,20 @@ class _FeedState extends State { - late final _backgroundColor = Color.alphaBlend( - _colorScheme.primary.withAlpha(36), _colorScheme.surface); + @@ -40,12 +41,22 @@ class _FeedState extends State { + _colorScheme.surface, + ); + int selectedIndex = 0; + @@ -934,29 +924,30 @@ steps: return Scaffold( body: Container( color: _backgroundColor, - child: EmailListView( + - child: EmailListView(currentUser: widget.currentUser), + + child: EmailListView( + selectedIndex: selectedIndex, + onSelected: (index) { + setState(() { + selectedIndex = index; + }); + }, - currentUser: widget.currentUser, - ), + + currentUser: widget.currentUser, + + ), ), - @@ -56,6 +65,22 @@ class _FeedState extends State { + floatingActionButton: FloatingActionButton( + backgroundColor: _colorScheme.tertiaryContainer, + @@ -53,6 +64,20 @@ class _FeedState extends State { onPressed: () {}, child: const Icon(Icons.add), ), + bottomNavigationBar: NavigationBar( + elevation: 0, + backgroundColor: Colors.white, - + destinations: destinations.map((d) { - + return NavigationDestination( - + icon: Icon(d.icon), - + label: d.label, - + ); - + }).toList(), + + destinations: + + destinations.map((d) { + + return NavigationDestination(icon: Icon(d.icon), label: d.label); + + }).toList(), + selectedIndex: selectedIndex, + onDestinationSelected: (index) { + setState(() { @@ -984,32 +975,30 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import '../destinations.dart'; - + class DisappearingBottomNavigationBar extends StatelessWidget { const DisappearingBottomNavigationBar({ super.key, required this.selectedIndex, this.onDestinationSelected, }); - + final int selectedIndex; final ValueChanged? onDestinationSelected; - + @override Widget build(BuildContext context) { return NavigationBar( elevation: 0, backgroundColor: Colors.white, - destinations: destinations.map((d) { - return NavigationDestination( - icon: Icon(d.icon), - label: d.label, - ); - }).toList(), + destinations: + destinations.map((d) { + return NavigationDestination(icon: Icon(d.icon), label: d.label); + }).toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ); @@ -1021,11 +1010,11 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import '../destinations.dart'; - + class DisappearingNavigationRail extends StatelessWidget { const DisappearingNavigationRail({ super.key, @@ -1033,11 +1022,11 @@ steps: required this.selectedIndex, this.onDestinationSelected, }); - + final Color backgroundColor; final int selectedIndex; final ValueChanged? onDestinationSelected; - + @override Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; @@ -1047,16 +1036,11 @@ steps: onDestinationSelected: onDestinationSelected, leading: Column( children: [ - IconButton( - onPressed: () {}, - icon: const Icon(Icons.menu), - ), + IconButton(onPressed: () {}, icon: const Icon(Icons.menu)), const SizedBox(height: 8), FloatingActionButton( shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all( - Radius.circular(15), - ), + borderRadius: BorderRadius.all(Radius.circular(15)), ), backgroundColor: colorScheme.tertiaryContainer, foregroundColor: colorScheme.onTertiaryContainer, @@ -1066,20 +1050,21 @@ steps: ], ), groupAlignment: -0.85, - destinations: destinations.map((d) { - return NavigationRailDestination( - icon: Icon(d.icon), - label: Text(d.label), - ); - }).toList(), + destinations: + destinations.map((d) { + return NavigationRailDestination( + icon: Icon(d.icon), + label: Text(d.label), + ); + }).toList(), ); } } - name: Patch lib/main.dart path: animated_responsive_layout/lib/main.dart patch-u: | - --- b/material-3-codelab/step_06/lib/main.dart - +++ a/material-3-codelab/step_06/lib/main.dart + --- b/animated-responsive-layout/step_06/lib/main.dart + +++ a/animated-responsive-layout/step_06/lib/main.dart @@ -4,9 +4,10 @@ import 'package:flutter/material.dart'; @@ -1092,8 +1077,8 @@ steps: import 'widgets/email_list_view.dart'; void main() { - @@ -43,44 +44,65 @@ class _FeedState extends State { - _colorScheme.primary.withAlpha(36), _colorScheme.surface); + @@ -42,42 +43,67 @@ class _FeedState extends State { + ); int selectedIndex = 0; + bool wideScreen = false; @@ -1130,12 +1115,10 @@ steps: - bottomNavigationBar: NavigationBar( - elevation: 0, - backgroundColor: Colors.white, - - destinations: destinations.map((d) { - - return NavigationDestination( - - icon: Icon(d.icon), - - label: d.label, - - ); - - }).toList(), + - destinations: + - destinations.map((d) { + - return NavigationDestination(icon: Icon(d.icon), label: d.label); + - }).toList(), - selectedIndex: selectedIndex, - onDestinationSelected: (index) { - setState(() { @@ -1170,24 +1153,26 @@ steps: + ), + ], ), - + floatingActionButton: wideScreen - + ? null - + : FloatingActionButton( - + backgroundColor: _colorScheme.tertiaryContainer, - + foregroundColor: _colorScheme.onTertiaryContainer, - + onPressed: () {}, - + child: const Icon(Icons.add), - + ), - + bottomNavigationBar: wideScreen - + ? null - + : DisappearingBottomNavigationBar( - + selectedIndex: selectedIndex, - + onDestinationSelected: (index) { - + setState(() { - + selectedIndex = index; - + }); - + }, - + ), + + floatingActionButton: + + wideScreen + + ? null + + : FloatingActionButton( + + backgroundColor: _colorScheme.tertiaryContainer, + + foregroundColor: _colorScheme.onTertiaryContainer, + + onPressed: () {}, + + child: const Icon(Icons.add), + + ), + + bottomNavigationBar: + + wideScreen + + ? null + + : DisappearingBottomNavigationBar( + + selectedIndex: selectedIndex, + + onDestinationSelected: (index) { + + setState(() { + + selectedIndex = index; + + }); + + }, + + ), ); } } @@ -1208,92 +1193,90 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/animation.dart'; - + class BarAnimation extends ReverseAnimation { BarAnimation({required AnimationController parent}) - : super( - CurvedAnimation( - parent: parent, - curve: const Interval(0, 1 / 5), - reverseCurve: const Interval(1 / 5, 4 / 5), - ), - ); + : super( + CurvedAnimation( + parent: parent, + curve: const Interval(0, 1 / 5), + reverseCurve: const Interval(1 / 5, 4 / 5), + ), + ); } - + class OffsetAnimation extends CurvedAnimation { OffsetAnimation({required super.parent}) - : super( - curve: const Interval( - 2 / 5, - 3 / 5, - curve: Curves.easeInOutCubicEmphasized, - ), - reverseCurve: Interval( - 4 / 5, - 1, - curve: Curves.easeInOutCubicEmphasized.flipped, - ), - ); + : super( + curve: const Interval( + 2 / 5, + 3 / 5, + curve: Curves.easeInOutCubicEmphasized, + ), + reverseCurve: Interval( + 4 / 5, + 1, + curve: Curves.easeInOutCubicEmphasized.flipped, + ), + ); } - + class RailAnimation extends CurvedAnimation { RailAnimation({required super.parent}) - : super( - curve: const Interval(0 / 5, 4 / 5), - reverseCurve: const Interval(3 / 5, 1), - ); + : super( + curve: const Interval(0 / 5, 4 / 5), + reverseCurve: const Interval(3 / 5, 1), + ); } - + class RailFabAnimation extends CurvedAnimation { RailFabAnimation({required super.parent}) - : super( - curve: const Interval(3 / 5, 1), - ); + : super(curve: const Interval(3 / 5, 1)); } - + class ScaleAnimation extends CurvedAnimation { ScaleAnimation({required super.parent}) - : super( - curve: const Interval( - 3 / 5, - 4 / 5, - curve: Curves.easeInOutCubicEmphasized, - ), - reverseCurve: Interval( - 3 / 5, - 1, - curve: Curves.easeInOutCubicEmphasized.flipped, - ), - ); + : super( + curve: const Interval( + 3 / 5, + 4 / 5, + curve: Curves.easeInOutCubicEmphasized, + ), + reverseCurve: Interval( + 3 / 5, + 1, + curve: Curves.easeInOutCubicEmphasized.flipped, + ), + ); } - + class ShapeAnimation extends CurvedAnimation { ShapeAnimation({required super.parent}) - : super( - curve: const Interval( - 2 / 5, - 3 / 5, - curve: Curves.easeInOutCubicEmphasized, - ), - ); + : super( + curve: const Interval( + 2 / 5, + 3 / 5, + curve: Curves.easeInOutCubicEmphasized, + ), + ); } - + class SizeAnimation extends CurvedAnimation { SizeAnimation({required super.parent}) - : super( - curve: const Interval( - 0 / 5, - 3 / 5, - curve: Curves.easeInOutCubicEmphasized, - ), - reverseCurve: Interval( - 2 / 5, - 1, - curve: Curves.easeInOutCubicEmphasized.flipped, - ), - ); + : super( + curve: const Interval( + 0 / 5, + 3 / 5, + curve: Curves.easeInOutCubicEmphasized, + ), + reverseCurve: Interval( + 2 / 5, + 1, + curve: Curves.easeInOutCubicEmphasized.flipped, + ), + ); } - name: mkdir lib/transitions mkdir: animated_responsive_layout/lib/transitions @@ -1303,36 +1286,37 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import '../animations.dart'; - + class BottomBarTransition extends StatefulWidget { - const BottomBarTransition( - {super.key, - required this.animation, - required this.backgroundColor, - required this.child}); - + const BottomBarTransition({ + super.key, + required this.animation, + required this.backgroundColor, + required this.child, + }); + final Animation animation; final Color backgroundColor; final Widget child; - + @override State createState() => _BottomBarTransition(); } - + class _BottomBarTransition extends State { late final Animation offsetAnimation = Tween( begin: const Offset(0, 1), end: Offset.zero, ).animate(OffsetAnimation(parent: widget.animation)); - + late final Animation heightAnimation = Tween( begin: 0, end: 1, ).animate(SizeAnimation(parent: widget.animation)); - + @override Widget build(BuildContext context) { return ClipRect( @@ -1356,25 +1340,26 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import '../animations.dart'; - + class NavRailTransition extends StatefulWidget { - const NavRailTransition( - {super.key, - required this.animation, - required this.backgroundColor, - required this.child}); - + const NavRailTransition({ + super.key, + required this.animation, + required this.backgroundColor, + required this.child, + }); + final Animation animation; final Widget child; final Color backgroundColor; - + @override State createState() => _NavRailTransitionState(); } - + class _NavRailTransitionState extends State { // The animations are only rebuilt by this method when the text // direction changes because this widget only depends on Directionality. @@ -1387,7 +1372,7 @@ steps: begin: 0, end: 1, ).animate(SizeAnimation(parent: widget.animation)); - + @override Widget build(BuildContext context) { return ClipRect( @@ -1416,12 +1401,12 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:ui'; - + import 'package:flutter/material.dart'; import '../animations.dart'; - + class AnimatedFloatingActionButton extends StatefulWidget { const AnimatedFloatingActionButton({ super.key, @@ -1430,25 +1415,27 @@ steps: this.onPressed, this.child, }); - + final Animation animation; final VoidCallback? onPressed; final Widget? child; final double? elevation; - + @override State createState() => _AnimatedFloatingActionButton(); } - + class _AnimatedFloatingActionButton extends State { late final ColorScheme _colorScheme = Theme.of(context).colorScheme; - late final Animation _scaleAnimation = - ScaleAnimation(parent: widget.animation); - late final Animation _shapeAnimation = - ShapeAnimation(parent: widget.animation); - + late final Animation _scaleAnimation = ScaleAnimation( + parent: widget.animation, + ); + late final Animation _shapeAnimation = ShapeAnimation( + parent: widget.animation, + ); + @override Widget build(BuildContext context) { return ScaleTransition( @@ -1471,9 +1458,9 @@ steps: - name: Patch lib/widgets/disappearing_bottom_navigation_bar.dart path: animated_responsive_layout/lib/widgets/disappearing_bottom_navigation_bar.dart patch-u: | - --- b/material-3-codelab/step_07/lib/widgets/disappearing_bottom_navigation_bar.dart - +++ a/material-3-codelab/step_07/lib/widgets/disappearing_bottom_navigation_bar.dart - @@ -4,31 +4,39 @@ + --- b/animated-responsive-layout/step_07/lib/widgets/disappearing_bottom_navigation_bar.dart + +++ a/animated-responsive-layout/step_07/lib/widgets/disappearing_bottom_navigation_bar.dart + @@ -4,29 +4,37 @@ import 'package:flutter/material.dart'; @@ -1500,23 +1487,19 @@ steps: + return BottomBarTransition( + animation: barAnimation, backgroundColor: Colors.white, - - destinations: destinations.map((d) { - - return NavigationDestination( - - icon: Icon(d.icon), - - label: d.label, - - ); - - }).toList(), + - destinations: + - destinations.map((d) { + - return NavigationDestination(icon: Icon(d.icon), label: d.label); + - }).toList(), - selectedIndex: selectedIndex, - onDestinationSelected: onDestinationSelected, + child: NavigationBar( + elevation: 0, + backgroundColor: Colors.white, - + destinations: destinations.map((d) { - + return NavigationDestination( - + icon: Icon(d.icon), - + label: d.label, - + ); - + }).toList(), + + destinations: + + destinations.map((d) { + + return NavigationDestination(icon: Icon(d.icon), label: d.label); + + }).toList(), + selectedIndex: selectedIndex, + onDestinationSelected: onDestinationSelected, + ), @@ -1526,9 +1509,9 @@ steps: - name: Patch lib/widgets/disappearing_navigation_rail.dart path: animated_responsive_layout/lib/widgets/disappearing_navigation_rail.dart patch-u: | - --- b/material-3-codelab/step_07/lib/widgets/disappearing_navigation_rail.dart - +++ a/material-3-codelab/step_07/lib/widgets/disappearing_navigation_rail.dart - @@ -4,54 +4,59 @@ + --- b/animated-responsive-layout/step_07/lib/widgets/disappearing_navigation_rail.dart + +++ a/animated-responsive-layout/step_07/lib/widgets/disappearing_navigation_rail.dart + @@ -4,50 +4,57 @@ import 'package:flutter/material.dart'; @@ -1564,25 +1547,24 @@ steps: - onDestinationSelected: onDestinationSelected, - leading: Column( - children: [ - - IconButton( - - onPressed: () {}, - - icon: const Icon(Icons.menu), - - ), + - IconButton(onPressed: () {}, icon: const Icon(Icons.menu)), - const SizedBox(height: 8), - FloatingActionButton( - shape: const RoundedRectangleBorder( - - borderRadius: BorderRadius.all( - - Radius.circular(15), - - ), + - borderRadius: BorderRadius.all(Radius.circular(15)), + child: NavigationRail( + selectedIndex: selectedIndex, + backgroundColor: backgroundColor, + onDestinationSelected: onDestinationSelected, + leading: Column( + children: [ - + IconButton( + + IconButton(onPressed: () {}, icon: const Icon(Icons.menu)), + + const SizedBox(height: 8), + + AnimatedFloatingActionButton( + + animation: railFabAnimation, + + elevation: 0, + onPressed: () {}, - + icon: const Icon(Icons.menu), + + child: const Icon(Icons.add), ), - backgroundColor: colorScheme.tertiaryContainer, - foregroundColor: colorScheme.onTertiaryContainer, @@ -1590,38 +1572,33 @@ steps: - child: const Icon(Icons.add), - ), - ], - + const SizedBox(height: 8), - + AnimatedFloatingActionButton( - + animation: railFabAnimation, - + elevation: 0, - + onPressed: () {}, - + child: const Icon(Icons.add), - + ), + ], + ), + groupAlignment: -0.85, - + destinations: destinations.map((d) { - + return NavigationRailDestination( - + icon: Icon(d.icon), - + label: Text(d.label), - + ); - + }).toList(), + + destinations: + + destinations.map((d) { + + return NavigationRailDestination( + + icon: Icon(d.icon), + + label: Text(d.label), + + ); + + }).toList(), ), - groupAlignment: -0.85, - - destinations: destinations.map((d) { - - return NavigationRailDestination( - - icon: Icon(d.icon), - - label: Text(d.label), - - ); - - }).toList(), + - destinations: + - destinations.map((d) { + - return NavigationRailDestination( + - icon: Icon(d.icon), + - label: Text(d.label), + - ); + - }).toList(), ); } } - name: Patch lib/main.dart path: animated_responsive_layout/lib/main.dart patch-u: | - --- b/material-3-codelab/step_07/lib/main.dart - +++ a/material-3-codelab/step_07/lib/main.dart + --- b/animated-responsive-layout/step_07/lib/main.dart + +++ a/animated-responsive-layout/step_07/lib/main.dart @@ -4,8 +4,10 @@ import 'package:flutter/material.dart'; @@ -1633,7 +1610,7 @@ steps: import 'widgets/disappearing_bottom_navigation_bar.dart'; import 'widgets/disappearing_navigation_rail.dart'; import 'widgets/email_list_view.dart'; - @@ -38,71 +40,102 @@ class Feed extends StatefulWidget { + @@ -35,75 +37,105 @@ class Feed extends StatefulWidget { State createState() => _FeedState(); } @@ -1641,12 +1618,15 @@ steps: +class _FeedState extends State with SingleTickerProviderStateMixin { late final _colorScheme = Theme.of(context).colorScheme; late final _backgroundColor = Color.alphaBlend( - _colorScheme.primary.withAlpha(36), _colorScheme.surface); + _colorScheme.primary.withAlpha(36), + _colorScheme.surface, + ); + late final _controller = AnimationController( - + duration: const Duration(milliseconds: 1000), - + reverseDuration: const Duration(milliseconds: 1250), - + value: 0, - + vsync: this); + + duration: const Duration(milliseconds: 1000), + + reverseDuration: const Duration(milliseconds: 1250), + + value: 0, + + vsync: this, + + ); + late final _railAnimation = RailAnimation(parent: _controller); + late final _railFabAnimation = RailFabAnimation(parent: _controller); + late final _barAnimation = BarAnimation(parent: _controller); @@ -1704,6 +1684,31 @@ steps: - child: Container( - color: _backgroundColor, - child: EmailListView( + - selectedIndex: selectedIndex, + - onSelected: (index) { + - setState(() { + - selectedIndex = index; + - }); + - }, + - currentUser: widget.currentUser, + - ), + - ), + - ), + - ], + - ), + - floatingActionButton: + - wideScreen + - ? null + - : FloatingActionButton( + - backgroundColor: _colorScheme.tertiaryContainer, + - foregroundColor: _colorScheme.onTertiaryContainer, + - onPressed: () {}, + - child: const Icon(Icons.add), + - ), + - bottomNavigationBar: + - wideScreen + - ? null + - : DisappearingBottomNavigationBar( + return AnimatedBuilder( + animation: _controller, + builder: (context, _) { @@ -1714,16 +1719,13 @@ steps: + railAnimation: _railAnimation, + railFabAnimation: _railFabAnimation, selectedIndex: selectedIndex, - - onSelected: (index) { + backgroundColor: _backgroundColor, - + onDestinationSelected: (index) { + onDestinationSelected: (index) { setState(() { selectedIndex = index; }); }, - - currentUser: widget.currentUser, ), - - ), + Expanded( + child: Container( + color: _backgroundColor, @@ -1753,27 +1755,7 @@ steps: + selectedIndex = index; + }); + }, - ), - - ], - - ), - - floatingActionButton: wideScreen - - ? null - - : FloatingActionButton( - - backgroundColor: _colorScheme.tertiaryContainer, - - foregroundColor: _colorScheme.onTertiaryContainer, - - onPressed: () {}, - - child: const Icon(Icons.add), - - ), - - bottomNavigationBar: wideScreen - - ? null - - : DisappearingBottomNavigationBar( - - selectedIndex: selectedIndex, - - onDestinationSelected: (index) { - - setState(() { - - selectedIndex = index; - - }); - - }, - - ), + + ), + ); + }, ); @@ -1820,8 +1802,9 @@ steps: class _ListDetailTransitionState extends State { Animation widthAnimation = const AlwaysStoppedAnimation(0); - late final Animation sizeAnimation = - SizeAnimation(parent: widget.animation); + late final Animation sizeAnimation = SizeAnimation( + parent: widget.animation, + ); late final Animation offsetAnimation = Tween( begin: const Offset(1, 0), end: Offset.zero, @@ -1851,8 +1834,10 @@ steps: } if (currentFlexFactor == 0) { - widthAnimation = - Tween(begin: 0, end: nextFlexFactor).animate(sizeAnimation); + widthAnimation = Tween( + begin: 0, + end: nextFlexFactor, + ).animate(sizeAnimation); } else { final TweenSequence sequence = TweenSequence([ if (sizeAnimation.value > 0) ...[ @@ -1880,20 +1865,17 @@ steps: return widthAnimation.value.toInt() == 0 ? widget.one : Row( - children: [ - Flexible( - flex: 1000, - child: widget.one, - ), - Flexible( - flex: widthAnimation.value.toInt(), - child: FractionalTranslation( - translation: offsetAnimation.value, - child: widget.two, - ), + children: [ + Flexible(flex: 1000, child: widget.one), + Flexible( + flex: widthAnimation.value.toInt(), + child: FractionalTranslation( + translation: offsetAnimation.value, + child: widget.two, ), - ], - ); + ), + ], + ); } } - name: Create lib/widgets/reply_list_view.dart @@ -1937,8 +1919,8 @@ steps: - name: Update lib/main.dart path: animated_responsive_layout/lib/main.dart patch-u: | - --- b/material-3-codelab/step_08/lib/main.dart - +++ a/material-3-codelab/step_08/lib/main.dart + --- b/animated-responsive-layout/step_08/lib/main.dart + +++ a/animated-responsive-layout/step_08/lib/main.dart @@ -7,10 +7,12 @@ import 'package:flutter/material.dart'; import 'animations.dart'; import 'models/data.dart' as data; diff --git a/animated-responsive-layout/step_03/android/app/build.gradle b/animated-responsive-layout/step_03/android/app/build.gradle deleted file mode 100644 index 79a54d97fd..0000000000 --- a/animated-responsive-layout/step_03/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.animated_responsive_layout" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.animated_responsive_layout" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animated-responsive-layout/step_03/android/app/build.gradle.kts b/animated-responsive-layout/step_03/android/app/build.gradle.kts new file mode 100644 index 0000000000..5643237de3 --- /dev/null +++ b/animated-responsive-layout/step_03/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.animated_responsive_layout" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.animated_responsive_layout" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animated-responsive-layout/step_03/android/build.gradle b/animated-responsive-layout/step_03/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animated-responsive-layout/step_03/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animated-responsive-layout/step_03/android/build.gradle.kts b/animated-responsive-layout/step_03/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animated-responsive-layout/step_03/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animated-responsive-layout/step_03/android/gradle.properties b/animated-responsive-layout/step_03/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animated-responsive-layout/step_03/android/gradle.properties +++ b/animated-responsive-layout/step_03/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animated-responsive-layout/step_03/android/gradle/wrapper/gradle-wrapper.properties b/animated-responsive-layout/step_03/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animated-responsive-layout/step_03/android/gradle/wrapper/gradle-wrapper.properties +++ b/animated-responsive-layout/step_03/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animated-responsive-layout/step_03/android/settings.gradle b/animated-responsive-layout/step_03/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animated-responsive-layout/step_03/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animated-responsive-layout/step_03/android/settings.gradle.kts b/animated-responsive-layout/step_03/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animated-responsive-layout/step_03/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animated-responsive-layout/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animated-responsive-layout/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animated-responsive-layout/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animated-responsive-layout/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animated-responsive-layout/step_03/lib/main.dart b/animated-responsive-layout/step_03/lib/main.dart index a7256585ad..640824f765 100644 --- a/animated-responsive-layout/step_03/lib/main.dart +++ b/animated-responsive-layout/step_03/lib/main.dart @@ -10,11 +10,7 @@ class MainApp extends StatelessWidget { @override Widget build(BuildContext context) { return const MaterialApp( - home: Scaffold( - body: Center( - child: Text('Hello World!'), - ), - ), + home: Scaffold(body: Center(child: Text('Hello World!'))), ); } } diff --git a/animated-responsive-layout/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animated-responsive-layout/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 6784a9060a..8307189d5d 100644 --- a/animated-responsive-layout/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animated-responsive-layout/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animated-responsive-layout/step_03/pubspec.yaml b/animated-responsive-layout/step_03/pubspec.yaml index 6efd54e69c..e8f6f66e41 100644 --- a/animated-responsive-layout/step_03/pubspec.yaml +++ b/animated-responsive-layout/step_03/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/animated-responsive-layout/step_04/android/app/build.gradle b/animated-responsive-layout/step_04/android/app/build.gradle deleted file mode 100644 index 79a54d97fd..0000000000 --- a/animated-responsive-layout/step_04/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.animated_responsive_layout" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.animated_responsive_layout" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animated-responsive-layout/step_04/android/app/build.gradle.kts b/animated-responsive-layout/step_04/android/app/build.gradle.kts new file mode 100644 index 0000000000..5643237de3 --- /dev/null +++ b/animated-responsive-layout/step_04/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.animated_responsive_layout" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.animated_responsive_layout" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animated-responsive-layout/step_04/android/build.gradle b/animated-responsive-layout/step_04/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animated-responsive-layout/step_04/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animated-responsive-layout/step_04/android/build.gradle.kts b/animated-responsive-layout/step_04/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animated-responsive-layout/step_04/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animated-responsive-layout/step_04/android/gradle.properties b/animated-responsive-layout/step_04/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animated-responsive-layout/step_04/android/gradle.properties +++ b/animated-responsive-layout/step_04/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animated-responsive-layout/step_04/android/gradle/wrapper/gradle-wrapper.properties b/animated-responsive-layout/step_04/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animated-responsive-layout/step_04/android/gradle/wrapper/gradle-wrapper.properties +++ b/animated-responsive-layout/step_04/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animated-responsive-layout/step_04/android/settings.gradle b/animated-responsive-layout/step_04/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animated-responsive-layout/step_04/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animated-responsive-layout/step_04/android/settings.gradle.kts b/animated-responsive-layout/step_04/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animated-responsive-layout/step_04/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animated-responsive-layout/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animated-responsive-layout/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animated-responsive-layout/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animated-responsive-layout/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animated-responsive-layout/step_04/lib/main.dart b/animated-responsive-layout/step_04/lib/main.dart index a39c0c698e..1eedcd7fe6 100644 --- a/animated-responsive-layout/step_04/lib/main.dart +++ b/animated-responsive-layout/step_04/lib/main.dart @@ -25,10 +25,7 @@ class MainApp extends StatelessWidget { } class Feed extends StatefulWidget { - const Feed({ - super.key, - required this.currentUser, - }); + const Feed({super.key, required this.currentUser}); final User currentUser; @@ -39,16 +36,16 @@ class Feed extends StatefulWidget { class _FeedState extends State { late final _colorScheme = Theme.of(context).colorScheme; late final _backgroundColor = Color.alphaBlend( - _colorScheme.primary.withAlpha(36), _colorScheme.surface); + _colorScheme.primary.withAlpha(36), + _colorScheme.surface, + ); @override Widget build(BuildContext context) { return Scaffold( body: Container( color: _backgroundColor, - child: EmailListView( - currentUser: widget.currentUser, - ), + child: EmailListView(currentUser: widget.currentUser), ), floatingActionButton: FloatingActionButton( backgroundColor: _colorScheme.tertiaryContainer, diff --git a/animated-responsive-layout/step_04/lib/models/data.dart b/animated-responsive-layout/step_04/lib/models/data.dart index 141ce9d588..097304290b 100644 --- a/animated-responsive-layout/step_04/lib/models/data.dart +++ b/animated-responsive-layout/step_04/lib/models/data.dart @@ -5,25 +5,30 @@ import 'models.dart'; final User user_0 = User( - name: const Name(first: 'Me', last: ''), - avatarUrl: 'assets/avatar_1.png', - lastActive: DateTime.now()); + name: const Name(first: 'Me', last: ''), + avatarUrl: 'assets/avatar_1.png', + lastActive: DateTime.now(), +); final User user_1 = User( - name: const Name(first: '老', last: '强'), - avatarUrl: 'assets/avatar_2.png', - lastActive: DateTime.now().subtract(const Duration(minutes: 10))); + name: const Name(first: '老', last: '强'), + avatarUrl: 'assets/avatar_2.png', + lastActive: DateTime.now().subtract(const Duration(minutes: 10)), +); final User user_2 = User( - name: const Name(first: 'So', last: 'Duri'), - avatarUrl: 'assets/avatar_3.png', - lastActive: DateTime.now().subtract(const Duration(minutes: 20))); + name: const Name(first: 'So', last: 'Duri'), + avatarUrl: 'assets/avatar_3.png', + lastActive: DateTime.now().subtract(const Duration(minutes: 20)), +); final User user_3 = User( - name: const Name(first: 'Lily', last: 'MacDonald'), - avatarUrl: 'assets/avatar_4.png', - lastActive: DateTime.now().subtract(const Duration(hours: 2))); + name: const Name(first: 'Lily', last: 'MacDonald'), + avatarUrl: 'assets/avatar_4.png', + lastActive: DateTime.now().subtract(const Duration(hours: 2)), +); final User user_4 = User( - name: const Name(first: 'Ziad', last: 'Aouad'), - avatarUrl: 'assets/avatar_5.png', - lastActive: DateTime.now().subtract(const Duration(hours: 6))); + name: const Name(first: 'Ziad', last: 'Aouad'), + avatarUrl: 'assets/avatar_5.png', + lastActive: DateTime.now().subtract(const Duration(hours: 6)), +); final List emails = [ Email( @@ -40,12 +45,13 @@ final List emails = [ 'I think it’s time for us to finally try that new noodle shop downtown that doesn’t use menus. Anyone else have other suggestions for dinner club this week? I’m so intrigued by this idea of a noodle restaurant where no one gets to order for themselves - could be fun, or terrible, or both :)\n\nSo', ), Email( - sender: user_3, - recipients: [], - subject: 'This food show is made for you', - content: - 'Ping– you’d love this new food show I started watching. It’s produced by a Thai drummer who started getting recognized for the amazing vegan food she always brought to shows.', - attachments: [const Attachment(url: 'assets/thumbnail_1.png')]), + sender: user_3, + recipients: [], + subject: 'This food show is made for you', + content: + 'Ping– you’d love this new food show I started watching. It’s produced by a Thai drummer who started getting recognized for the amazing vegan food she always brought to shows.', + attachments: [const Attachment(url: 'assets/thumbnail_1.png')], + ), Email( sender: user_4, recipients: [], @@ -58,20 +64,14 @@ final List emails = [ final List replies = [ Email( sender: user_2, - recipients: [ - user_3, - user_2, - ], + recipients: [user_3, user_2], subject: 'Dinner Club', content: 'I think it’s time for us to finally try that new noodle shop downtown that doesn’t use menus. Anyone else have other suggestions for dinner club this week? I’m so intrigued by this idea of a noodle restaurant where no one gets to order for themselves - could be fun, or terrible, or both :)\n\nSo', ), Email( sender: user_0, - recipients: [ - user_3, - user_2, - ], + recipients: [user_3, user_2], subject: 'Dinner Club', content: 'Yes! I forgot about that place! I’m definitely up for taking a risk this week and handing control over to this mysterious noodle chef. I wonder what happens if you have allergies though? Lucky none of us have any otherwise I’d be a bit concerned.\n\nThis is going to be great. See you all at the usual time?', diff --git a/animated-responsive-layout/step_04/lib/models/models.dart b/animated-responsive-layout/step_04/lib/models/models.dart index c6fe69e010..6b1f3d95d6 100644 --- a/animated-responsive-layout/step_04/lib/models/models.dart +++ b/animated-responsive-layout/step_04/lib/models/models.dart @@ -3,9 +3,7 @@ // found in the LICENSE file. class Attachment { - const Attachment({ - required this.url, - }); + const Attachment({required this.url}); final String url; } @@ -29,10 +27,7 @@ class Email { } class Name { - const Name({ - required this.first, - required this.last, - }); + const Name({required this.first, required this.last}); final String first; final String last; diff --git a/animated-responsive-layout/step_04/lib/widgets/email_list_view.dart b/animated-responsive-layout/step_04/lib/widgets/email_list_view.dart index 881cd434c1..38a751af1c 100644 --- a/animated-responsive-layout/step_04/lib/widgets/email_list_view.dart +++ b/animated-responsive-layout/step_04/lib/widgets/email_list_view.dart @@ -30,23 +30,21 @@ class EmailListView extends StatelessWidget { const SizedBox(height: 8), search_bar.SearchBar(currentUser: currentUser), const SizedBox(height: 8), - ...List.generate( - data.emails.length, - (index) { - return Padding( - padding: const EdgeInsets.only(bottom: 8.0), - child: EmailWidget( - email: data.emails[index], - onSelected: onSelected != null - ? () { + ...List.generate(data.emails.length, (index) { + return Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: EmailWidget( + email: data.emails[index], + onSelected: + onSelected != null + ? () { onSelected!(index); } - : null, - isSelected: selectedIndex == index, - ), - ); - }, - ), + : null, + isSelected: selectedIndex == index, + ), + ); + }), ], ), ); diff --git a/animated-responsive-layout/step_04/lib/widgets/email_widget.dart b/animated-responsive-layout/step_04/lib/widgets/email_widget.dart index cb317686d6..8e37f4d8bc 100644 --- a/animated-responsive-layout/step_04/lib/widgets/email_widget.dart +++ b/animated-responsive-layout/step_04/lib/widgets/email_widget.dart @@ -6,11 +6,7 @@ import 'package:flutter/material.dart'; import '../models/models.dart'; import 'star_button.dart'; -enum EmailType { - preview, - threaded, - primaryThreaded, -} +enum EmailType { preview, threaded, primaryThreaded } class EmailWidget extends StatefulWidget { const EmailWidget({ @@ -42,10 +38,10 @@ class _EmailWidgetState extends State { ); Color get _surfaceColor => switch (widget) { - EmailWidget(isPreview: false) => _colorScheme.surface, - EmailWidget(isSelected: true) => _colorScheme.primaryContainer, - _ => unselectedColor, - }; + EmailWidget(isPreview: false) => _colorScheme.surface, + EmailWidget(isSelected: true) => _colorScheme.primaryContainer, + _ => unselectedColor, + }; @override Widget build(BuildContext context) { @@ -60,10 +56,7 @@ class _EmailWidgetState extends State { mainAxisSize: MainAxisSize.min, children: [ if (widget.showHeadline) ...[ - EmailHeadline( - email: widget.email, - isSelected: widget.isSelected, - ), + EmailHeadline(email: widget.email, isSelected: widget.isSelected), ], EmailContent( email: widget.email, @@ -117,12 +110,12 @@ class _EmailContentState extends State { } TextStyle? get contentTextStyle => switch (widget) { - EmailContent(isThreaded: true) => _textTheme.bodyLarge, - EmailContent(isSelected: true) => _textTheme.bodyMedium - ?.copyWith(color: _colorScheme.onPrimaryContainer), - _ => - _textTheme.bodyMedium?.copyWith(color: _colorScheme.onSurfaceVariant), - }; + EmailContent(isThreaded: true) => _textTheme.bodyLarge, + EmailContent(isSelected: true) => _textTheme.bodyMedium?.copyWith( + color: _colorScheme.onPrimaryContainer, + ), + _ => _textTheme.bodyMedium?.copyWith(color: _colorScheme.onSurfaceVariant), + }; @override Widget build(BuildContext context) { @@ -131,49 +124,59 @@ class _EmailContentState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - LayoutBuilder(builder: (context, constraints) { - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - if (constraints.maxWidth - 200 > 0) ...[ - CircleAvatar( - backgroundImage: AssetImage(widget.email.sender.avatarUrl), - ), - const Padding(padding: EdgeInsets.symmetric(horizontal: 6.0)), - ], - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.email.sender.name.fullName, - overflow: TextOverflow.fade, - maxLines: 1, - style: widget.isSelected - ? _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSecondaryContainer) - : _textTheme.labelMedium - ?.copyWith(color: _colorScheme.onSurface), - ), - Text( - lastActiveLabel, - overflow: TextOverflow.fade, - maxLines: 1, - style: widget.isSelected - ? _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSecondaryContainer) - : _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSurfaceVariant), + LayoutBuilder( + builder: (context, constraints) { + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (constraints.maxWidth - 200 > 0) ...[ + CircleAvatar( + backgroundImage: AssetImage( + widget.email.sender.avatarUrl, ), - ], + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 6.0), + ), + ], + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.email.sender.name.fullName, + overflow: TextOverflow.fade, + maxLines: 1, + style: + widget.isSelected + ? _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSecondaryContainer, + ) + : _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSurface, + ), + ), + Text( + lastActiveLabel, + overflow: TextOverflow.fade, + maxLines: 1, + style: + widget.isSelected + ? _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSecondaryContainer, + ) + : _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSurfaceVariant, + ), + ), + ], + ), ), - ), - if (constraints.maxWidth - 200 > 0) ...[ - const StarButton(), - ] - ], - ); - }), + if (constraints.maxWidth - 200 > 0) ...[const StarButton()], + ], + ); + }, + ), const SizedBox(width: 8), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -181,8 +184,9 @@ class _EmailContentState extends State { if (widget.isPreview) ...[ Text( widget.email.subject, - style: const TextStyle(fontSize: 18) - .copyWith(color: _colorScheme.onSurface), + style: const TextStyle( + fontSize: 18, + ).copyWith(color: _colorScheme.onSurface), ), ], if (widget.isThreaded) ...[ @@ -190,7 +194,7 @@ class _EmailContentState extends State { Text( "To ${widget.email.recipients.map((recipient) => recipient.name.first).join(", ")}", style: _textTheme.bodyMedium, - ) + ), ], contentSpacer, Text( @@ -204,19 +208,17 @@ class _EmailContentState extends State { const SizedBox(width: 12), widget.email.attachments.isNotEmpty ? Container( - height: 96, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8.0), - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage(widget.email.attachments.first.url), - ), + height: 96, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage(widget.email.attachments.first.url), ), - ) + ), + ) : const SizedBox.shrink(), - if (!widget.isPreview) ...[ - const EmailReplyOptions(), - ], + if (!widget.isPreview) ...[const EmailReplyOptions()], ], ), ); @@ -243,71 +245,76 @@ class _EmailHeadlineState extends State { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - return Container( - height: 84, - color: Color.alphaBlend( - _colorScheme.primary.withAlpha(12), - _colorScheme.surface, - ), - child: Padding( - padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), - child: Row( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.email.subject, - maxLines: 1, - overflow: TextOverflow.fade, - style: const TextStyle( - fontSize: 18, fontWeight: FontWeight.w400), - ), - Text( - '${widget.email.replies.toString()} Messages', - maxLines: 1, - overflow: TextOverflow.fade, - style: _textTheme.labelMedium - ?.copyWith(fontWeight: FontWeight.w500), - ), - ], - ), - ), - // Display a "condensed" version if the widget in the row are - // expected to overflow. - if (constraints.maxWidth - 200 > 0) ...[ - SizedBox( - height: 40, - width: 40, - child: FloatingActionButton( - onPressed: () {}, - elevation: 0, - backgroundColor: _colorScheme.surface, - child: const Icon(Icons.delete_outline), + return LayoutBuilder( + builder: (context, constraints) { + return Container( + height: 84, + color: Color.alphaBlend( + _colorScheme.primary.withAlpha(12), + _colorScheme.surface, + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), + child: Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.email.subject, + maxLines: 1, + overflow: TextOverflow.fade, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w400, + ), + ), + Text( + '${widget.email.replies.toString()} Messages', + maxLines: 1, + overflow: TextOverflow.fade, + style: _textTheme.labelMedium?.copyWith( + fontWeight: FontWeight.w500, + ), + ), + ], ), ), - const Padding(padding: EdgeInsets.only(right: 8.0)), - SizedBox( - height: 40, - width: 40, - child: FloatingActionButton( - onPressed: () {}, - elevation: 0, - backgroundColor: _colorScheme.surface, - child: const Icon(Icons.more_vert), + // Display a "condensed" version if the widget in the row are + // expected to overflow. + if (constraints.maxWidth - 200 > 0) ...[ + SizedBox( + height: 40, + width: 40, + child: FloatingActionButton( + onPressed: () {}, + elevation: 0, + backgroundColor: _colorScheme.surface, + child: const Icon(Icons.delete_outline), + ), ), - ), - ] - ], + const Padding(padding: EdgeInsets.only(right: 8.0)), + SizedBox( + height: 40, + width: 40, + child: FloatingActionButton( + onPressed: () {}, + elevation: 0, + backgroundColor: _colorScheme.surface, + child: const Icon(Icons.more_vert), + ), + ), + ], + ], + ), ), - ), - ); - }); + ); + }, + ); } } @@ -333,8 +340,9 @@ class _EmailReplyOptionsState extends State { Expanded( child: TextButton( style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(_colorScheme.onInverseSurface), + backgroundColor: WidgetStateProperty.all( + _colorScheme.onInverseSurface, + ), ), onPressed: () {}, child: Text( @@ -347,8 +355,9 @@ class _EmailReplyOptionsState extends State { Expanded( child: TextButton( style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(_colorScheme.onInverseSurface), + backgroundColor: WidgetStateProperty.all( + _colorScheme.onInverseSurface, + ), ), onPressed: () {}, child: Text( diff --git a/animated-responsive-layout/step_04/lib/widgets/search_bar.dart b/animated-responsive-layout/step_04/lib/widgets/search_bar.dart index 28a15c3ef0..92d91750c6 100644 --- a/animated-responsive-layout/step_04/lib/widgets/search_bar.dart +++ b/animated-responsive-layout/step_04/lib/widgets/search_bar.dart @@ -7,10 +7,7 @@ import 'package:flutter/material.dart'; import '../models/models.dart'; class SearchBar extends StatelessWidget { - const SearchBar({ - super.key, - required this.currentUser, - }); + const SearchBar({super.key, required this.currentUser}); final User currentUser; @@ -40,9 +37,7 @@ class SearchBar extends StatelessWidget { ), ), ), - CircleAvatar( - backgroundImage: AssetImage(currentUser.avatarUrl), - ), + CircleAvatar(backgroundImage: AssetImage(currentUser.avatarUrl)), ], ), ), diff --git a/animated-responsive-layout/step_04/lib/widgets/star_button.dart b/animated-responsive-layout/step_04/lib/widgets/star_button.dart index 95c1c79ee2..441c83570f 100644 --- a/animated-responsive-layout/step_04/lib/widgets/star_button.dart +++ b/animated-responsive-layout/step_04/lib/widgets/star_button.dart @@ -18,11 +18,7 @@ class _StarButtonState extends State { Icon get icon { final IconData iconData = state ? Icons.star : Icons.star_outline; - return Icon( - iconData, - color: Colors.grey, - size: 20, - ); + return Icon(iconData, color: Colors.grey, size: 20); } void _toggle() { @@ -44,10 +40,7 @@ class _StarButtonState extends State { shape: const CircleBorder(), backgroundColor: _colorScheme.surface, onPressed: () => _toggle(), - child: Padding( - padding: const EdgeInsets.all(10.0), - child: icon, - ), + child: Padding(padding: const EdgeInsets.all(10.0), child: icon), ), ); } diff --git a/animated-responsive-layout/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animated-responsive-layout/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 6784a9060a..8307189d5d 100644 --- a/animated-responsive-layout/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animated-responsive-layout/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animated-responsive-layout/step_04/pubspec.yaml b/animated-responsive-layout/step_04/pubspec.yaml index e66a7947a0..51fe30860f 100644 --- a/animated-responsive-layout/step_04/pubspec.yaml +++ b/animated-responsive-layout/step_04/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/animated-responsive-layout/step_05/android/app/build.gradle b/animated-responsive-layout/step_05/android/app/build.gradle deleted file mode 100644 index 79a54d97fd..0000000000 --- a/animated-responsive-layout/step_05/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.animated_responsive_layout" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.animated_responsive_layout" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animated-responsive-layout/step_05/android/app/build.gradle.kts b/animated-responsive-layout/step_05/android/app/build.gradle.kts new file mode 100644 index 0000000000..5643237de3 --- /dev/null +++ b/animated-responsive-layout/step_05/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.animated_responsive_layout" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.animated_responsive_layout" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animated-responsive-layout/step_05/android/build.gradle b/animated-responsive-layout/step_05/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animated-responsive-layout/step_05/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animated-responsive-layout/step_05/android/build.gradle.kts b/animated-responsive-layout/step_05/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animated-responsive-layout/step_05/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animated-responsive-layout/step_05/android/gradle.properties b/animated-responsive-layout/step_05/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animated-responsive-layout/step_05/android/gradle.properties +++ b/animated-responsive-layout/step_05/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animated-responsive-layout/step_05/android/gradle/wrapper/gradle-wrapper.properties b/animated-responsive-layout/step_05/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animated-responsive-layout/step_05/android/gradle/wrapper/gradle-wrapper.properties +++ b/animated-responsive-layout/step_05/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animated-responsive-layout/step_05/android/settings.gradle b/animated-responsive-layout/step_05/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animated-responsive-layout/step_05/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animated-responsive-layout/step_05/android/settings.gradle.kts b/animated-responsive-layout/step_05/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animated-responsive-layout/step_05/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animated-responsive-layout/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animated-responsive-layout/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animated-responsive-layout/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animated-responsive-layout/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animated-responsive-layout/step_05/lib/main.dart b/animated-responsive-layout/step_05/lib/main.dart index facc35e85c..1647179967 100644 --- a/animated-responsive-layout/step_05/lib/main.dart +++ b/animated-responsive-layout/step_05/lib/main.dart @@ -26,10 +26,7 @@ class MainApp extends StatelessWidget { } class Feed extends StatefulWidget { - const Feed({ - super.key, - required this.currentUser, - }); + const Feed({super.key, required this.currentUser}); final User currentUser; @@ -40,7 +37,9 @@ class Feed extends StatefulWidget { class _FeedState extends State { late final _colorScheme = Theme.of(context).colorScheme; late final _backgroundColor = Color.alphaBlend( - _colorScheme.primary.withAlpha(36), _colorScheme.surface); + _colorScheme.primary.withAlpha(36), + _colorScheme.surface, + ); int selectedIndex = 0; @@ -68,12 +67,10 @@ class _FeedState extends State { bottomNavigationBar: NavigationBar( elevation: 0, backgroundColor: Colors.white, - destinations: destinations.map((d) { - return NavigationDestination( - icon: Icon(d.icon), - label: d.label, - ); - }).toList(), + destinations: + destinations.map((d) { + return NavigationDestination(icon: Icon(d.icon), label: d.label); + }).toList(), selectedIndex: selectedIndex, onDestinationSelected: (index) { setState(() { diff --git a/animated-responsive-layout/step_05/lib/models/data.dart b/animated-responsive-layout/step_05/lib/models/data.dart index 141ce9d588..097304290b 100644 --- a/animated-responsive-layout/step_05/lib/models/data.dart +++ b/animated-responsive-layout/step_05/lib/models/data.dart @@ -5,25 +5,30 @@ import 'models.dart'; final User user_0 = User( - name: const Name(first: 'Me', last: ''), - avatarUrl: 'assets/avatar_1.png', - lastActive: DateTime.now()); + name: const Name(first: 'Me', last: ''), + avatarUrl: 'assets/avatar_1.png', + lastActive: DateTime.now(), +); final User user_1 = User( - name: const Name(first: '老', last: '强'), - avatarUrl: 'assets/avatar_2.png', - lastActive: DateTime.now().subtract(const Duration(minutes: 10))); + name: const Name(first: '老', last: '强'), + avatarUrl: 'assets/avatar_2.png', + lastActive: DateTime.now().subtract(const Duration(minutes: 10)), +); final User user_2 = User( - name: const Name(first: 'So', last: 'Duri'), - avatarUrl: 'assets/avatar_3.png', - lastActive: DateTime.now().subtract(const Duration(minutes: 20))); + name: const Name(first: 'So', last: 'Duri'), + avatarUrl: 'assets/avatar_3.png', + lastActive: DateTime.now().subtract(const Duration(minutes: 20)), +); final User user_3 = User( - name: const Name(first: 'Lily', last: 'MacDonald'), - avatarUrl: 'assets/avatar_4.png', - lastActive: DateTime.now().subtract(const Duration(hours: 2))); + name: const Name(first: 'Lily', last: 'MacDonald'), + avatarUrl: 'assets/avatar_4.png', + lastActive: DateTime.now().subtract(const Duration(hours: 2)), +); final User user_4 = User( - name: const Name(first: 'Ziad', last: 'Aouad'), - avatarUrl: 'assets/avatar_5.png', - lastActive: DateTime.now().subtract(const Duration(hours: 6))); + name: const Name(first: 'Ziad', last: 'Aouad'), + avatarUrl: 'assets/avatar_5.png', + lastActive: DateTime.now().subtract(const Duration(hours: 6)), +); final List emails = [ Email( @@ -40,12 +45,13 @@ final List emails = [ 'I think it’s time for us to finally try that new noodle shop downtown that doesn’t use menus. Anyone else have other suggestions for dinner club this week? I’m so intrigued by this idea of a noodle restaurant where no one gets to order for themselves - could be fun, or terrible, or both :)\n\nSo', ), Email( - sender: user_3, - recipients: [], - subject: 'This food show is made for you', - content: - 'Ping– you’d love this new food show I started watching. It’s produced by a Thai drummer who started getting recognized for the amazing vegan food she always brought to shows.', - attachments: [const Attachment(url: 'assets/thumbnail_1.png')]), + sender: user_3, + recipients: [], + subject: 'This food show is made for you', + content: + 'Ping– you’d love this new food show I started watching. It’s produced by a Thai drummer who started getting recognized for the amazing vegan food she always brought to shows.', + attachments: [const Attachment(url: 'assets/thumbnail_1.png')], + ), Email( sender: user_4, recipients: [], @@ -58,20 +64,14 @@ final List emails = [ final List replies = [ Email( sender: user_2, - recipients: [ - user_3, - user_2, - ], + recipients: [user_3, user_2], subject: 'Dinner Club', content: 'I think it’s time for us to finally try that new noodle shop downtown that doesn’t use menus. Anyone else have other suggestions for dinner club this week? I’m so intrigued by this idea of a noodle restaurant where no one gets to order for themselves - could be fun, or terrible, or both :)\n\nSo', ), Email( sender: user_0, - recipients: [ - user_3, - user_2, - ], + recipients: [user_3, user_2], subject: 'Dinner Club', content: 'Yes! I forgot about that place! I’m definitely up for taking a risk this week and handing control over to this mysterious noodle chef. I wonder what happens if you have allergies though? Lucky none of us have any otherwise I’d be a bit concerned.\n\nThis is going to be great. See you all at the usual time?', diff --git a/animated-responsive-layout/step_05/lib/models/models.dart b/animated-responsive-layout/step_05/lib/models/models.dart index c6fe69e010..6b1f3d95d6 100644 --- a/animated-responsive-layout/step_05/lib/models/models.dart +++ b/animated-responsive-layout/step_05/lib/models/models.dart @@ -3,9 +3,7 @@ // found in the LICENSE file. class Attachment { - const Attachment({ - required this.url, - }); + const Attachment({required this.url}); final String url; } @@ -29,10 +27,7 @@ class Email { } class Name { - const Name({ - required this.first, - required this.last, - }); + const Name({required this.first, required this.last}); final String first; final String last; diff --git a/animated-responsive-layout/step_05/lib/widgets/email_list_view.dart b/animated-responsive-layout/step_05/lib/widgets/email_list_view.dart index 881cd434c1..38a751af1c 100644 --- a/animated-responsive-layout/step_05/lib/widgets/email_list_view.dart +++ b/animated-responsive-layout/step_05/lib/widgets/email_list_view.dart @@ -30,23 +30,21 @@ class EmailListView extends StatelessWidget { const SizedBox(height: 8), search_bar.SearchBar(currentUser: currentUser), const SizedBox(height: 8), - ...List.generate( - data.emails.length, - (index) { - return Padding( - padding: const EdgeInsets.only(bottom: 8.0), - child: EmailWidget( - email: data.emails[index], - onSelected: onSelected != null - ? () { + ...List.generate(data.emails.length, (index) { + return Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: EmailWidget( + email: data.emails[index], + onSelected: + onSelected != null + ? () { onSelected!(index); } - : null, - isSelected: selectedIndex == index, - ), - ); - }, - ), + : null, + isSelected: selectedIndex == index, + ), + ); + }), ], ), ); diff --git a/animated-responsive-layout/step_05/lib/widgets/email_widget.dart b/animated-responsive-layout/step_05/lib/widgets/email_widget.dart index cb317686d6..8e37f4d8bc 100644 --- a/animated-responsive-layout/step_05/lib/widgets/email_widget.dart +++ b/animated-responsive-layout/step_05/lib/widgets/email_widget.dart @@ -6,11 +6,7 @@ import 'package:flutter/material.dart'; import '../models/models.dart'; import 'star_button.dart'; -enum EmailType { - preview, - threaded, - primaryThreaded, -} +enum EmailType { preview, threaded, primaryThreaded } class EmailWidget extends StatefulWidget { const EmailWidget({ @@ -42,10 +38,10 @@ class _EmailWidgetState extends State { ); Color get _surfaceColor => switch (widget) { - EmailWidget(isPreview: false) => _colorScheme.surface, - EmailWidget(isSelected: true) => _colorScheme.primaryContainer, - _ => unselectedColor, - }; + EmailWidget(isPreview: false) => _colorScheme.surface, + EmailWidget(isSelected: true) => _colorScheme.primaryContainer, + _ => unselectedColor, + }; @override Widget build(BuildContext context) { @@ -60,10 +56,7 @@ class _EmailWidgetState extends State { mainAxisSize: MainAxisSize.min, children: [ if (widget.showHeadline) ...[ - EmailHeadline( - email: widget.email, - isSelected: widget.isSelected, - ), + EmailHeadline(email: widget.email, isSelected: widget.isSelected), ], EmailContent( email: widget.email, @@ -117,12 +110,12 @@ class _EmailContentState extends State { } TextStyle? get contentTextStyle => switch (widget) { - EmailContent(isThreaded: true) => _textTheme.bodyLarge, - EmailContent(isSelected: true) => _textTheme.bodyMedium - ?.copyWith(color: _colorScheme.onPrimaryContainer), - _ => - _textTheme.bodyMedium?.copyWith(color: _colorScheme.onSurfaceVariant), - }; + EmailContent(isThreaded: true) => _textTheme.bodyLarge, + EmailContent(isSelected: true) => _textTheme.bodyMedium?.copyWith( + color: _colorScheme.onPrimaryContainer, + ), + _ => _textTheme.bodyMedium?.copyWith(color: _colorScheme.onSurfaceVariant), + }; @override Widget build(BuildContext context) { @@ -131,49 +124,59 @@ class _EmailContentState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - LayoutBuilder(builder: (context, constraints) { - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - if (constraints.maxWidth - 200 > 0) ...[ - CircleAvatar( - backgroundImage: AssetImage(widget.email.sender.avatarUrl), - ), - const Padding(padding: EdgeInsets.symmetric(horizontal: 6.0)), - ], - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.email.sender.name.fullName, - overflow: TextOverflow.fade, - maxLines: 1, - style: widget.isSelected - ? _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSecondaryContainer) - : _textTheme.labelMedium - ?.copyWith(color: _colorScheme.onSurface), - ), - Text( - lastActiveLabel, - overflow: TextOverflow.fade, - maxLines: 1, - style: widget.isSelected - ? _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSecondaryContainer) - : _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSurfaceVariant), + LayoutBuilder( + builder: (context, constraints) { + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (constraints.maxWidth - 200 > 0) ...[ + CircleAvatar( + backgroundImage: AssetImage( + widget.email.sender.avatarUrl, ), - ], + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 6.0), + ), + ], + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.email.sender.name.fullName, + overflow: TextOverflow.fade, + maxLines: 1, + style: + widget.isSelected + ? _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSecondaryContainer, + ) + : _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSurface, + ), + ), + Text( + lastActiveLabel, + overflow: TextOverflow.fade, + maxLines: 1, + style: + widget.isSelected + ? _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSecondaryContainer, + ) + : _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSurfaceVariant, + ), + ), + ], + ), ), - ), - if (constraints.maxWidth - 200 > 0) ...[ - const StarButton(), - ] - ], - ); - }), + if (constraints.maxWidth - 200 > 0) ...[const StarButton()], + ], + ); + }, + ), const SizedBox(width: 8), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -181,8 +184,9 @@ class _EmailContentState extends State { if (widget.isPreview) ...[ Text( widget.email.subject, - style: const TextStyle(fontSize: 18) - .copyWith(color: _colorScheme.onSurface), + style: const TextStyle( + fontSize: 18, + ).copyWith(color: _colorScheme.onSurface), ), ], if (widget.isThreaded) ...[ @@ -190,7 +194,7 @@ class _EmailContentState extends State { Text( "To ${widget.email.recipients.map((recipient) => recipient.name.first).join(", ")}", style: _textTheme.bodyMedium, - ) + ), ], contentSpacer, Text( @@ -204,19 +208,17 @@ class _EmailContentState extends State { const SizedBox(width: 12), widget.email.attachments.isNotEmpty ? Container( - height: 96, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8.0), - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage(widget.email.attachments.first.url), - ), + height: 96, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage(widget.email.attachments.first.url), ), - ) + ), + ) : const SizedBox.shrink(), - if (!widget.isPreview) ...[ - const EmailReplyOptions(), - ], + if (!widget.isPreview) ...[const EmailReplyOptions()], ], ), ); @@ -243,71 +245,76 @@ class _EmailHeadlineState extends State { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - return Container( - height: 84, - color: Color.alphaBlend( - _colorScheme.primary.withAlpha(12), - _colorScheme.surface, - ), - child: Padding( - padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), - child: Row( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.email.subject, - maxLines: 1, - overflow: TextOverflow.fade, - style: const TextStyle( - fontSize: 18, fontWeight: FontWeight.w400), - ), - Text( - '${widget.email.replies.toString()} Messages', - maxLines: 1, - overflow: TextOverflow.fade, - style: _textTheme.labelMedium - ?.copyWith(fontWeight: FontWeight.w500), - ), - ], - ), - ), - // Display a "condensed" version if the widget in the row are - // expected to overflow. - if (constraints.maxWidth - 200 > 0) ...[ - SizedBox( - height: 40, - width: 40, - child: FloatingActionButton( - onPressed: () {}, - elevation: 0, - backgroundColor: _colorScheme.surface, - child: const Icon(Icons.delete_outline), + return LayoutBuilder( + builder: (context, constraints) { + return Container( + height: 84, + color: Color.alphaBlend( + _colorScheme.primary.withAlpha(12), + _colorScheme.surface, + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), + child: Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.email.subject, + maxLines: 1, + overflow: TextOverflow.fade, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w400, + ), + ), + Text( + '${widget.email.replies.toString()} Messages', + maxLines: 1, + overflow: TextOverflow.fade, + style: _textTheme.labelMedium?.copyWith( + fontWeight: FontWeight.w500, + ), + ), + ], ), ), - const Padding(padding: EdgeInsets.only(right: 8.0)), - SizedBox( - height: 40, - width: 40, - child: FloatingActionButton( - onPressed: () {}, - elevation: 0, - backgroundColor: _colorScheme.surface, - child: const Icon(Icons.more_vert), + // Display a "condensed" version if the widget in the row are + // expected to overflow. + if (constraints.maxWidth - 200 > 0) ...[ + SizedBox( + height: 40, + width: 40, + child: FloatingActionButton( + onPressed: () {}, + elevation: 0, + backgroundColor: _colorScheme.surface, + child: const Icon(Icons.delete_outline), + ), ), - ), - ] - ], + const Padding(padding: EdgeInsets.only(right: 8.0)), + SizedBox( + height: 40, + width: 40, + child: FloatingActionButton( + onPressed: () {}, + elevation: 0, + backgroundColor: _colorScheme.surface, + child: const Icon(Icons.more_vert), + ), + ), + ], + ], + ), ), - ), - ); - }); + ); + }, + ); } } @@ -333,8 +340,9 @@ class _EmailReplyOptionsState extends State { Expanded( child: TextButton( style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(_colorScheme.onInverseSurface), + backgroundColor: WidgetStateProperty.all( + _colorScheme.onInverseSurface, + ), ), onPressed: () {}, child: Text( @@ -347,8 +355,9 @@ class _EmailReplyOptionsState extends State { Expanded( child: TextButton( style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(_colorScheme.onInverseSurface), + backgroundColor: WidgetStateProperty.all( + _colorScheme.onInverseSurface, + ), ), onPressed: () {}, child: Text( diff --git a/animated-responsive-layout/step_05/lib/widgets/search_bar.dart b/animated-responsive-layout/step_05/lib/widgets/search_bar.dart index 28a15c3ef0..92d91750c6 100644 --- a/animated-responsive-layout/step_05/lib/widgets/search_bar.dart +++ b/animated-responsive-layout/step_05/lib/widgets/search_bar.dart @@ -7,10 +7,7 @@ import 'package:flutter/material.dart'; import '../models/models.dart'; class SearchBar extends StatelessWidget { - const SearchBar({ - super.key, - required this.currentUser, - }); + const SearchBar({super.key, required this.currentUser}); final User currentUser; @@ -40,9 +37,7 @@ class SearchBar extends StatelessWidget { ), ), ), - CircleAvatar( - backgroundImage: AssetImage(currentUser.avatarUrl), - ), + CircleAvatar(backgroundImage: AssetImage(currentUser.avatarUrl)), ], ), ), diff --git a/animated-responsive-layout/step_05/lib/widgets/star_button.dart b/animated-responsive-layout/step_05/lib/widgets/star_button.dart index 95c1c79ee2..441c83570f 100644 --- a/animated-responsive-layout/step_05/lib/widgets/star_button.dart +++ b/animated-responsive-layout/step_05/lib/widgets/star_button.dart @@ -18,11 +18,7 @@ class _StarButtonState extends State { Icon get icon { final IconData iconData = state ? Icons.star : Icons.star_outline; - return Icon( - iconData, - color: Colors.grey, - size: 20, - ); + return Icon(iconData, color: Colors.grey, size: 20); } void _toggle() { @@ -44,10 +40,7 @@ class _StarButtonState extends State { shape: const CircleBorder(), backgroundColor: _colorScheme.surface, onPressed: () => _toggle(), - child: Padding( - padding: const EdgeInsets.all(10.0), - child: icon, - ), + child: Padding(padding: const EdgeInsets.all(10.0), child: icon), ), ); } diff --git a/animated-responsive-layout/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animated-responsive-layout/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 6784a9060a..8307189d5d 100644 --- a/animated-responsive-layout/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animated-responsive-layout/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animated-responsive-layout/step_05/pubspec.yaml b/animated-responsive-layout/step_05/pubspec.yaml index e66a7947a0..51fe30860f 100644 --- a/animated-responsive-layout/step_05/pubspec.yaml +++ b/animated-responsive-layout/step_05/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/animated-responsive-layout/step_06/android/app/build.gradle b/animated-responsive-layout/step_06/android/app/build.gradle deleted file mode 100644 index 79a54d97fd..0000000000 --- a/animated-responsive-layout/step_06/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.animated_responsive_layout" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.animated_responsive_layout" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animated-responsive-layout/step_06/android/app/build.gradle.kts b/animated-responsive-layout/step_06/android/app/build.gradle.kts new file mode 100644 index 0000000000..5643237de3 --- /dev/null +++ b/animated-responsive-layout/step_06/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.animated_responsive_layout" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.animated_responsive_layout" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animated-responsive-layout/step_06/android/build.gradle b/animated-responsive-layout/step_06/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animated-responsive-layout/step_06/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animated-responsive-layout/step_06/android/build.gradle.kts b/animated-responsive-layout/step_06/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animated-responsive-layout/step_06/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animated-responsive-layout/step_06/android/gradle.properties b/animated-responsive-layout/step_06/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animated-responsive-layout/step_06/android/gradle.properties +++ b/animated-responsive-layout/step_06/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animated-responsive-layout/step_06/android/gradle/wrapper/gradle-wrapper.properties b/animated-responsive-layout/step_06/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animated-responsive-layout/step_06/android/gradle/wrapper/gradle-wrapper.properties +++ b/animated-responsive-layout/step_06/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animated-responsive-layout/step_06/android/settings.gradle b/animated-responsive-layout/step_06/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animated-responsive-layout/step_06/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animated-responsive-layout/step_06/android/settings.gradle.kts b/animated-responsive-layout/step_06/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animated-responsive-layout/step_06/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animated-responsive-layout/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animated-responsive-layout/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animated-responsive-layout/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animated-responsive-layout/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animated-responsive-layout/step_06/lib/main.dart b/animated-responsive-layout/step_06/lib/main.dart index 4c89a293d7..185ba19308 100644 --- a/animated-responsive-layout/step_06/lib/main.dart +++ b/animated-responsive-layout/step_06/lib/main.dart @@ -27,10 +27,7 @@ class MainApp extends StatelessWidget { } class Feed extends StatefulWidget { - const Feed({ - super.key, - required this.currentUser, - }); + const Feed({super.key, required this.currentUser}); final User currentUser; @@ -41,7 +38,9 @@ class Feed extends StatefulWidget { class _FeedState extends State { late final _colorScheme = Theme.of(context).colorScheme; late final _backgroundColor = Color.alphaBlend( - _colorScheme.primary.withAlpha(36), _colorScheme.surface); + _colorScheme.primary.withAlpha(36), + _colorScheme.surface, + ); int selectedIndex = 0; bool wideScreen = false; @@ -85,24 +84,26 @@ class _FeedState extends State { ), ], ), - floatingActionButton: wideScreen - ? null - : FloatingActionButton( - backgroundColor: _colorScheme.tertiaryContainer, - foregroundColor: _colorScheme.onTertiaryContainer, - onPressed: () {}, - child: const Icon(Icons.add), - ), - bottomNavigationBar: wideScreen - ? null - : DisappearingBottomNavigationBar( - selectedIndex: selectedIndex, - onDestinationSelected: (index) { - setState(() { - selectedIndex = index; - }); - }, - ), + floatingActionButton: + wideScreen + ? null + : FloatingActionButton( + backgroundColor: _colorScheme.tertiaryContainer, + foregroundColor: _colorScheme.onTertiaryContainer, + onPressed: () {}, + child: const Icon(Icons.add), + ), + bottomNavigationBar: + wideScreen + ? null + : DisappearingBottomNavigationBar( + selectedIndex: selectedIndex, + onDestinationSelected: (index) { + setState(() { + selectedIndex = index; + }); + }, + ), ); } } diff --git a/animated-responsive-layout/step_06/lib/models/data.dart b/animated-responsive-layout/step_06/lib/models/data.dart index 141ce9d588..097304290b 100644 --- a/animated-responsive-layout/step_06/lib/models/data.dart +++ b/animated-responsive-layout/step_06/lib/models/data.dart @@ -5,25 +5,30 @@ import 'models.dart'; final User user_0 = User( - name: const Name(first: 'Me', last: ''), - avatarUrl: 'assets/avatar_1.png', - lastActive: DateTime.now()); + name: const Name(first: 'Me', last: ''), + avatarUrl: 'assets/avatar_1.png', + lastActive: DateTime.now(), +); final User user_1 = User( - name: const Name(first: '老', last: '强'), - avatarUrl: 'assets/avatar_2.png', - lastActive: DateTime.now().subtract(const Duration(minutes: 10))); + name: const Name(first: '老', last: '强'), + avatarUrl: 'assets/avatar_2.png', + lastActive: DateTime.now().subtract(const Duration(minutes: 10)), +); final User user_2 = User( - name: const Name(first: 'So', last: 'Duri'), - avatarUrl: 'assets/avatar_3.png', - lastActive: DateTime.now().subtract(const Duration(minutes: 20))); + name: const Name(first: 'So', last: 'Duri'), + avatarUrl: 'assets/avatar_3.png', + lastActive: DateTime.now().subtract(const Duration(minutes: 20)), +); final User user_3 = User( - name: const Name(first: 'Lily', last: 'MacDonald'), - avatarUrl: 'assets/avatar_4.png', - lastActive: DateTime.now().subtract(const Duration(hours: 2))); + name: const Name(first: 'Lily', last: 'MacDonald'), + avatarUrl: 'assets/avatar_4.png', + lastActive: DateTime.now().subtract(const Duration(hours: 2)), +); final User user_4 = User( - name: const Name(first: 'Ziad', last: 'Aouad'), - avatarUrl: 'assets/avatar_5.png', - lastActive: DateTime.now().subtract(const Duration(hours: 6))); + name: const Name(first: 'Ziad', last: 'Aouad'), + avatarUrl: 'assets/avatar_5.png', + lastActive: DateTime.now().subtract(const Duration(hours: 6)), +); final List emails = [ Email( @@ -40,12 +45,13 @@ final List emails = [ 'I think it’s time for us to finally try that new noodle shop downtown that doesn’t use menus. Anyone else have other suggestions for dinner club this week? I’m so intrigued by this idea of a noodle restaurant where no one gets to order for themselves - could be fun, or terrible, or both :)\n\nSo', ), Email( - sender: user_3, - recipients: [], - subject: 'This food show is made for you', - content: - 'Ping– you’d love this new food show I started watching. It’s produced by a Thai drummer who started getting recognized for the amazing vegan food she always brought to shows.', - attachments: [const Attachment(url: 'assets/thumbnail_1.png')]), + sender: user_3, + recipients: [], + subject: 'This food show is made for you', + content: + 'Ping– you’d love this new food show I started watching. It’s produced by a Thai drummer who started getting recognized for the amazing vegan food she always brought to shows.', + attachments: [const Attachment(url: 'assets/thumbnail_1.png')], + ), Email( sender: user_4, recipients: [], @@ -58,20 +64,14 @@ final List emails = [ final List replies = [ Email( sender: user_2, - recipients: [ - user_3, - user_2, - ], + recipients: [user_3, user_2], subject: 'Dinner Club', content: 'I think it’s time for us to finally try that new noodle shop downtown that doesn’t use menus. Anyone else have other suggestions for dinner club this week? I’m so intrigued by this idea of a noodle restaurant where no one gets to order for themselves - could be fun, or terrible, or both :)\n\nSo', ), Email( sender: user_0, - recipients: [ - user_3, - user_2, - ], + recipients: [user_3, user_2], subject: 'Dinner Club', content: 'Yes! I forgot about that place! I’m definitely up for taking a risk this week and handing control over to this mysterious noodle chef. I wonder what happens if you have allergies though? Lucky none of us have any otherwise I’d be a bit concerned.\n\nThis is going to be great. See you all at the usual time?', diff --git a/animated-responsive-layout/step_06/lib/models/models.dart b/animated-responsive-layout/step_06/lib/models/models.dart index c6fe69e010..6b1f3d95d6 100644 --- a/animated-responsive-layout/step_06/lib/models/models.dart +++ b/animated-responsive-layout/step_06/lib/models/models.dart @@ -3,9 +3,7 @@ // found in the LICENSE file. class Attachment { - const Attachment({ - required this.url, - }); + const Attachment({required this.url}); final String url; } @@ -29,10 +27,7 @@ class Email { } class Name { - const Name({ - required this.first, - required this.last, - }); + const Name({required this.first, required this.last}); final String first; final String last; diff --git a/animated-responsive-layout/step_06/lib/widgets/disappearing_bottom_navigation_bar.dart b/animated-responsive-layout/step_06/lib/widgets/disappearing_bottom_navigation_bar.dart index 67fd048672..c200b82c5b 100644 --- a/animated-responsive-layout/step_06/lib/widgets/disappearing_bottom_navigation_bar.dart +++ b/animated-responsive-layout/step_06/lib/widgets/disappearing_bottom_navigation_bar.dart @@ -21,12 +21,10 @@ class DisappearingBottomNavigationBar extends StatelessWidget { return NavigationBar( elevation: 0, backgroundColor: Colors.white, - destinations: destinations.map((d) { - return NavigationDestination( - icon: Icon(d.icon), - label: d.label, - ); - }).toList(), + destinations: + destinations.map((d) { + return NavigationDestination(icon: Icon(d.icon), label: d.label); + }).toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ); diff --git a/animated-responsive-layout/step_06/lib/widgets/disappearing_navigation_rail.dart b/animated-responsive-layout/step_06/lib/widgets/disappearing_navigation_rail.dart index c45ce6a884..ff8696eb2f 100644 --- a/animated-responsive-layout/step_06/lib/widgets/disappearing_navigation_rail.dart +++ b/animated-responsive-layout/step_06/lib/widgets/disappearing_navigation_rail.dart @@ -27,16 +27,11 @@ class DisappearingNavigationRail extends StatelessWidget { onDestinationSelected: onDestinationSelected, leading: Column( children: [ - IconButton( - onPressed: () {}, - icon: const Icon(Icons.menu), - ), + IconButton(onPressed: () {}, icon: const Icon(Icons.menu)), const SizedBox(height: 8), FloatingActionButton( shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all( - Radius.circular(15), - ), + borderRadius: BorderRadius.all(Radius.circular(15)), ), backgroundColor: colorScheme.tertiaryContainer, foregroundColor: colorScheme.onTertiaryContainer, @@ -46,12 +41,13 @@ class DisappearingNavigationRail extends StatelessWidget { ], ), groupAlignment: -0.85, - destinations: destinations.map((d) { - return NavigationRailDestination( - icon: Icon(d.icon), - label: Text(d.label), - ); - }).toList(), + destinations: + destinations.map((d) { + return NavigationRailDestination( + icon: Icon(d.icon), + label: Text(d.label), + ); + }).toList(), ); } } diff --git a/animated-responsive-layout/step_06/lib/widgets/email_list_view.dart b/animated-responsive-layout/step_06/lib/widgets/email_list_view.dart index 881cd434c1..38a751af1c 100644 --- a/animated-responsive-layout/step_06/lib/widgets/email_list_view.dart +++ b/animated-responsive-layout/step_06/lib/widgets/email_list_view.dart @@ -30,23 +30,21 @@ class EmailListView extends StatelessWidget { const SizedBox(height: 8), search_bar.SearchBar(currentUser: currentUser), const SizedBox(height: 8), - ...List.generate( - data.emails.length, - (index) { - return Padding( - padding: const EdgeInsets.only(bottom: 8.0), - child: EmailWidget( - email: data.emails[index], - onSelected: onSelected != null - ? () { + ...List.generate(data.emails.length, (index) { + return Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: EmailWidget( + email: data.emails[index], + onSelected: + onSelected != null + ? () { onSelected!(index); } - : null, - isSelected: selectedIndex == index, - ), - ); - }, - ), + : null, + isSelected: selectedIndex == index, + ), + ); + }), ], ), ); diff --git a/animated-responsive-layout/step_06/lib/widgets/email_widget.dart b/animated-responsive-layout/step_06/lib/widgets/email_widget.dart index cb317686d6..8e37f4d8bc 100644 --- a/animated-responsive-layout/step_06/lib/widgets/email_widget.dart +++ b/animated-responsive-layout/step_06/lib/widgets/email_widget.dart @@ -6,11 +6,7 @@ import 'package:flutter/material.dart'; import '../models/models.dart'; import 'star_button.dart'; -enum EmailType { - preview, - threaded, - primaryThreaded, -} +enum EmailType { preview, threaded, primaryThreaded } class EmailWidget extends StatefulWidget { const EmailWidget({ @@ -42,10 +38,10 @@ class _EmailWidgetState extends State { ); Color get _surfaceColor => switch (widget) { - EmailWidget(isPreview: false) => _colorScheme.surface, - EmailWidget(isSelected: true) => _colorScheme.primaryContainer, - _ => unselectedColor, - }; + EmailWidget(isPreview: false) => _colorScheme.surface, + EmailWidget(isSelected: true) => _colorScheme.primaryContainer, + _ => unselectedColor, + }; @override Widget build(BuildContext context) { @@ -60,10 +56,7 @@ class _EmailWidgetState extends State { mainAxisSize: MainAxisSize.min, children: [ if (widget.showHeadline) ...[ - EmailHeadline( - email: widget.email, - isSelected: widget.isSelected, - ), + EmailHeadline(email: widget.email, isSelected: widget.isSelected), ], EmailContent( email: widget.email, @@ -117,12 +110,12 @@ class _EmailContentState extends State { } TextStyle? get contentTextStyle => switch (widget) { - EmailContent(isThreaded: true) => _textTheme.bodyLarge, - EmailContent(isSelected: true) => _textTheme.bodyMedium - ?.copyWith(color: _colorScheme.onPrimaryContainer), - _ => - _textTheme.bodyMedium?.copyWith(color: _colorScheme.onSurfaceVariant), - }; + EmailContent(isThreaded: true) => _textTheme.bodyLarge, + EmailContent(isSelected: true) => _textTheme.bodyMedium?.copyWith( + color: _colorScheme.onPrimaryContainer, + ), + _ => _textTheme.bodyMedium?.copyWith(color: _colorScheme.onSurfaceVariant), + }; @override Widget build(BuildContext context) { @@ -131,49 +124,59 @@ class _EmailContentState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - LayoutBuilder(builder: (context, constraints) { - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - if (constraints.maxWidth - 200 > 0) ...[ - CircleAvatar( - backgroundImage: AssetImage(widget.email.sender.avatarUrl), - ), - const Padding(padding: EdgeInsets.symmetric(horizontal: 6.0)), - ], - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.email.sender.name.fullName, - overflow: TextOverflow.fade, - maxLines: 1, - style: widget.isSelected - ? _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSecondaryContainer) - : _textTheme.labelMedium - ?.copyWith(color: _colorScheme.onSurface), - ), - Text( - lastActiveLabel, - overflow: TextOverflow.fade, - maxLines: 1, - style: widget.isSelected - ? _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSecondaryContainer) - : _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSurfaceVariant), + LayoutBuilder( + builder: (context, constraints) { + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (constraints.maxWidth - 200 > 0) ...[ + CircleAvatar( + backgroundImage: AssetImage( + widget.email.sender.avatarUrl, ), - ], + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 6.0), + ), + ], + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.email.sender.name.fullName, + overflow: TextOverflow.fade, + maxLines: 1, + style: + widget.isSelected + ? _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSecondaryContainer, + ) + : _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSurface, + ), + ), + Text( + lastActiveLabel, + overflow: TextOverflow.fade, + maxLines: 1, + style: + widget.isSelected + ? _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSecondaryContainer, + ) + : _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSurfaceVariant, + ), + ), + ], + ), ), - ), - if (constraints.maxWidth - 200 > 0) ...[ - const StarButton(), - ] - ], - ); - }), + if (constraints.maxWidth - 200 > 0) ...[const StarButton()], + ], + ); + }, + ), const SizedBox(width: 8), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -181,8 +184,9 @@ class _EmailContentState extends State { if (widget.isPreview) ...[ Text( widget.email.subject, - style: const TextStyle(fontSize: 18) - .copyWith(color: _colorScheme.onSurface), + style: const TextStyle( + fontSize: 18, + ).copyWith(color: _colorScheme.onSurface), ), ], if (widget.isThreaded) ...[ @@ -190,7 +194,7 @@ class _EmailContentState extends State { Text( "To ${widget.email.recipients.map((recipient) => recipient.name.first).join(", ")}", style: _textTheme.bodyMedium, - ) + ), ], contentSpacer, Text( @@ -204,19 +208,17 @@ class _EmailContentState extends State { const SizedBox(width: 12), widget.email.attachments.isNotEmpty ? Container( - height: 96, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8.0), - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage(widget.email.attachments.first.url), - ), + height: 96, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage(widget.email.attachments.first.url), ), - ) + ), + ) : const SizedBox.shrink(), - if (!widget.isPreview) ...[ - const EmailReplyOptions(), - ], + if (!widget.isPreview) ...[const EmailReplyOptions()], ], ), ); @@ -243,71 +245,76 @@ class _EmailHeadlineState extends State { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - return Container( - height: 84, - color: Color.alphaBlend( - _colorScheme.primary.withAlpha(12), - _colorScheme.surface, - ), - child: Padding( - padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), - child: Row( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.email.subject, - maxLines: 1, - overflow: TextOverflow.fade, - style: const TextStyle( - fontSize: 18, fontWeight: FontWeight.w400), - ), - Text( - '${widget.email.replies.toString()} Messages', - maxLines: 1, - overflow: TextOverflow.fade, - style: _textTheme.labelMedium - ?.copyWith(fontWeight: FontWeight.w500), - ), - ], - ), - ), - // Display a "condensed" version if the widget in the row are - // expected to overflow. - if (constraints.maxWidth - 200 > 0) ...[ - SizedBox( - height: 40, - width: 40, - child: FloatingActionButton( - onPressed: () {}, - elevation: 0, - backgroundColor: _colorScheme.surface, - child: const Icon(Icons.delete_outline), + return LayoutBuilder( + builder: (context, constraints) { + return Container( + height: 84, + color: Color.alphaBlend( + _colorScheme.primary.withAlpha(12), + _colorScheme.surface, + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), + child: Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.email.subject, + maxLines: 1, + overflow: TextOverflow.fade, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w400, + ), + ), + Text( + '${widget.email.replies.toString()} Messages', + maxLines: 1, + overflow: TextOverflow.fade, + style: _textTheme.labelMedium?.copyWith( + fontWeight: FontWeight.w500, + ), + ), + ], ), ), - const Padding(padding: EdgeInsets.only(right: 8.0)), - SizedBox( - height: 40, - width: 40, - child: FloatingActionButton( - onPressed: () {}, - elevation: 0, - backgroundColor: _colorScheme.surface, - child: const Icon(Icons.more_vert), + // Display a "condensed" version if the widget in the row are + // expected to overflow. + if (constraints.maxWidth - 200 > 0) ...[ + SizedBox( + height: 40, + width: 40, + child: FloatingActionButton( + onPressed: () {}, + elevation: 0, + backgroundColor: _colorScheme.surface, + child: const Icon(Icons.delete_outline), + ), ), - ), - ] - ], + const Padding(padding: EdgeInsets.only(right: 8.0)), + SizedBox( + height: 40, + width: 40, + child: FloatingActionButton( + onPressed: () {}, + elevation: 0, + backgroundColor: _colorScheme.surface, + child: const Icon(Icons.more_vert), + ), + ), + ], + ], + ), ), - ), - ); - }); + ); + }, + ); } } @@ -333,8 +340,9 @@ class _EmailReplyOptionsState extends State { Expanded( child: TextButton( style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(_colorScheme.onInverseSurface), + backgroundColor: WidgetStateProperty.all( + _colorScheme.onInverseSurface, + ), ), onPressed: () {}, child: Text( @@ -347,8 +355,9 @@ class _EmailReplyOptionsState extends State { Expanded( child: TextButton( style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(_colorScheme.onInverseSurface), + backgroundColor: WidgetStateProperty.all( + _colorScheme.onInverseSurface, + ), ), onPressed: () {}, child: Text( diff --git a/animated-responsive-layout/step_06/lib/widgets/search_bar.dart b/animated-responsive-layout/step_06/lib/widgets/search_bar.dart index 28a15c3ef0..92d91750c6 100644 --- a/animated-responsive-layout/step_06/lib/widgets/search_bar.dart +++ b/animated-responsive-layout/step_06/lib/widgets/search_bar.dart @@ -7,10 +7,7 @@ import 'package:flutter/material.dart'; import '../models/models.dart'; class SearchBar extends StatelessWidget { - const SearchBar({ - super.key, - required this.currentUser, - }); + const SearchBar({super.key, required this.currentUser}); final User currentUser; @@ -40,9 +37,7 @@ class SearchBar extends StatelessWidget { ), ), ), - CircleAvatar( - backgroundImage: AssetImage(currentUser.avatarUrl), - ), + CircleAvatar(backgroundImage: AssetImage(currentUser.avatarUrl)), ], ), ), diff --git a/animated-responsive-layout/step_06/lib/widgets/star_button.dart b/animated-responsive-layout/step_06/lib/widgets/star_button.dart index 95c1c79ee2..441c83570f 100644 --- a/animated-responsive-layout/step_06/lib/widgets/star_button.dart +++ b/animated-responsive-layout/step_06/lib/widgets/star_button.dart @@ -18,11 +18,7 @@ class _StarButtonState extends State { Icon get icon { final IconData iconData = state ? Icons.star : Icons.star_outline; - return Icon( - iconData, - color: Colors.grey, - size: 20, - ); + return Icon(iconData, color: Colors.grey, size: 20); } void _toggle() { @@ -44,10 +40,7 @@ class _StarButtonState extends State { shape: const CircleBorder(), backgroundColor: _colorScheme.surface, onPressed: () => _toggle(), - child: Padding( - padding: const EdgeInsets.all(10.0), - child: icon, - ), + child: Padding(padding: const EdgeInsets.all(10.0), child: icon), ), ); } diff --git a/animated-responsive-layout/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animated-responsive-layout/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 6784a9060a..8307189d5d 100644 --- a/animated-responsive-layout/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animated-responsive-layout/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animated-responsive-layout/step_06/pubspec.yaml b/animated-responsive-layout/step_06/pubspec.yaml index e66a7947a0..51fe30860f 100644 --- a/animated-responsive-layout/step_06/pubspec.yaml +++ b/animated-responsive-layout/step_06/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/animated-responsive-layout/step_07/android/app/build.gradle b/animated-responsive-layout/step_07/android/app/build.gradle deleted file mode 100644 index 79a54d97fd..0000000000 --- a/animated-responsive-layout/step_07/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.animated_responsive_layout" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.animated_responsive_layout" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animated-responsive-layout/step_07/android/app/build.gradle.kts b/animated-responsive-layout/step_07/android/app/build.gradle.kts new file mode 100644 index 0000000000..5643237de3 --- /dev/null +++ b/animated-responsive-layout/step_07/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.animated_responsive_layout" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.animated_responsive_layout" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animated-responsive-layout/step_07/android/build.gradle b/animated-responsive-layout/step_07/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animated-responsive-layout/step_07/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animated-responsive-layout/step_07/android/build.gradle.kts b/animated-responsive-layout/step_07/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animated-responsive-layout/step_07/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animated-responsive-layout/step_07/android/gradle.properties b/animated-responsive-layout/step_07/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animated-responsive-layout/step_07/android/gradle.properties +++ b/animated-responsive-layout/step_07/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animated-responsive-layout/step_07/android/gradle/wrapper/gradle-wrapper.properties b/animated-responsive-layout/step_07/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animated-responsive-layout/step_07/android/gradle/wrapper/gradle-wrapper.properties +++ b/animated-responsive-layout/step_07/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animated-responsive-layout/step_07/android/settings.gradle b/animated-responsive-layout/step_07/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animated-responsive-layout/step_07/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animated-responsive-layout/step_07/android/settings.gradle.kts b/animated-responsive-layout/step_07/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animated-responsive-layout/step_07/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animated-responsive-layout/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animated-responsive-layout/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animated-responsive-layout/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animated-responsive-layout/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animated-responsive-layout/step_07/lib/animations.dart b/animated-responsive-layout/step_07/lib/animations.dart index aa48363aaf..41650c1c3c 100644 --- a/animated-responsive-layout/step_07/lib/animations.dart +++ b/animated-responsive-layout/step_07/lib/animations.dart @@ -6,85 +6,83 @@ import 'package:flutter/animation.dart'; class BarAnimation extends ReverseAnimation { BarAnimation({required AnimationController parent}) - : super( - CurvedAnimation( - parent: parent, - curve: const Interval(0, 1 / 5), - reverseCurve: const Interval(1 / 5, 4 / 5), - ), - ); + : super( + CurvedAnimation( + parent: parent, + curve: const Interval(0, 1 / 5), + reverseCurve: const Interval(1 / 5, 4 / 5), + ), + ); } class OffsetAnimation extends CurvedAnimation { OffsetAnimation({required super.parent}) - : super( - curve: const Interval( - 2 / 5, - 3 / 5, - curve: Curves.easeInOutCubicEmphasized, - ), - reverseCurve: Interval( - 4 / 5, - 1, - curve: Curves.easeInOutCubicEmphasized.flipped, - ), - ); + : super( + curve: const Interval( + 2 / 5, + 3 / 5, + curve: Curves.easeInOutCubicEmphasized, + ), + reverseCurve: Interval( + 4 / 5, + 1, + curve: Curves.easeInOutCubicEmphasized.flipped, + ), + ); } class RailAnimation extends CurvedAnimation { RailAnimation({required super.parent}) - : super( - curve: const Interval(0 / 5, 4 / 5), - reverseCurve: const Interval(3 / 5, 1), - ); + : super( + curve: const Interval(0 / 5, 4 / 5), + reverseCurve: const Interval(3 / 5, 1), + ); } class RailFabAnimation extends CurvedAnimation { RailFabAnimation({required super.parent}) - : super( - curve: const Interval(3 / 5, 1), - ); + : super(curve: const Interval(3 / 5, 1)); } class ScaleAnimation extends CurvedAnimation { ScaleAnimation({required super.parent}) - : super( - curve: const Interval( - 3 / 5, - 4 / 5, - curve: Curves.easeInOutCubicEmphasized, - ), - reverseCurve: Interval( - 3 / 5, - 1, - curve: Curves.easeInOutCubicEmphasized.flipped, - ), - ); + : super( + curve: const Interval( + 3 / 5, + 4 / 5, + curve: Curves.easeInOutCubicEmphasized, + ), + reverseCurve: Interval( + 3 / 5, + 1, + curve: Curves.easeInOutCubicEmphasized.flipped, + ), + ); } class ShapeAnimation extends CurvedAnimation { ShapeAnimation({required super.parent}) - : super( - curve: const Interval( - 2 / 5, - 3 / 5, - curve: Curves.easeInOutCubicEmphasized, - ), - ); + : super( + curve: const Interval( + 2 / 5, + 3 / 5, + curve: Curves.easeInOutCubicEmphasized, + ), + ); } class SizeAnimation extends CurvedAnimation { SizeAnimation({required super.parent}) - : super( - curve: const Interval( - 0 / 5, - 3 / 5, - curve: Curves.easeInOutCubicEmphasized, - ), - reverseCurve: Interval( - 2 / 5, - 1, - curve: Curves.easeInOutCubicEmphasized.flipped, - ), - ); + : super( + curve: const Interval( + 0 / 5, + 3 / 5, + curve: Curves.easeInOutCubicEmphasized, + ), + reverseCurve: Interval( + 2 / 5, + 1, + curve: Curves.easeInOutCubicEmphasized.flipped, + ), + ); } diff --git a/animated-responsive-layout/step_07/lib/main.dart b/animated-responsive-layout/step_07/lib/main.dart index 65ca5800b8..f771d2ed6a 100644 --- a/animated-responsive-layout/step_07/lib/main.dart +++ b/animated-responsive-layout/step_07/lib/main.dart @@ -29,10 +29,7 @@ class MainApp extends StatelessWidget { } class Feed extends StatefulWidget { - const Feed({ - super.key, - required this.currentUser, - }); + const Feed({super.key, required this.currentUser}); final User currentUser; @@ -43,12 +40,15 @@ class Feed extends StatefulWidget { class _FeedState extends State with SingleTickerProviderStateMixin { late final _colorScheme = Theme.of(context).colorScheme; late final _backgroundColor = Color.alphaBlend( - _colorScheme.primary.withAlpha(36), _colorScheme.surface); + _colorScheme.primary.withAlpha(36), + _colorScheme.surface, + ); late final _controller = AnimationController( - duration: const Duration(milliseconds: 1000), - reverseDuration: const Duration(milliseconds: 1250), - value: 0, - vsync: this); + duration: const Duration(milliseconds: 1000), + reverseDuration: const Duration(milliseconds: 1250), + value: 0, + vsync: this, + ); late final _railAnimation = RailAnimation(parent: _controller); late final _railFabAnimation = RailFabAnimation(parent: _controller); late final _barAnimation = BarAnimation(parent: _controller); diff --git a/animated-responsive-layout/step_07/lib/models/data.dart b/animated-responsive-layout/step_07/lib/models/data.dart index 141ce9d588..097304290b 100644 --- a/animated-responsive-layout/step_07/lib/models/data.dart +++ b/animated-responsive-layout/step_07/lib/models/data.dart @@ -5,25 +5,30 @@ import 'models.dart'; final User user_0 = User( - name: const Name(first: 'Me', last: ''), - avatarUrl: 'assets/avatar_1.png', - lastActive: DateTime.now()); + name: const Name(first: 'Me', last: ''), + avatarUrl: 'assets/avatar_1.png', + lastActive: DateTime.now(), +); final User user_1 = User( - name: const Name(first: '老', last: '强'), - avatarUrl: 'assets/avatar_2.png', - lastActive: DateTime.now().subtract(const Duration(minutes: 10))); + name: const Name(first: '老', last: '强'), + avatarUrl: 'assets/avatar_2.png', + lastActive: DateTime.now().subtract(const Duration(minutes: 10)), +); final User user_2 = User( - name: const Name(first: 'So', last: 'Duri'), - avatarUrl: 'assets/avatar_3.png', - lastActive: DateTime.now().subtract(const Duration(minutes: 20))); + name: const Name(first: 'So', last: 'Duri'), + avatarUrl: 'assets/avatar_3.png', + lastActive: DateTime.now().subtract(const Duration(minutes: 20)), +); final User user_3 = User( - name: const Name(first: 'Lily', last: 'MacDonald'), - avatarUrl: 'assets/avatar_4.png', - lastActive: DateTime.now().subtract(const Duration(hours: 2))); + name: const Name(first: 'Lily', last: 'MacDonald'), + avatarUrl: 'assets/avatar_4.png', + lastActive: DateTime.now().subtract(const Duration(hours: 2)), +); final User user_4 = User( - name: const Name(first: 'Ziad', last: 'Aouad'), - avatarUrl: 'assets/avatar_5.png', - lastActive: DateTime.now().subtract(const Duration(hours: 6))); + name: const Name(first: 'Ziad', last: 'Aouad'), + avatarUrl: 'assets/avatar_5.png', + lastActive: DateTime.now().subtract(const Duration(hours: 6)), +); final List emails = [ Email( @@ -40,12 +45,13 @@ final List emails = [ 'I think it’s time for us to finally try that new noodle shop downtown that doesn’t use menus. Anyone else have other suggestions for dinner club this week? I’m so intrigued by this idea of a noodle restaurant where no one gets to order for themselves - could be fun, or terrible, or both :)\n\nSo', ), Email( - sender: user_3, - recipients: [], - subject: 'This food show is made for you', - content: - 'Ping– you’d love this new food show I started watching. It’s produced by a Thai drummer who started getting recognized for the amazing vegan food she always brought to shows.', - attachments: [const Attachment(url: 'assets/thumbnail_1.png')]), + sender: user_3, + recipients: [], + subject: 'This food show is made for you', + content: + 'Ping– you’d love this new food show I started watching. It’s produced by a Thai drummer who started getting recognized for the amazing vegan food she always brought to shows.', + attachments: [const Attachment(url: 'assets/thumbnail_1.png')], + ), Email( sender: user_4, recipients: [], @@ -58,20 +64,14 @@ final List emails = [ final List replies = [ Email( sender: user_2, - recipients: [ - user_3, - user_2, - ], + recipients: [user_3, user_2], subject: 'Dinner Club', content: 'I think it’s time for us to finally try that new noodle shop downtown that doesn’t use menus. Anyone else have other suggestions for dinner club this week? I’m so intrigued by this idea of a noodle restaurant where no one gets to order for themselves - could be fun, or terrible, or both :)\n\nSo', ), Email( sender: user_0, - recipients: [ - user_3, - user_2, - ], + recipients: [user_3, user_2], subject: 'Dinner Club', content: 'Yes! I forgot about that place! I’m definitely up for taking a risk this week and handing control over to this mysterious noodle chef. I wonder what happens if you have allergies though? Lucky none of us have any otherwise I’d be a bit concerned.\n\nThis is going to be great. See you all at the usual time?', diff --git a/animated-responsive-layout/step_07/lib/models/models.dart b/animated-responsive-layout/step_07/lib/models/models.dart index c6fe69e010..6b1f3d95d6 100644 --- a/animated-responsive-layout/step_07/lib/models/models.dart +++ b/animated-responsive-layout/step_07/lib/models/models.dart @@ -3,9 +3,7 @@ // found in the LICENSE file. class Attachment { - const Attachment({ - required this.url, - }); + const Attachment({required this.url}); final String url; } @@ -29,10 +27,7 @@ class Email { } class Name { - const Name({ - required this.first, - required this.last, - }); + const Name({required this.first, required this.last}); final String first; final String last; diff --git a/animated-responsive-layout/step_07/lib/transitions/bottom_bar_transition.dart b/animated-responsive-layout/step_07/lib/transitions/bottom_bar_transition.dart index 1fe9654d87..61dc6821a0 100644 --- a/animated-responsive-layout/step_07/lib/transitions/bottom_bar_transition.dart +++ b/animated-responsive-layout/step_07/lib/transitions/bottom_bar_transition.dart @@ -6,11 +6,12 @@ import 'package:flutter/material.dart'; import '../animations.dart'; class BottomBarTransition extends StatefulWidget { - const BottomBarTransition( - {super.key, - required this.animation, - required this.backgroundColor, - required this.child}); + const BottomBarTransition({ + super.key, + required this.animation, + required this.backgroundColor, + required this.child, + }); final Animation animation; final Color backgroundColor; diff --git a/animated-responsive-layout/step_07/lib/transitions/nav_rail_transition.dart b/animated-responsive-layout/step_07/lib/transitions/nav_rail_transition.dart index 36d06eb4b7..f1d83bb3cd 100644 --- a/animated-responsive-layout/step_07/lib/transitions/nav_rail_transition.dart +++ b/animated-responsive-layout/step_07/lib/transitions/nav_rail_transition.dart @@ -6,11 +6,12 @@ import 'package:flutter/material.dart'; import '../animations.dart'; class NavRailTransition extends StatefulWidget { - const NavRailTransition( - {super.key, - required this.animation, - required this.backgroundColor, - required this.child}); + const NavRailTransition({ + super.key, + required this.animation, + required this.backgroundColor, + required this.child, + }); final Animation animation; final Widget child; diff --git a/animated-responsive-layout/step_07/lib/widgets/animated_floating_action_button.dart b/animated-responsive-layout/step_07/lib/widgets/animated_floating_action_button.dart index e0fa168644..6d50e95dd0 100644 --- a/animated-responsive-layout/step_07/lib/widgets/animated_floating_action_button.dart +++ b/animated-responsive-layout/step_07/lib/widgets/animated_floating_action_button.dart @@ -29,10 +29,12 @@ class AnimatedFloatingActionButton extends StatefulWidget { class _AnimatedFloatingActionButton extends State { late final ColorScheme _colorScheme = Theme.of(context).colorScheme; - late final Animation _scaleAnimation = - ScaleAnimation(parent: widget.animation); - late final Animation _shapeAnimation = - ShapeAnimation(parent: widget.animation); + late final Animation _scaleAnimation = ScaleAnimation( + parent: widget.animation, + ); + late final Animation _shapeAnimation = ShapeAnimation( + parent: widget.animation, + ); @override Widget build(BuildContext context) { diff --git a/animated-responsive-layout/step_07/lib/widgets/disappearing_bottom_navigation_bar.dart b/animated-responsive-layout/step_07/lib/widgets/disappearing_bottom_navigation_bar.dart index 059e4afb63..7108dbfaea 100644 --- a/animated-responsive-layout/step_07/lib/widgets/disappearing_bottom_navigation_bar.dart +++ b/animated-responsive-layout/step_07/lib/widgets/disappearing_bottom_navigation_bar.dart @@ -28,12 +28,10 @@ class DisappearingBottomNavigationBar extends StatelessWidget { child: NavigationBar( elevation: 0, backgroundColor: Colors.white, - destinations: destinations.map((d) { - return NavigationDestination( - icon: Icon(d.icon), - label: d.label, - ); - }).toList(), + destinations: + destinations.map((d) { + return NavigationDestination(icon: Icon(d.icon), label: d.label); + }).toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ), diff --git a/animated-responsive-layout/step_07/lib/widgets/disappearing_navigation_rail.dart b/animated-responsive-layout/step_07/lib/widgets/disappearing_navigation_rail.dart index 9f1446ca98..2a586bbaff 100644 --- a/animated-responsive-layout/step_07/lib/widgets/disappearing_navigation_rail.dart +++ b/animated-responsive-layout/step_07/lib/widgets/disappearing_navigation_rail.dart @@ -36,10 +36,7 @@ class DisappearingNavigationRail extends StatelessWidget { onDestinationSelected: onDestinationSelected, leading: Column( children: [ - IconButton( - onPressed: () {}, - icon: const Icon(Icons.menu), - ), + IconButton(onPressed: () {}, icon: const Icon(Icons.menu)), const SizedBox(height: 8), AnimatedFloatingActionButton( animation: railFabAnimation, @@ -50,12 +47,13 @@ class DisappearingNavigationRail extends StatelessWidget { ], ), groupAlignment: -0.85, - destinations: destinations.map((d) { - return NavigationRailDestination( - icon: Icon(d.icon), - label: Text(d.label), - ); - }).toList(), + destinations: + destinations.map((d) { + return NavigationRailDestination( + icon: Icon(d.icon), + label: Text(d.label), + ); + }).toList(), ), ); } diff --git a/animated-responsive-layout/step_07/lib/widgets/email_list_view.dart b/animated-responsive-layout/step_07/lib/widgets/email_list_view.dart index 881cd434c1..38a751af1c 100644 --- a/animated-responsive-layout/step_07/lib/widgets/email_list_view.dart +++ b/animated-responsive-layout/step_07/lib/widgets/email_list_view.dart @@ -30,23 +30,21 @@ class EmailListView extends StatelessWidget { const SizedBox(height: 8), search_bar.SearchBar(currentUser: currentUser), const SizedBox(height: 8), - ...List.generate( - data.emails.length, - (index) { - return Padding( - padding: const EdgeInsets.only(bottom: 8.0), - child: EmailWidget( - email: data.emails[index], - onSelected: onSelected != null - ? () { + ...List.generate(data.emails.length, (index) { + return Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: EmailWidget( + email: data.emails[index], + onSelected: + onSelected != null + ? () { onSelected!(index); } - : null, - isSelected: selectedIndex == index, - ), - ); - }, - ), + : null, + isSelected: selectedIndex == index, + ), + ); + }), ], ), ); diff --git a/animated-responsive-layout/step_07/lib/widgets/email_widget.dart b/animated-responsive-layout/step_07/lib/widgets/email_widget.dart index cb317686d6..8e37f4d8bc 100644 --- a/animated-responsive-layout/step_07/lib/widgets/email_widget.dart +++ b/animated-responsive-layout/step_07/lib/widgets/email_widget.dart @@ -6,11 +6,7 @@ import 'package:flutter/material.dart'; import '../models/models.dart'; import 'star_button.dart'; -enum EmailType { - preview, - threaded, - primaryThreaded, -} +enum EmailType { preview, threaded, primaryThreaded } class EmailWidget extends StatefulWidget { const EmailWidget({ @@ -42,10 +38,10 @@ class _EmailWidgetState extends State { ); Color get _surfaceColor => switch (widget) { - EmailWidget(isPreview: false) => _colorScheme.surface, - EmailWidget(isSelected: true) => _colorScheme.primaryContainer, - _ => unselectedColor, - }; + EmailWidget(isPreview: false) => _colorScheme.surface, + EmailWidget(isSelected: true) => _colorScheme.primaryContainer, + _ => unselectedColor, + }; @override Widget build(BuildContext context) { @@ -60,10 +56,7 @@ class _EmailWidgetState extends State { mainAxisSize: MainAxisSize.min, children: [ if (widget.showHeadline) ...[ - EmailHeadline( - email: widget.email, - isSelected: widget.isSelected, - ), + EmailHeadline(email: widget.email, isSelected: widget.isSelected), ], EmailContent( email: widget.email, @@ -117,12 +110,12 @@ class _EmailContentState extends State { } TextStyle? get contentTextStyle => switch (widget) { - EmailContent(isThreaded: true) => _textTheme.bodyLarge, - EmailContent(isSelected: true) => _textTheme.bodyMedium - ?.copyWith(color: _colorScheme.onPrimaryContainer), - _ => - _textTheme.bodyMedium?.copyWith(color: _colorScheme.onSurfaceVariant), - }; + EmailContent(isThreaded: true) => _textTheme.bodyLarge, + EmailContent(isSelected: true) => _textTheme.bodyMedium?.copyWith( + color: _colorScheme.onPrimaryContainer, + ), + _ => _textTheme.bodyMedium?.copyWith(color: _colorScheme.onSurfaceVariant), + }; @override Widget build(BuildContext context) { @@ -131,49 +124,59 @@ class _EmailContentState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - LayoutBuilder(builder: (context, constraints) { - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - if (constraints.maxWidth - 200 > 0) ...[ - CircleAvatar( - backgroundImage: AssetImage(widget.email.sender.avatarUrl), - ), - const Padding(padding: EdgeInsets.symmetric(horizontal: 6.0)), - ], - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.email.sender.name.fullName, - overflow: TextOverflow.fade, - maxLines: 1, - style: widget.isSelected - ? _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSecondaryContainer) - : _textTheme.labelMedium - ?.copyWith(color: _colorScheme.onSurface), - ), - Text( - lastActiveLabel, - overflow: TextOverflow.fade, - maxLines: 1, - style: widget.isSelected - ? _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSecondaryContainer) - : _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSurfaceVariant), + LayoutBuilder( + builder: (context, constraints) { + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (constraints.maxWidth - 200 > 0) ...[ + CircleAvatar( + backgroundImage: AssetImage( + widget.email.sender.avatarUrl, ), - ], + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 6.0), + ), + ], + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.email.sender.name.fullName, + overflow: TextOverflow.fade, + maxLines: 1, + style: + widget.isSelected + ? _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSecondaryContainer, + ) + : _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSurface, + ), + ), + Text( + lastActiveLabel, + overflow: TextOverflow.fade, + maxLines: 1, + style: + widget.isSelected + ? _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSecondaryContainer, + ) + : _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSurfaceVariant, + ), + ), + ], + ), ), - ), - if (constraints.maxWidth - 200 > 0) ...[ - const StarButton(), - ] - ], - ); - }), + if (constraints.maxWidth - 200 > 0) ...[const StarButton()], + ], + ); + }, + ), const SizedBox(width: 8), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -181,8 +184,9 @@ class _EmailContentState extends State { if (widget.isPreview) ...[ Text( widget.email.subject, - style: const TextStyle(fontSize: 18) - .copyWith(color: _colorScheme.onSurface), + style: const TextStyle( + fontSize: 18, + ).copyWith(color: _colorScheme.onSurface), ), ], if (widget.isThreaded) ...[ @@ -190,7 +194,7 @@ class _EmailContentState extends State { Text( "To ${widget.email.recipients.map((recipient) => recipient.name.first).join(", ")}", style: _textTheme.bodyMedium, - ) + ), ], contentSpacer, Text( @@ -204,19 +208,17 @@ class _EmailContentState extends State { const SizedBox(width: 12), widget.email.attachments.isNotEmpty ? Container( - height: 96, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8.0), - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage(widget.email.attachments.first.url), - ), + height: 96, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage(widget.email.attachments.first.url), ), - ) + ), + ) : const SizedBox.shrink(), - if (!widget.isPreview) ...[ - const EmailReplyOptions(), - ], + if (!widget.isPreview) ...[const EmailReplyOptions()], ], ), ); @@ -243,71 +245,76 @@ class _EmailHeadlineState extends State { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - return Container( - height: 84, - color: Color.alphaBlend( - _colorScheme.primary.withAlpha(12), - _colorScheme.surface, - ), - child: Padding( - padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), - child: Row( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.email.subject, - maxLines: 1, - overflow: TextOverflow.fade, - style: const TextStyle( - fontSize: 18, fontWeight: FontWeight.w400), - ), - Text( - '${widget.email.replies.toString()} Messages', - maxLines: 1, - overflow: TextOverflow.fade, - style: _textTheme.labelMedium - ?.copyWith(fontWeight: FontWeight.w500), - ), - ], - ), - ), - // Display a "condensed" version if the widget in the row are - // expected to overflow. - if (constraints.maxWidth - 200 > 0) ...[ - SizedBox( - height: 40, - width: 40, - child: FloatingActionButton( - onPressed: () {}, - elevation: 0, - backgroundColor: _colorScheme.surface, - child: const Icon(Icons.delete_outline), + return LayoutBuilder( + builder: (context, constraints) { + return Container( + height: 84, + color: Color.alphaBlend( + _colorScheme.primary.withAlpha(12), + _colorScheme.surface, + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), + child: Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.email.subject, + maxLines: 1, + overflow: TextOverflow.fade, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w400, + ), + ), + Text( + '${widget.email.replies.toString()} Messages', + maxLines: 1, + overflow: TextOverflow.fade, + style: _textTheme.labelMedium?.copyWith( + fontWeight: FontWeight.w500, + ), + ), + ], ), ), - const Padding(padding: EdgeInsets.only(right: 8.0)), - SizedBox( - height: 40, - width: 40, - child: FloatingActionButton( - onPressed: () {}, - elevation: 0, - backgroundColor: _colorScheme.surface, - child: const Icon(Icons.more_vert), + // Display a "condensed" version if the widget in the row are + // expected to overflow. + if (constraints.maxWidth - 200 > 0) ...[ + SizedBox( + height: 40, + width: 40, + child: FloatingActionButton( + onPressed: () {}, + elevation: 0, + backgroundColor: _colorScheme.surface, + child: const Icon(Icons.delete_outline), + ), ), - ), - ] - ], + const Padding(padding: EdgeInsets.only(right: 8.0)), + SizedBox( + height: 40, + width: 40, + child: FloatingActionButton( + onPressed: () {}, + elevation: 0, + backgroundColor: _colorScheme.surface, + child: const Icon(Icons.more_vert), + ), + ), + ], + ], + ), ), - ), - ); - }); + ); + }, + ); } } @@ -333,8 +340,9 @@ class _EmailReplyOptionsState extends State { Expanded( child: TextButton( style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(_colorScheme.onInverseSurface), + backgroundColor: WidgetStateProperty.all( + _colorScheme.onInverseSurface, + ), ), onPressed: () {}, child: Text( @@ -347,8 +355,9 @@ class _EmailReplyOptionsState extends State { Expanded( child: TextButton( style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(_colorScheme.onInverseSurface), + backgroundColor: WidgetStateProperty.all( + _colorScheme.onInverseSurface, + ), ), onPressed: () {}, child: Text( diff --git a/animated-responsive-layout/step_07/lib/widgets/search_bar.dart b/animated-responsive-layout/step_07/lib/widgets/search_bar.dart index 28a15c3ef0..92d91750c6 100644 --- a/animated-responsive-layout/step_07/lib/widgets/search_bar.dart +++ b/animated-responsive-layout/step_07/lib/widgets/search_bar.dart @@ -7,10 +7,7 @@ import 'package:flutter/material.dart'; import '../models/models.dart'; class SearchBar extends StatelessWidget { - const SearchBar({ - super.key, - required this.currentUser, - }); + const SearchBar({super.key, required this.currentUser}); final User currentUser; @@ -40,9 +37,7 @@ class SearchBar extends StatelessWidget { ), ), ), - CircleAvatar( - backgroundImage: AssetImage(currentUser.avatarUrl), - ), + CircleAvatar(backgroundImage: AssetImage(currentUser.avatarUrl)), ], ), ), diff --git a/animated-responsive-layout/step_07/lib/widgets/star_button.dart b/animated-responsive-layout/step_07/lib/widgets/star_button.dart index 95c1c79ee2..441c83570f 100644 --- a/animated-responsive-layout/step_07/lib/widgets/star_button.dart +++ b/animated-responsive-layout/step_07/lib/widgets/star_button.dart @@ -18,11 +18,7 @@ class _StarButtonState extends State { Icon get icon { final IconData iconData = state ? Icons.star : Icons.star_outline; - return Icon( - iconData, - color: Colors.grey, - size: 20, - ); + return Icon(iconData, color: Colors.grey, size: 20); } void _toggle() { @@ -44,10 +40,7 @@ class _StarButtonState extends State { shape: const CircleBorder(), backgroundColor: _colorScheme.surface, onPressed: () => _toggle(), - child: Padding( - padding: const EdgeInsets.all(10.0), - child: icon, - ), + child: Padding(padding: const EdgeInsets.all(10.0), child: icon), ), ); } diff --git a/animated-responsive-layout/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animated-responsive-layout/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 6784a9060a..8307189d5d 100644 --- a/animated-responsive-layout/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animated-responsive-layout/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animated-responsive-layout/step_07/pubspec.yaml b/animated-responsive-layout/step_07/pubspec.yaml index e66a7947a0..51fe30860f 100644 --- a/animated-responsive-layout/step_07/pubspec.yaml +++ b/animated-responsive-layout/step_07/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/animated-responsive-layout/step_08/android/app/build.gradle b/animated-responsive-layout/step_08/android/app/build.gradle deleted file mode 100644 index 79a54d97fd..0000000000 --- a/animated-responsive-layout/step_08/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.animated_responsive_layout" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.animated_responsive_layout" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animated-responsive-layout/step_08/android/app/build.gradle.kts b/animated-responsive-layout/step_08/android/app/build.gradle.kts new file mode 100644 index 0000000000..5643237de3 --- /dev/null +++ b/animated-responsive-layout/step_08/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.animated_responsive_layout" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.animated_responsive_layout" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animated-responsive-layout/step_08/android/build.gradle b/animated-responsive-layout/step_08/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animated-responsive-layout/step_08/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animated-responsive-layout/step_08/android/build.gradle.kts b/animated-responsive-layout/step_08/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animated-responsive-layout/step_08/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animated-responsive-layout/step_08/android/gradle.properties b/animated-responsive-layout/step_08/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animated-responsive-layout/step_08/android/gradle.properties +++ b/animated-responsive-layout/step_08/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animated-responsive-layout/step_08/android/gradle/wrapper/gradle-wrapper.properties b/animated-responsive-layout/step_08/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animated-responsive-layout/step_08/android/gradle/wrapper/gradle-wrapper.properties +++ b/animated-responsive-layout/step_08/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animated-responsive-layout/step_08/android/settings.gradle b/animated-responsive-layout/step_08/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animated-responsive-layout/step_08/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animated-responsive-layout/step_08/android/settings.gradle.kts b/animated-responsive-layout/step_08/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animated-responsive-layout/step_08/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animated-responsive-layout/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animated-responsive-layout/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animated-responsive-layout/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animated-responsive-layout/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animated-responsive-layout/step_08/lib/animations.dart b/animated-responsive-layout/step_08/lib/animations.dart index aa48363aaf..41650c1c3c 100644 --- a/animated-responsive-layout/step_08/lib/animations.dart +++ b/animated-responsive-layout/step_08/lib/animations.dart @@ -6,85 +6,83 @@ import 'package:flutter/animation.dart'; class BarAnimation extends ReverseAnimation { BarAnimation({required AnimationController parent}) - : super( - CurvedAnimation( - parent: parent, - curve: const Interval(0, 1 / 5), - reverseCurve: const Interval(1 / 5, 4 / 5), - ), - ); + : super( + CurvedAnimation( + parent: parent, + curve: const Interval(0, 1 / 5), + reverseCurve: const Interval(1 / 5, 4 / 5), + ), + ); } class OffsetAnimation extends CurvedAnimation { OffsetAnimation({required super.parent}) - : super( - curve: const Interval( - 2 / 5, - 3 / 5, - curve: Curves.easeInOutCubicEmphasized, - ), - reverseCurve: Interval( - 4 / 5, - 1, - curve: Curves.easeInOutCubicEmphasized.flipped, - ), - ); + : super( + curve: const Interval( + 2 / 5, + 3 / 5, + curve: Curves.easeInOutCubicEmphasized, + ), + reverseCurve: Interval( + 4 / 5, + 1, + curve: Curves.easeInOutCubicEmphasized.flipped, + ), + ); } class RailAnimation extends CurvedAnimation { RailAnimation({required super.parent}) - : super( - curve: const Interval(0 / 5, 4 / 5), - reverseCurve: const Interval(3 / 5, 1), - ); + : super( + curve: const Interval(0 / 5, 4 / 5), + reverseCurve: const Interval(3 / 5, 1), + ); } class RailFabAnimation extends CurvedAnimation { RailFabAnimation({required super.parent}) - : super( - curve: const Interval(3 / 5, 1), - ); + : super(curve: const Interval(3 / 5, 1)); } class ScaleAnimation extends CurvedAnimation { ScaleAnimation({required super.parent}) - : super( - curve: const Interval( - 3 / 5, - 4 / 5, - curve: Curves.easeInOutCubicEmphasized, - ), - reverseCurve: Interval( - 3 / 5, - 1, - curve: Curves.easeInOutCubicEmphasized.flipped, - ), - ); + : super( + curve: const Interval( + 3 / 5, + 4 / 5, + curve: Curves.easeInOutCubicEmphasized, + ), + reverseCurve: Interval( + 3 / 5, + 1, + curve: Curves.easeInOutCubicEmphasized.flipped, + ), + ); } class ShapeAnimation extends CurvedAnimation { ShapeAnimation({required super.parent}) - : super( - curve: const Interval( - 2 / 5, - 3 / 5, - curve: Curves.easeInOutCubicEmphasized, - ), - ); + : super( + curve: const Interval( + 2 / 5, + 3 / 5, + curve: Curves.easeInOutCubicEmphasized, + ), + ); } class SizeAnimation extends CurvedAnimation { SizeAnimation({required super.parent}) - : super( - curve: const Interval( - 0 / 5, - 3 / 5, - curve: Curves.easeInOutCubicEmphasized, - ), - reverseCurve: Interval( - 2 / 5, - 1, - curve: Curves.easeInOutCubicEmphasized.flipped, - ), - ); + : super( + curve: const Interval( + 0 / 5, + 3 / 5, + curve: Curves.easeInOutCubicEmphasized, + ), + reverseCurve: Interval( + 2 / 5, + 1, + curve: Curves.easeInOutCubicEmphasized.flipped, + ), + ); } diff --git a/animated-responsive-layout/step_08/lib/main.dart b/animated-responsive-layout/step_08/lib/main.dart index 3b08566329..3429694842 100644 --- a/animated-responsive-layout/step_08/lib/main.dart +++ b/animated-responsive-layout/step_08/lib/main.dart @@ -31,10 +31,7 @@ class MainApp extends StatelessWidget { } class Feed extends StatefulWidget { - const Feed({ - super.key, - required this.currentUser, - }); + const Feed({super.key, required this.currentUser}); final User currentUser; @@ -45,12 +42,15 @@ class Feed extends StatefulWidget { class _FeedState extends State with SingleTickerProviderStateMixin { late final _colorScheme = Theme.of(context).colorScheme; late final _backgroundColor = Color.alphaBlend( - _colorScheme.primary.withAlpha(36), _colorScheme.surface); + _colorScheme.primary.withAlpha(36), + _colorScheme.surface, + ); late final _controller = AnimationController( - duration: const Duration(milliseconds: 1000), - reverseDuration: const Duration(milliseconds: 1250), - value: 0, - vsync: this); + duration: const Duration(milliseconds: 1000), + reverseDuration: const Duration(milliseconds: 1250), + value: 0, + vsync: this, + ); late final _railAnimation = RailAnimation(parent: _controller); late final _railFabAnimation = RailFabAnimation(parent: _controller); late final _barAnimation = BarAnimation(parent: _controller); diff --git a/animated-responsive-layout/step_08/lib/models/data.dart b/animated-responsive-layout/step_08/lib/models/data.dart index 141ce9d588..097304290b 100644 --- a/animated-responsive-layout/step_08/lib/models/data.dart +++ b/animated-responsive-layout/step_08/lib/models/data.dart @@ -5,25 +5,30 @@ import 'models.dart'; final User user_0 = User( - name: const Name(first: 'Me', last: ''), - avatarUrl: 'assets/avatar_1.png', - lastActive: DateTime.now()); + name: const Name(first: 'Me', last: ''), + avatarUrl: 'assets/avatar_1.png', + lastActive: DateTime.now(), +); final User user_1 = User( - name: const Name(first: '老', last: '强'), - avatarUrl: 'assets/avatar_2.png', - lastActive: DateTime.now().subtract(const Duration(minutes: 10))); + name: const Name(first: '老', last: '强'), + avatarUrl: 'assets/avatar_2.png', + lastActive: DateTime.now().subtract(const Duration(minutes: 10)), +); final User user_2 = User( - name: const Name(first: 'So', last: 'Duri'), - avatarUrl: 'assets/avatar_3.png', - lastActive: DateTime.now().subtract(const Duration(minutes: 20))); + name: const Name(first: 'So', last: 'Duri'), + avatarUrl: 'assets/avatar_3.png', + lastActive: DateTime.now().subtract(const Duration(minutes: 20)), +); final User user_3 = User( - name: const Name(first: 'Lily', last: 'MacDonald'), - avatarUrl: 'assets/avatar_4.png', - lastActive: DateTime.now().subtract(const Duration(hours: 2))); + name: const Name(first: 'Lily', last: 'MacDonald'), + avatarUrl: 'assets/avatar_4.png', + lastActive: DateTime.now().subtract(const Duration(hours: 2)), +); final User user_4 = User( - name: const Name(first: 'Ziad', last: 'Aouad'), - avatarUrl: 'assets/avatar_5.png', - lastActive: DateTime.now().subtract(const Duration(hours: 6))); + name: const Name(first: 'Ziad', last: 'Aouad'), + avatarUrl: 'assets/avatar_5.png', + lastActive: DateTime.now().subtract(const Duration(hours: 6)), +); final List emails = [ Email( @@ -40,12 +45,13 @@ final List emails = [ 'I think it’s time for us to finally try that new noodle shop downtown that doesn’t use menus. Anyone else have other suggestions for dinner club this week? I’m so intrigued by this idea of a noodle restaurant where no one gets to order for themselves - could be fun, or terrible, or both :)\n\nSo', ), Email( - sender: user_3, - recipients: [], - subject: 'This food show is made for you', - content: - 'Ping– you’d love this new food show I started watching. It’s produced by a Thai drummer who started getting recognized for the amazing vegan food she always brought to shows.', - attachments: [const Attachment(url: 'assets/thumbnail_1.png')]), + sender: user_3, + recipients: [], + subject: 'This food show is made for you', + content: + 'Ping– you’d love this new food show I started watching. It’s produced by a Thai drummer who started getting recognized for the amazing vegan food she always brought to shows.', + attachments: [const Attachment(url: 'assets/thumbnail_1.png')], + ), Email( sender: user_4, recipients: [], @@ -58,20 +64,14 @@ final List emails = [ final List replies = [ Email( sender: user_2, - recipients: [ - user_3, - user_2, - ], + recipients: [user_3, user_2], subject: 'Dinner Club', content: 'I think it’s time for us to finally try that new noodle shop downtown that doesn’t use menus. Anyone else have other suggestions for dinner club this week? I’m so intrigued by this idea of a noodle restaurant where no one gets to order for themselves - could be fun, or terrible, or both :)\n\nSo', ), Email( sender: user_0, - recipients: [ - user_3, - user_2, - ], + recipients: [user_3, user_2], subject: 'Dinner Club', content: 'Yes! I forgot about that place! I’m definitely up for taking a risk this week and handing control over to this mysterious noodle chef. I wonder what happens if you have allergies though? Lucky none of us have any otherwise I’d be a bit concerned.\n\nThis is going to be great. See you all at the usual time?', diff --git a/animated-responsive-layout/step_08/lib/models/models.dart b/animated-responsive-layout/step_08/lib/models/models.dart index c6fe69e010..6b1f3d95d6 100644 --- a/animated-responsive-layout/step_08/lib/models/models.dart +++ b/animated-responsive-layout/step_08/lib/models/models.dart @@ -3,9 +3,7 @@ // found in the LICENSE file. class Attachment { - const Attachment({ - required this.url, - }); + const Attachment({required this.url}); final String url; } @@ -29,10 +27,7 @@ class Email { } class Name { - const Name({ - required this.first, - required this.last, - }); + const Name({required this.first, required this.last}); final String first; final String last; diff --git a/animated-responsive-layout/step_08/lib/transitions/bottom_bar_transition.dart b/animated-responsive-layout/step_08/lib/transitions/bottom_bar_transition.dart index 1fe9654d87..61dc6821a0 100644 --- a/animated-responsive-layout/step_08/lib/transitions/bottom_bar_transition.dart +++ b/animated-responsive-layout/step_08/lib/transitions/bottom_bar_transition.dart @@ -6,11 +6,12 @@ import 'package:flutter/material.dart'; import '../animations.dart'; class BottomBarTransition extends StatefulWidget { - const BottomBarTransition( - {super.key, - required this.animation, - required this.backgroundColor, - required this.child}); + const BottomBarTransition({ + super.key, + required this.animation, + required this.backgroundColor, + required this.child, + }); final Animation animation; final Color backgroundColor; diff --git a/animated-responsive-layout/step_08/lib/transitions/list_detail_transition.dart b/animated-responsive-layout/step_08/lib/transitions/list_detail_transition.dart index e2f3748b89..92707c2f0c 100644 --- a/animated-responsive-layout/step_08/lib/transitions/list_detail_transition.dart +++ b/animated-responsive-layout/step_08/lib/transitions/list_detail_transition.dart @@ -25,8 +25,9 @@ class ListDetailTransition extends StatefulWidget { class _ListDetailTransitionState extends State { Animation widthAnimation = const AlwaysStoppedAnimation(0); - late final Animation sizeAnimation = - SizeAnimation(parent: widget.animation); + late final Animation sizeAnimation = SizeAnimation( + parent: widget.animation, + ); late final Animation offsetAnimation = Tween( begin: const Offset(1, 0), end: Offset.zero, @@ -56,8 +57,10 @@ class _ListDetailTransitionState extends State { } if (currentFlexFactor == 0) { - widthAnimation = - Tween(begin: 0, end: nextFlexFactor).animate(sizeAnimation); + widthAnimation = Tween( + begin: 0, + end: nextFlexFactor, + ).animate(sizeAnimation); } else { final TweenSequence sequence = TweenSequence([ if (sizeAnimation.value > 0) ...[ @@ -85,19 +88,16 @@ class _ListDetailTransitionState extends State { return widthAnimation.value.toInt() == 0 ? widget.one : Row( - children: [ - Flexible( - flex: 1000, - child: widget.one, + children: [ + Flexible(flex: 1000, child: widget.one), + Flexible( + flex: widthAnimation.value.toInt(), + child: FractionalTranslation( + translation: offsetAnimation.value, + child: widget.two, ), - Flexible( - flex: widthAnimation.value.toInt(), - child: FractionalTranslation( - translation: offsetAnimation.value, - child: widget.two, - ), - ), - ], - ); + ), + ], + ); } } diff --git a/animated-responsive-layout/step_08/lib/transitions/nav_rail_transition.dart b/animated-responsive-layout/step_08/lib/transitions/nav_rail_transition.dart index 36d06eb4b7..f1d83bb3cd 100644 --- a/animated-responsive-layout/step_08/lib/transitions/nav_rail_transition.dart +++ b/animated-responsive-layout/step_08/lib/transitions/nav_rail_transition.dart @@ -6,11 +6,12 @@ import 'package:flutter/material.dart'; import '../animations.dart'; class NavRailTransition extends StatefulWidget { - const NavRailTransition( - {super.key, - required this.animation, - required this.backgroundColor, - required this.child}); + const NavRailTransition({ + super.key, + required this.animation, + required this.backgroundColor, + required this.child, + }); final Animation animation; final Widget child; diff --git a/animated-responsive-layout/step_08/lib/widgets/animated_floating_action_button.dart b/animated-responsive-layout/step_08/lib/widgets/animated_floating_action_button.dart index e0fa168644..6d50e95dd0 100644 --- a/animated-responsive-layout/step_08/lib/widgets/animated_floating_action_button.dart +++ b/animated-responsive-layout/step_08/lib/widgets/animated_floating_action_button.dart @@ -29,10 +29,12 @@ class AnimatedFloatingActionButton extends StatefulWidget { class _AnimatedFloatingActionButton extends State { late final ColorScheme _colorScheme = Theme.of(context).colorScheme; - late final Animation _scaleAnimation = - ScaleAnimation(parent: widget.animation); - late final Animation _shapeAnimation = - ShapeAnimation(parent: widget.animation); + late final Animation _scaleAnimation = ScaleAnimation( + parent: widget.animation, + ); + late final Animation _shapeAnimation = ShapeAnimation( + parent: widget.animation, + ); @override Widget build(BuildContext context) { diff --git a/animated-responsive-layout/step_08/lib/widgets/disappearing_bottom_navigation_bar.dart b/animated-responsive-layout/step_08/lib/widgets/disappearing_bottom_navigation_bar.dart index 059e4afb63..7108dbfaea 100644 --- a/animated-responsive-layout/step_08/lib/widgets/disappearing_bottom_navigation_bar.dart +++ b/animated-responsive-layout/step_08/lib/widgets/disappearing_bottom_navigation_bar.dart @@ -28,12 +28,10 @@ class DisappearingBottomNavigationBar extends StatelessWidget { child: NavigationBar( elevation: 0, backgroundColor: Colors.white, - destinations: destinations.map((d) { - return NavigationDestination( - icon: Icon(d.icon), - label: d.label, - ); - }).toList(), + destinations: + destinations.map((d) { + return NavigationDestination(icon: Icon(d.icon), label: d.label); + }).toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ), diff --git a/animated-responsive-layout/step_08/lib/widgets/disappearing_navigation_rail.dart b/animated-responsive-layout/step_08/lib/widgets/disappearing_navigation_rail.dart index 9f1446ca98..2a586bbaff 100644 --- a/animated-responsive-layout/step_08/lib/widgets/disappearing_navigation_rail.dart +++ b/animated-responsive-layout/step_08/lib/widgets/disappearing_navigation_rail.dart @@ -36,10 +36,7 @@ class DisappearingNavigationRail extends StatelessWidget { onDestinationSelected: onDestinationSelected, leading: Column( children: [ - IconButton( - onPressed: () {}, - icon: const Icon(Icons.menu), - ), + IconButton(onPressed: () {}, icon: const Icon(Icons.menu)), const SizedBox(height: 8), AnimatedFloatingActionButton( animation: railFabAnimation, @@ -50,12 +47,13 @@ class DisappearingNavigationRail extends StatelessWidget { ], ), groupAlignment: -0.85, - destinations: destinations.map((d) { - return NavigationRailDestination( - icon: Icon(d.icon), - label: Text(d.label), - ); - }).toList(), + destinations: + destinations.map((d) { + return NavigationRailDestination( + icon: Icon(d.icon), + label: Text(d.label), + ); + }).toList(), ), ); } diff --git a/animated-responsive-layout/step_08/lib/widgets/email_list_view.dart b/animated-responsive-layout/step_08/lib/widgets/email_list_view.dart index 881cd434c1..38a751af1c 100644 --- a/animated-responsive-layout/step_08/lib/widgets/email_list_view.dart +++ b/animated-responsive-layout/step_08/lib/widgets/email_list_view.dart @@ -30,23 +30,21 @@ class EmailListView extends StatelessWidget { const SizedBox(height: 8), search_bar.SearchBar(currentUser: currentUser), const SizedBox(height: 8), - ...List.generate( - data.emails.length, - (index) { - return Padding( - padding: const EdgeInsets.only(bottom: 8.0), - child: EmailWidget( - email: data.emails[index], - onSelected: onSelected != null - ? () { + ...List.generate(data.emails.length, (index) { + return Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: EmailWidget( + email: data.emails[index], + onSelected: + onSelected != null + ? () { onSelected!(index); } - : null, - isSelected: selectedIndex == index, - ), - ); - }, - ), + : null, + isSelected: selectedIndex == index, + ), + ); + }), ], ), ); diff --git a/animated-responsive-layout/step_08/lib/widgets/email_widget.dart b/animated-responsive-layout/step_08/lib/widgets/email_widget.dart index cb317686d6..8e37f4d8bc 100644 --- a/animated-responsive-layout/step_08/lib/widgets/email_widget.dart +++ b/animated-responsive-layout/step_08/lib/widgets/email_widget.dart @@ -6,11 +6,7 @@ import 'package:flutter/material.dart'; import '../models/models.dart'; import 'star_button.dart'; -enum EmailType { - preview, - threaded, - primaryThreaded, -} +enum EmailType { preview, threaded, primaryThreaded } class EmailWidget extends StatefulWidget { const EmailWidget({ @@ -42,10 +38,10 @@ class _EmailWidgetState extends State { ); Color get _surfaceColor => switch (widget) { - EmailWidget(isPreview: false) => _colorScheme.surface, - EmailWidget(isSelected: true) => _colorScheme.primaryContainer, - _ => unselectedColor, - }; + EmailWidget(isPreview: false) => _colorScheme.surface, + EmailWidget(isSelected: true) => _colorScheme.primaryContainer, + _ => unselectedColor, + }; @override Widget build(BuildContext context) { @@ -60,10 +56,7 @@ class _EmailWidgetState extends State { mainAxisSize: MainAxisSize.min, children: [ if (widget.showHeadline) ...[ - EmailHeadline( - email: widget.email, - isSelected: widget.isSelected, - ), + EmailHeadline(email: widget.email, isSelected: widget.isSelected), ], EmailContent( email: widget.email, @@ -117,12 +110,12 @@ class _EmailContentState extends State { } TextStyle? get contentTextStyle => switch (widget) { - EmailContent(isThreaded: true) => _textTheme.bodyLarge, - EmailContent(isSelected: true) => _textTheme.bodyMedium - ?.copyWith(color: _colorScheme.onPrimaryContainer), - _ => - _textTheme.bodyMedium?.copyWith(color: _colorScheme.onSurfaceVariant), - }; + EmailContent(isThreaded: true) => _textTheme.bodyLarge, + EmailContent(isSelected: true) => _textTheme.bodyMedium?.copyWith( + color: _colorScheme.onPrimaryContainer, + ), + _ => _textTheme.bodyMedium?.copyWith(color: _colorScheme.onSurfaceVariant), + }; @override Widget build(BuildContext context) { @@ -131,49 +124,59 @@ class _EmailContentState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - LayoutBuilder(builder: (context, constraints) { - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - if (constraints.maxWidth - 200 > 0) ...[ - CircleAvatar( - backgroundImage: AssetImage(widget.email.sender.avatarUrl), - ), - const Padding(padding: EdgeInsets.symmetric(horizontal: 6.0)), - ], - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.email.sender.name.fullName, - overflow: TextOverflow.fade, - maxLines: 1, - style: widget.isSelected - ? _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSecondaryContainer) - : _textTheme.labelMedium - ?.copyWith(color: _colorScheme.onSurface), - ), - Text( - lastActiveLabel, - overflow: TextOverflow.fade, - maxLines: 1, - style: widget.isSelected - ? _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSecondaryContainer) - : _textTheme.labelMedium?.copyWith( - color: _colorScheme.onSurfaceVariant), + LayoutBuilder( + builder: (context, constraints) { + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (constraints.maxWidth - 200 > 0) ...[ + CircleAvatar( + backgroundImage: AssetImage( + widget.email.sender.avatarUrl, ), - ], + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 6.0), + ), + ], + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.email.sender.name.fullName, + overflow: TextOverflow.fade, + maxLines: 1, + style: + widget.isSelected + ? _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSecondaryContainer, + ) + : _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSurface, + ), + ), + Text( + lastActiveLabel, + overflow: TextOverflow.fade, + maxLines: 1, + style: + widget.isSelected + ? _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSecondaryContainer, + ) + : _textTheme.labelMedium?.copyWith( + color: _colorScheme.onSurfaceVariant, + ), + ), + ], + ), ), - ), - if (constraints.maxWidth - 200 > 0) ...[ - const StarButton(), - ] - ], - ); - }), + if (constraints.maxWidth - 200 > 0) ...[const StarButton()], + ], + ); + }, + ), const SizedBox(width: 8), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -181,8 +184,9 @@ class _EmailContentState extends State { if (widget.isPreview) ...[ Text( widget.email.subject, - style: const TextStyle(fontSize: 18) - .copyWith(color: _colorScheme.onSurface), + style: const TextStyle( + fontSize: 18, + ).copyWith(color: _colorScheme.onSurface), ), ], if (widget.isThreaded) ...[ @@ -190,7 +194,7 @@ class _EmailContentState extends State { Text( "To ${widget.email.recipients.map((recipient) => recipient.name.first).join(", ")}", style: _textTheme.bodyMedium, - ) + ), ], contentSpacer, Text( @@ -204,19 +208,17 @@ class _EmailContentState extends State { const SizedBox(width: 12), widget.email.attachments.isNotEmpty ? Container( - height: 96, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8.0), - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage(widget.email.attachments.first.url), - ), + height: 96, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage(widget.email.attachments.first.url), ), - ) + ), + ) : const SizedBox.shrink(), - if (!widget.isPreview) ...[ - const EmailReplyOptions(), - ], + if (!widget.isPreview) ...[const EmailReplyOptions()], ], ), ); @@ -243,71 +245,76 @@ class _EmailHeadlineState extends State { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - return Container( - height: 84, - color: Color.alphaBlend( - _colorScheme.primary.withAlpha(12), - _colorScheme.surface, - ), - child: Padding( - padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), - child: Row( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.email.subject, - maxLines: 1, - overflow: TextOverflow.fade, - style: const TextStyle( - fontSize: 18, fontWeight: FontWeight.w400), - ), - Text( - '${widget.email.replies.toString()} Messages', - maxLines: 1, - overflow: TextOverflow.fade, - style: _textTheme.labelMedium - ?.copyWith(fontWeight: FontWeight.w500), - ), - ], - ), - ), - // Display a "condensed" version if the widget in the row are - // expected to overflow. - if (constraints.maxWidth - 200 > 0) ...[ - SizedBox( - height: 40, - width: 40, - child: FloatingActionButton( - onPressed: () {}, - elevation: 0, - backgroundColor: _colorScheme.surface, - child: const Icon(Icons.delete_outline), + return LayoutBuilder( + builder: (context, constraints) { + return Container( + height: 84, + color: Color.alphaBlend( + _colorScheme.primary.withAlpha(12), + _colorScheme.surface, + ), + child: Padding( + padding: const EdgeInsets.fromLTRB(24, 12, 12, 12), + child: Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.email.subject, + maxLines: 1, + overflow: TextOverflow.fade, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w400, + ), + ), + Text( + '${widget.email.replies.toString()} Messages', + maxLines: 1, + overflow: TextOverflow.fade, + style: _textTheme.labelMedium?.copyWith( + fontWeight: FontWeight.w500, + ), + ), + ], ), ), - const Padding(padding: EdgeInsets.only(right: 8.0)), - SizedBox( - height: 40, - width: 40, - child: FloatingActionButton( - onPressed: () {}, - elevation: 0, - backgroundColor: _colorScheme.surface, - child: const Icon(Icons.more_vert), + // Display a "condensed" version if the widget in the row are + // expected to overflow. + if (constraints.maxWidth - 200 > 0) ...[ + SizedBox( + height: 40, + width: 40, + child: FloatingActionButton( + onPressed: () {}, + elevation: 0, + backgroundColor: _colorScheme.surface, + child: const Icon(Icons.delete_outline), + ), ), - ), - ] - ], + const Padding(padding: EdgeInsets.only(right: 8.0)), + SizedBox( + height: 40, + width: 40, + child: FloatingActionButton( + onPressed: () {}, + elevation: 0, + backgroundColor: _colorScheme.surface, + child: const Icon(Icons.more_vert), + ), + ), + ], + ], + ), ), - ), - ); - }); + ); + }, + ); } } @@ -333,8 +340,9 @@ class _EmailReplyOptionsState extends State { Expanded( child: TextButton( style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(_colorScheme.onInverseSurface), + backgroundColor: WidgetStateProperty.all( + _colorScheme.onInverseSurface, + ), ), onPressed: () {}, child: Text( @@ -347,8 +355,9 @@ class _EmailReplyOptionsState extends State { Expanded( child: TextButton( style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(_colorScheme.onInverseSurface), + backgroundColor: WidgetStateProperty.all( + _colorScheme.onInverseSurface, + ), ), onPressed: () {}, child: Text( diff --git a/animated-responsive-layout/step_08/lib/widgets/search_bar.dart b/animated-responsive-layout/step_08/lib/widgets/search_bar.dart index 28a15c3ef0..92d91750c6 100644 --- a/animated-responsive-layout/step_08/lib/widgets/search_bar.dart +++ b/animated-responsive-layout/step_08/lib/widgets/search_bar.dart @@ -7,10 +7,7 @@ import 'package:flutter/material.dart'; import '../models/models.dart'; class SearchBar extends StatelessWidget { - const SearchBar({ - super.key, - required this.currentUser, - }); + const SearchBar({super.key, required this.currentUser}); final User currentUser; @@ -40,9 +37,7 @@ class SearchBar extends StatelessWidget { ), ), ), - CircleAvatar( - backgroundImage: AssetImage(currentUser.avatarUrl), - ), + CircleAvatar(backgroundImage: AssetImage(currentUser.avatarUrl)), ], ), ), diff --git a/animated-responsive-layout/step_08/lib/widgets/star_button.dart b/animated-responsive-layout/step_08/lib/widgets/star_button.dart index 95c1c79ee2..441c83570f 100644 --- a/animated-responsive-layout/step_08/lib/widgets/star_button.dart +++ b/animated-responsive-layout/step_08/lib/widgets/star_button.dart @@ -18,11 +18,7 @@ class _StarButtonState extends State { Icon get icon { final IconData iconData = state ? Icons.star : Icons.star_outline; - return Icon( - iconData, - color: Colors.grey, - size: 20, - ); + return Icon(iconData, color: Colors.grey, size: 20); } void _toggle() { @@ -44,10 +40,7 @@ class _StarButtonState extends State { shape: const CircleBorder(), backgroundColor: _colorScheme.surface, onPressed: () => _toggle(), - child: Padding( - padding: const EdgeInsets.all(10.0), - child: icon, - ), + child: Padding(padding: const EdgeInsets.all(10.0), child: icon), ), ); } diff --git a/animated-responsive-layout/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animated-responsive-layout/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 6784a9060a..8307189d5d 100644 --- a/animated-responsive-layout/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animated-responsive-layout/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animated-responsive-layout/step_08/pubspec.yaml b/animated-responsive-layout/step_08/pubspec.yaml index e66a7947a0..51fe30860f 100644 --- a/animated-responsive-layout/step_08/pubspec.yaml +++ b/animated-responsive-layout/step_08/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/animations/codelab_rebuild.yaml b/animations/codelab_rebuild.yaml index da908463aa..34269155a7 100644 --- a/animations/codelab_rebuild.yaml +++ b/animations/codelab_rebuild.yaml @@ -20,7 +20,7 @@ steps: version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 @@ -67,15 +67,13 @@ steps: child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { @@ -126,43 +124,38 @@ steps: path: quiz/lib/model.dart replace-contents: | import 'dart:math' as math; - + class Question { final String question; final List possibleAnswers; final int correctAnswer; Question(this.question, this.possibleAnswers, this.correctAnswer); } - + class QuestionBank { final List _questions = _createQuestions(); - + bool get hasNextQuestion => _questions.isNotEmpty; int get remainingQuestions => _questions.length; - + Question? getRandomQuestion() { if (_questions.isEmpty) { return null; } - + var i = math.Random().nextInt(_questions.length); var question = _questions[i]; - + _questions.removeAt(i); return question; } } - + List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -177,12 +170,7 @@ steps: ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; @@ -247,8 +235,9 @@ steps: } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -262,11 +251,11 @@ steps: onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -279,9 +268,10 @@ steps: viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -317,10 +307,7 @@ steps: class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { @@ -429,17 +416,17 @@ steps: path: quiz/lib/scoreboard.dart replace-contents: | import 'package:flutter/material.dart'; - + class Scoreboard extends StatelessWidget { final int score; final int totalQuestions; - + const Scoreboard({ super.key, required this.score, required this.totalQuestions, }); - + @override Widget build(BuildContext context) { return Padding( @@ -453,7 +440,7 @@ steps: size: 50, color: score < i + 1 ? Colors.grey.shade400 : Colors.yellow.shade700, - ) + ), ], ), ); @@ -471,15 +458,15 @@ steps: - name: Patch lib/question_screen.dart path: quiz/lib/question_screen.dart patch-u: | - --- a/animations/step_01/lib/question_screen.dart - +++ b/animations/step_01/lib/question_screen.dart + --- b/animations/step_02_b/lib/question_screen.dart + +++ a/animations/step_02_b/lib/question_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'scoreboard.dart'; import 'view_model.dart'; class QuestionScreen extends StatefulWidget { - @@ -161,13 +162,9 @@ class StatusBar extends StatelessWidget { + @@ -160,13 +161,9 @@ class StatusBar extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -508,9 +495,9 @@ steps: - name: Patch lib/scoreboard.dart path: quiz/lib/scoreboard.dart patch-u: | - --- a/animations/step_02/lib/scoreboard.dart - +++ b/animations/step_02/lib/scoreboard.dart - @@ -18,14 +18,33 @@ class Scoreboard extends StatelessWidget { + --- b/animations/step_02_c/lib/scoreboard.dart + +++ a/animations/step_02_c/lib/scoreboard.dart + @@ -18,14 +18,31 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) @@ -519,9 +506,8 @@ steps: - size: 50, - color: - score < i + 1 ? Colors.grey.shade400 : Colors.yellow.shade700, - + AnimatedStar( - + isActive: score > i, - ) + - ), + + AnimatedStar(isActive: score > i), ], ), ); @@ -561,9 +547,9 @@ steps: - name: Patch lib/scoreboard.dart path: quiz/lib/scoreboard.dart patch-u: | - --- a/animations/step_02/lib/scoreboard.dart - +++ b/animations/step_02/lib/scoreboard.dart - @@ -40,10 +40,19 @@ class AnimatedStar extends StatelessWidget { + --- b/animations/step_02_d/lib/scoreboard.dart + +++ a/animations/step_02_d/lib/scoreboard.dart + @@ -38,10 +38,15 @@ class AnimatedStar extends StatelessWidget { return AnimatedScale( scale: isActive ? 1.0 : 0.5, duration: _duration, @@ -578,11 +564,7 @@ steps: + end: isActive ? _activatedColor : _deactivatedColor, + ), + builder: (context, value, child) { - + return Icon( - + Icons.star, - + size: 50, - + color: value, - + ); + + return Icon(Icons.star, size: 50, color: value); + }, ), ); @@ -599,9 +581,9 @@ steps: - name: Patch lib/scoreboard.dart path: quiz/lib/scoreboard.dart patch-u: | - --- a/animations/step_02/lib/scoreboard.dart - +++ b/animations/step_02/lib/scoreboard.dart - @@ -32,6 +32,7 @@ class AnimatedStar extends StatelessWidget { + --- b/animations/step_02_e/lib/scoreboard.dart + +++ a/animations/step_02_e/lib/scoreboard.dart + @@ -30,6 +30,7 @@ class AnimatedStar extends StatelessWidget { final Duration _duration = const Duration(milliseconds: 1000); final Color _deactivatedColor = Colors.grey.shade400; final Color _activatedColor = Colors.yellow.shade700; @@ -609,7 +591,7 @@ steps: AnimatedStar({super.key, required this.isActive}); - @@ -39,8 +40,10 @@ class AnimatedStar extends StatelessWidget { + @@ -37,8 +38,10 @@ class AnimatedStar extends StatelessWidget { Widget build(BuildContext context) { return AnimatedScale( scale: isActive ? 1.0 : 0.5, @@ -634,7 +616,7 @@ steps: patch-u: | --- b/animations/step_03_a/lib/question_screen.dart +++ a/animations/step_03_a/lib/question_screen.dart - @@ -87,13 +87,17 @@ class QuestionCard extends StatelessWidget { + @@ -86,13 +86,17 @@ class QuestionCard extends StatelessWidget { @override Widget build(BuildContext context) { @@ -673,16 +655,18 @@ steps: patch-u: | --- b/animations/step_03_b/lib/question_screen.dart +++ a/animations/step_03_b/lib/question_screen.dart - @@ -88,6 +88,14 @@ class QuestionCard extends StatelessWidget { + @@ -87,6 +87,16 @@ class QuestionCard extends StatelessWidget { @override Widget build(BuildContext context) { return AnimatedSwitcher( + transitionBuilder: (child, animation) { - + final curveAnimation = - + CurveTween(curve: Curves.easeInCubic).animate(animation); - + final offsetAnimation = - + Tween(begin: Offset(-0.1, 0.0), end: Offset.zero) - + .animate(curveAnimation); + + final curveAnimation = CurveTween( + + curve: Curves.easeInCubic, + + ).animate(animation); + + final offsetAnimation = Tween( + + begin: Offset(-0.1, 0.0), + + end: Offset.zero, + + ).animate(curveAnimation); + return SlideTransition(position: offsetAnimation, child: child); + }, duration: const Duration(milliseconds: 300), @@ -700,12 +684,12 @@ steps: - name: Patch lib/question_screen.dart path: quiz/lib/question_screen.dart patch-u: | - --- a/animations/step_03/lib/question_screen.dart - +++ b/animations/step_03/lib/question_screen.dart - @@ -94,7 +94,11 @@ class QuestionCard extends StatelessWidget { - final offsetAnimation = - Tween(begin: Offset(-0.1, 0.0), end: Offset.zero) - .animate(curveAnimation); + --- b/animations/step_03_c/lib/question_screen.dart + +++ a/animations/step_03_c/lib/question_screen.dart + @@ -95,7 +95,11 @@ class QuestionCard extends StatelessWidget { + begin: Offset(-0.1, 0.0), + end: Offset.zero, + ).animate(curveAnimation); - return SlideTransition(position: offsetAnimation, child: child); + final fadeInAnimation = curveAnimation; + return FadeTransition( @@ -729,7 +713,7 @@ steps: patch-u: | --- b/animations/step_03_d/lib/question_screen.dart +++ a/animations/step_03_d/lib/question_screen.dart - @@ -88,6 +88,15 @@ class QuestionCard extends StatelessWidget { + @@ -87,6 +87,15 @@ class QuestionCard extends StatelessWidget { @override Widget build(BuildContext context) { return AnimatedSwitcher( @@ -743,8 +727,8 @@ steps: + ); + }, transitionBuilder: (child, animation) { - final curveAnimation = - CurveTween(curve: Curves.easeInCubic).animate(animation); + final curveAnimation = CurveTween( + curve: Curves.easeInCubic, - name: Copy step_03_d copydir: from: quiz @@ -784,8 +768,10 @@ steps: void initState() { super.initState(); - _animationController = - AnimationController(vsync: this, duration: widget.duration); + _animationController = AnimationController( + vsync: this, + duration: widget.duration, + ); _animationController.addListener(() { if (_animationController.value == 1) { @@ -815,13 +801,14 @@ steps: builder: (context, child) { return Transform( alignment: Alignment.center, - transform: Matrix4.identity() - ..rotateX(_animationController.value * math.pi), - child: _animationController.isAnimating - ? _animationController.value < 0.5 - ? _previousChild - : Transform.flip(flipY: true, child: child) - : child, + transform: + Matrix4.identity()..rotateX(_animationController.value * math.pi), + child: + _animationController.isAnimating + ? _animationController.value < 0.5 + ? _previousChild + : Transform.flip(flipY: true, child: child) + : child, ); }, child: widget.child, @@ -839,7 +826,7 @@ steps: import 'scoreboard.dart'; import 'view_model.dart'; - @@ -148,21 +149,24 @@ class AnswerCards extends StatelessWidget { + @@ -149,21 +150,24 @@ class AnswerCards extends StatelessWidget { if (correctAnswer == index) { color = Theme.of(context).colorScheme.tertiaryContainer; } @@ -912,7 +899,7 @@ steps: patch-u: | --- b/animations/step_04_b/lib/question_screen.dart +++ a/animations/step_04_b/lib/question_screen.dart - @@ -150,6 +150,7 @@ class AnswerCards extends StatelessWidget { + @@ -151,6 +151,7 @@ class AnswerCards extends StatelessWidget { color = Theme.of(context).colorScheme.tertiaryContainer; } return CardFlipEffect( @@ -934,7 +921,7 @@ steps: patch-u: | --- b/animations/step_04_c/lib/flip_effect.dart +++ a/animations/step_04_c/lib/flip_effect.dart - @@ -22,19 +22,32 @@ class _CardFlipEffectState extends State + @@ -22,6 +22,7 @@ class _CardFlipEffectState extends State with SingleTickerProviderStateMixin { late final AnimationController _animationController; Widget? _previousChild; @@ -942,15 +929,16 @@ steps: @override void initState() { - super.initState(); + @@ -29,7 +30,7 @@ class _CardFlipEffectState extends State - - _animationController = - - AnimationController(vsync: this, duration: widget.duration); - + _animationController = AnimationController( - + vsync: this, duration: widget.duration * (widget.delayAmount + 1)); + _animationController = AnimationController( + vsync: this, + - duration: widget.duration, + + duration: widget.duration * (widget.delayAmount + 1), + ); _animationController.addListener(() { - if (_animationController.value == 1) { + @@ -37,6 +38,15 @@ class _CardFlipEffectState extends State _animationController.reset(); } }); @@ -961,10 +949,7 @@ steps: + tween: ConstantTween(0.0), + weight: widget.delayAmount, + ), - + TweenSequenceItem( - + tween: Tween(begin: 0.0, end: 1.0), - + weight: 1.0, - + ), + + TweenSequenceItem(tween: Tween(begin: 0.0, end: 1.0), weight: 1.0), + ]).animate(_animationController); } @@ -983,7 +968,7 @@ steps: patch-u: | --- b/animations/step_04_d/lib/flip_effect.dart +++ a/animations/step_04_d/lib/flip_effect.dart - @@ -67,14 +67,14 @@ class _CardFlipEffectState extends State + @@ -66,15 +66,15 @@ class _CardFlipEffectState extends State @override Widget build(BuildContext context) { return AnimatedBuilder( @@ -992,15 +977,16 @@ steps: builder: (context, child) { return Transform( alignment: Alignment.center, - transform: Matrix4.identity() - - ..rotateX(_animationController.value * math.pi), - + ..rotateX(_animationWithDelay.value * math.pi), - child: _animationController.isAnimating - - ? _animationController.value < 0.5 - + ? _animationWithDelay.value < 0.5 - ? _previousChild - : Transform.flip(flipY: true, child: child) - : child, + transform: + - Matrix4.identity()..rotateX(_animationController.value * math.pi), + + Matrix4.identity()..rotateX(_animationWithDelay.value * math.pi), + child: + _animationController.isAnimating + - ? _animationController.value < 0.5 + + ? _animationWithDelay.value < 0.5 + ? _previousChild + : Transform.flip(flipY: true, child: child) + : child, - name: Copy step_04_d copydir: from: quiz @@ -1015,7 +1001,7 @@ steps: patch-u: | --- b/animations/step_05_a/lib/home_screen.dart +++ a/animations/step_05_a/lib/home_screen.dart - @@ -26,9 +26,16 @@ class HomeScreen extends StatelessWidget { + @@ -24,9 +24,17 @@ class HomeScreen extends StatelessWidget { // Show the question screen to start the game Navigator.push( context, @@ -1026,12 +1012,13 @@ steps: + pageBuilder: (context, animation, secondaryAnimation) { + return const QuestionScreen(); + }, - + transitionsBuilder: - + (context, animation, secondaryAnimation, child) { - + return FadeTransition( - + opacity: animation, - + child: child, - + ); + + transitionsBuilder: ( + + context, + + animation, + + secondaryAnimation, + + child, + + ) { + + return FadeTransition(opacity: animation, child: child); }, ), ); @@ -1054,18 +1041,19 @@ steps: import 'package:flutter/material.dart'; import 'question_screen.dart'; - @@ -32,8 +33,9 @@ class HomeScreen extends StatelessWidget { - }, - transitionsBuilder: - (context, animation, secondaryAnimation, child) { - - return FadeTransition( - - opacity: animation, + @@ -34,7 +35,11 @@ class HomeScreen extends StatelessWidget { + secondaryAnimation, + child, + ) { + - return FadeTransition(opacity: animation, child: child); + return FadeThroughTransition( + animation: animation, + secondaryAnimation: secondaryAnimation, - child: child, - ); + + child: child, + + ); }, + ), + ); - name: Patch lib/main.dart path: quiz/lib/main.dart patch-u: | @@ -1111,29 +1099,31 @@ steps: import 'package:flutter/material.dart'; import 'question_screen.dart'; - @@ -27,19 +26,9 @@ class HomeScreen extends StatelessWidget { + @@ -25,22 +24,10 @@ class HomeScreen extends StatelessWidget { // Show the question screen to start the game Navigator.push( context, - PageRouteBuilder( - pageBuilder: (context, animation, secondaryAnimation) { - - return const QuestionScreen(); - - }, - - transitionsBuilder: - - (context, animation, secondaryAnimation, child) { + + MaterialPageRoute( + + builder: (context) { + return const QuestionScreen(); + }, + - transitionsBuilder: ( + - context, + - animation, + - secondaryAnimation, + - child, + - ) { - return FadeThroughTransition( - animation: animation, - secondaryAnimation: secondaryAnimation, - child: child, - ); - }, - - ), - + MaterialPageRoute(builder: (context) { - + return const QuestionScreen(); - + }), + ), ); }, - child: Text('New Game'), - name: Patch lib/question_screen.dart path: quiz/lib/question_screen.dart patch-u: | @@ -1144,29 +1134,31 @@ steps: import 'package:flutter/material.dart'; import 'flip_effect.dart'; import 'scoreboard.dart'; - @@ -88,26 +89,18 @@ class QuestionCard extends StatelessWidget { + @@ -87,28 +88,15 @@ class QuestionCard extends StatelessWidget { @override Widget build(BuildContext context) { - return AnimatedSwitcher( - layoutBuilder: (currentChild, previousChildren) { - + return PageTransitionSwitcher( - + layoutBuilder: (entries) { - return Stack( - alignment: Alignment.topCenter, + - return Stack( + - alignment: Alignment.topCenter, - children: [ - ...previousChildren, - if (currentChild != null) currentChild, - ], - + children: entries, - ); + - ); + + return PageTransitionSwitcher( + + layoutBuilder: (entries) { + + return Stack(alignment: Alignment.topCenter, children: entries); }, - transitionBuilder: (child, animation) { - - final curveAnimation = - - CurveTween(curve: Curves.easeInCubic).animate(animation); - - final offsetAnimation = - - Tween(begin: Offset(-0.1, 0.0), end: Offset.zero) - - .animate(curveAnimation); + - final curveAnimation = CurveTween( + - curve: Curves.easeInCubic, + - ).animate(animation); + - final offsetAnimation = Tween( + - begin: Offset(-0.1, 0.0), + - end: Offset.zero, + - ).animate(curveAnimation); - final fadeInAnimation = curveAnimation; - return FadeTransition( - opacity: fadeInAnimation, @@ -1193,15 +1185,15 @@ steps: patch-u: | --- b/animations/step_05_d/lib/question_screen.dart +++ a/animations/step_05_d/lib/question_screen.dart - @@ -14,6 +14,7 @@ class QuestionScreen extends StatefulWidget { - class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + @@ -15,6 +15,7 @@ class _QuestionScreenState extends State { + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); + VoidCallback? _showGameOverScreen; @override Widget build(BuildContext context) { - @@ -37,7 +38,11 @@ class _QuestionScreenState extends State { + @@ -38,7 +39,11 @@ class _QuestionScreenState extends State { body: Center( child: Column( children: [ @@ -1214,7 +1206,7 @@ steps: Spacer(), AnswerCards( onTapped: (index) { - @@ -57,24 +62,52 @@ class _QuestionScreenState extends State { + @@ -59,24 +64,47 @@ class _QuestionScreenState extends State { ); } @@ -1245,9 +1237,7 @@ steps: + @override + Widget build(BuildContext context) { + return Scaffold( - + appBar: AppBar( - + automaticallyImplyLeading: false, - + ), + + appBar: AppBar(automaticallyImplyLeading: false), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, @@ -1256,10 +1246,7 @@ steps: + score: viewModel.score, + totalQuestions: viewModel.totalQuestions, + ), - + Text( - + 'You Win!', - + style: Theme.of(context).textTheme.displayLarge, - + ), + + Text('You Win!', style: Theme.of(context).textTheme.displayLarge), + Text( + 'Score: ${viewModel.score} / ${viewModel.totalQuestions}', + style: Theme.of(context).textTheme.displaySmall, @@ -1279,35 +1266,34 @@ steps: ); } } - @@ -83,19 +116,21 @@ class QuestionCard extends StatelessWidget { + @@ -84,14 +112,22 @@ class _QuestionScreenState extends State { + class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ + - const QuestionCard({required this.question, super.key}); + + const QuestionCard({ + required this.onChangeOpenContainer, - required this.question, + + required this.question, + required this.viewModel, - super.key, - }); - + + super.key, + + }); + + + final ValueChanged onChangeOpenContainer; + final QuizViewModel viewModel; + + static const _backgroundColor = Color(0xfff2f3fa); - + + @override Widget build(BuildContext context) { return PageTransitionSwitcher( - layoutBuilder: (entries) { - - return Stack( - - alignment: Alignment.topCenter, - - children: entries, - - ); + - return Stack(alignment: Alignment.topCenter, children: entries); - }, + duration: const Duration(milliseconds: 200), transitionBuilder: (child, animation, secondaryAnimation) { return FadeThroughTransition( animation: animation, - @@ -103,17 +138,30 @@ class QuestionCard extends StatelessWidget { + @@ -99,17 +135,30 @@ class QuestionCard extends StatelessWidget { child: child, ); }, @@ -1379,4 +1365,4 @@ steps: flutter: build web - name: Cleanup - rmdir: quiz + rmdir: quiz \ No newline at end of file diff --git a/animations/step_01/android/.gitignore b/animations/step_01/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_01/android/.gitignore +++ b/animations/step_01/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_01/android/app/build.gradle b/animations/step_01/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_01/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_01/android/app/build.gradle.kts b/animations/step_01/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_01/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_01/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_01/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_01/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_01/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_01/android/build.gradle b/animations/step_01/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_01/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_01/android/build.gradle.kts b/animations/step_01/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_01/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_01/android/gradle.properties b/animations/step_01/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_01/android/gradle.properties +++ b/animations/step_01/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_01/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_01/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_01/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_01/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_01/android/settings.gradle b/animations/step_01/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_01/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_01/android/settings.gradle.kts b/animations/step_01/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_01/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_01/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_01/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_01/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_01/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_01/lib/home_screen.dart b/animations/step_01/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_01/lib/home_screen.dart +++ b/animations/step_01/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_01/lib/model.dart b/animations/step_01/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_01/lib/model.dart +++ b/animations/step_01/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_01/lib/question_screen.dart b/animations/step_01/lib/question_screen.dart index 6df3e904de..5e76886a74 100644 --- a/animations/step_01/lib/question_screen.dart +++ b/animations/step_01/lib/question_screen.dart @@ -9,8 +9,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -24,11 +25,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -41,9 +42,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -79,10 +81,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { diff --git a/animations/step_01/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_01/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_01/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_01/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_01/pubspec.yaml b/animations/step_01/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_01/pubspec.yaml +++ b/animations/step_01/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_02_a/android/.gitignore b/animations/step_02_a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_02_a/android/.gitignore +++ b/animations/step_02_a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_02_a/android/app/build.gradle b/animations/step_02_a/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_02_a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_02_a/android/app/build.gradle.kts b/animations/step_02_a/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_02_a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_02_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_02_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_02_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_02_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_02_a/android/build.gradle b/animations/step_02_a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_02_a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_02_a/android/build.gradle.kts b/animations/step_02_a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_02_a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_02_a/android/gradle.properties b/animations/step_02_a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_02_a/android/gradle.properties +++ b/animations/step_02_a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_02_a/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_02_a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_02_a/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_02_a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_02_a/android/settings.gradle b/animations/step_02_a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_02_a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_02_a/android/settings.gradle.kts b/animations/step_02_a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_02_a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_02_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_02_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_02_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_02_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_02_a/lib/home_screen.dart b/animations/step_02_a/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_02_a/lib/home_screen.dart +++ b/animations/step_02_a/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_02_a/lib/model.dart b/animations/step_02_a/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_02_a/lib/model.dart +++ b/animations/step_02_a/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_02_a/lib/question_screen.dart b/animations/step_02_a/lib/question_screen.dart index 6df3e904de..5e76886a74 100644 --- a/animations/step_02_a/lib/question_screen.dart +++ b/animations/step_02_a/lib/question_screen.dart @@ -9,8 +9,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -24,11 +25,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -41,9 +42,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -79,10 +81,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { diff --git a/animations/step_02_a/lib/scoreboard.dart b/animations/step_02_a/lib/scoreboard.dart index e875caebf3..1f8d31e019 100644 --- a/animations/step_02_a/lib/scoreboard.dart +++ b/animations/step_02_a/lib/scoreboard.dart @@ -23,7 +23,7 @@ class Scoreboard extends StatelessWidget { size: 50, color: score < i + 1 ? Colors.grey.shade400 : Colors.yellow.shade700, - ) + ), ], ), ); diff --git a/animations/step_02_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_02_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_02_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_02_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_02_a/pubspec.yaml b/animations/step_02_a/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_02_a/pubspec.yaml +++ b/animations/step_02_a/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_02_b/android/.gitignore b/animations/step_02_b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_02_b/android/.gitignore +++ b/animations/step_02_b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_02_b/android/app/build.gradle b/animations/step_02_b/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_02_b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_02_b/android/app/build.gradle.kts b/animations/step_02_b/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_02_b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_02_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_02_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_02_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_02_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_02_b/android/build.gradle b/animations/step_02_b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_02_b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_02_b/android/build.gradle.kts b/animations/step_02_b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_02_b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_02_b/android/gradle.properties b/animations/step_02_b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_02_b/android/gradle.properties +++ b/animations/step_02_b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_02_b/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_02_b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_02_b/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_02_b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_02_b/android/settings.gradle b/animations/step_02_b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_02_b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_02_b/android/settings.gradle.kts b/animations/step_02_b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_02_b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_02_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_02_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_02_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_02_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_02_b/lib/home_screen.dart b/animations/step_02_b/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_02_b/lib/home_screen.dart +++ b/animations/step_02_b/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_02_b/lib/model.dart b/animations/step_02_b/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_02_b/lib/model.dart +++ b/animations/step_02_b/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_02_b/lib/question_screen.dart b/animations/step_02_b/lib/question_screen.dart index e09b5194db..0f98d589d7 100644 --- a/animations/step_02_b/lib/question_screen.dart +++ b/animations/step_02_b/lib/question_screen.dart @@ -10,8 +10,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -25,11 +26,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -42,9 +43,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -80,10 +82,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { diff --git a/animations/step_02_b/lib/scoreboard.dart b/animations/step_02_b/lib/scoreboard.dart index e875caebf3..1f8d31e019 100644 --- a/animations/step_02_b/lib/scoreboard.dart +++ b/animations/step_02_b/lib/scoreboard.dart @@ -23,7 +23,7 @@ class Scoreboard extends StatelessWidget { size: 50, color: score < i + 1 ? Colors.grey.shade400 : Colors.yellow.shade700, - ) + ), ], ), ); diff --git a/animations/step_02_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_02_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_02_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_02_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_02_b/pubspec.yaml b/animations/step_02_b/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_02_b/pubspec.yaml +++ b/animations/step_02_b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_02_c/android/.gitignore b/animations/step_02_c/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_02_c/android/.gitignore +++ b/animations/step_02_c/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_02_c/android/app/build.gradle b/animations/step_02_c/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_02_c/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_02_c/android/app/build.gradle.kts b/animations/step_02_c/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_02_c/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_02_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_02_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_02_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_02_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_02_c/android/build.gradle b/animations/step_02_c/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_02_c/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_02_c/android/build.gradle.kts b/animations/step_02_c/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_02_c/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_02_c/android/gradle.properties b/animations/step_02_c/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_02_c/android/gradle.properties +++ b/animations/step_02_c/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_02_c/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_02_c/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_02_c/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_02_c/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_02_c/android/settings.gradle b/animations/step_02_c/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_02_c/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_02_c/android/settings.gradle.kts b/animations/step_02_c/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_02_c/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_02_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_02_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_02_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_02_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_02_c/lib/home_screen.dart b/animations/step_02_c/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_02_c/lib/home_screen.dart +++ b/animations/step_02_c/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_02_c/lib/model.dart b/animations/step_02_c/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_02_c/lib/model.dart +++ b/animations/step_02_c/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_02_c/lib/question_screen.dart b/animations/step_02_c/lib/question_screen.dart index e09b5194db..0f98d589d7 100644 --- a/animations/step_02_c/lib/question_screen.dart +++ b/animations/step_02_c/lib/question_screen.dart @@ -10,8 +10,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -25,11 +26,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -42,9 +43,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -80,10 +82,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { diff --git a/animations/step_02_c/lib/scoreboard.dart b/animations/step_02_c/lib/scoreboard.dart index 52ed759ad2..90cc849afe 100644 --- a/animations/step_02_c/lib/scoreboard.dart +++ b/animations/step_02_c/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); diff --git a/animations/step_02_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_02_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_02_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_02_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_02_c/pubspec.yaml b/animations/step_02_c/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_02_c/pubspec.yaml +++ b/animations/step_02_c/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_02_d/android/.gitignore b/animations/step_02_d/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_02_d/android/.gitignore +++ b/animations/step_02_d/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_02_d/android/app/build.gradle b/animations/step_02_d/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_02_d/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_02_d/android/app/build.gradle.kts b/animations/step_02_d/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_02_d/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_02_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_02_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_02_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_02_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_02_d/android/build.gradle b/animations/step_02_d/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_02_d/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_02_d/android/build.gradle.kts b/animations/step_02_d/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_02_d/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_02_d/android/gradle.properties b/animations/step_02_d/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_02_d/android/gradle.properties +++ b/animations/step_02_d/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_02_d/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_02_d/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_02_d/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_02_d/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_02_d/android/settings.gradle b/animations/step_02_d/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_02_d/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_02_d/android/settings.gradle.kts b/animations/step_02_d/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_02_d/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_02_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_02_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_02_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_02_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_02_d/lib/home_screen.dart b/animations/step_02_d/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_02_d/lib/home_screen.dart +++ b/animations/step_02_d/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_02_d/lib/model.dart b/animations/step_02_d/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_02_d/lib/model.dart +++ b/animations/step_02_d/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_02_d/lib/question_screen.dart b/animations/step_02_d/lib/question_screen.dart index e09b5194db..0f98d589d7 100644 --- a/animations/step_02_d/lib/question_screen.dart +++ b/animations/step_02_d/lib/question_screen.dart @@ -10,8 +10,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -25,11 +26,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -42,9 +43,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -80,10 +82,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { diff --git a/animations/step_02_d/lib/scoreboard.dart b/animations/step_02_d/lib/scoreboard.dart index 734b3223ec..b9f8689830 100644 --- a/animations/step_02_d/lib/scoreboard.dart +++ b/animations/step_02_d/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -47,11 +45,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_02_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_02_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_02_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_02_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_02_d/pubspec.yaml b/animations/step_02_d/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_02_d/pubspec.yaml +++ b/animations/step_02_d/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_02_e/android/.gitignore b/animations/step_02_e/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_02_e/android/.gitignore +++ b/animations/step_02_e/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_02_e/android/app/build.gradle b/animations/step_02_e/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_02_e/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_02_e/android/app/build.gradle.kts b/animations/step_02_e/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_02_e/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_02_e/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_02_e/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_02_e/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_02_e/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_02_e/android/build.gradle b/animations/step_02_e/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_02_e/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_02_e/android/build.gradle.kts b/animations/step_02_e/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_02_e/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_02_e/android/gradle.properties b/animations/step_02_e/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_02_e/android/gradle.properties +++ b/animations/step_02_e/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_02_e/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_02_e/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_02_e/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_02_e/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_02_e/android/settings.gradle b/animations/step_02_e/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_02_e/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_02_e/android/settings.gradle.kts b/animations/step_02_e/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_02_e/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_02_e/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_02_e/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_02_e/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_02_e/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_02_e/lib/home_screen.dart b/animations/step_02_e/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_02_e/lib/home_screen.dart +++ b/animations/step_02_e/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_02_e/lib/model.dart b/animations/step_02_e/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_02_e/lib/model.dart +++ b/animations/step_02_e/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_02_e/lib/question_screen.dart b/animations/step_02_e/lib/question_screen.dart index e09b5194db..0f98d589d7 100644 --- a/animations/step_02_e/lib/question_screen.dart +++ b/animations/step_02_e/lib/question_screen.dart @@ -10,8 +10,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -25,11 +26,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -42,9 +43,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -80,10 +82,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { diff --git a/animations/step_02_e/lib/scoreboard.dart b/animations/step_02_e/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_02_e/lib/scoreboard.dart +++ b/animations/step_02_e/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_02_e/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_02_e/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_02_e/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_02_e/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_02_e/pubspec.yaml b/animations/step_02_e/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_02_e/pubspec.yaml +++ b/animations/step_02_e/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_03_a/android/.gitignore b/animations/step_03_a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_03_a/android/.gitignore +++ b/animations/step_03_a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_03_a/android/app/build.gradle b/animations/step_03_a/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_03_a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_03_a/android/app/build.gradle.kts b/animations/step_03_a/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_03_a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_03_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_03_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_03_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_03_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_03_a/android/build.gradle b/animations/step_03_a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_03_a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_03_a/android/build.gradle.kts b/animations/step_03_a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_03_a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_03_a/android/gradle.properties b/animations/step_03_a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_03_a/android/gradle.properties +++ b/animations/step_03_a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_03_a/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_03_a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_03_a/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_03_a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_03_a/android/settings.gradle b/animations/step_03_a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_03_a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_03_a/android/settings.gradle.kts b/animations/step_03_a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_03_a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_03_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_03_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_03_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_03_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_03_a/lib/home_screen.dart b/animations/step_03_a/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_03_a/lib/home_screen.dart +++ b/animations/step_03_a/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_03_a/lib/model.dart b/animations/step_03_a/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_03_a/lib/model.dart +++ b/animations/step_03_a/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_03_a/lib/question_screen.dart b/animations/step_03_a/lib/question_screen.dart index 29da4edce8..787aff5a28 100644 --- a/animations/step_03_a/lib/question_screen.dart +++ b/animations/step_03_a/lib/question_screen.dart @@ -10,8 +10,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -25,11 +26,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -42,9 +43,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -80,10 +82,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { diff --git a/animations/step_03_a/lib/scoreboard.dart b/animations/step_03_a/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_03_a/lib/scoreboard.dart +++ b/animations/step_03_a/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_03_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_03_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_03_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_03_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_03_a/pubspec.yaml b/animations/step_03_a/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_03_a/pubspec.yaml +++ b/animations/step_03_a/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_03_b/android/.gitignore b/animations/step_03_b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_03_b/android/.gitignore +++ b/animations/step_03_b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_03_b/android/app/build.gradle b/animations/step_03_b/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_03_b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_03_b/android/app/build.gradle.kts b/animations/step_03_b/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_03_b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_03_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_03_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_03_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_03_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_03_b/android/build.gradle b/animations/step_03_b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_03_b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_03_b/android/build.gradle.kts b/animations/step_03_b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_03_b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_03_b/android/gradle.properties b/animations/step_03_b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_03_b/android/gradle.properties +++ b/animations/step_03_b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_03_b/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_03_b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_03_b/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_03_b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_03_b/android/settings.gradle b/animations/step_03_b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_03_b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_03_b/android/settings.gradle.kts b/animations/step_03_b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_03_b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_03_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_03_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_03_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_03_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_03_b/lib/home_screen.dart b/animations/step_03_b/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_03_b/lib/home_screen.dart +++ b/animations/step_03_b/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_03_b/lib/model.dart b/animations/step_03_b/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_03_b/lib/model.dart +++ b/animations/step_03_b/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_03_b/lib/question_screen.dart b/animations/step_03_b/lib/question_screen.dart index 390c1dcbf5..d6505f2b8c 100644 --- a/animations/step_03_b/lib/question_screen.dart +++ b/animations/step_03_b/lib/question_screen.dart @@ -10,8 +10,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -25,11 +26,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -42,9 +43,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -80,20 +82,19 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { return AnimatedSwitcher( transitionBuilder: (child, animation) { - final curveAnimation = - CurveTween(curve: Curves.easeInCubic).animate(animation); - final offsetAnimation = - Tween(begin: Offset(-0.1, 0.0), end: Offset.zero) - .animate(curveAnimation); + final curveAnimation = CurveTween( + curve: Curves.easeInCubic, + ).animate(animation); + final offsetAnimation = Tween( + begin: Offset(-0.1, 0.0), + end: Offset.zero, + ).animate(curveAnimation); return SlideTransition(position: offsetAnimation, child: child); }, duration: const Duration(milliseconds: 300), diff --git a/animations/step_03_b/lib/scoreboard.dart b/animations/step_03_b/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_03_b/lib/scoreboard.dart +++ b/animations/step_03_b/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_03_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_03_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_03_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_03_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_03_b/pubspec.yaml b/animations/step_03_b/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_03_b/pubspec.yaml +++ b/animations/step_03_b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_03_c/android/.gitignore b/animations/step_03_c/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_03_c/android/.gitignore +++ b/animations/step_03_c/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_03_c/android/app/build.gradle b/animations/step_03_c/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_03_c/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_03_c/android/app/build.gradle.kts b/animations/step_03_c/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_03_c/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_03_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_03_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_03_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_03_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_03_c/android/build.gradle b/animations/step_03_c/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_03_c/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_03_c/android/build.gradle.kts b/animations/step_03_c/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_03_c/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_03_c/android/gradle.properties b/animations/step_03_c/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_03_c/android/gradle.properties +++ b/animations/step_03_c/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_03_c/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_03_c/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_03_c/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_03_c/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_03_c/android/settings.gradle b/animations/step_03_c/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_03_c/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_03_c/android/settings.gradle.kts b/animations/step_03_c/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_03_c/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_03_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_03_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_03_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_03_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_03_c/lib/home_screen.dart b/animations/step_03_c/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_03_c/lib/home_screen.dart +++ b/animations/step_03_c/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_03_c/lib/model.dart b/animations/step_03_c/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_03_c/lib/model.dart +++ b/animations/step_03_c/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_03_c/lib/question_screen.dart b/animations/step_03_c/lib/question_screen.dart index da3e30a77e..7319c09f58 100644 --- a/animations/step_03_c/lib/question_screen.dart +++ b/animations/step_03_c/lib/question_screen.dart @@ -10,8 +10,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -25,11 +26,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -42,9 +43,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -80,20 +82,19 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { return AnimatedSwitcher( transitionBuilder: (child, animation) { - final curveAnimation = - CurveTween(curve: Curves.easeInCubic).animate(animation); - final offsetAnimation = - Tween(begin: Offset(-0.1, 0.0), end: Offset.zero) - .animate(curveAnimation); + final curveAnimation = CurveTween( + curve: Curves.easeInCubic, + ).animate(animation); + final offsetAnimation = Tween( + begin: Offset(-0.1, 0.0), + end: Offset.zero, + ).animate(curveAnimation); final fadeInAnimation = curveAnimation; return FadeTransition( opacity: fadeInAnimation, diff --git a/animations/step_03_c/lib/scoreboard.dart b/animations/step_03_c/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_03_c/lib/scoreboard.dart +++ b/animations/step_03_c/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_03_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_03_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_03_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_03_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_03_c/pubspec.yaml b/animations/step_03_c/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_03_c/pubspec.yaml +++ b/animations/step_03_c/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_03_d/android/.gitignore b/animations/step_03_d/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_03_d/android/.gitignore +++ b/animations/step_03_d/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_03_d/android/app/build.gradle b/animations/step_03_d/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_03_d/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_03_d/android/app/build.gradle.kts b/animations/step_03_d/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_03_d/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_03_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_03_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_03_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_03_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_03_d/android/build.gradle b/animations/step_03_d/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_03_d/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_03_d/android/build.gradle.kts b/animations/step_03_d/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_03_d/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_03_d/android/gradle.properties b/animations/step_03_d/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_03_d/android/gradle.properties +++ b/animations/step_03_d/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_03_d/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_03_d/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_03_d/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_03_d/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_03_d/android/settings.gradle b/animations/step_03_d/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_03_d/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_03_d/android/settings.gradle.kts b/animations/step_03_d/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_03_d/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_03_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_03_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_03_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_03_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_03_d/lib/home_screen.dart b/animations/step_03_d/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_03_d/lib/home_screen.dart +++ b/animations/step_03_d/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_03_d/lib/model.dart b/animations/step_03_d/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_03_d/lib/model.dart +++ b/animations/step_03_d/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_03_d/lib/question_screen.dart b/animations/step_03_d/lib/question_screen.dart index 2854674988..123c1b3328 100644 --- a/animations/step_03_d/lib/question_screen.dart +++ b/animations/step_03_d/lib/question_screen.dart @@ -10,8 +10,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -25,11 +26,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -42,9 +43,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -80,10 +82,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { @@ -98,11 +97,13 @@ class QuestionCard extends StatelessWidget { ); }, transitionBuilder: (child, animation) { - final curveAnimation = - CurveTween(curve: Curves.easeInCubic).animate(animation); - final offsetAnimation = - Tween(begin: Offset(-0.1, 0.0), end: Offset.zero) - .animate(curveAnimation); + final curveAnimation = CurveTween( + curve: Curves.easeInCubic, + ).animate(animation); + final offsetAnimation = Tween( + begin: Offset(-0.1, 0.0), + end: Offset.zero, + ).animate(curveAnimation); final fadeInAnimation = curveAnimation; return FadeTransition( opacity: fadeInAnimation, diff --git a/animations/step_03_d/lib/scoreboard.dart b/animations/step_03_d/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_03_d/lib/scoreboard.dart +++ b/animations/step_03_d/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_03_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_03_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_03_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_03_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_03_d/pubspec.yaml b/animations/step_03_d/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_03_d/pubspec.yaml +++ b/animations/step_03_d/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_04_a/android/.gitignore b/animations/step_04_a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_04_a/android/.gitignore +++ b/animations/step_04_a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_04_a/android/app/build.gradle b/animations/step_04_a/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_04_a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_04_a/android/app/build.gradle.kts b/animations/step_04_a/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_04_a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_04_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_04_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_04_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_04_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_04_a/android/build.gradle b/animations/step_04_a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_04_a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_04_a/android/build.gradle.kts b/animations/step_04_a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_04_a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_04_a/android/gradle.properties b/animations/step_04_a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_04_a/android/gradle.properties +++ b/animations/step_04_a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_04_a/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_04_a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_04_a/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_04_a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_04_a/android/settings.gradle b/animations/step_04_a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_04_a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_04_a/android/settings.gradle.kts b/animations/step_04_a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_04_a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_04_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_04_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_04_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_04_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_04_a/lib/flip_effect.dart b/animations/step_04_a/lib/flip_effect.dart index 30d7b6b2dd..10561f2383 100644 --- a/animations/step_04_a/lib/flip_effect.dart +++ b/animations/step_04_a/lib/flip_effect.dart @@ -25,8 +25,10 @@ class _CardFlipEffectState extends State void initState() { super.initState(); - _animationController = - AnimationController(vsync: this, duration: widget.duration); + _animationController = AnimationController( + vsync: this, + duration: widget.duration, + ); _animationController.addListener(() { if (_animationController.value == 1) { @@ -56,13 +58,14 @@ class _CardFlipEffectState extends State builder: (context, child) { return Transform( alignment: Alignment.center, - transform: Matrix4.identity() - ..rotateX(_animationController.value * math.pi), - child: _animationController.isAnimating - ? _animationController.value < 0.5 - ? _previousChild - : Transform.flip(flipY: true, child: child) - : child, + transform: + Matrix4.identity()..rotateX(_animationController.value * math.pi), + child: + _animationController.isAnimating + ? _animationController.value < 0.5 + ? _previousChild + : Transform.flip(flipY: true, child: child) + : child, ); }, child: widget.child, diff --git a/animations/step_04_a/lib/home_screen.dart b/animations/step_04_a/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_04_a/lib/home_screen.dart +++ b/animations/step_04_a/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_04_a/lib/model.dart b/animations/step_04_a/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_04_a/lib/model.dart +++ b/animations/step_04_a/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_04_a/lib/question_screen.dart b/animations/step_04_a/lib/question_screen.dart index 141e416382..160c661f82 100644 --- a/animations/step_04_a/lib/question_screen.dart +++ b/animations/step_04_a/lib/question_screen.dart @@ -11,8 +11,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -26,11 +27,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -43,9 +44,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -81,10 +83,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { @@ -99,11 +98,13 @@ class QuestionCard extends StatelessWidget { ); }, transitionBuilder: (child, animation) { - final curveAnimation = - CurveTween(curve: Curves.easeInCubic).animate(animation); - final offsetAnimation = - Tween(begin: Offset(-0.1, 0.0), end: Offset.zero) - .animate(curveAnimation); + final curveAnimation = CurveTween( + curve: Curves.easeInCubic, + ).animate(animation); + final offsetAnimation = Tween( + begin: Offset(-0.1, 0.0), + end: Offset.zero, + ).animate(curveAnimation); final fadeInAnimation = curveAnimation; return FadeTransition( opacity: fadeInAnimation, diff --git a/animations/step_04_a/lib/scoreboard.dart b/animations/step_04_a/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_04_a/lib/scoreboard.dart +++ b/animations/step_04_a/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_04_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_04_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_04_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_04_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_04_a/pubspec.yaml b/animations/step_04_a/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_04_a/pubspec.yaml +++ b/animations/step_04_a/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_04_b/android/.gitignore b/animations/step_04_b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_04_b/android/.gitignore +++ b/animations/step_04_b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_04_b/android/app/build.gradle b/animations/step_04_b/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_04_b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_04_b/android/app/build.gradle.kts b/animations/step_04_b/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_04_b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_04_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_04_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_04_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_04_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_04_b/android/build.gradle b/animations/step_04_b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_04_b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_04_b/android/build.gradle.kts b/animations/step_04_b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_04_b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_04_b/android/gradle.properties b/animations/step_04_b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_04_b/android/gradle.properties +++ b/animations/step_04_b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_04_b/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_04_b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_04_b/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_04_b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_04_b/android/settings.gradle b/animations/step_04_b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_04_b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_04_b/android/settings.gradle.kts b/animations/step_04_b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_04_b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_04_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_04_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_04_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_04_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_04_b/lib/flip_effect.dart b/animations/step_04_b/lib/flip_effect.dart index 93a82d4d41..faf4f53c10 100644 --- a/animations/step_04_b/lib/flip_effect.dart +++ b/animations/step_04_b/lib/flip_effect.dart @@ -27,8 +27,10 @@ class _CardFlipEffectState extends State void initState() { super.initState(); - _animationController = - AnimationController(vsync: this, duration: widget.duration); + _animationController = AnimationController( + vsync: this, + duration: widget.duration, + ); _animationController.addListener(() { if (_animationController.value == 1) { @@ -58,13 +60,14 @@ class _CardFlipEffectState extends State builder: (context, child) { return Transform( alignment: Alignment.center, - transform: Matrix4.identity() - ..rotateX(_animationController.value * math.pi), - child: _animationController.isAnimating - ? _animationController.value < 0.5 - ? _previousChild - : Transform.flip(flipY: true, child: child) - : child, + transform: + Matrix4.identity()..rotateX(_animationController.value * math.pi), + child: + _animationController.isAnimating + ? _animationController.value < 0.5 + ? _previousChild + : Transform.flip(flipY: true, child: child) + : child, ); }, child: widget.child, diff --git a/animations/step_04_b/lib/home_screen.dart b/animations/step_04_b/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_04_b/lib/home_screen.dart +++ b/animations/step_04_b/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_04_b/lib/model.dart b/animations/step_04_b/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_04_b/lib/model.dart +++ b/animations/step_04_b/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_04_b/lib/question_screen.dart b/animations/step_04_b/lib/question_screen.dart index ac37a0bd25..c465f44f19 100644 --- a/animations/step_04_b/lib/question_screen.dart +++ b/animations/step_04_b/lib/question_screen.dart @@ -11,8 +11,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -26,11 +27,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -43,9 +44,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -81,10 +83,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { @@ -99,11 +98,13 @@ class QuestionCard extends StatelessWidget { ); }, transitionBuilder: (child, animation) { - final curveAnimation = - CurveTween(curve: Curves.easeInCubic).animate(animation); - final offsetAnimation = - Tween(begin: Offset(-0.1, 0.0), end: Offset.zero) - .animate(curveAnimation); + final curveAnimation = CurveTween( + curve: Curves.easeInCubic, + ).animate(animation); + final offsetAnimation = Tween( + begin: Offset(-0.1, 0.0), + end: Offset.zero, + ).animate(curveAnimation); final fadeInAnimation = curveAnimation; return FadeTransition( opacity: fadeInAnimation, diff --git a/animations/step_04_b/lib/scoreboard.dart b/animations/step_04_b/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_04_b/lib/scoreboard.dart +++ b/animations/step_04_b/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_04_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_04_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_04_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_04_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_04_b/pubspec.yaml b/animations/step_04_b/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_04_b/pubspec.yaml +++ b/animations/step_04_b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_04_c/android/.gitignore b/animations/step_04_c/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_04_c/android/.gitignore +++ b/animations/step_04_c/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_04_c/android/app/build.gradle b/animations/step_04_c/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_04_c/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_04_c/android/app/build.gradle.kts b/animations/step_04_c/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_04_c/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_04_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_04_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_04_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_04_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_04_c/android/build.gradle b/animations/step_04_c/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_04_c/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_04_c/android/build.gradle.kts b/animations/step_04_c/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_04_c/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_04_c/android/gradle.properties b/animations/step_04_c/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_04_c/android/gradle.properties +++ b/animations/step_04_c/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_04_c/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_04_c/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_04_c/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_04_c/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_04_c/android/settings.gradle b/animations/step_04_c/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_04_c/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_04_c/android/settings.gradle.kts b/animations/step_04_c/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_04_c/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_04_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_04_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_04_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_04_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_04_c/lib/flip_effect.dart b/animations/step_04_c/lib/flip_effect.dart index 0f3ab26b0a..f9a1f0c303 100644 --- a/animations/step_04_c/lib/flip_effect.dart +++ b/animations/step_04_c/lib/flip_effect.dart @@ -29,7 +29,9 @@ class _CardFlipEffectState extends State super.initState(); _animationController = AnimationController( - vsync: this, duration: widget.duration * (widget.delayAmount + 1)); + vsync: this, + duration: widget.duration * (widget.delayAmount + 1), + ); _animationController.addListener(() { if (_animationController.value == 1) { @@ -43,10 +45,7 @@ class _CardFlipEffectState extends State tween: ConstantTween(0.0), weight: widget.delayAmount, ), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0), - weight: 1.0, - ), + TweenSequenceItem(tween: Tween(begin: 0.0, end: 1.0), weight: 1.0), ]).animate(_animationController); } @@ -71,13 +70,14 @@ class _CardFlipEffectState extends State builder: (context, child) { return Transform( alignment: Alignment.center, - transform: Matrix4.identity() - ..rotateX(_animationController.value * math.pi), - child: _animationController.isAnimating - ? _animationController.value < 0.5 - ? _previousChild - : Transform.flip(flipY: true, child: child) - : child, + transform: + Matrix4.identity()..rotateX(_animationController.value * math.pi), + child: + _animationController.isAnimating + ? _animationController.value < 0.5 + ? _previousChild + : Transform.flip(flipY: true, child: child) + : child, ); }, child: widget.child, diff --git a/animations/step_04_c/lib/home_screen.dart b/animations/step_04_c/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_04_c/lib/home_screen.dart +++ b/animations/step_04_c/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_04_c/lib/model.dart b/animations/step_04_c/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_04_c/lib/model.dart +++ b/animations/step_04_c/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_04_c/lib/question_screen.dart b/animations/step_04_c/lib/question_screen.dart index ac37a0bd25..c465f44f19 100644 --- a/animations/step_04_c/lib/question_screen.dart +++ b/animations/step_04_c/lib/question_screen.dart @@ -11,8 +11,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -26,11 +27,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -43,9 +44,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -81,10 +83,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { @@ -99,11 +98,13 @@ class QuestionCard extends StatelessWidget { ); }, transitionBuilder: (child, animation) { - final curveAnimation = - CurveTween(curve: Curves.easeInCubic).animate(animation); - final offsetAnimation = - Tween(begin: Offset(-0.1, 0.0), end: Offset.zero) - .animate(curveAnimation); + final curveAnimation = CurveTween( + curve: Curves.easeInCubic, + ).animate(animation); + final offsetAnimation = Tween( + begin: Offset(-0.1, 0.0), + end: Offset.zero, + ).animate(curveAnimation); final fadeInAnimation = curveAnimation; return FadeTransition( opacity: fadeInAnimation, diff --git a/animations/step_04_c/lib/scoreboard.dart b/animations/step_04_c/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_04_c/lib/scoreboard.dart +++ b/animations/step_04_c/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_04_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_04_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_04_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_04_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_04_c/pubspec.yaml b/animations/step_04_c/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_04_c/pubspec.yaml +++ b/animations/step_04_c/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_04_d/android/.gitignore b/animations/step_04_d/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_04_d/android/.gitignore +++ b/animations/step_04_d/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_04_d/android/app/build.gradle b/animations/step_04_d/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_04_d/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_04_d/android/app/build.gradle.kts b/animations/step_04_d/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_04_d/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_04_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_04_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_04_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_04_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_04_d/android/build.gradle b/animations/step_04_d/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_04_d/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_04_d/android/build.gradle.kts b/animations/step_04_d/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_04_d/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_04_d/android/gradle.properties b/animations/step_04_d/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_04_d/android/gradle.properties +++ b/animations/step_04_d/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_04_d/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_04_d/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_04_d/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_04_d/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_04_d/android/settings.gradle b/animations/step_04_d/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_04_d/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_04_d/android/settings.gradle.kts b/animations/step_04_d/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_04_d/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_04_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_04_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_04_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_04_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_04_d/lib/flip_effect.dart b/animations/step_04_d/lib/flip_effect.dart index f21b8eac6a..d4b7ff4016 100644 --- a/animations/step_04_d/lib/flip_effect.dart +++ b/animations/step_04_d/lib/flip_effect.dart @@ -29,7 +29,9 @@ class _CardFlipEffectState extends State super.initState(); _animationController = AnimationController( - vsync: this, duration: widget.duration * (widget.delayAmount + 1)); + vsync: this, + duration: widget.duration * (widget.delayAmount + 1), + ); _animationController.addListener(() { if (_animationController.value == 1) { @@ -43,10 +45,7 @@ class _CardFlipEffectState extends State tween: ConstantTween(0.0), weight: widget.delayAmount, ), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0), - weight: 1.0, - ), + TweenSequenceItem(tween: Tween(begin: 0.0, end: 1.0), weight: 1.0), ]).animate(_animationController); } @@ -71,13 +70,14 @@ class _CardFlipEffectState extends State builder: (context, child) { return Transform( alignment: Alignment.center, - transform: Matrix4.identity() - ..rotateX(_animationWithDelay.value * math.pi), - child: _animationController.isAnimating - ? _animationWithDelay.value < 0.5 - ? _previousChild - : Transform.flip(flipY: true, child: child) - : child, + transform: + Matrix4.identity()..rotateX(_animationWithDelay.value * math.pi), + child: + _animationController.isAnimating + ? _animationWithDelay.value < 0.5 + ? _previousChild + : Transform.flip(flipY: true, child: child) + : child, ); }, child: widget.child, diff --git a/animations/step_04_d/lib/home_screen.dart b/animations/step_04_d/lib/home_screen.dart index 51f4df1331..4b3445738f 100644 --- a/animations/step_04_d/lib/home_screen.dart +++ b/animations/step_04_d/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { diff --git a/animations/step_04_d/lib/model.dart b/animations/step_04_d/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_04_d/lib/model.dart +++ b/animations/step_04_d/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_04_d/lib/question_screen.dart b/animations/step_04_d/lib/question_screen.dart index ac37a0bd25..c465f44f19 100644 --- a/animations/step_04_d/lib/question_screen.dart +++ b/animations/step_04_d/lib/question_screen.dart @@ -11,8 +11,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -26,11 +27,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -43,9 +44,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -81,10 +83,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { @@ -99,11 +98,13 @@ class QuestionCard extends StatelessWidget { ); }, transitionBuilder: (child, animation) { - final curveAnimation = - CurveTween(curve: Curves.easeInCubic).animate(animation); - final offsetAnimation = - Tween(begin: Offset(-0.1, 0.0), end: Offset.zero) - .animate(curveAnimation); + final curveAnimation = CurveTween( + curve: Curves.easeInCubic, + ).animate(animation); + final offsetAnimation = Tween( + begin: Offset(-0.1, 0.0), + end: Offset.zero, + ).animate(curveAnimation); final fadeInAnimation = curveAnimation; return FadeTransition( opacity: fadeInAnimation, diff --git a/animations/step_04_d/lib/scoreboard.dart b/animations/step_04_d/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_04_d/lib/scoreboard.dart +++ b/animations/step_04_d/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_04_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_04_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_04_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_04_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_04_d/pubspec.yaml b/animations/step_04_d/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_04_d/pubspec.yaml +++ b/animations/step_04_d/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_05_a/android/.gitignore b/animations/step_05_a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_05_a/android/.gitignore +++ b/animations/step_05_a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_05_a/android/app/build.gradle b/animations/step_05_a/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_05_a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_05_a/android/app/build.gradle.kts b/animations/step_05_a/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_05_a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_05_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_05_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_05_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_05_a/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_05_a/android/build.gradle b/animations/step_05_a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_05_a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_05_a/android/build.gradle.kts b/animations/step_05_a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_05_a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_05_a/android/gradle.properties b/animations/step_05_a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_05_a/android/gradle.properties +++ b/animations/step_05_a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_05_a/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_05_a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_05_a/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_05_a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_05_a/android/settings.gradle b/animations/step_05_a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_05_a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_05_a/android/settings.gradle.kts b/animations/step_05_a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_05_a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_05_a/lib/flip_effect.dart b/animations/step_05_a/lib/flip_effect.dart index f21b8eac6a..d4b7ff4016 100644 --- a/animations/step_05_a/lib/flip_effect.dart +++ b/animations/step_05_a/lib/flip_effect.dart @@ -29,7 +29,9 @@ class _CardFlipEffectState extends State super.initState(); _animationController = AnimationController( - vsync: this, duration: widget.duration * (widget.delayAmount + 1)); + vsync: this, + duration: widget.duration * (widget.delayAmount + 1), + ); _animationController.addListener(() { if (_animationController.value == 1) { @@ -43,10 +45,7 @@ class _CardFlipEffectState extends State tween: ConstantTween(0.0), weight: widget.delayAmount, ), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0), - weight: 1.0, - ), + TweenSequenceItem(tween: Tween(begin: 0.0, end: 1.0), weight: 1.0), ]).animate(_animationController); } @@ -71,13 +70,14 @@ class _CardFlipEffectState extends State builder: (context, child) { return Transform( alignment: Alignment.center, - transform: Matrix4.identity() - ..rotateX(_animationWithDelay.value * math.pi), - child: _animationController.isAnimating - ? _animationWithDelay.value < 0.5 - ? _previousChild - : Transform.flip(flipY: true, child: child) - : child, + transform: + Matrix4.identity()..rotateX(_animationWithDelay.value * math.pi), + child: + _animationController.isAnimating + ? _animationWithDelay.value < 0.5 + ? _previousChild + : Transform.flip(flipY: true, child: child) + : child, ); }, child: widget.child, diff --git a/animations/step_05_a/lib/home_screen.dart b/animations/step_05_a/lib/home_screen.dart index 6b8c670a9b..08372c0a4c 100644 --- a/animations/step_05_a/lib/home_screen.dart +++ b/animations/step_05_a/lib/home_screen.dart @@ -11,15 +11,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { @@ -30,12 +28,13 @@ class HomeScreen extends StatelessWidget { pageBuilder: (context, animation, secondaryAnimation) { return const QuestionScreen(); }, - transitionsBuilder: - (context, animation, secondaryAnimation, child) { - return FadeTransition( - opacity: animation, - child: child, - ); + transitionsBuilder: ( + context, + animation, + secondaryAnimation, + child, + ) { + return FadeTransition(opacity: animation, child: child); }, ), ); diff --git a/animations/step_05_a/lib/model.dart b/animations/step_05_a/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_05_a/lib/model.dart +++ b/animations/step_05_a/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_05_a/lib/question_screen.dart b/animations/step_05_a/lib/question_screen.dart index ac37a0bd25..c465f44f19 100644 --- a/animations/step_05_a/lib/question_screen.dart +++ b/animations/step_05_a/lib/question_screen.dart @@ -11,8 +11,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -26,11 +27,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -43,9 +44,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -81,10 +83,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { @@ -99,11 +98,13 @@ class QuestionCard extends StatelessWidget { ); }, transitionBuilder: (child, animation) { - final curveAnimation = - CurveTween(curve: Curves.easeInCubic).animate(animation); - final offsetAnimation = - Tween(begin: Offset(-0.1, 0.0), end: Offset.zero) - .animate(curveAnimation); + final curveAnimation = CurveTween( + curve: Curves.easeInCubic, + ).animate(animation); + final offsetAnimation = Tween( + begin: Offset(-0.1, 0.0), + end: Offset.zero, + ).animate(curveAnimation); final fadeInAnimation = curveAnimation; return FadeTransition( opacity: fadeInAnimation, diff --git a/animations/step_05_a/lib/scoreboard.dart b/animations/step_05_a/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_05_a/lib/scoreboard.dart +++ b/animations/step_05_a/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_05_a/pubspec.yaml b/animations/step_05_a/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_05_a/pubspec.yaml +++ b/animations/step_05_a/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_05_b/android/.gitignore b/animations/step_05_b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_05_b/android/.gitignore +++ b/animations/step_05_b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_05_b/android/app/build.gradle b/animations/step_05_b/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_05_b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_05_b/android/app/build.gradle.kts b/animations/step_05_b/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_05_b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_05_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_05_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_05_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_05_b/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_05_b/android/build.gradle b/animations/step_05_b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_05_b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_05_b/android/build.gradle.kts b/animations/step_05_b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_05_b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_05_b/android/gradle.properties b/animations/step_05_b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_05_b/android/gradle.properties +++ b/animations/step_05_b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_05_b/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_05_b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_05_b/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_05_b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_05_b/android/settings.gradle b/animations/step_05_b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_05_b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_05_b/android/settings.gradle.kts b/animations/step_05_b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_05_b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_05_b/lib/flip_effect.dart b/animations/step_05_b/lib/flip_effect.dart index f21b8eac6a..d4b7ff4016 100644 --- a/animations/step_05_b/lib/flip_effect.dart +++ b/animations/step_05_b/lib/flip_effect.dart @@ -29,7 +29,9 @@ class _CardFlipEffectState extends State super.initState(); _animationController = AnimationController( - vsync: this, duration: widget.duration * (widget.delayAmount + 1)); + vsync: this, + duration: widget.duration * (widget.delayAmount + 1), + ); _animationController.addListener(() { if (_animationController.value == 1) { @@ -43,10 +45,7 @@ class _CardFlipEffectState extends State tween: ConstantTween(0.0), weight: widget.delayAmount, ), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0), - weight: 1.0, - ), + TweenSequenceItem(tween: Tween(begin: 0.0, end: 1.0), weight: 1.0), ]).animate(_animationController); } @@ -71,13 +70,14 @@ class _CardFlipEffectState extends State builder: (context, child) { return Transform( alignment: Alignment.center, - transform: Matrix4.identity() - ..rotateX(_animationWithDelay.value * math.pi), - child: _animationController.isAnimating - ? _animationWithDelay.value < 0.5 - ? _previousChild - : Transform.flip(flipY: true, child: child) - : child, + transform: + Matrix4.identity()..rotateX(_animationWithDelay.value * math.pi), + child: + _animationController.isAnimating + ? _animationWithDelay.value < 0.5 + ? _previousChild + : Transform.flip(flipY: true, child: child) + : child, ); }, child: widget.child, diff --git a/animations/step_05_b/lib/home_screen.dart b/animations/step_05_b/lib/home_screen.dart index fbf3aaba47..b5af1b56d7 100644 --- a/animations/step_05_b/lib/home_screen.dart +++ b/animations/step_05_b/lib/home_screen.dart @@ -12,15 +12,13 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { @@ -31,8 +29,12 @@ class HomeScreen extends StatelessWidget { pageBuilder: (context, animation, secondaryAnimation) { return const QuestionScreen(); }, - transitionsBuilder: - (context, animation, secondaryAnimation, child) { + transitionsBuilder: ( + context, + animation, + secondaryAnimation, + child, + ) { return FadeThroughTransition( animation: animation, secondaryAnimation: secondaryAnimation, diff --git a/animations/step_05_b/lib/model.dart b/animations/step_05_b/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_05_b/lib/model.dart +++ b/animations/step_05_b/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_05_b/lib/question_screen.dart b/animations/step_05_b/lib/question_screen.dart index ac37a0bd25..c465f44f19 100644 --- a/animations/step_05_b/lib/question_screen.dart +++ b/animations/step_05_b/lib/question_screen.dart @@ -11,8 +11,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -26,11 +27,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -43,9 +44,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -81,10 +83,7 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { @@ -99,11 +98,13 @@ class QuestionCard extends StatelessWidget { ); }, transitionBuilder: (child, animation) { - final curveAnimation = - CurveTween(curve: Curves.easeInCubic).animate(animation); - final offsetAnimation = - Tween(begin: Offset(-0.1, 0.0), end: Offset.zero) - .animate(curveAnimation); + final curveAnimation = CurveTween( + curve: Curves.easeInCubic, + ).animate(animation); + final offsetAnimation = Tween( + begin: Offset(-0.1, 0.0), + end: Offset.zero, + ).animate(curveAnimation); final fadeInAnimation = curveAnimation; return FadeTransition( opacity: fadeInAnimation, diff --git a/animations/step_05_b/lib/scoreboard.dart b/animations/step_05_b/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_05_b/lib/scoreboard.dart +++ b/animations/step_05_b/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_05_b/pubspec.yaml b/animations/step_05_b/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_05_b/pubspec.yaml +++ b/animations/step_05_b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_05_c/android/.gitignore b/animations/step_05_c/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_05_c/android/.gitignore +++ b/animations/step_05_c/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_05_c/android/app/build.gradle b/animations/step_05_c/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_05_c/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_05_c/android/app/build.gradle.kts b/animations/step_05_c/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_05_c/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_05_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_05_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_05_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_05_c/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_05_c/android/build.gradle b/animations/step_05_c/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_05_c/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_05_c/android/build.gradle.kts b/animations/step_05_c/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_05_c/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_05_c/android/gradle.properties b/animations/step_05_c/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_05_c/android/gradle.properties +++ b/animations/step_05_c/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_05_c/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_05_c/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_05_c/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_05_c/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_05_c/android/settings.gradle b/animations/step_05_c/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_05_c/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_05_c/android/settings.gradle.kts b/animations/step_05_c/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_05_c/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_05_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_05_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_05_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_05_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_05_c/lib/flip_effect.dart b/animations/step_05_c/lib/flip_effect.dart index f21b8eac6a..d4b7ff4016 100644 --- a/animations/step_05_c/lib/flip_effect.dart +++ b/animations/step_05_c/lib/flip_effect.dart @@ -29,7 +29,9 @@ class _CardFlipEffectState extends State super.initState(); _animationController = AnimationController( - vsync: this, duration: widget.duration * (widget.delayAmount + 1)); + vsync: this, + duration: widget.duration * (widget.delayAmount + 1), + ); _animationController.addListener(() { if (_animationController.value == 1) { @@ -43,10 +45,7 @@ class _CardFlipEffectState extends State tween: ConstantTween(0.0), weight: widget.delayAmount, ), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0), - weight: 1.0, - ), + TweenSequenceItem(tween: Tween(begin: 0.0, end: 1.0), weight: 1.0), ]).animate(_animationController); } @@ -71,13 +70,14 @@ class _CardFlipEffectState extends State builder: (context, child) { return Transform( alignment: Alignment.center, - transform: Matrix4.identity() - ..rotateX(_animationWithDelay.value * math.pi), - child: _animationController.isAnimating - ? _animationWithDelay.value < 0.5 - ? _previousChild - : Transform.flip(flipY: true, child: child) - : child, + transform: + Matrix4.identity()..rotateX(_animationWithDelay.value * math.pi), + child: + _animationController.isAnimating + ? _animationWithDelay.value < 0.5 + ? _previousChild + : Transform.flip(flipY: true, child: child) + : child, ); }, child: widget.child, diff --git a/animations/step_05_c/lib/home_screen.dart b/animations/step_05_c/lib/home_screen.dart index 0aba8c77d5..088259805b 100644 --- a/animations/step_05_c/lib/home_screen.dart +++ b/animations/step_05_c/lib/home_screen.dart @@ -11,24 +11,24 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { // Show the question screen to start the game Navigator.push( context, - MaterialPageRoute(builder: (context) { - return const QuestionScreen(); - }), + MaterialPageRoute( + builder: (context) { + return const QuestionScreen(); + }, + ), ); }, child: Text('New Game'), diff --git a/animations/step_05_c/lib/model.dart b/animations/step_05_c/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_05_c/lib/model.dart +++ b/animations/step_05_c/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_05_c/lib/question_screen.dart b/animations/step_05_c/lib/question_screen.dart index 06219fa08b..7a3cbde2dd 100644 --- a/animations/step_05_c/lib/question_screen.dart +++ b/animations/step_05_c/lib/question_screen.dart @@ -12,8 +12,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); @override Widget build(BuildContext context) { @@ -27,11 +28,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -44,9 +45,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -82,19 +84,13 @@ class _QuestionScreenState extends State { class QuestionCard extends StatelessWidget { final String? question; - const QuestionCard({ - required this.question, - super.key, - }); + const QuestionCard({required this.question, super.key}); @override Widget build(BuildContext context) { return PageTransitionSwitcher( layoutBuilder: (entries) { - return Stack( - alignment: Alignment.topCenter, - children: entries, - ); + return Stack(alignment: Alignment.topCenter, children: entries); }, transitionBuilder: (child, animation, secondaryAnimation) { return FadeThroughTransition( diff --git a/animations/step_05_c/lib/scoreboard.dart b/animations/step_05_c/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_05_c/lib/scoreboard.dart +++ b/animations/step_05_c/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_05_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_05_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_05_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_05_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_05_c/pubspec.yaml b/animations/step_05_c/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_05_c/pubspec.yaml +++ b/animations/step_05_c/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/animations/step_05_d/android/.gitignore b/animations/step_05_d/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/animations/step_05_d/android/.gitignore +++ b/animations/step_05_d/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/animations/step_05_d/android/app/build.gradle b/animations/step_05_d/android/app/build.gradle deleted file mode 100644 index 7c3594ed33..0000000000 --- a/animations/step_05_d/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.quiz" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.quiz" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/animations/step_05_d/android/app/build.gradle.kts b/animations/step_05_d/android/app/build.gradle.kts new file mode 100644 index 0000000000..56080e232a --- /dev/null +++ b/animations/step_05_d/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.quiz" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.quiz" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/animations/step_05_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt b/animations/step_05_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt index 87081bb97c..3df56280d1 100644 --- a/animations/step_05_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt +++ b/animations/step_05_d/android/app/src/main/kotlin/com/example/quiz/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.quiz import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/animations/step_05_d/android/build.gradle b/animations/step_05_d/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/animations/step_05_d/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/animations/step_05_d/android/build.gradle.kts b/animations/step_05_d/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/animations/step_05_d/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/animations/step_05_d/android/gradle.properties b/animations/step_05_d/android/gradle.properties index 2597170821..f018a61817 100644 --- a/animations/step_05_d/android/gradle.properties +++ b/animations/step_05_d/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/animations/step_05_d/android/gradle/wrapper/gradle-wrapper.properties b/animations/step_05_d/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/animations/step_05_d/android/gradle/wrapper/gradle-wrapper.properties +++ b/animations/step_05_d/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/animations/step_05_d/android/settings.gradle b/animations/step_05_d/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/animations/step_05_d/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/animations/step_05_d/android/settings.gradle.kts b/animations/step_05_d/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/animations/step_05_d/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/animations/step_05_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_05_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/animations/step_05_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_05_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_05_d/lib/flip_effect.dart b/animations/step_05_d/lib/flip_effect.dart index f21b8eac6a..d4b7ff4016 100644 --- a/animations/step_05_d/lib/flip_effect.dart +++ b/animations/step_05_d/lib/flip_effect.dart @@ -29,7 +29,9 @@ class _CardFlipEffectState extends State super.initState(); _animationController = AnimationController( - vsync: this, duration: widget.duration * (widget.delayAmount + 1)); + vsync: this, + duration: widget.duration * (widget.delayAmount + 1), + ); _animationController.addListener(() { if (_animationController.value == 1) { @@ -43,10 +45,7 @@ class _CardFlipEffectState extends State tween: ConstantTween(0.0), weight: widget.delayAmount, ), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0), - weight: 1.0, - ), + TweenSequenceItem(tween: Tween(begin: 0.0, end: 1.0), weight: 1.0), ]).animate(_animationController); } @@ -71,13 +70,14 @@ class _CardFlipEffectState extends State builder: (context, child) { return Transform( alignment: Alignment.center, - transform: Matrix4.identity() - ..rotateX(_animationWithDelay.value * math.pi), - child: _animationController.isAnimating - ? _animationWithDelay.value < 0.5 - ? _previousChild - : Transform.flip(flipY: true, child: child) - : child, + transform: + Matrix4.identity()..rotateX(_animationWithDelay.value * math.pi), + child: + _animationController.isAnimating + ? _animationWithDelay.value < 0.5 + ? _previousChild + : Transform.flip(flipY: true, child: child) + : child, ); }, child: widget.child, diff --git a/animations/step_05_d/lib/home_screen.dart b/animations/step_05_d/lib/home_screen.dart index 0aba8c77d5..088259805b 100644 --- a/animations/step_05_d/lib/home_screen.dart +++ b/animations/step_05_d/lib/home_screen.dart @@ -11,24 +11,24 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - '✏️', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('✏️', style: Theme.of(context).textTheme.displayLarge), Text( 'Flutter Quiz', style: Theme.of(context).textTheme.displayLarge!.copyWith( - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onPrimaryFixedVariant), + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onPrimaryFixedVariant, + ), ), ElevatedButton( onPressed: () { // Show the question screen to start the game Navigator.push( context, - MaterialPageRoute(builder: (context) { - return const QuestionScreen(); - }), + MaterialPageRoute( + builder: (context) { + return const QuestionScreen(); + }, + ), ); }, child: Text('New Game'), diff --git a/animations/step_05_d/lib/model.dart b/animations/step_05_d/lib/model.dart index 0662327f52..56666d11dc 100644 --- a/animations/step_05_d/lib/model.dart +++ b/animations/step_05_d/lib/model.dart @@ -30,12 +30,7 @@ List _createQuestions() { return [ Question( 'What class used to create custom explicit animations in Flutter?', - [ - 'AnimationController', - 'AnimatedWidget', - 'AnimatedBuilder', - 'Tween', - ], + ['AnimationController', 'AnimatedWidget', 'AnimatedBuilder', 'Tween'], 0, ), Question( @@ -50,12 +45,7 @@ List _createQuestions() { ), Question( 'What class is used to define the start and end values for an animation?', - [ - 'Tween', - 'Curve', - 'AnimationController', - 'AnimatedWidget', - ], + ['Tween', 'Curve', 'AnimationController', 'AnimatedWidget'], 0, ), ]; diff --git a/animations/step_05_d/lib/question_screen.dart b/animations/step_05_d/lib/question_screen.dart index 025474e4bf..2ebbd9f8e1 100644 --- a/animations/step_05_d/lib/question_screen.dart +++ b/animations/step_05_d/lib/question_screen.dart @@ -12,8 +12,9 @@ class QuestionScreen extends StatefulWidget { } class _QuestionScreenState extends State { - late final QuizViewModel viewModel = - QuizViewModel(onGameOver: _handleGameOver); + late final QuizViewModel viewModel = QuizViewModel( + onGameOver: _handleGameOver, + ); VoidCallback? _showGameOverScreen; @override @@ -28,11 +29,11 @@ class _QuestionScreenState extends State { onPressed: viewModel.hasNextQuestion && viewModel.didAnswerQuestion ? () { - viewModel.getNextQuestion(); - } + viewModel.getNextQuestion(); + } : null, child: const Text('Next'), - ) + ), ], ), body: Center( @@ -49,9 +50,10 @@ class _QuestionScreenState extends State { viewModel.checkAnswer(index); }, answers: viewModel.currentQuestion?.possibleAnswers ?? [], - correctAnswer: viewModel.didAnswerQuestion - ? viewModel.currentQuestion?.correctAnswer - : null, + correctAnswer: + viewModel.didAnswerQuestion + ? viewModel.currentQuestion?.correctAnswer + : null, ), StatusBar(viewModel: viewModel), ], @@ -80,9 +82,7 @@ class GameOverScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - automaticallyImplyLeading: false, - ), + appBar: AppBar(automaticallyImplyLeading: false), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -91,10 +91,7 @@ class GameOverScreen extends StatelessWidget { score: viewModel.score, totalQuestions: viewModel.totalQuestions, ), - Text( - 'You Win!', - style: Theme.of(context).textTheme.displayLarge, - ), + Text('You Win!', style: Theme.of(context).textTheme.displayLarge), Text( 'Score: ${viewModel.score} / ${viewModel.totalQuestions}', style: Theme.of(context).textTheme.displaySmall, diff --git a/animations/step_05_d/lib/scoreboard.dart b/animations/step_05_d/lib/scoreboard.dart index dd71080ba3..765711fe87 100644 --- a/animations/step_05_d/lib/scoreboard.dart +++ b/animations/step_05_d/lib/scoreboard.dart @@ -18,9 +18,7 @@ class Scoreboard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ for (var i = 0; i < totalQuestions; i++) - AnimatedStar( - isActive: score > i, - ) + AnimatedStar(isActive: score > i), ], ), ); @@ -50,11 +48,7 @@ class AnimatedStar extends StatelessWidget { end: isActive ? _activatedColor : _deactivatedColor, ), builder: (context, value, child) { - return Icon( - Icons.star, - size: 50, - color: value, - ); + return Icon(Icons.star, size: 50, color: value); }, ), ); diff --git a/animations/step_05_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/animations/step_05_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2f413cb17b..c06f35f66b 100644 --- a/animations/step_05_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/animations/step_05_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/animations/step_05_d/pubspec.yaml b/animations/step_05_d/pubspec.yaml index 528325bd26..d8e843d9c9 100644 --- a/animations/step_05_d/pubspec.yaml +++ b/animations/step_05_d/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: animations: ^2.0.0 diff --git a/audio_soloud/codelab_rebuild.yaml b/audio_soloud/codelab_rebuild.yaml index 2eaf56c692..325be57bf4 100644 --- a/audio_soloud/codelab_rebuild.yaml +++ b/audio_soloud/codelab_rebuild.yaml @@ -139,9 +139,7 @@ steps: final audioController = AudioController(); await audioController.initialize(); - runApp( - MyApp(audioController: audioController), - ); + runApp(MyApp(audioController: audioController)); } class MyApp extends StatelessWidget { @@ -506,8 +504,8 @@ steps: - name: Play music loops path: audio_soloud/lib/audio/audio_controller.dart patch-u: | - --- a/lib/audio/audio_controller.dart - +++ b/lib/audio/audio_controller.dart + --- b/audio_soloud/step_05/lib/audio/audio_controller.dart + +++ a/audio_soloud/step_05/lib/audio/audio_controller.dart @@ -8,6 +8,8 @@ class AudioController { SoLoud? _soloud; @@ -517,7 +515,7 @@ steps: Future initialize() async { _soloud = SoLoud.instance; await _soloud!.init(); - @@ -27,11 +29,38 @@ class AudioController { + @@ -27,11 +29,40 @@ class AudioController { } Future startMusic() async { @@ -529,8 +527,10 @@ steps: + } + } + _log.info('Loading music'); - + final musicSource = await _soloud! - + .loadAsset('assets/music/looped-song.ogg', mode: LoadMode.disk); + + final musicSource = await _soloud!.loadAsset( + + 'assets/music/looped-song.ogg', + + mode: LoadMode.disk, + + ); + musicSource.allInstancesFinished.first.then((_) { + _soloud!.disposeSource(musicSource); + _log.info('Music source disposed'); @@ -593,9 +593,9 @@ steps: - name: Apply effects path: audio_soloud/lib/audio/audio_controller.dart patch-u: | - --- a/lib/audio/audio_controller.dart - +++ b/lib/audio/audio_controller.dart - @@ -64,10 +64,12 @@ class AudioController { + --- b/audio_soloud/step_06/lib/audio/audio_controller.dart + +++ a/audio_soloud/step_06/lib/audio/audio_controller.dart + @@ -66,10 +66,12 @@ class AudioController { } void applyFilter() { diff --git a/audio_soloud/step_02/android/.gitignore b/audio_soloud/step_02/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/audio_soloud/step_02/android/.gitignore +++ b/audio_soloud/step_02/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/audio_soloud/step_02/android/app/build.gradle b/audio_soloud/step_02/android/app/build.gradle deleted file mode 100644 index 2c07f0d32f..0000000000 --- a/audio_soloud/step_02/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.audio_soloud" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.audio_soloud" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/audio_soloud/step_02/android/app/build.gradle.kts b/audio_soloud/step_02/android/app/build.gradle.kts new file mode 100644 index 0000000000..e72c8cc3c6 --- /dev/null +++ b/audio_soloud/step_02/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.audio_soloud" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.audio_soloud" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/audio_soloud/step_02/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt b/audio_soloud/step_02/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt index b859911758..97f37d1195 100644 --- a/audio_soloud/step_02/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt +++ b/audio_soloud/step_02/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.audio_soloud import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/audio_soloud/step_02/android/build.gradle b/audio_soloud/step_02/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/audio_soloud/step_02/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/audio_soloud/step_02/android/build.gradle.kts b/audio_soloud/step_02/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/audio_soloud/step_02/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/audio_soloud/step_02/android/gradle.properties b/audio_soloud/step_02/android/gradle.properties index 2597170821..f018a61817 100644 --- a/audio_soloud/step_02/android/gradle.properties +++ b/audio_soloud/step_02/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/audio_soloud/step_02/android/gradle/wrapper/gradle-wrapper.properties b/audio_soloud/step_02/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/audio_soloud/step_02/android/gradle/wrapper/gradle-wrapper.properties +++ b/audio_soloud/step_02/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/audio_soloud/step_02/android/settings.gradle b/audio_soloud/step_02/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/audio_soloud/step_02/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/audio_soloud/step_02/android/settings.gradle.kts b/audio_soloud/step_02/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/audio_soloud/step_02/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/audio_soloud/step_02/ios/Podfile b/audio_soloud/step_02/ios/Podfile index a836c8c671..11e1cb83ed 100644 --- a/audio_soloud/step_02/ios/Podfile +++ b/audio_soloud/step_02/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/audio_soloud/step_02/ios/Runner.xcodeproj/project.pbxproj b/audio_soloud/step_02/ios/Runner.xcodeproj/project.pbxproj index fac9082715..16518f4dd9 100644 --- a/audio_soloud/step_02/ios/Runner.xcodeproj/project.pbxproj +++ b/audio_soloud/step_02/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 747A1A21109B45392F081BC2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8337EA84BF804665DA448E15 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 8060B4C8A4071A8051685E44 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */; }; + 7E2EE3A2951A8BE26699963F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - A034088987B534A451EFB38E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,19 +42,20 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 09399623F661DE2EE41CB8EF /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1523C53D90CE6D43C8888D56 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5B9D9524E8CF2DBC4CDED108 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 773B59DE2A36228D644B1D4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8337EA84BF804665DA448E15 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 938480D239228B279363867F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -62,9 +63,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E8777681D17029A3F91A91A4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,28 +72,33 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A034088987B534A451EFB38E /* Pods_Runner.framework in Frameworks */, + 747A1A21109B45392F081BC2 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A19538DF89AE3BEE3D02BF34 /* Frameworks */ = { + B6DB4B3B8B5010DECE956EFF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8060B4C8A4071A8051685E44 /* Pods_RunnerTests.framework in Frameworks */, + 7E2EE3A2951A8BE26699963F /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 01F5BEB0970C970A8F0312D7 /* Frameworks */ = { + 087DC788C8C193F8B24485FA /* Pods */ = { isa = PBXGroup; children = ( - 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */, - D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */, + 938480D239228B279363867F /* Pods-Runner.debug.xcconfig */, + 09399623F661DE2EE41CB8EF /* Pods-Runner.release.xcconfig */, + E8777681D17029A3F91A91A4 /* Pods-Runner.profile.xcconfig */, + BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */, + 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */, + 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */, ); - name = Frameworks; + name = Pods; + path = Pods; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -104,6 +109,15 @@ path = RunnerTests; sourceTree = ""; }; + 823855D77A18EB5C79276C5D /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8337EA84BF804665DA448E15 /* Pods_Runner.framework */, + 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -122,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - C554A0098E4F2CDD762C76D1 /* Pods */, - 01F5BEB0970C970A8F0312D7 /* Frameworks */, + 087DC788C8C193F8B24485FA /* Pods */, + 823855D77A18EB5C79276C5D /* Frameworks */, ); sourceTree = ""; }; @@ -151,20 +165,6 @@ path = Runner; sourceTree = ""; }; - C554A0098E4F2CDD762C76D1 /* Pods */ = { - isa = PBXGroup; - children = ( - 5B9D9524E8CF2DBC4CDED108 /* Pods-Runner.debug.xcconfig */, - 1523C53D90CE6D43C8888D56 /* Pods-Runner.release.xcconfig */, - 773B59DE2A36228D644B1D4A /* Pods-Runner.profile.xcconfig */, - E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */, - BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */, - 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 67A9505F2A052479CF709E67 /* [CP] Check Pods Manifest.lock */, + EEC06284570A8E1E0C175E13 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - A19538DF89AE3BEE3D02BF34 /* Frameworks */, + B6DB4B3B8B5010DECE956EFF /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 424397666203ED2B8C8170B1 /* [CP] Check Pods Manifest.lock */, + F479FB5CBA3B4987D82D408A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 681DBF6A3167757588B117FF /* [CP] Embed Pods Frameworks */, + F0FC3564BF6E2A2AC047A8CF /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -286,29 +286,22 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 424397666203ED2B8C8170B1 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 67A9505F2A052479CF709E67 /* [CP] Check Pods Manifest.lock */ = { + EEC06284570A8E1E0C175E13 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -330,7 +323,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 681DBF6A3167757588B117FF /* [CP] Embed Pods Frameworks */ = { + F0FC3564BF6E2A2AC047A8CF /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -347,20 +340,27 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + F479FB5CBA3B4987D82D408A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/audio_soloud/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/audio_soloud/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/audio_soloud/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/audio_soloud/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/audio_soloud/step_02/lib/main.dart b/audio_soloud/step_02/lib/main.dart index c5b712c0ab..f5dd49989a 100644 --- a/audio_soloud/step_02/lib/main.dart +++ b/audio_soloud/step_02/lib/main.dart @@ -29,9 +29,7 @@ void main() async { final audioController = AudioController(); await audioController.initialize(); - runApp( - MyApp(audioController: audioController), - ); + runApp(MyApp(audioController: audioController)); } class MyApp extends StatelessWidget { diff --git a/audio_soloud/step_02/macos/Podfile b/audio_soloud/step_02/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/audio_soloud/step_02/macos/Podfile +++ b/audio_soloud/step_02/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/audio_soloud/step_02/macos/Runner.xcodeproj/project.pbxproj b/audio_soloud/step_02/macos/Runner.xcodeproj/project.pbxproj index a4e92d2523..93598f2c60 100644 --- a/audio_soloud/step_02/macos/Runner.xcodeproj/project.pbxproj +++ b/audio_soloud/step_02/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 28BA7DD876B091736AA592C0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */; }; + 311442AF0C61E450A50B190E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 566C9560CDCA3EC9A1670E3B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */; }; + 767D946585A6F8D095D0FD64 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 448F4A69AA210917BB78B289 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -78,16 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 448F4A69AA210917BB78B289 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 496ED413CF3C7282334FF1D3 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9044FE8CEF8C48D67B7B9FD4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - AD07C985A6A2E940086E4383 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - B882402F138E3E4FBBCDE9FD /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - D15E6BBD47D050D0C2B86309 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E4C7EDF44633F3BAD32EF14A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 566C9560CDCA3EC9A1670E3B /* Pods_RunnerTests.framework in Frameworks */, + 311442AF0C61E450A50B190E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28BA7DD876B091736AA592C0 /* Pods_Runner.framework in Frameworks */, + 767D946585A6F8D095D0FD64 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 643D227792280CD77DE5A03F /* Pods */, + 7870A8B81746845D606F9B9A /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 643D227792280CD77DE5A03F /* Pods */ = { + 7870A8B81746845D606F9B9A /* Pods */ = { isa = PBXGroup; children = ( - B882402F138E3E4FBBCDE9FD /* Pods-Runner.debug.xcconfig */, - D15E6BBD47D050D0C2B86309 /* Pods-Runner.release.xcconfig */, - AD07C985A6A2E940086E4383 /* Pods-Runner.profile.xcconfig */, - BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */, - F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */, - 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */, + 496ED413CF3C7282334FF1D3 /* Pods-Runner.debug.xcconfig */, + E4C7EDF44633F3BAD32EF14A /* Pods-Runner.release.xcconfig */, + 9044FE8CEF8C48D67B7B9FD4 /* Pods-Runner.profile.xcconfig */, + CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */, + 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */, + C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */, - E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */, + 448F4A69AA210917BB78B289 /* Pods_Runner.framework */, + 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C20BDC9ECC747861359A2FEF /* [CP] Check Pods Manifest.lock */, + 4F222F6356D31545AC90BF60 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B9815FFAB2648C447B43A498 /* [CP] Check Pods Manifest.lock */, + E9CFD0CD97DE3D6E12FBA841 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 307026101EF3E74AFC515029 /* [CP] Embed Pods Frameworks */, + CDBC90FE07734ACB2697BC69 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,23 +323,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 307026101EF3E74AFC515029 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -378,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - B9815FFAB2648C447B43A498 /* [CP] Check Pods Manifest.lock */ = { + 4F222F6356D31545AC90BF60 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +376,31 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C20BDC9ECC747861359A2FEF /* [CP] Check Pods Manifest.lock */ = { + CDBC90FE07734ACB2697BC69 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E9CFD0CD97DE3D6E12FBA841 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/audio_soloud/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/audio_soloud/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 29e755cf42..d0f7e9d1f4 100644 --- a/audio_soloud/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/audio_soloud/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/audio_soloud/step_02/pubspec.yaml b/audio_soloud/step_02/pubspec.yaml index b11d52d990..ae4a32a71c 100644 --- a/audio_soloud/step_02/pubspec.yaml +++ b/audio_soloud/step_02/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/audio_soloud/step_03/android/.gitignore b/audio_soloud/step_03/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/audio_soloud/step_03/android/.gitignore +++ b/audio_soloud/step_03/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/audio_soloud/step_03/android/app/build.gradle b/audio_soloud/step_03/android/app/build.gradle deleted file mode 100644 index 2c07f0d32f..0000000000 --- a/audio_soloud/step_03/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.audio_soloud" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.audio_soloud" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/audio_soloud/step_03/android/app/build.gradle.kts b/audio_soloud/step_03/android/app/build.gradle.kts new file mode 100644 index 0000000000..e72c8cc3c6 --- /dev/null +++ b/audio_soloud/step_03/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.audio_soloud" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.audio_soloud" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/audio_soloud/step_03/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt b/audio_soloud/step_03/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt index b859911758..97f37d1195 100644 --- a/audio_soloud/step_03/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt +++ b/audio_soloud/step_03/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.audio_soloud import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/audio_soloud/step_03/android/build.gradle b/audio_soloud/step_03/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/audio_soloud/step_03/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/audio_soloud/step_03/android/build.gradle.kts b/audio_soloud/step_03/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/audio_soloud/step_03/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/audio_soloud/step_03/android/gradle.properties b/audio_soloud/step_03/android/gradle.properties index 2597170821..f018a61817 100644 --- a/audio_soloud/step_03/android/gradle.properties +++ b/audio_soloud/step_03/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/audio_soloud/step_03/android/gradle/wrapper/gradle-wrapper.properties b/audio_soloud/step_03/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/audio_soloud/step_03/android/gradle/wrapper/gradle-wrapper.properties +++ b/audio_soloud/step_03/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/audio_soloud/step_03/android/settings.gradle b/audio_soloud/step_03/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/audio_soloud/step_03/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/audio_soloud/step_03/android/settings.gradle.kts b/audio_soloud/step_03/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/audio_soloud/step_03/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/audio_soloud/step_03/ios/Podfile b/audio_soloud/step_03/ios/Podfile index a836c8c671..11e1cb83ed 100644 --- a/audio_soloud/step_03/ios/Podfile +++ b/audio_soloud/step_03/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/audio_soloud/step_03/ios/Runner.xcodeproj/project.pbxproj b/audio_soloud/step_03/ios/Runner.xcodeproj/project.pbxproj index fac9082715..16518f4dd9 100644 --- a/audio_soloud/step_03/ios/Runner.xcodeproj/project.pbxproj +++ b/audio_soloud/step_03/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 747A1A21109B45392F081BC2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8337EA84BF804665DA448E15 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 8060B4C8A4071A8051685E44 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */; }; + 7E2EE3A2951A8BE26699963F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - A034088987B534A451EFB38E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,19 +42,20 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 09399623F661DE2EE41CB8EF /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1523C53D90CE6D43C8888D56 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5B9D9524E8CF2DBC4CDED108 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 773B59DE2A36228D644B1D4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8337EA84BF804665DA448E15 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 938480D239228B279363867F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -62,9 +63,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E8777681D17029A3F91A91A4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,28 +72,33 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A034088987B534A451EFB38E /* Pods_Runner.framework in Frameworks */, + 747A1A21109B45392F081BC2 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A19538DF89AE3BEE3D02BF34 /* Frameworks */ = { + B6DB4B3B8B5010DECE956EFF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8060B4C8A4071A8051685E44 /* Pods_RunnerTests.framework in Frameworks */, + 7E2EE3A2951A8BE26699963F /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 01F5BEB0970C970A8F0312D7 /* Frameworks */ = { + 087DC788C8C193F8B24485FA /* Pods */ = { isa = PBXGroup; children = ( - 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */, - D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */, + 938480D239228B279363867F /* Pods-Runner.debug.xcconfig */, + 09399623F661DE2EE41CB8EF /* Pods-Runner.release.xcconfig */, + E8777681D17029A3F91A91A4 /* Pods-Runner.profile.xcconfig */, + BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */, + 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */, + 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */, ); - name = Frameworks; + name = Pods; + path = Pods; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -104,6 +109,15 @@ path = RunnerTests; sourceTree = ""; }; + 823855D77A18EB5C79276C5D /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8337EA84BF804665DA448E15 /* Pods_Runner.framework */, + 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -122,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - C554A0098E4F2CDD762C76D1 /* Pods */, - 01F5BEB0970C970A8F0312D7 /* Frameworks */, + 087DC788C8C193F8B24485FA /* Pods */, + 823855D77A18EB5C79276C5D /* Frameworks */, ); sourceTree = ""; }; @@ -151,20 +165,6 @@ path = Runner; sourceTree = ""; }; - C554A0098E4F2CDD762C76D1 /* Pods */ = { - isa = PBXGroup; - children = ( - 5B9D9524E8CF2DBC4CDED108 /* Pods-Runner.debug.xcconfig */, - 1523C53D90CE6D43C8888D56 /* Pods-Runner.release.xcconfig */, - 773B59DE2A36228D644B1D4A /* Pods-Runner.profile.xcconfig */, - E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */, - BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */, - 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 67A9505F2A052479CF709E67 /* [CP] Check Pods Manifest.lock */, + EEC06284570A8E1E0C175E13 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - A19538DF89AE3BEE3D02BF34 /* Frameworks */, + B6DB4B3B8B5010DECE956EFF /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 424397666203ED2B8C8170B1 /* [CP] Check Pods Manifest.lock */, + F479FB5CBA3B4987D82D408A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 681DBF6A3167757588B117FF /* [CP] Embed Pods Frameworks */, + F0FC3564BF6E2A2AC047A8CF /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -286,29 +286,22 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 424397666203ED2B8C8170B1 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 67A9505F2A052479CF709E67 /* [CP] Check Pods Manifest.lock */ = { + EEC06284570A8E1E0C175E13 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -330,7 +323,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 681DBF6A3167757588B117FF /* [CP] Embed Pods Frameworks */ = { + F0FC3564BF6E2A2AC047A8CF /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -347,20 +340,27 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + F479FB5CBA3B4987D82D408A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/audio_soloud/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/audio_soloud/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/audio_soloud/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/audio_soloud/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/audio_soloud/step_03/lib/main.dart b/audio_soloud/step_03/lib/main.dart index c5b712c0ab..f5dd49989a 100644 --- a/audio_soloud/step_03/lib/main.dart +++ b/audio_soloud/step_03/lib/main.dart @@ -29,9 +29,7 @@ void main() async { final audioController = AudioController(); await audioController.initialize(); - runApp( - MyApp(audioController: audioController), - ); + runApp(MyApp(audioController: audioController)); } class MyApp extends StatelessWidget { diff --git a/audio_soloud/step_03/macos/Podfile b/audio_soloud/step_03/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/audio_soloud/step_03/macos/Podfile +++ b/audio_soloud/step_03/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/audio_soloud/step_03/macos/Runner.xcodeproj/project.pbxproj b/audio_soloud/step_03/macos/Runner.xcodeproj/project.pbxproj index a4e92d2523..93598f2c60 100644 --- a/audio_soloud/step_03/macos/Runner.xcodeproj/project.pbxproj +++ b/audio_soloud/step_03/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 28BA7DD876B091736AA592C0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */; }; + 311442AF0C61E450A50B190E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 566C9560CDCA3EC9A1670E3B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */; }; + 767D946585A6F8D095D0FD64 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 448F4A69AA210917BB78B289 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -78,16 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 448F4A69AA210917BB78B289 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 496ED413CF3C7282334FF1D3 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9044FE8CEF8C48D67B7B9FD4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - AD07C985A6A2E940086E4383 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - B882402F138E3E4FBBCDE9FD /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - D15E6BBD47D050D0C2B86309 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E4C7EDF44633F3BAD32EF14A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 566C9560CDCA3EC9A1670E3B /* Pods_RunnerTests.framework in Frameworks */, + 311442AF0C61E450A50B190E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28BA7DD876B091736AA592C0 /* Pods_Runner.framework in Frameworks */, + 767D946585A6F8D095D0FD64 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 643D227792280CD77DE5A03F /* Pods */, + 7870A8B81746845D606F9B9A /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 643D227792280CD77DE5A03F /* Pods */ = { + 7870A8B81746845D606F9B9A /* Pods */ = { isa = PBXGroup; children = ( - B882402F138E3E4FBBCDE9FD /* Pods-Runner.debug.xcconfig */, - D15E6BBD47D050D0C2B86309 /* Pods-Runner.release.xcconfig */, - AD07C985A6A2E940086E4383 /* Pods-Runner.profile.xcconfig */, - BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */, - F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */, - 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */, + 496ED413CF3C7282334FF1D3 /* Pods-Runner.debug.xcconfig */, + E4C7EDF44633F3BAD32EF14A /* Pods-Runner.release.xcconfig */, + 9044FE8CEF8C48D67B7B9FD4 /* Pods-Runner.profile.xcconfig */, + CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */, + 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */, + C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */, - E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */, + 448F4A69AA210917BB78B289 /* Pods_Runner.framework */, + 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C20BDC9ECC747861359A2FEF /* [CP] Check Pods Manifest.lock */, + 4F222F6356D31545AC90BF60 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B9815FFAB2648C447B43A498 /* [CP] Check Pods Manifest.lock */, + E9CFD0CD97DE3D6E12FBA841 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 307026101EF3E74AFC515029 /* [CP] Embed Pods Frameworks */, + CDBC90FE07734ACB2697BC69 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,23 +323,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 307026101EF3E74AFC515029 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -378,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - B9815FFAB2648C447B43A498 /* [CP] Check Pods Manifest.lock */ = { + 4F222F6356D31545AC90BF60 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +376,31 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C20BDC9ECC747861359A2FEF /* [CP] Check Pods Manifest.lock */ = { + CDBC90FE07734ACB2697BC69 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E9CFD0CD97DE3D6E12FBA841 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/audio_soloud/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/audio_soloud/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 29e755cf42..d0f7e9d1f4 100644 --- a/audio_soloud/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/audio_soloud/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/audio_soloud/step_03/pubspec.yaml b/audio_soloud/step_03/pubspec.yaml index b11d52d990..ae4a32a71c 100644 --- a/audio_soloud/step_03/pubspec.yaml +++ b/audio_soloud/step_03/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/audio_soloud/step_04a/android/.gitignore b/audio_soloud/step_04a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/audio_soloud/step_04a/android/.gitignore +++ b/audio_soloud/step_04a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/audio_soloud/step_04a/android/app/build.gradle b/audio_soloud/step_04a/android/app/build.gradle deleted file mode 100644 index 2c07f0d32f..0000000000 --- a/audio_soloud/step_04a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.audio_soloud" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.audio_soloud" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/audio_soloud/step_04a/android/app/build.gradle.kts b/audio_soloud/step_04a/android/app/build.gradle.kts new file mode 100644 index 0000000000..e72c8cc3c6 --- /dev/null +++ b/audio_soloud/step_04a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.audio_soloud" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.audio_soloud" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/audio_soloud/step_04a/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt b/audio_soloud/step_04a/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt index b859911758..97f37d1195 100644 --- a/audio_soloud/step_04a/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt +++ b/audio_soloud/step_04a/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.audio_soloud import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/audio_soloud/step_04a/android/build.gradle b/audio_soloud/step_04a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/audio_soloud/step_04a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/audio_soloud/step_04a/android/build.gradle.kts b/audio_soloud/step_04a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/audio_soloud/step_04a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/audio_soloud/step_04a/android/gradle.properties b/audio_soloud/step_04a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/audio_soloud/step_04a/android/gradle.properties +++ b/audio_soloud/step_04a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/audio_soloud/step_04a/android/gradle/wrapper/gradle-wrapper.properties b/audio_soloud/step_04a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/audio_soloud/step_04a/android/gradle/wrapper/gradle-wrapper.properties +++ b/audio_soloud/step_04a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/audio_soloud/step_04a/android/settings.gradle b/audio_soloud/step_04a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/audio_soloud/step_04a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/audio_soloud/step_04a/android/settings.gradle.kts b/audio_soloud/step_04a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/audio_soloud/step_04a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/audio_soloud/step_04a/ios/Podfile b/audio_soloud/step_04a/ios/Podfile index a836c8c671..11e1cb83ed 100644 --- a/audio_soloud/step_04a/ios/Podfile +++ b/audio_soloud/step_04a/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/audio_soloud/step_04a/ios/Runner.xcodeproj/project.pbxproj b/audio_soloud/step_04a/ios/Runner.xcodeproj/project.pbxproj index fac9082715..16518f4dd9 100644 --- a/audio_soloud/step_04a/ios/Runner.xcodeproj/project.pbxproj +++ b/audio_soloud/step_04a/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 747A1A21109B45392F081BC2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8337EA84BF804665DA448E15 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 8060B4C8A4071A8051685E44 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */; }; + 7E2EE3A2951A8BE26699963F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - A034088987B534A451EFB38E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,19 +42,20 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 09399623F661DE2EE41CB8EF /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1523C53D90CE6D43C8888D56 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5B9D9524E8CF2DBC4CDED108 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 773B59DE2A36228D644B1D4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8337EA84BF804665DA448E15 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 938480D239228B279363867F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -62,9 +63,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E8777681D17029A3F91A91A4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,28 +72,33 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A034088987B534A451EFB38E /* Pods_Runner.framework in Frameworks */, + 747A1A21109B45392F081BC2 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A19538DF89AE3BEE3D02BF34 /* Frameworks */ = { + B6DB4B3B8B5010DECE956EFF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8060B4C8A4071A8051685E44 /* Pods_RunnerTests.framework in Frameworks */, + 7E2EE3A2951A8BE26699963F /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 01F5BEB0970C970A8F0312D7 /* Frameworks */ = { + 087DC788C8C193F8B24485FA /* Pods */ = { isa = PBXGroup; children = ( - 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */, - D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */, + 938480D239228B279363867F /* Pods-Runner.debug.xcconfig */, + 09399623F661DE2EE41CB8EF /* Pods-Runner.release.xcconfig */, + E8777681D17029A3F91A91A4 /* Pods-Runner.profile.xcconfig */, + BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */, + 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */, + 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */, ); - name = Frameworks; + name = Pods; + path = Pods; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -104,6 +109,15 @@ path = RunnerTests; sourceTree = ""; }; + 823855D77A18EB5C79276C5D /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8337EA84BF804665DA448E15 /* Pods_Runner.framework */, + 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -122,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - C554A0098E4F2CDD762C76D1 /* Pods */, - 01F5BEB0970C970A8F0312D7 /* Frameworks */, + 087DC788C8C193F8B24485FA /* Pods */, + 823855D77A18EB5C79276C5D /* Frameworks */, ); sourceTree = ""; }; @@ -151,20 +165,6 @@ path = Runner; sourceTree = ""; }; - C554A0098E4F2CDD762C76D1 /* Pods */ = { - isa = PBXGroup; - children = ( - 5B9D9524E8CF2DBC4CDED108 /* Pods-Runner.debug.xcconfig */, - 1523C53D90CE6D43C8888D56 /* Pods-Runner.release.xcconfig */, - 773B59DE2A36228D644B1D4A /* Pods-Runner.profile.xcconfig */, - E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */, - BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */, - 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 67A9505F2A052479CF709E67 /* [CP] Check Pods Manifest.lock */, + EEC06284570A8E1E0C175E13 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - A19538DF89AE3BEE3D02BF34 /* Frameworks */, + B6DB4B3B8B5010DECE956EFF /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 424397666203ED2B8C8170B1 /* [CP] Check Pods Manifest.lock */, + F479FB5CBA3B4987D82D408A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 681DBF6A3167757588B117FF /* [CP] Embed Pods Frameworks */, + F0FC3564BF6E2A2AC047A8CF /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -286,29 +286,22 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 424397666203ED2B8C8170B1 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 67A9505F2A052479CF709E67 /* [CP] Check Pods Manifest.lock */ = { + EEC06284570A8E1E0C175E13 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -330,7 +323,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 681DBF6A3167757588B117FF /* [CP] Embed Pods Frameworks */ = { + F0FC3564BF6E2A2AC047A8CF /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -347,20 +340,27 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + F479FB5CBA3B4987D82D408A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/audio_soloud/step_04a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/audio_soloud/step_04a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/audio_soloud/step_04a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/audio_soloud/step_04a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/audio_soloud/step_04a/lib/main.dart b/audio_soloud/step_04a/lib/main.dart index c5b712c0ab..f5dd49989a 100644 --- a/audio_soloud/step_04a/lib/main.dart +++ b/audio_soloud/step_04a/lib/main.dart @@ -29,9 +29,7 @@ void main() async { final audioController = AudioController(); await audioController.initialize(); - runApp( - MyApp(audioController: audioController), - ); + runApp(MyApp(audioController: audioController)); } class MyApp extends StatelessWidget { diff --git a/audio_soloud/step_04a/macos/Podfile b/audio_soloud/step_04a/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/audio_soloud/step_04a/macos/Podfile +++ b/audio_soloud/step_04a/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/audio_soloud/step_04a/macos/Runner.xcodeproj/project.pbxproj b/audio_soloud/step_04a/macos/Runner.xcodeproj/project.pbxproj index a4e92d2523..93598f2c60 100644 --- a/audio_soloud/step_04a/macos/Runner.xcodeproj/project.pbxproj +++ b/audio_soloud/step_04a/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 28BA7DD876B091736AA592C0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */; }; + 311442AF0C61E450A50B190E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 566C9560CDCA3EC9A1670E3B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */; }; + 767D946585A6F8D095D0FD64 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 448F4A69AA210917BB78B289 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -78,16 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 448F4A69AA210917BB78B289 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 496ED413CF3C7282334FF1D3 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9044FE8CEF8C48D67B7B9FD4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - AD07C985A6A2E940086E4383 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - B882402F138E3E4FBBCDE9FD /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - D15E6BBD47D050D0C2B86309 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E4C7EDF44633F3BAD32EF14A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 566C9560CDCA3EC9A1670E3B /* Pods_RunnerTests.framework in Frameworks */, + 311442AF0C61E450A50B190E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28BA7DD876B091736AA592C0 /* Pods_Runner.framework in Frameworks */, + 767D946585A6F8D095D0FD64 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 643D227792280CD77DE5A03F /* Pods */, + 7870A8B81746845D606F9B9A /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 643D227792280CD77DE5A03F /* Pods */ = { + 7870A8B81746845D606F9B9A /* Pods */ = { isa = PBXGroup; children = ( - B882402F138E3E4FBBCDE9FD /* Pods-Runner.debug.xcconfig */, - D15E6BBD47D050D0C2B86309 /* Pods-Runner.release.xcconfig */, - AD07C985A6A2E940086E4383 /* Pods-Runner.profile.xcconfig */, - BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */, - F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */, - 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */, + 496ED413CF3C7282334FF1D3 /* Pods-Runner.debug.xcconfig */, + E4C7EDF44633F3BAD32EF14A /* Pods-Runner.release.xcconfig */, + 9044FE8CEF8C48D67B7B9FD4 /* Pods-Runner.profile.xcconfig */, + CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */, + 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */, + C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */, - E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */, + 448F4A69AA210917BB78B289 /* Pods_Runner.framework */, + 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C20BDC9ECC747861359A2FEF /* [CP] Check Pods Manifest.lock */, + 4F222F6356D31545AC90BF60 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B9815FFAB2648C447B43A498 /* [CP] Check Pods Manifest.lock */, + E9CFD0CD97DE3D6E12FBA841 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 307026101EF3E74AFC515029 /* [CP] Embed Pods Frameworks */, + CDBC90FE07734ACB2697BC69 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,23 +323,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 307026101EF3E74AFC515029 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -378,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - B9815FFAB2648C447B43A498 /* [CP] Check Pods Manifest.lock */ = { + 4F222F6356D31545AC90BF60 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +376,31 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C20BDC9ECC747861359A2FEF /* [CP] Check Pods Manifest.lock */ = { + CDBC90FE07734ACB2697BC69 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E9CFD0CD97DE3D6E12FBA841 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/audio_soloud/step_04a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/audio_soloud/step_04a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 29e755cf42..d0f7e9d1f4 100644 --- a/audio_soloud/step_04a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/audio_soloud/step_04a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/audio_soloud/step_04a/pubspec.yaml b/audio_soloud/step_04a/pubspec.yaml index b11d52d990..ae4a32a71c 100644 --- a/audio_soloud/step_04a/pubspec.yaml +++ b/audio_soloud/step_04a/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/audio_soloud/step_04b/android/.gitignore b/audio_soloud/step_04b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/audio_soloud/step_04b/android/.gitignore +++ b/audio_soloud/step_04b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/audio_soloud/step_04b/android/app/build.gradle b/audio_soloud/step_04b/android/app/build.gradle deleted file mode 100644 index 2c07f0d32f..0000000000 --- a/audio_soloud/step_04b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.audio_soloud" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.audio_soloud" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/audio_soloud/step_04b/android/app/build.gradle.kts b/audio_soloud/step_04b/android/app/build.gradle.kts new file mode 100644 index 0000000000..e72c8cc3c6 --- /dev/null +++ b/audio_soloud/step_04b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.audio_soloud" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.audio_soloud" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/audio_soloud/step_04b/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt b/audio_soloud/step_04b/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt index b859911758..97f37d1195 100644 --- a/audio_soloud/step_04b/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt +++ b/audio_soloud/step_04b/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.audio_soloud import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/audio_soloud/step_04b/android/build.gradle b/audio_soloud/step_04b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/audio_soloud/step_04b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/audio_soloud/step_04b/android/build.gradle.kts b/audio_soloud/step_04b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/audio_soloud/step_04b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/audio_soloud/step_04b/android/gradle.properties b/audio_soloud/step_04b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/audio_soloud/step_04b/android/gradle.properties +++ b/audio_soloud/step_04b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/audio_soloud/step_04b/android/gradle/wrapper/gradle-wrapper.properties b/audio_soloud/step_04b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/audio_soloud/step_04b/android/gradle/wrapper/gradle-wrapper.properties +++ b/audio_soloud/step_04b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/audio_soloud/step_04b/android/settings.gradle b/audio_soloud/step_04b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/audio_soloud/step_04b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/audio_soloud/step_04b/android/settings.gradle.kts b/audio_soloud/step_04b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/audio_soloud/step_04b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/audio_soloud/step_04b/ios/Podfile b/audio_soloud/step_04b/ios/Podfile index a836c8c671..11e1cb83ed 100644 --- a/audio_soloud/step_04b/ios/Podfile +++ b/audio_soloud/step_04b/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/audio_soloud/step_04b/ios/Runner.xcodeproj/project.pbxproj b/audio_soloud/step_04b/ios/Runner.xcodeproj/project.pbxproj index fac9082715..16518f4dd9 100644 --- a/audio_soloud/step_04b/ios/Runner.xcodeproj/project.pbxproj +++ b/audio_soloud/step_04b/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 747A1A21109B45392F081BC2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8337EA84BF804665DA448E15 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 8060B4C8A4071A8051685E44 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */; }; + 7E2EE3A2951A8BE26699963F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - A034088987B534A451EFB38E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,19 +42,20 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 09399623F661DE2EE41CB8EF /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1523C53D90CE6D43C8888D56 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5B9D9524E8CF2DBC4CDED108 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 773B59DE2A36228D644B1D4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8337EA84BF804665DA448E15 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 938480D239228B279363867F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -62,9 +63,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E8777681D17029A3F91A91A4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,28 +72,33 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A034088987B534A451EFB38E /* Pods_Runner.framework in Frameworks */, + 747A1A21109B45392F081BC2 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A19538DF89AE3BEE3D02BF34 /* Frameworks */ = { + B6DB4B3B8B5010DECE956EFF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8060B4C8A4071A8051685E44 /* Pods_RunnerTests.framework in Frameworks */, + 7E2EE3A2951A8BE26699963F /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 01F5BEB0970C970A8F0312D7 /* Frameworks */ = { + 087DC788C8C193F8B24485FA /* Pods */ = { isa = PBXGroup; children = ( - 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */, - D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */, + 938480D239228B279363867F /* Pods-Runner.debug.xcconfig */, + 09399623F661DE2EE41CB8EF /* Pods-Runner.release.xcconfig */, + E8777681D17029A3F91A91A4 /* Pods-Runner.profile.xcconfig */, + BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */, + 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */, + 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */, ); - name = Frameworks; + name = Pods; + path = Pods; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -104,6 +109,15 @@ path = RunnerTests; sourceTree = ""; }; + 823855D77A18EB5C79276C5D /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8337EA84BF804665DA448E15 /* Pods_Runner.framework */, + 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -122,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - C554A0098E4F2CDD762C76D1 /* Pods */, - 01F5BEB0970C970A8F0312D7 /* Frameworks */, + 087DC788C8C193F8B24485FA /* Pods */, + 823855D77A18EB5C79276C5D /* Frameworks */, ); sourceTree = ""; }; @@ -151,20 +165,6 @@ path = Runner; sourceTree = ""; }; - C554A0098E4F2CDD762C76D1 /* Pods */ = { - isa = PBXGroup; - children = ( - 5B9D9524E8CF2DBC4CDED108 /* Pods-Runner.debug.xcconfig */, - 1523C53D90CE6D43C8888D56 /* Pods-Runner.release.xcconfig */, - 773B59DE2A36228D644B1D4A /* Pods-Runner.profile.xcconfig */, - E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */, - BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */, - 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 67A9505F2A052479CF709E67 /* [CP] Check Pods Manifest.lock */, + EEC06284570A8E1E0C175E13 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - A19538DF89AE3BEE3D02BF34 /* Frameworks */, + B6DB4B3B8B5010DECE956EFF /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 424397666203ED2B8C8170B1 /* [CP] Check Pods Manifest.lock */, + F479FB5CBA3B4987D82D408A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 681DBF6A3167757588B117FF /* [CP] Embed Pods Frameworks */, + F0FC3564BF6E2A2AC047A8CF /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -286,29 +286,22 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 424397666203ED2B8C8170B1 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 67A9505F2A052479CF709E67 /* [CP] Check Pods Manifest.lock */ = { + EEC06284570A8E1E0C175E13 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -330,7 +323,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 681DBF6A3167757588B117FF /* [CP] Embed Pods Frameworks */ = { + F0FC3564BF6E2A2AC047A8CF /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -347,20 +340,27 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + F479FB5CBA3B4987D82D408A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/audio_soloud/step_04b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/audio_soloud/step_04b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/audio_soloud/step_04b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/audio_soloud/step_04b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/audio_soloud/step_04b/lib/main.dart b/audio_soloud/step_04b/lib/main.dart index c5b712c0ab..f5dd49989a 100644 --- a/audio_soloud/step_04b/lib/main.dart +++ b/audio_soloud/step_04b/lib/main.dart @@ -29,9 +29,7 @@ void main() async { final audioController = AudioController(); await audioController.initialize(); - runApp( - MyApp(audioController: audioController), - ); + runApp(MyApp(audioController: audioController)); } class MyApp extends StatelessWidget { diff --git a/audio_soloud/step_04b/macos/Podfile b/audio_soloud/step_04b/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/audio_soloud/step_04b/macos/Podfile +++ b/audio_soloud/step_04b/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/audio_soloud/step_04b/macos/Runner.xcodeproj/project.pbxproj b/audio_soloud/step_04b/macos/Runner.xcodeproj/project.pbxproj index a4e92d2523..93598f2c60 100644 --- a/audio_soloud/step_04b/macos/Runner.xcodeproj/project.pbxproj +++ b/audio_soloud/step_04b/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 28BA7DD876B091736AA592C0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */; }; + 311442AF0C61E450A50B190E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 566C9560CDCA3EC9A1670E3B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */; }; + 767D946585A6F8D095D0FD64 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 448F4A69AA210917BB78B289 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -78,16 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 448F4A69AA210917BB78B289 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 496ED413CF3C7282334FF1D3 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9044FE8CEF8C48D67B7B9FD4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - AD07C985A6A2E940086E4383 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - B882402F138E3E4FBBCDE9FD /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - D15E6BBD47D050D0C2B86309 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E4C7EDF44633F3BAD32EF14A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 566C9560CDCA3EC9A1670E3B /* Pods_RunnerTests.framework in Frameworks */, + 311442AF0C61E450A50B190E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28BA7DD876B091736AA592C0 /* Pods_Runner.framework in Frameworks */, + 767D946585A6F8D095D0FD64 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 643D227792280CD77DE5A03F /* Pods */, + 7870A8B81746845D606F9B9A /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 643D227792280CD77DE5A03F /* Pods */ = { + 7870A8B81746845D606F9B9A /* Pods */ = { isa = PBXGroup; children = ( - B882402F138E3E4FBBCDE9FD /* Pods-Runner.debug.xcconfig */, - D15E6BBD47D050D0C2B86309 /* Pods-Runner.release.xcconfig */, - AD07C985A6A2E940086E4383 /* Pods-Runner.profile.xcconfig */, - BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */, - F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */, - 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */, + 496ED413CF3C7282334FF1D3 /* Pods-Runner.debug.xcconfig */, + E4C7EDF44633F3BAD32EF14A /* Pods-Runner.release.xcconfig */, + 9044FE8CEF8C48D67B7B9FD4 /* Pods-Runner.profile.xcconfig */, + CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */, + 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */, + C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */, - E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */, + 448F4A69AA210917BB78B289 /* Pods_Runner.framework */, + 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C20BDC9ECC747861359A2FEF /* [CP] Check Pods Manifest.lock */, + 4F222F6356D31545AC90BF60 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B9815FFAB2648C447B43A498 /* [CP] Check Pods Manifest.lock */, + E9CFD0CD97DE3D6E12FBA841 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 307026101EF3E74AFC515029 /* [CP] Embed Pods Frameworks */, + CDBC90FE07734ACB2697BC69 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,23 +323,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 307026101EF3E74AFC515029 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -378,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - B9815FFAB2648C447B43A498 /* [CP] Check Pods Manifest.lock */ = { + 4F222F6356D31545AC90BF60 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +376,31 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C20BDC9ECC747861359A2FEF /* [CP] Check Pods Manifest.lock */ = { + CDBC90FE07734ACB2697BC69 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E9CFD0CD97DE3D6E12FBA841 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/audio_soloud/step_04b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/audio_soloud/step_04b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 29e755cf42..d0f7e9d1f4 100644 --- a/audio_soloud/step_04b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/audio_soloud/step_04b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/audio_soloud/step_04b/pubspec.yaml b/audio_soloud/step_04b/pubspec.yaml index b11d52d990..ae4a32a71c 100644 --- a/audio_soloud/step_04b/pubspec.yaml +++ b/audio_soloud/step_04b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/audio_soloud/step_05/android/.gitignore b/audio_soloud/step_05/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/audio_soloud/step_05/android/.gitignore +++ b/audio_soloud/step_05/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/audio_soloud/step_05/android/app/build.gradle b/audio_soloud/step_05/android/app/build.gradle deleted file mode 100644 index 2c07f0d32f..0000000000 --- a/audio_soloud/step_05/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.audio_soloud" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.audio_soloud" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/audio_soloud/step_05/android/app/build.gradle.kts b/audio_soloud/step_05/android/app/build.gradle.kts new file mode 100644 index 0000000000..e72c8cc3c6 --- /dev/null +++ b/audio_soloud/step_05/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.audio_soloud" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.audio_soloud" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/audio_soloud/step_05/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt b/audio_soloud/step_05/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt index b859911758..97f37d1195 100644 --- a/audio_soloud/step_05/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt +++ b/audio_soloud/step_05/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.audio_soloud import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/audio_soloud/step_05/android/build.gradle b/audio_soloud/step_05/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/audio_soloud/step_05/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/audio_soloud/step_05/android/build.gradle.kts b/audio_soloud/step_05/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/audio_soloud/step_05/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/audio_soloud/step_05/android/gradle.properties b/audio_soloud/step_05/android/gradle.properties index 2597170821..f018a61817 100644 --- a/audio_soloud/step_05/android/gradle.properties +++ b/audio_soloud/step_05/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/audio_soloud/step_05/android/gradle/wrapper/gradle-wrapper.properties b/audio_soloud/step_05/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/audio_soloud/step_05/android/gradle/wrapper/gradle-wrapper.properties +++ b/audio_soloud/step_05/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/audio_soloud/step_05/android/settings.gradle b/audio_soloud/step_05/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/audio_soloud/step_05/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/audio_soloud/step_05/android/settings.gradle.kts b/audio_soloud/step_05/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/audio_soloud/step_05/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/audio_soloud/step_05/ios/Podfile b/audio_soloud/step_05/ios/Podfile index a836c8c671..11e1cb83ed 100644 --- a/audio_soloud/step_05/ios/Podfile +++ b/audio_soloud/step_05/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/audio_soloud/step_05/ios/Runner.xcodeproj/project.pbxproj b/audio_soloud/step_05/ios/Runner.xcodeproj/project.pbxproj index fac9082715..16518f4dd9 100644 --- a/audio_soloud/step_05/ios/Runner.xcodeproj/project.pbxproj +++ b/audio_soloud/step_05/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 747A1A21109B45392F081BC2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8337EA84BF804665DA448E15 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 8060B4C8A4071A8051685E44 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */; }; + 7E2EE3A2951A8BE26699963F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - A034088987B534A451EFB38E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,19 +42,20 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 09399623F661DE2EE41CB8EF /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1523C53D90CE6D43C8888D56 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5B9D9524E8CF2DBC4CDED108 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 773B59DE2A36228D644B1D4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8337EA84BF804665DA448E15 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 938480D239228B279363867F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -62,9 +63,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E8777681D17029A3F91A91A4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,28 +72,33 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A034088987B534A451EFB38E /* Pods_Runner.framework in Frameworks */, + 747A1A21109B45392F081BC2 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A19538DF89AE3BEE3D02BF34 /* Frameworks */ = { + B6DB4B3B8B5010DECE956EFF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8060B4C8A4071A8051685E44 /* Pods_RunnerTests.framework in Frameworks */, + 7E2EE3A2951A8BE26699963F /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 01F5BEB0970C970A8F0312D7 /* Frameworks */ = { + 087DC788C8C193F8B24485FA /* Pods */ = { isa = PBXGroup; children = ( - 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */, - D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */, + 938480D239228B279363867F /* Pods-Runner.debug.xcconfig */, + 09399623F661DE2EE41CB8EF /* Pods-Runner.release.xcconfig */, + E8777681D17029A3F91A91A4 /* Pods-Runner.profile.xcconfig */, + BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */, + 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */, + 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */, ); - name = Frameworks; + name = Pods; + path = Pods; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -104,6 +109,15 @@ path = RunnerTests; sourceTree = ""; }; + 823855D77A18EB5C79276C5D /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8337EA84BF804665DA448E15 /* Pods_Runner.framework */, + 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -122,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - C554A0098E4F2CDD762C76D1 /* Pods */, - 01F5BEB0970C970A8F0312D7 /* Frameworks */, + 087DC788C8C193F8B24485FA /* Pods */, + 823855D77A18EB5C79276C5D /* Frameworks */, ); sourceTree = ""; }; @@ -151,20 +165,6 @@ path = Runner; sourceTree = ""; }; - C554A0098E4F2CDD762C76D1 /* Pods */ = { - isa = PBXGroup; - children = ( - 5B9D9524E8CF2DBC4CDED108 /* Pods-Runner.debug.xcconfig */, - 1523C53D90CE6D43C8888D56 /* Pods-Runner.release.xcconfig */, - 773B59DE2A36228D644B1D4A /* Pods-Runner.profile.xcconfig */, - E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */, - BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */, - 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 67A9505F2A052479CF709E67 /* [CP] Check Pods Manifest.lock */, + EEC06284570A8E1E0C175E13 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - A19538DF89AE3BEE3D02BF34 /* Frameworks */, + B6DB4B3B8B5010DECE956EFF /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 424397666203ED2B8C8170B1 /* [CP] Check Pods Manifest.lock */, + F479FB5CBA3B4987D82D408A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 681DBF6A3167757588B117FF /* [CP] Embed Pods Frameworks */, + F0FC3564BF6E2A2AC047A8CF /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -286,29 +286,22 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 424397666203ED2B8C8170B1 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 67A9505F2A052479CF709E67 /* [CP] Check Pods Manifest.lock */ = { + EEC06284570A8E1E0C175E13 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -330,7 +323,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 681DBF6A3167757588B117FF /* [CP] Embed Pods Frameworks */ = { + F0FC3564BF6E2A2AC047A8CF /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -347,20 +340,27 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + F479FB5CBA3B4987D82D408A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/audio_soloud/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/audio_soloud/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/audio_soloud/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/audio_soloud/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/audio_soloud/step_05/lib/audio/audio_controller.dart b/audio_soloud/step_05/lib/audio/audio_controller.dart index a9da421edf..4f77785385 100644 --- a/audio_soloud/step_05/lib/audio/audio_controller.dart +++ b/audio_soloud/step_05/lib/audio/audio_controller.dart @@ -36,8 +36,10 @@ class AudioController { } } _log.info('Loading music'); - final musicSource = await _soloud! - .loadAsset('assets/music/looped-song.ogg', mode: LoadMode.disk); + final musicSource = await _soloud!.loadAsset( + 'assets/music/looped-song.ogg', + mode: LoadMode.disk, + ); musicSource.allInstancesFinished.first.then((_) { _soloud!.disposeSource(musicSource); _log.info('Music source disposed'); diff --git a/audio_soloud/step_05/lib/main.dart b/audio_soloud/step_05/lib/main.dart index c5b712c0ab..f5dd49989a 100644 --- a/audio_soloud/step_05/lib/main.dart +++ b/audio_soloud/step_05/lib/main.dart @@ -29,9 +29,7 @@ void main() async { final audioController = AudioController(); await audioController.initialize(); - runApp( - MyApp(audioController: audioController), - ); + runApp(MyApp(audioController: audioController)); } class MyApp extends StatelessWidget { diff --git a/audio_soloud/step_05/macos/Podfile b/audio_soloud/step_05/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/audio_soloud/step_05/macos/Podfile +++ b/audio_soloud/step_05/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/audio_soloud/step_05/macos/Runner.xcodeproj/project.pbxproj b/audio_soloud/step_05/macos/Runner.xcodeproj/project.pbxproj index a4e92d2523..93598f2c60 100644 --- a/audio_soloud/step_05/macos/Runner.xcodeproj/project.pbxproj +++ b/audio_soloud/step_05/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 28BA7DD876B091736AA592C0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */; }; + 311442AF0C61E450A50B190E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 566C9560CDCA3EC9A1670E3B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */; }; + 767D946585A6F8D095D0FD64 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 448F4A69AA210917BB78B289 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -78,16 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 448F4A69AA210917BB78B289 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 496ED413CF3C7282334FF1D3 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9044FE8CEF8C48D67B7B9FD4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - AD07C985A6A2E940086E4383 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - B882402F138E3E4FBBCDE9FD /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - D15E6BBD47D050D0C2B86309 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E4C7EDF44633F3BAD32EF14A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 566C9560CDCA3EC9A1670E3B /* Pods_RunnerTests.framework in Frameworks */, + 311442AF0C61E450A50B190E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28BA7DD876B091736AA592C0 /* Pods_Runner.framework in Frameworks */, + 767D946585A6F8D095D0FD64 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 643D227792280CD77DE5A03F /* Pods */, + 7870A8B81746845D606F9B9A /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 643D227792280CD77DE5A03F /* Pods */ = { + 7870A8B81746845D606F9B9A /* Pods */ = { isa = PBXGroup; children = ( - B882402F138E3E4FBBCDE9FD /* Pods-Runner.debug.xcconfig */, - D15E6BBD47D050D0C2B86309 /* Pods-Runner.release.xcconfig */, - AD07C985A6A2E940086E4383 /* Pods-Runner.profile.xcconfig */, - BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */, - F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */, - 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */, + 496ED413CF3C7282334FF1D3 /* Pods-Runner.debug.xcconfig */, + E4C7EDF44633F3BAD32EF14A /* Pods-Runner.release.xcconfig */, + 9044FE8CEF8C48D67B7B9FD4 /* Pods-Runner.profile.xcconfig */, + CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */, + 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */, + C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */, - E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */, + 448F4A69AA210917BB78B289 /* Pods_Runner.framework */, + 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C20BDC9ECC747861359A2FEF /* [CP] Check Pods Manifest.lock */, + 4F222F6356D31545AC90BF60 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B9815FFAB2648C447B43A498 /* [CP] Check Pods Manifest.lock */, + E9CFD0CD97DE3D6E12FBA841 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 307026101EF3E74AFC515029 /* [CP] Embed Pods Frameworks */, + CDBC90FE07734ACB2697BC69 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,23 +323,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 307026101EF3E74AFC515029 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -378,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - B9815FFAB2648C447B43A498 /* [CP] Check Pods Manifest.lock */ = { + 4F222F6356D31545AC90BF60 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +376,31 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C20BDC9ECC747861359A2FEF /* [CP] Check Pods Manifest.lock */ = { + CDBC90FE07734ACB2697BC69 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E9CFD0CD97DE3D6E12FBA841 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/audio_soloud/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/audio_soloud/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 29e755cf42..d0f7e9d1f4 100644 --- a/audio_soloud/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/audio_soloud/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/audio_soloud/step_05/pubspec.yaml b/audio_soloud/step_05/pubspec.yaml index b11d52d990..ae4a32a71c 100644 --- a/audio_soloud/step_05/pubspec.yaml +++ b/audio_soloud/step_05/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/audio_soloud/step_06/android/.gitignore b/audio_soloud/step_06/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/audio_soloud/step_06/android/.gitignore +++ b/audio_soloud/step_06/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/audio_soloud/step_06/android/app/build.gradle b/audio_soloud/step_06/android/app/build.gradle deleted file mode 100644 index 2c07f0d32f..0000000000 --- a/audio_soloud/step_06/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.audio_soloud" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.audio_soloud" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/audio_soloud/step_06/android/app/build.gradle.kts b/audio_soloud/step_06/android/app/build.gradle.kts new file mode 100644 index 0000000000..e72c8cc3c6 --- /dev/null +++ b/audio_soloud/step_06/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.audio_soloud" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.audio_soloud" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/audio_soloud/step_06/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt b/audio_soloud/step_06/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt index b859911758..97f37d1195 100644 --- a/audio_soloud/step_06/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt +++ b/audio_soloud/step_06/android/app/src/main/kotlin/com/example/audio_soloud/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.audio_soloud import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/audio_soloud/step_06/android/build.gradle b/audio_soloud/step_06/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/audio_soloud/step_06/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/audio_soloud/step_06/android/build.gradle.kts b/audio_soloud/step_06/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/audio_soloud/step_06/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/audio_soloud/step_06/android/gradle.properties b/audio_soloud/step_06/android/gradle.properties index 2597170821..f018a61817 100644 --- a/audio_soloud/step_06/android/gradle.properties +++ b/audio_soloud/step_06/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/audio_soloud/step_06/android/gradle/wrapper/gradle-wrapper.properties b/audio_soloud/step_06/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/audio_soloud/step_06/android/gradle/wrapper/gradle-wrapper.properties +++ b/audio_soloud/step_06/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/audio_soloud/step_06/android/settings.gradle b/audio_soloud/step_06/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/audio_soloud/step_06/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/audio_soloud/step_06/android/settings.gradle.kts b/audio_soloud/step_06/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/audio_soloud/step_06/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/audio_soloud/step_06/ios/Podfile b/audio_soloud/step_06/ios/Podfile index a836c8c671..11e1cb83ed 100644 --- a/audio_soloud/step_06/ios/Podfile +++ b/audio_soloud/step_06/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/audio_soloud/step_06/ios/Runner.xcodeproj/project.pbxproj b/audio_soloud/step_06/ios/Runner.xcodeproj/project.pbxproj index fac9082715..16518f4dd9 100644 --- a/audio_soloud/step_06/ios/Runner.xcodeproj/project.pbxproj +++ b/audio_soloud/step_06/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 747A1A21109B45392F081BC2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8337EA84BF804665DA448E15 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 8060B4C8A4071A8051685E44 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */; }; + 7E2EE3A2951A8BE26699963F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - A034088987B534A451EFB38E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,19 +42,20 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 09399623F661DE2EE41CB8EF /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1523C53D90CE6D43C8888D56 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5B9D9524E8CF2DBC4CDED108 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 773B59DE2A36228D644B1D4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8337EA84BF804665DA448E15 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 938480D239228B279363867F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -62,9 +63,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E8777681D17029A3F91A91A4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,28 +72,33 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A034088987B534A451EFB38E /* Pods_Runner.framework in Frameworks */, + 747A1A21109B45392F081BC2 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A19538DF89AE3BEE3D02BF34 /* Frameworks */ = { + B6DB4B3B8B5010DECE956EFF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8060B4C8A4071A8051685E44 /* Pods_RunnerTests.framework in Frameworks */, + 7E2EE3A2951A8BE26699963F /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 01F5BEB0970C970A8F0312D7 /* Frameworks */ = { + 087DC788C8C193F8B24485FA /* Pods */ = { isa = PBXGroup; children = ( - 619A42A38F4B9085CCCA145F /* Pods_Runner.framework */, - D43DFD33800C4786BD55090A /* Pods_RunnerTests.framework */, + 938480D239228B279363867F /* Pods-Runner.debug.xcconfig */, + 09399623F661DE2EE41CB8EF /* Pods-Runner.release.xcconfig */, + E8777681D17029A3F91A91A4 /* Pods-Runner.profile.xcconfig */, + BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */, + 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */, + 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */, ); - name = Frameworks; + name = Pods; + path = Pods; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -104,6 +109,15 @@ path = RunnerTests; sourceTree = ""; }; + 823855D77A18EB5C79276C5D /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8337EA84BF804665DA448E15 /* Pods_Runner.framework */, + 8ADD91890A645E5DFA6DE366 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -122,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - C554A0098E4F2CDD762C76D1 /* Pods */, - 01F5BEB0970C970A8F0312D7 /* Frameworks */, + 087DC788C8C193F8B24485FA /* Pods */, + 823855D77A18EB5C79276C5D /* Frameworks */, ); sourceTree = ""; }; @@ -151,20 +165,6 @@ path = Runner; sourceTree = ""; }; - C554A0098E4F2CDD762C76D1 /* Pods */ = { - isa = PBXGroup; - children = ( - 5B9D9524E8CF2DBC4CDED108 /* Pods-Runner.debug.xcconfig */, - 1523C53D90CE6D43C8888D56 /* Pods-Runner.release.xcconfig */, - 773B59DE2A36228D644B1D4A /* Pods-Runner.profile.xcconfig */, - E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */, - BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */, - 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 67A9505F2A052479CF709E67 /* [CP] Check Pods Manifest.lock */, + EEC06284570A8E1E0C175E13 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - A19538DF89AE3BEE3D02BF34 /* Frameworks */, + B6DB4B3B8B5010DECE956EFF /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 424397666203ED2B8C8170B1 /* [CP] Check Pods Manifest.lock */, + F479FB5CBA3B4987D82D408A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 681DBF6A3167757588B117FF /* [CP] Embed Pods Frameworks */, + F0FC3564BF6E2A2AC047A8CF /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -286,29 +286,22 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 424397666203ED2B8C8170B1 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 67A9505F2A052479CF709E67 /* [CP] Check Pods Manifest.lock */ = { + EEC06284570A8E1E0C175E13 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -330,7 +323,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 681DBF6A3167757588B117FF /* [CP] Embed Pods Frameworks */ = { + F0FC3564BF6E2A2AC047A8CF /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -347,20 +340,27 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + F479FB5CBA3B4987D82D408A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E7C2D1AC79465DF8D1A46D55 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = BA0FC922A834BEC75EBDD5B0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BCBB0B12DBBDBE4988FE7313 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 3E22CA5ECCA8EC2D6ECFCB9E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5FEF8C40EA3B4C4CD1DAB017 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 8938E68C4415DD60971D92E3 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/audio_soloud/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/audio_soloud/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/audio_soloud/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/audio_soloud/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/audio_soloud/step_06/lib/audio/audio_controller.dart b/audio_soloud/step_06/lib/audio/audio_controller.dart index f7a58a88cd..4012102ddb 100644 --- a/audio_soloud/step_06/lib/audio/audio_controller.dart +++ b/audio_soloud/step_06/lib/audio/audio_controller.dart @@ -36,8 +36,10 @@ class AudioController { } } _log.info('Loading music'); - final musicSource = await _soloud! - .loadAsset('assets/music/looped-song.ogg', mode: LoadMode.disk); + final musicSource = await _soloud!.loadAsset( + 'assets/music/looped-song.ogg', + mode: LoadMode.disk, + ); musicSource.allInstancesFinished.first.then((_) { _soloud!.disposeSource(musicSource); _log.info('Music source disposed'); diff --git a/audio_soloud/step_06/lib/main.dart b/audio_soloud/step_06/lib/main.dart index c5b712c0ab..f5dd49989a 100644 --- a/audio_soloud/step_06/lib/main.dart +++ b/audio_soloud/step_06/lib/main.dart @@ -29,9 +29,7 @@ void main() async { final audioController = AudioController(); await audioController.initialize(); - runApp( - MyApp(audioController: audioController), - ); + runApp(MyApp(audioController: audioController)); } class MyApp extends StatelessWidget { diff --git a/audio_soloud/step_06/macos/Podfile b/audio_soloud/step_06/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/audio_soloud/step_06/macos/Podfile +++ b/audio_soloud/step_06/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/audio_soloud/step_06/macos/Runner.xcodeproj/project.pbxproj b/audio_soloud/step_06/macos/Runner.xcodeproj/project.pbxproj index a4e92d2523..93598f2c60 100644 --- a/audio_soloud/step_06/macos/Runner.xcodeproj/project.pbxproj +++ b/audio_soloud/step_06/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 28BA7DD876B091736AA592C0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */; }; + 311442AF0C61E450A50B190E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 566C9560CDCA3EC9A1670E3B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */; }; + 767D946585A6F8D095D0FD64 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 448F4A69AA210917BB78B289 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -78,16 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 448F4A69AA210917BB78B289 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 496ED413CF3C7282334FF1D3 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9044FE8CEF8C48D67B7B9FD4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - AD07C985A6A2E940086E4383 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - B882402F138E3E4FBBCDE9FD /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - D15E6BBD47D050D0C2B86309 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + E4C7EDF44633F3BAD32EF14A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 566C9560CDCA3EC9A1670E3B /* Pods_RunnerTests.framework in Frameworks */, + 311442AF0C61E450A50B190E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 28BA7DD876B091736AA592C0 /* Pods_Runner.framework in Frameworks */, + 767D946585A6F8D095D0FD64 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 643D227792280CD77DE5A03F /* Pods */, + 7870A8B81746845D606F9B9A /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 643D227792280CD77DE5A03F /* Pods */ = { + 7870A8B81746845D606F9B9A /* Pods */ = { isa = PBXGroup; children = ( - B882402F138E3E4FBBCDE9FD /* Pods-Runner.debug.xcconfig */, - D15E6BBD47D050D0C2B86309 /* Pods-Runner.release.xcconfig */, - AD07C985A6A2E940086E4383 /* Pods-Runner.profile.xcconfig */, - BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */, - F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */, - 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */, + 496ED413CF3C7282334FF1D3 /* Pods-Runner.debug.xcconfig */, + E4C7EDF44633F3BAD32EF14A /* Pods-Runner.release.xcconfig */, + 9044FE8CEF8C48D67B7B9FD4 /* Pods-Runner.profile.xcconfig */, + CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */, + 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */, + C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - D9BD20EB3630A719EAE521E8 /* Pods_Runner.framework */, - E3C9A8A2CDFF7E7015CFB71D /* Pods_RunnerTests.framework */, + 448F4A69AA210917BB78B289 /* Pods_Runner.framework */, + 960D4D39D53EED121C5CB875 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C20BDC9ECC747861359A2FEF /* [CP] Check Pods Manifest.lock */, + 4F222F6356D31545AC90BF60 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B9815FFAB2648C447B43A498 /* [CP] Check Pods Manifest.lock */, + E9CFD0CD97DE3D6E12FBA841 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 307026101EF3E74AFC515029 /* [CP] Embed Pods Frameworks */, + CDBC90FE07734ACB2697BC69 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,23 +323,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 307026101EF3E74AFC515029 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -378,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - B9815FFAB2648C447B43A498 /* [CP] Check Pods Manifest.lock */ = { + 4F222F6356D31545AC90BF60 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +376,31 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C20BDC9ECC747861359A2FEF /* [CP] Check Pods Manifest.lock */ = { + CDBC90FE07734ACB2697BC69 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E9CFD0CD97DE3D6E12FBA841 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BB1C5EC6D156FD3070A4A60B /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = CCE690FEEED5ACB3D8032A9E /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F77189A4C3273DBF615DABCA /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 31EFA18AAB15D9C7A3030396 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 76AAC89AA09B2F139DA96034 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = C7A0F0BBCAC89599031067A8 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/audio_soloud/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/audio_soloud/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 29e755cf42..d0f7e9d1f4 100644 --- a/audio_soloud/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/audio_soloud/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/audio_soloud/step_06/pubspec.yaml b/audio_soloud/step_06/pubspec.yaml index b11d52d990..ae4a32a71c 100644 --- a/audio_soloud/step_06/pubspec.yaml +++ b/audio_soloud/step_06/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/boring_to_beautiful/codelab_rebuild.yaml b/boring_to_beautiful/codelab_rebuild.yaml index ee6d38e06d..9174f93960 100644 --- a/boring_to_beautiful/codelab_rebuild.yaml +++ b/boring_to_beautiful/codelab_rebuild.yaml @@ -42,7 +42,7 @@ steps: version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -103,25 +103,25 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:desktop_window/desktop_window.dart'; import 'package:flutter/material.dart'; import 'package:universal_platform/universal_platform.dart'; - + import 'src/shared/app.dart'; - + Future setDesktopWindow() async { await DesktopWindow.setMinWindowSize(const Size(400, 400)); await DesktopWindow.setWindowSize(const Size(1300, 900)); } - + void main() { WidgetsFlutterBinding.ensureInitialized(); - + if (UniversalPlatform.isDesktop) { setDesktopWindow(); } - + runApp(const MyApp()); } - name: mkdir lib/src/features/home/view @@ -159,48 +159,46 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; - + import '../../../shared/classes/classes.dart'; import '../../../shared/extensions.dart'; - + class HomeArtists extends StatelessWidget { const HomeArtists({ super.key, required this.artists, required this.constraints, }); - + final List artists; final BoxConstraints constraints; - + @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(15), - child: constraints.isMobile - ? Column( - children: [ - for (final artist in artists) buildTile(context, artist), - ], - ) - : Row(children: [ - for (final artist in artists) - Flexible( - flex: 1, - child: buildTile(context, artist), - ), - ]), + child: + constraints.isMobile + ? Column( + children: [ + for (final artist in artists) buildTile(context, artist), + ], + ) + : Row( + children: [ + for (final artist in artists) + Flexible(flex: 1, child: buildTile(context, artist)), + ], + ), ); } - + Widget buildTile(BuildContext context, Artist artist) { return ListTile( - leading: CircleAvatar( - backgroundImage: AssetImage(artist.image.image), - ), + leading: CircleAvatar(backgroundImage: AssetImage(artist.image.image)), title: Text( artist.updates.first, maxLines: 2, @@ -221,15 +219,15 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; - + import '../../../shared/views/views.dart'; - + class HomeHighlight extends StatelessWidget { const HomeHighlight({super.key}); - + @override Widget build(BuildContext context) { return Row( @@ -262,23 +260,26 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; - + import '../../../shared/classes/playlist.dart'; import '../../../shared/extensions.dart'; import '../../../shared/views/clickable.dart'; import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/outlined_card.dart'; - + class HomeRecent extends StatelessWidget { - const HomeRecent( - {super.key, required this.playlists, this.axis = Axis.horizontal}); - + const HomeRecent({ + super.key, + required this.playlists, + this.axis = Axis.horizontal, + }); + final List playlists; final Axis axis; - + @override Widget build(BuildContext context) { if (axis == Axis.horizontal) { @@ -304,8 +305,10 @@ steps: Row( children: [ Expanded( - child: Image.asset(playlist.cover.image, - fit: BoxFit.cover), + child: Image.asset( + playlist.cover.image, + fit: BoxFit.cover, + ), ), ], ), @@ -340,10 +343,7 @@ steps: crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ - ClippedImage( - playlist.cover.image, - height: 200, - ), + ClippedImage(playlist.cover.image, height: 200), Expanded( child: Center( child: Padding( @@ -360,28 +360,29 @@ steps: }, ); } - + Widget buildDetails(BuildContext context, Playlist playlist) { return Column( children: [ Padding( - padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), - child: Text( - playlist.title, - style: context.titleSmall!.copyWith( - fontWeight: FontWeight.bold, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - textAlign: TextAlign.center, - )), + padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), + child: Text( + playlist.title, + style: context.titleSmall!.copyWith(fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, + textAlign: TextAlign.center, + ), + ), Padding( padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text(playlist.description, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center), + child: Text( + playlist.description, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), ), ], ); @@ -404,24 +405,24 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:adaptive_components/adaptive_components.dart'; import 'package:flutter/material.dart'; - + import '../../../shared/classes/classes.dart'; import '../../../shared/extensions.dart'; import '../../../shared/providers/providers.dart'; import '../../../shared/views/views.dart'; import '../../playlists/view/playlist_songs.dart'; import 'view.dart'; - + class HomeScreen extends StatefulWidget { const HomeScreen({super.key}); - + @override State createState() => _HomeScreenState(); } - + class _HomeScreenState extends State { @override Widget build(BuildContext context) { @@ -434,7 +435,7 @@ steps: return LayoutBuilder( builder: (context, constraints) { // Add conditional mobile layout - + return Scaffold( body: SingleChildScrollView( child: AdaptiveColumn( @@ -464,10 +465,11 @@ steps: children: [ const HomeHighlight(), LayoutBuilder( - builder: (context, constraints) => HomeArtists( - artists: artists, - constraints: constraints, - ), + builder: + (context, constraints) => HomeArtists( + artists: artists, + constraints: constraints, + ), ), ], ), @@ -484,9 +486,7 @@ steps: style: context.headlineSmall, ), ), - HomeRecent( - playlists: playlists, - ), + HomeRecent(playlists: playlists), ], ), ), @@ -504,19 +504,20 @@ steps: crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.all(2), // Modify this line + padding: const EdgeInsets.all( + 2, + ), // Modify this line child: Text( 'Top Songs Today', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), ), ], ), @@ -529,19 +530,20 @@ steps: crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.all(2), // Modify this line + padding: const EdgeInsets.all( + 2, + ), // Modify this line child: Text( 'New Releases', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: newReleases, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), ), ], ), @@ -572,23 +574,26 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - + import '../../../shared/classes/classes.dart'; import '../../../shared/extensions.dart'; import '../../../shared/playback/bloc/bloc.dart'; import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/views.dart'; - + class PlaylistSongs extends StatelessWidget { - const PlaylistSongs( - {super.key, required this.playlist, required this.constraints}); - + const PlaylistSongs({ + super.key, + required this.playlist, + required this.constraints, + }); + final Playlist playlist; final BoxConstraints constraints; - + @override Widget build(BuildContext context) { return AdaptiveTable( @@ -596,14 +601,9 @@ steps: breakpoint: 450, columns: const [ DataColumn( - label: Padding( - padding: EdgeInsets.only(left: 20), - child: Text('#'), - ), - ), - DataColumn( - label: Text('Title'), + label: Padding(padding: EdgeInsets.only(left: 20), child: Text('#')), ), + DataColumn(label: Text('Title')), DataColumn( label: Padding( padding: EdgeInsets.only(right: 10), @@ -611,38 +611,40 @@ steps: ), ), ], - rowBuilder: (context, index) => DataRow.byIndex( - index: index, - cells: [ - DataCell( - // Add HoverableSongPlayButton - Center( - child: Text( - (index + 1).toString(), - textAlign: TextAlign.center, + rowBuilder: + (context, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + // Add HoverableSongPlayButton + Center( + child: Text( + (index + 1).toString(), + textAlign: TextAlign.center, + ), + ), ), - ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(playlist.songs[index].image.image), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(playlist.songs[index].image.image), + ), + const SizedBox(width: 10), + Expanded(child: Text(playlist.songs[index].title)), + ], + ), ), - const SizedBox(width: 10), - Expanded(child: Text(playlist.songs[index].title)), - ]), - ), - DataCell( - Text(playlist.songs[index].length.toHumanizedString()), + DataCell(Text(playlist.songs[index].length.toHumanizedString())), + ], ), - ], - ), itemBuilder: (song, index) { return ListTile( - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), leading: ClippedImage(song.image.image), title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), @@ -666,17 +668,17 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; - + import '../../../shared/classes/classes.dart'; import '../../../shared/providers/providers.dart'; import '../../../shared/views/views.dart'; - + class PlaylistHomeScreen extends StatelessWidget { const PlaylistHomeScreen({super.key}); - + @override Widget build(BuildContext context) { PlaylistsProvider playlistProvider = PlaylistsProvider(); @@ -709,8 +711,10 @@ steps: title: playlist.title, subtitle: playlist.description, ), - onTap: () => - GoRouter.of(context).go('/playlists/${playlist.id}'), + onTap: + () => GoRouter.of( + context, + ).go('/playlists/${playlist.id}'), ); }, ), @@ -728,134 +732,136 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:math'; - + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; - + import '../../../shared/classes/classes.dart'; import '../../../shared/extensions.dart'; import '../../../shared/views/adaptive_image_card.dart'; import '../../../shared/views/views.dart'; import 'playlist_songs.dart'; - + class PlaylistScreen extends StatelessWidget { const PlaylistScreen({required this.playlist, super.key}); - + final Playlist playlist; - + @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - final colors = Theme.of(context).colorScheme; - final double headerHeight = constraints.isMobile - ? max(constraints.biggest.height * 0.5, 450) - : max(constraints.biggest.height * 0.25, 250); - if (constraints.isMobile) { - return Scaffold( - appBar: AppBar( - leading: BackButton( - onPressed: () => GoRouter.of(context).go('/playlists'), - ), - title: Text(playlist.title), - actions: [ - IconButton( - icon: const Icon(Icons.play_circle_fill), - onPressed: () {}, - ), - IconButton( - onPressed: () {}, - icon: const Icon(Icons.shuffle), - ), - ], - ), - body: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, - ), - ), - ); - } - return Scaffold( - body: CustomScrollView( - slivers: [ - SliverAppBar( + return LayoutBuilder( + builder: (context, constraints) { + final colors = Theme.of(context).colorScheme; + final double headerHeight = + constraints.isMobile + ? max(constraints.biggest.height * 0.5, 450) + : max(constraints.biggest.height * 0.25, 250); + if (constraints.isMobile) { + return Scaffold( + appBar: AppBar( leading: BackButton( onPressed: () => GoRouter.of(context).go('/playlists'), ), - expandedHeight: headerHeight, - pinned: false, - flexibleSpace: FlexibleSpaceBar( - background: AdaptiveImageCard( - axis: constraints.isMobile ? Axis.vertical : Axis.horizontal, - constraints: - constraints.copyWith(maxHeight: headerHeight).normalize(), - image: playlist.cover.image, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'PLAYLIST', - style: context.titleSmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.title, - style: context.displaySmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.description, - style: context.bodyLarge!.copyWith( - color: colors.onSurface.withAlpha(204), + title: Text(playlist.title), + actions: [ + IconButton( + icon: const Icon(Icons.play_circle_fill), + onPressed: () {}, + ), + IconButton(onPressed: () {}, icon: const Icon(Icons.shuffle)), + ], + ), + body: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), + ), + ); + } + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + leading: BackButton( + onPressed: () => GoRouter.of(context).go('/playlists'), + ), + expandedHeight: headerHeight, + pinned: false, + flexibleSpace: FlexibleSpaceBar( + background: AdaptiveImageCard( + axis: + constraints.isMobile ? Axis.vertical : Axis.horizontal, + constraints: + constraints + .copyWith(maxHeight: headerHeight) + .normalize(), + image: playlist.cover.image, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'PLAYLIST', + style: context.titleSmall!.copyWith( + color: colors.onSurface, + ), ), - ), - const SizedBox(height: 8), - Row( - children: [ - IconButton( - icon: Icon( - Icons.play_circle_fill, - color: colors.tertiary, - ), - onPressed: () {}, + Text( + playlist.title, + style: context.displaySmall!.copyWith( + color: colors.onSurface, ), - TextButton.icon( - onPressed: () {}, - icon: Icon( - Icons.shuffle, - color: colors.tertiary, - ), - label: Text( - 'Shuffle', - style: context.bodySmall!.copyWith( + ), + Text( + playlist.description, + style: context.bodyLarge!.copyWith( + color: colors.onSurface.withAlpha(204), + ), + ), + const SizedBox(height: 8), + Row( + children: [ + IconButton( + icon: Icon( + Icons.play_circle_fill, color: colors.tertiary, ), + onPressed: () {}, ), - ), - ], - ), - ], + TextButton.icon( + onPressed: () {}, + icon: Icon(Icons.shuffle, color: colors.tertiary), + label: Text( + 'Shuffle', + style: context.bodySmall!.copyWith( + color: colors.tertiary, + ), + ), + ), + ], + ), + ], + ), ), ), ), - ), - SliverToBoxAdapter( - child: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, + SliverToBoxAdapter( + child: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), ), ), - ), - ], - ), - ); - }); + ], + ), + ); + }, + ); } } - name: Add lib/src/features/artists/artists.dart @@ -888,34 +894,34 @@ steps: Widget build(BuildContext context) { final artistsProvider = ArtistsProvider(); final artists = artistsProvider.artists; - return LayoutBuilder(builder: (context, constraints) { - return Scaffold( - primary: false, - appBar: AppBar( - title: const Text('ARTISTS'), - toolbarHeight: kToolbarHeight * 2, - ), - body: GridView.builder( - padding: const EdgeInsets.all(15), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), - childAspectRatio: 2.5, - mainAxisSpacing: 10, - crossAxisSpacing: 10, + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + primary: false, + appBar: AppBar( + title: const Text('ARTISTS'), + toolbarHeight: kToolbarHeight * 2, ), - itemCount: artists.length, - itemBuilder: (context, index) { - final artist = artists[index]; - return GestureDetector( - child: ArtistCard( - artist: artist, - ), - onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), - ); - }, - ), - ); - }); + body: GridView.builder( + padding: const EdgeInsets.all(15), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), + childAspectRatio: 2.5, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + ), + itemCount: artists.length, + itemBuilder: (context, index) { + final artist = artists[index]; + return GestureDetector( + child: ArtistCard(artist: artist), + onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), + ); + }, + ), + ); + }, + ); } } - name: Add lib/src/features/artists/view/artist_card.dart @@ -924,88 +930,86 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:math'; - + import 'package:flutter/material.dart'; import '../../../shared/classes/classes.dart'; import '../../../shared/extensions.dart'; import '../../../shared/views/outlined_card.dart'; import '../../../shared/views/views.dart'; - + class ArtistCard extends StatelessWidget { - const ArtistCard({ - super.key, - required this.artist, - }); - + const ArtistCard({super.key, required this.artist}); + final Artist artist; - + @override Widget build(BuildContext context) { Song nowPlaying = artist.songs[Random().nextInt(artist.songs.length)]; - + return OutlinedCard( child: LayoutBuilder( - builder: (context, dimens) => Row( - children: [ - SizedBox( - width: dimens.maxWidth * 0.4, - child: Image.asset( - artist.image.image, - fit: BoxFit.cover, - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - artist.name, - style: context.titleMedium, - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - const SizedBox(height: 10), - Text( - artist.bio, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 3, - ), - ]), - ), - if (dimens.maxHeight > 100) - Row( - children: [ - HoverableSongPlayButton( - size: const Size(50, 50), - song: nowPlaying, - child: Icon(Icons.play_circle, - color: context.colors.tertiary), + builder: + (context, dimens) => Row( + children: [ + SizedBox( + width: dimens.maxWidth * 0.4, + child: Image.asset(artist.image.image, fit: BoxFit.cover), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + artist.name, + style: context.titleMedium, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + const SizedBox(height: 10), + Text( + artist.bio, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 3, + ), + ], ), - Text( - nowPlaying.title, - maxLines: 1, - overflow: TextOverflow.clip, - style: context.labelMedium, + ), + if (dimens.maxHeight > 100) + Row( + children: [ + HoverableSongPlayButton( + size: const Size(50, 50), + song: nowPlaying, + child: Icon( + Icons.play_circle, + color: context.colors.tertiary, + ), + ), + Text( + nowPlaying.title, + maxLines: 1, + overflow: TextOverflow.clip, + style: context.labelMedium, + ), + ], ), - ], - ), - ], + ], + ), + ), ), - ), + ], ), - ], - ), ), ); } @@ -1016,18 +1020,18 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; - + import '../../../shared/classes/classes.dart'; import '../../../shared/views/views.dart'; - + class ArtistNews extends StatelessWidget { const ArtistNews({super.key, required this.artist}); - + final Artist artist; - + @override Widget build(BuildContext context) { return Column( @@ -1073,21 +1077,21 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - + import '../../../shared/classes/classes.dart'; import '../../../shared/extensions.dart'; import '../../../shared/playback/bloc/bloc.dart'; import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/views.dart'; - + class ArtistRankedSongs extends StatelessWidget { const ArtistRankedSongs({super.key, required this.artist}); - + final Artist artist; - + @override Widget build(BuildContext context) { return AdaptiveTable( @@ -1099,52 +1103,42 @@ steps: title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), trailing: Text(song.ranking.toString()), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ); }, columns: const [ - DataColumn( - label: Text( - 'Ranking', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Title', - ), - ), - DataColumn( - label: Text( - 'Length', - ), - ), + DataColumn(label: Text('Ranking'), numeric: true), + DataColumn(label: Text('Title')), + DataColumn(label: Text('Length')), ], - rowBuilder: (song, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - HoverableSongPlayButton( - song: song, - child: Center( - child: Text(song.ranking.toString()), - ), + rowBuilder: + (song, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + HoverableSongPlayButton( + song: song, + child: Center(child: Text(song.ranking.toString())), + ), + ), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(song.image.image), + ), + const SizedBox(width: 5.0), + Expanded(child: Text(song.title)), + ], + ), + ), + DataCell(Text(song.length.toHumanizedString())), + ], ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(song.image.image), - ), - const SizedBox(width: 5.0), - Expanded(child: Text(song.title)), - ]), - ), - DataCell( - Text(song.length.toHumanizedString()), - ), - ]), ); } } @@ -1154,17 +1148,17 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import '../../../shared/classes/classes.dart'; import '../../../shared/views/outlined_card.dart'; - + class ArtistUpdates extends StatelessWidget { const ArtistUpdates({super.key, required this.artist}); - + final Artist artist; - + @override Widget build(BuildContext context) { return Column( @@ -1183,7 +1177,7 @@ steps: child: Text(update), ), ), - ) + ), ], ); } @@ -1194,21 +1188,21 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; - + import '../../../shared/classes/classes.dart'; import '../../../shared/extensions.dart'; import '../../../shared/views/article_content.dart'; import '../../../shared/views/image_clipper.dart'; import 'view.dart'; - + class ArtistScreen extends StatelessWidget { const ArtistScreen({required this.artist, super.key}); - + final Artist artist; - + @override Widget build(BuildContext context) { return LayoutBuilder( @@ -1322,20 +1316,20 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import 'package:url_launcher/url_launcher.dart'; - + import '../../../shared/classes/classes.dart'; import '../../../shared/providers/providers.dart'; import '../../../shared/views/views.dart'; - + class ArtistEvents extends StatelessWidget { const ArtistEvents({super.key, required this.artist}); - + final Artist artist; - + @override Widget build(BuildContext context) { final theme = ThemeProvider.of(context); @@ -1391,53 +1385,32 @@ steps: ); }, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], - rowBuilder: (item, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - Text(item.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(item.title)), - ]), - ), - DataCell( - Text(item.location), - ), - DataCell( - Clickable( - child: Text( - item.link, - style: TextStyle( - color: linkColor.value(theme), - decoration: TextDecoration.underline, + rowBuilder: + (item, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell(Text(item.date)), + DataCell(Row(children: [Expanded(child: Text(item.title))])), + DataCell(Text(item.location)), + DataCell( + Clickable( + child: Text( + item.link, + style: TextStyle( + color: linkColor.value(theme), + decoration: TextDecoration.underline, + ), + ), + onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ), ), - ), - onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ], ), - ), - ]), ); } } @@ -1447,26 +1420,24 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import '../../../shared/classes/classes.dart'; import '../../../shared/extensions.dart'; - + class ArtistBio extends StatelessWidget { const ArtistBio({super.key, required this.artist}); - + final Artist artist; - + @override Widget build(BuildContext context) { return Text( artist.bio, style: context.bodyLarge!.copyWith( fontSize: 16, - color: context.colors.onSurface.withAlpha( - 222, - ), + color: context.colors.onSurface.withAlpha(222), ), ); } @@ -1477,10 +1448,10 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; - + import '../features/artists/artists.dart'; import '../features/home/home.dart'; import '../features/playlists/playlists.dart'; @@ -1488,13 +1459,13 @@ steps: import 'providers/artists.dart'; import 'providers/playlists.dart'; import 'views/views.dart'; - + const _pageKey = ValueKey('_pageKey'); const _scaffoldKey = ValueKey('_scaffoldKey'); - + final artistsProvider = ArtistsProvider(); final playlistsProvider = PlaylistsProvider(); - + const List destinations = [ NavigationDestination( label: 'Home', @@ -1512,7 +1483,7 @@ steps: route: '/artists', ), ]; - + class NavigationDestination { const NavigationDestination({ required this.route, @@ -1520,82 +1491,91 @@ steps: required this.icon, this.child, }); - + final String route; final String label; final Icon icon; final Widget? child; } - + final appRouter = GoRouter( routes: [ // HomeScreen GoRoute( path: '/', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 0, - child: HomeScreen(), - ), - ), + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 0, + child: HomeScreen(), + ), + ), ), - + // PlaylistHomeScreen GoRoute( path: '/playlists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 1, - child: PlaylistHomeScreen(), - ), - ), - routes: [ - GoRoute( - path: ':pid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 1, - child: PlaylistScreen( - playlist: playlistsProvider - .getPlaylist(state.pathParameters['pid']!)!, - ), + child: PlaylistHomeScreen(), ), ), + routes: [ + GoRoute( + path: ':pid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 1, + child: PlaylistScreen( + playlist: + playlistsProvider.getPlaylist( + state.pathParameters['pid']!, + )!, + ), + ), + ), ), ], ), - + // ArtistHomeScreen GoRoute( path: '/artists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 2, - child: ArtistsScreen(), - ), - ), - routes: [ - GoRoute( - path: ':aid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 2, - child: ArtistScreen( - artist: - artistsProvider.getArtist(state.pathParameters['aid']!)!, - ), + child: ArtistsScreen(), ), ), + routes: [ + GoRoute( + path: ':aid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 2, + child: ArtistScreen( + artist: + artistsProvider.getArtist( + state.pathParameters['aid']!, + )!, + ), + ), + ), // builder: (context, state) => ArtistScreen( // id: state.params['aid']!, // ), @@ -1605,14 +1585,15 @@ steps: for (final route in destinations.skip(3)) GoRoute( path: route.route, - pageBuilder: (context, state) => MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: destinations.indexOf(route), - child: const SizedBox(), - ), - ), + pageBuilder: + (context, state) => MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: destinations.indexOf(route), + child: const SizedBox(), + ), + ), ), ], ); @@ -1622,15 +1603,15 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import './classes.dart'; - + class Song { final Artist artist; final String title; final Duration length; final MyArtistImage image; - + const Song(this.title, this.artist, this.length, this.image); } - name: Add lib/src/shared/classes/image.dart @@ -1639,13 +1620,14 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + class MyArtistImage { - const MyArtistImage( - {required this.image, - required this.sourceName, - required this.sourceLink}); - + const MyArtistImage({ + required this.image, + required this.sourceName, + required this.sourceLink, + }); + final String image; final String sourceName; final String sourceLink; @@ -1656,9 +1638,9 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import './classes.dart'; - + class News { const News({ required this.title, @@ -1666,7 +1648,7 @@ steps: required this.blurb, required this.image, }); - + final String title; final String author; final String blurb; @@ -1710,25 +1692,26 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import './classes.dart'; - + class Playlist { final String id; final String title; final String description; final List songs; MyArtistImage cover; - + Playlist({ required this.id, required this.title, this.description = '', required this.songs, this.cover = const MyArtistImage( - image: 'assets/images/record.jpeg', - sourceName: 'Adobe Stock Images', - sourceLink: ''), + image: 'assets/images/record.jpeg', + sourceName: 'Adobe Stock Images', + sourceLink: '', + ), }); } - name: Add lib/src/shared/classes/classes.dart @@ -1751,7 +1734,7 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + class Event { const Event({ required this.date, @@ -1759,7 +1742,7 @@ steps: required this.location, required this.link, }); - + final String date; final String title; final String location; @@ -1771,15 +1754,19 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import './classes.dart'; - + class RankedSong extends Song { final int ranking; - - const RankedSong(this.ranking, String title, Artist artist, Duration length, - MyArtistImage image) - : super(title, artist, length, image); + + const RankedSong( + this.ranking, + String title, + Artist artist, + Duration length, + MyArtistImage image, + ) : super(title, artist, length, image); } - name: Add lib/src/shared/providers/playlists.dart path: myartist/lib/src/shared/providers/playlists.dart @@ -1787,65 +1774,74 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:math'; import 'package:collection/collection.dart'; import 'package:english_words/english_words.dart'; - + import '../classes/classes.dart'; import '../extensions.dart'; import 'providers.dart'; - + class PlaylistsProvider { List get playlists => _randomPlaylists; Playlist get newReleases => randomPlaylist(numSongs: 10); Playlist get topSongs => randomPlaylist(numSongs: 10); - + static List images() { return [ const MyArtistImage( - image: 'assets/images/playlists/favorite.jpg', - sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/favorite.jpg', + sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/austin.jpg', - sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', - sourceName: 'Carlos Alfonso'), + image: 'assets/images/playlists/austin.jpg', + sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', + sourceName: 'Carlos Alfonso', + ), const MyArtistImage( - image: 'assets/images/playlists/reading.jpg', - sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', - sourceName: 'Alexandra Fuller'), + image: 'assets/images/playlists/reading.jpg', + sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', + sourceName: 'Alexandra Fuller', + ), const MyArtistImage( - image: 'assets/images/playlists/workout.jpg', - sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/workout.jpg', + sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/calm.jpg', - sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', - sourceName: 'Jared Rice'), + image: 'assets/images/playlists/calm.jpg', + sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', + sourceName: 'Jared Rice', + ), const MyArtistImage( - image: 'assets/images/playlists/coffee.jpg', - sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', - sourceName: 'Nathan Dumlao'), + image: 'assets/images/playlists/coffee.jpg', + sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', + sourceName: 'Nathan Dumlao', + ), const MyArtistImage( - image: 'assets/images/playlists/piano.jpg', - sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', - sourceName: 'Jordan Whitfield'), + image: 'assets/images/playlists/piano.jpg', + sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', + sourceName: 'Jordan Whitfield', + ), const MyArtistImage( - image: 'assets/images/playlists/studying.jpg', - sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', - sourceName: 'Humble Lamb'), + image: 'assets/images/playlists/studying.jpg', + sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', + sourceName: 'Humble Lamb', + ), const MyArtistImage( - image: 'assets/images/playlists/jazz.jpg', - sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', - sourceName: 'dimitri.photography'), + image: 'assets/images/playlists/jazz.jpg', + sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', + sourceName: 'dimitri.photography', + ), ]; } - + Playlist? getPlaylist(String id) { return playlists.firstWhereOrNull((playlist) => playlist.id == id); } - + static Playlist randomPlaylist({int numSongs = 15}) { return Playlist( id: randomId(), @@ -1855,13 +1851,13 @@ steps: cover: images()[Random().nextInt(images().length - 1)], ); } - + static Playlist randomLengthPlaylist({int maxSongs = 15}) { final int songCount = Random().nextInt(maxSongs) + 1; - + return PlaylistsProvider.randomPlaylist(numSongs: songCount); } - + static Song randomSong() { return Song( generateRandomString(2), @@ -1870,33 +1866,35 @@ steps: images()[Random().nextInt(images().length)], ); } - - static final List _randomPlaylists = - List.generate(10, (index) => randomLengthPlaylist()); + + static final List _randomPlaylists = List.generate( + 10, + (index) => randomLengthPlaylist(), + ); } - + String randomId() { return Random().nextInt(1000000).toString(); } - + String generateRandomString(int wordCount) { final randomWords = generateWordPairs().take((wordCount).floor()); return randomWords.join(' '); } - + Duration generateRandomSongLength() { Random rand = Random(); - + int minute = rand.nextInt(5); - + int second = rand.nextInt(60); - + String secondStr = second.toString(); - + if (second < 10) { secondStr = secondStr.padLeft(2, '0'); } - + return '$minute : $secondStr'.toDuration(); } - name: Add lib/src/shared/providers/providers.dart @@ -1916,177 +1914,190 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:math'; - + import 'package:collection/collection.dart'; import '../classes/classes.dart'; - + class ArtistsProvider { static ArtistsProvider get shared => ArtistsProvider(); - + List get artists => const [ - Artist( - id: 'jmo', - name: 'Jessie Morrison', + Artist( + id: 'jmo', + name: 'Jessie Morrison', + image: MyArtistImage( + image: 'assets/images/artists/woman.jpeg', + sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', + sourceName: 'Daniel Monteiro', + ), + bio: + 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', + updates: [ + 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', + 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', + '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', + ], + events: [ + Event( + date: '1/20/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Mountain View, California', + link: 'Tickets', + ), + Event( + date: '1/22/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Austin, Texas', + link: 'Tickets', + ), + Event( + date: '1/23/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Houston, Texas', + link: 'Tickets', + ), + Event( + date: '2/8/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Los Angeles, California', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', + author: 'By Jacqueline Stewart', + blurb: + 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', image: MyArtistImage( - image: 'assets/images/artists/woman.jpeg', - sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', - sourceName: 'Daniel Monteiro', + image: 'assets/images/news/concert.jpeg', + sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', + sourceName: 'Anthony DELANOIX', ), - bio: - 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', - updates: [ - 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', - 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', - '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', - ], - events: [ - Event( - date: '1/20/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Mountain View, California', - link: 'Tickets'), - Event( - date: '1/22/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Austin, Texas', - link: 'Tickets'), - Event( - date: '1/23/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Houston, Texas', - link: 'Tickets'), - Event( - date: '2/8/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Los Angeles, California', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', - author: 'By Jacqueline Stewart', - blurb: - 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', - image: MyArtistImage( - image: 'assets/images/news/concert.jpeg', - sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', - sourceName: 'Anthony DELANOIX', - ), - ) - ], ), - Artist( - id: 'lb', - name: 'Lucas Bryant', + ], + ), + Artist( + id: 'lb', + name: 'Lucas Bryant', + image: MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + bio: + 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', + updates: [ + 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', + 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', + 'We\'re going all in this weekend! How are you doing, Vegas?!', + ], + events: [ + Event( + date: '5/16/22', + title: 'Back To My Hometown Tour', + location: 'Indianapolis, IN', + link: 'Tickets', + ), + Event( + date: '5/18/22', + title: 'Back To My Hometown Tour', + location: 'San Antonio, TX', + link: 'Tickets', + ), + Event( + date: '5/20/22', + title: 'Back To My Hometown Tour', + location: 'Phoenix, AZ', + link: 'Tickets', + ), + Event( + date: '5/23/22', + title: 'Back To My Hometown Tour', + location: 'San Diego, CA', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', + author: 'Lonnie Hall', + blurb: + 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', image: MyArtistImage( image: 'assets/images/albums/artist1-album2.jpg', sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', sourceName: 'Keagan Henman', ), - bio: - 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', - updates: [ - 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', - 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', - 'We\'re going all in this weekend! How are you doing, Vegas?!', - ], - events: [ - Event( - date: '5/16/22', - title: 'Back To My Hometown Tour', - location: 'Indianapolis, IN', - link: 'Tickets'), - Event( - date: '5/18/22', - title: 'Back To My Hometown Tour', - location: 'San Antonio, TX', - link: 'Tickets'), - Event( - date: '5/20/22', - title: 'Back To My Hometown Tour', - location: 'Phoenix, AZ', - link: 'Tickets'), - Event( - date: '5/23/22', - title: 'Back To My Hometown Tour', - location: 'San Diego, CA', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', - author: 'Lonnie Hall', - blurb: - 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', - image: MyArtistImage( - image: 'assets/images/albums/artist1-album2.jpg', - sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', - sourceName: 'Keagan Henman', - ), - ), - ], ), - Artist( - id: 'jonjames', - name: 'Jon James', + ], + ), + Artist( + id: 'jonjames', + name: 'Jon James', + image: MyArtistImage( + image: 'assets/images/artists/joe.jpg', + sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', + sourceName: 'Natalie Runnerstrom', + ), + bio: + 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', + updates: [ + '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', + '4 days until I get to share some of the favorite songs I\'ve ever written with you.', + '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', + ], + events: [ + Event( + date: '10/22/21', + title: 'Falling For You Tour', + location: 'Dallas, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/23/21', + title: 'Falling For You Tour', + location: 'Houston, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/26/21', + title: 'Falling For You Tour', + location: 'Phoenix, Arizona', + link: 'Ticketmaster', + ), + Event( + date: '10/27/21', + title: 'Falling For You Tour', + location: 'Los Angeles, California', + link: 'Ticketmaster', + ), + ], + news: [ + News( + title: + 'Jon James is excited for the release of his sixth album "Falling For You"', + author: 'Top Media Today', + blurb: + 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', image: MyArtistImage( - image: 'assets/images/artists/joe.jpg', - sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', - sourceName: 'Natalie Runnerstrom', + image: 'assets/images/news/recording_studio.jpg', + sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', + sourceName: 'Yohann LIBOT', ), - bio: - 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', - updates: [ - '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', - '4 days until I get to share some of the favorite songs I\'ve ever written with you.', - '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', - ], - events: [ - Event( - date: '10/22/21', - title: 'Falling For You Tour', - location: 'Dallas, Texas', - link: 'Ticketmaster'), - Event( - date: '10/23/21', - title: 'Falling For You Tour', - location: 'Houston, Texas', - link: 'Ticketmaster'), - Event( - date: '10/26/21', - title: 'Falling For You Tour', - location: 'Phoenix, Arizona', - link: 'Ticketmaster'), - Event( - date: '10/27/21', - title: 'Falling For You Tour', - location: 'Los Angeles, California', - link: 'Ticketmaster'), - ], - news: [ - News( - title: - 'Jon James is excited for the release of his sixth album "Falling For You"', - author: 'Top Media Today', - blurb: - 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', - image: MyArtistImage( - image: 'assets/images/news/recording_studio.jpg', - sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', - sourceName: 'Yohann LIBOT'), - ) - ], ), - ]; - + ], + ), + ]; + Artist? getArtist(String id) { return artists.firstWhereOrNull((artist) => artist.id == id); } - + Artist get randomArtist => artists[Random().nextInt(artists.length)]; } - name: Add lib/src/shared/providers/songs.dart @@ -2146,9 +2157,10 @@ steps: ArtistsProvider.shared.getArtist('jonjames')!, '3:35'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album2.jpg', - sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', - sourceName: 'Alexandru Acea'), + image: 'assets/images/albums/artist4-album2.jpg', + sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', + sourceName: 'Alexandru Acea', + ), ), RankedSong( 2, @@ -2156,9 +2168,10 @@ steps: ArtistsProvider.shared.getArtist('jonjames')!, '3:52'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album1.jpg', - sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', - sourceName: 'Jr Korpa'), + image: 'assets/images/albums/artist4-album1.jpg', + sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', + sourceName: 'Jr Korpa', + ), ), RankedSong( 3, @@ -2166,9 +2179,10 @@ steps: ArtistsProvider.shared.getArtist('jonjames')!, '3:39'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album3.jpg', - sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', - sourceName: 'Stormseeker'), + image: 'assets/images/albums/artist4-album3.jpg', + sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', + sourceName: 'Stormseeker', + ), ), RankedSong( 1, @@ -2259,12 +2273,13 @@ steps: } class ThemeProvider extends InheritedWidget { - const ThemeProvider( - {super.key, - required this.settings, - required this.lightDynamic, - required this.darkDynamic, - required super.child}); + const ThemeProvider({ + super.key, + required this.settings, + required this.lightDynamic, + required this.darkDynamic, + required super.child, + }); final ValueNotifier settings; final ColorScheme? lightDynamic; @@ -2290,8 +2305,9 @@ steps: Color blend(Color targetColor) { return Color( - // ignore: deprecated_member_use - Blend.harmonize(targetColor.value, settings.value.sourceColor.value)); + // ignore: deprecated_member_use + Blend.harmonize(targetColor.value, settings.value.sourceColor.value), + ); } Color source(Color? target) { @@ -2303,18 +2319,18 @@ steps: } ColorScheme colors(Brightness brightness, Color? targetColor) { - final dynamicPrimary = brightness == Brightness.light - ? lightDynamic?.primary - : darkDynamic?.primary; + final dynamicPrimary = + brightness == Brightness.light + ? lightDynamic?.primary + : darkDynamic?.primary; return ColorScheme.fromSeed( seedColor: dynamicPrimary ?? source(targetColor), brightness: brightness, ); } - ShapeBorder get shapeMedium => RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ); + ShapeBorder get shapeMedium => + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)); CardTheme cardTheme() { return CardTheme( @@ -2344,21 +2360,13 @@ steps: labelColor: colors.secondary, unselectedLabelColor: colors.onSurfaceVariant, indicator: BoxDecoration( - border: Border( - bottom: BorderSide( - color: colors.secondary, - width: 2, - ), - ), + border: Border(bottom: BorderSide(color: colors.secondary, width: 2)), ), ); } BottomAppBarTheme bottomAppBarTheme(ColorScheme colors) { - return BottomAppBarTheme( - color: colors.surface, - elevation: 0, - ); + return BottomAppBarTheme(color: colors.surface, elevation: 0); } BottomNavigationBarThemeData bottomNavigationBarTheme(ColorScheme colors) { @@ -2377,9 +2385,7 @@ steps: } DrawerThemeData drawerTheme(ColorScheme colors) { - return DrawerThemeData( - backgroundColor: colors.surface, - ); + return DrawerThemeData(backgroundColor: colors.surface); } ThemeData light([Color? targetColor]) { @@ -2438,10 +2444,7 @@ steps: } class ThemeSettings { - ThemeSettings({ - required this.sourceColor, - required this.themeMode, - }); + ThemeSettings({required this.sourceColor, required this.themeMode}); final Color sourceColor; final ThemeMode themeMode; @@ -2452,10 +2455,7 @@ steps: } // Custom Colors - const linkColor = CustomColor( - name: 'Link Color', - color: Color(0xFF00B0FF), - ); + const linkColor = CustomColor(name: 'Link Color', color: Color(0xFF00B0FF)); class CustomColor { const CustomColor({ @@ -2486,51 +2486,36 @@ steps: ThemeData get theme => Theme.of(this); TextTheme get textTheme => theme.textTheme; // Modify this line ColorScheme get colors => theme.colorScheme; - TextStyle? get displayLarge => textTheme.displayLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displayMedium => textTheme.displayMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displaySmall => textTheme.displaySmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineLarge => textTheme.headlineLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineMedium => textTheme.headlineMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineSmall => textTheme.headlineSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleLarge => textTheme.titleLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleMedium => textTheme.titleMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleSmall => textTheme.titleSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelLarge => textTheme.labelLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelMedium => textTheme.labelMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelSmall => textTheme.labelSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyLarge => textTheme.bodyLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyMedium => textTheme.bodyMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodySmall => textTheme.bodySmall?.copyWith( - color: colors.onSurface, - ); + TextStyle? get displayLarge => + textTheme.displayLarge?.copyWith(color: colors.onSurface); + TextStyle? get displayMedium => + textTheme.displayMedium?.copyWith(color: colors.onSurface); + TextStyle? get displaySmall => + textTheme.displaySmall?.copyWith(color: colors.onSurface); + TextStyle? get headlineLarge => + textTheme.headlineLarge?.copyWith(color: colors.onSurface); + TextStyle? get headlineMedium => + textTheme.headlineMedium?.copyWith(color: colors.onSurface); + TextStyle? get headlineSmall => + textTheme.headlineSmall?.copyWith(color: colors.onSurface); + TextStyle? get titleLarge => + textTheme.titleLarge?.copyWith(color: colors.onSurface); + TextStyle? get titleMedium => + textTheme.titleMedium?.copyWith(color: colors.onSurface); + TextStyle? get titleSmall => + textTheme.titleSmall?.copyWith(color: colors.onSurface); + TextStyle? get labelLarge => + textTheme.labelLarge?.copyWith(color: colors.onSurface); + TextStyle? get labelMedium => + textTheme.labelMedium?.copyWith(color: colors.onSurface); + TextStyle? get labelSmall => + textTheme.labelSmall?.copyWith(color: colors.onSurface); + TextStyle? get bodyLarge => + textTheme.bodyLarge?.copyWith(color: colors.onSurface); + TextStyle? get bodyMedium => + textTheme.bodyMedium?.copyWith(color: colors.onSurface); + TextStyle? get bodySmall => + textTheme.bodySmall?.copyWith(color: colors.onSurface); } extension BreakpointUtils on BoxConstraints { @@ -2542,17 +2527,17 @@ steps: extension DurationString on String { /// Assumes a string (roughly) of the format '\d{1,2}:\d{2}' Duration toDuration() => switch (split(':')) { - [var minutes, var seconds] => Duration( - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - [var hours, var minutes, var seconds] => Duration( - hours: int.parse(hours.trim()), - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - _ => throw Exception('Invalid duration string: $this'), - }; + [var minutes, var seconds] => Duration( + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + [var hours, var minutes, var seconds] => Duration( + hours: int.parse(hours.trim()), + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + _ => throw Exception('Invalid duration string: $this'), + }; } extension HumanizedDuration on Duration { @@ -2575,20 +2560,20 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + part of 'playback_bloc.dart'; - + @Freezed() class PlaybackEvent with _$PlaybackEvent { const factory PlaybackEvent.togglePlayPause() = TogglePlayPause; const factory PlaybackEvent.changeSong(Song song) = ChangeSong; const factory PlaybackEvent.setVolume(double value) = SetVolume; const factory PlaybackEvent.toggleMute() = ToggleMute; - + /// Used to move to a specific timestamp in a song, likely because the user /// has dragged the playback bar. Values should be between 0 and 1. const factory PlaybackEvent.moveToInSong(double percent) = MoveToInSong; - + /// Used to indicate incremental progress in the song that is currently /// playing. const factory PlaybackEvent.songProgress(Duration duration) = SongProgress; @@ -2599,25 +2584,25 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + part of 'playback_bloc.dart'; - + @Freezed() class PlaybackState with _$PlaybackState { const factory PlaybackState({ /// Legal values are between 0 and 1. @Default(0.5) double volume, - + /// Used to restore the volume after un-muting. double? previousVolume, @Default(false) bool isMuted, @Default(false) bool isPlaying, SongWithProgress? songWithProgress, }) = _PlaybackState; - + factory PlaybackState.initial() => const PlaybackState(); } - + /// Helper which enforces our rule that our `song` and `progress` must either /// both be `null`, or both have a real value. @Freezed() @@ -2641,16 +2626,16 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import '../../classes/classes.dart'; - + part 'playback_event.dart'; part 'playback_state.dart'; part 'playback_bloc.freezed.dart'; - + class PlaybackBloc extends Bloc { PlaybackBloc() : super(PlaybackState.initial()) { on( @@ -2664,10 +2649,10 @@ steps: ), ); } - + static const _playbackUpdateInterval = Duration(milliseconds: 100); StreamSubscription? _currentlyPlayingSubscription; - + Stream _startPlayingStream() async* { while (state.songWithProgress!.progress < state.songWithProgress!.song.length) { @@ -2680,21 +2665,22 @@ steps: } } } - - void _handlePlaybackProgress(Duration progress) => add( - PlaybackEvent.songProgress(progress), - ); - + + void _handlePlaybackProgress(Duration progress) => + add(PlaybackEvent.songProgress(progress)); + void _togglePlayPause(TogglePlayPause event, Emitter emit) { state.isPlaying ? _pausePlayback() : _resumePlayback(); emit(state.copyWith(isPlaying: !state.isPlaying)); } - + void _pausePlayback() => _currentlyPlayingSubscription!.cancel(); - - void _resumePlayback() => _currentlyPlayingSubscription = - _startPlayingStream().listen(_handlePlaybackProgress); - + + void _resumePlayback() => + _currentlyPlayingSubscription = _startPlayingStream().listen( + _handlePlaybackProgress, + ); + void _changeSong(ChangeSong event, Emitter emit) { emit( state.copyWith( @@ -2707,22 +2693,18 @@ steps: ); _resumePlayback(); } - + void _songProgress(SongProgress event, Emitter emit) => emit( - state.copyWith( - songWithProgress: state.songWithProgress!.copyWith( - progress: state.songWithProgress!.progress + event.duration, - ), - ), - ); + state.copyWith( + songWithProgress: state.songWithProgress!.copyWith( + progress: state.songWithProgress!.progress + event.duration, + ), + ), + ); void _setVolume(SetVolume event, Emitter emit) => emit( - state.copyWith( - volume: event.value, - isMuted: false, - previousVolume: null, - ), - ); - + state.copyWith(volume: event.value, isMuted: false, previousVolume: null), + ); + void _toggleMute(ToggleMute event, Emitter emit) { if (state.isMuted) { emit( @@ -2734,15 +2716,11 @@ steps: ); } else { emit( - state.copyWith( - isMuted: true, - volume: 0, - previousVolume: state.volume, - ), + state.copyWith(isMuted: true, volume: 0, previousVolume: state.volume), ); } } - + void _moveToInSong(MoveToInSong event, Emitter emit) { _pausePlayback(); final targetMilliseconds = @@ -2756,7 +2734,7 @@ steps: ), ); } - + @override Future close() async { await _currentlyPlayingSubscription?.cancel(); @@ -2769,31 +2747,22 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + class ArticleContent extends StatelessWidget { - const ArticleContent({ - super.key, - required this.child, - this.maxWidth = 960, - }); - + const ArticleContent({super.key, required this.child, this.maxWidth = 960}); + final double maxWidth; final Widget child; - + @override Widget build(BuildContext context) { return Container( alignment: Alignment.topCenter, child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: maxWidth, - ), - child: Padding( - padding: const EdgeInsets.all(15), - child: child, - ), + constraints: BoxConstraints(maxWidth: maxWidth), + child: Padding(padding: const EdgeInsets.all(15), child: child), ), ); } @@ -2804,30 +2773,27 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + class OutlinedCard extends StatefulWidget { - const OutlinedCard({ - super.key, - required this.child, - this.clickable = true, - }); - + const OutlinedCard({super.key, required this.child, this.clickable = true}); + final Widget child; final bool clickable; - + @override State createState() => _OutlinedCardState(); } - + class _OutlinedCardState extends State { @override Widget build(BuildContext context) { return MouseRegion( - cursor: widget.clickable - ? SystemMouseCursors.click - : SystemMouseCursors.basic, + cursor: + widget.clickable + ? SystemMouseCursors.click + : SystemMouseCursors.basic, child: Container( // Add box decoration here child: widget.child, @@ -2841,9 +2807,9 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + class AdaptiveNavigation extends StatelessWidget { const AdaptiveNavigation({ super.key, @@ -2852,12 +2818,12 @@ steps: required this.onDestinationSelected, required this.child, }); - + final List destinations; final int selectedIndex; final void Function(int index) onDestinationSelected; final Widget child; - + @override Widget build(BuildContext context) { return LayoutBuilder( @@ -2870,12 +2836,15 @@ steps: NavigationRail( extended: dimens.maxWidth >= 800, minExtendedWidth: 180, - destinations: destinations - .map((e) => NavigationRailDestination( - icon: e.icon, - label: Text(e.label), - )) - .toList(), + destinations: + destinations + .map( + (e) => NavigationRailDestination( + icon: e.icon, + label: Text(e.label), + ), + ) + .toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ), @@ -2884,7 +2853,7 @@ steps: ), ); // Add closing curly bracket - + // Add return for mobile layout }, ); @@ -2896,11 +2865,11 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import '../extensions.dart'; import 'outlined_card.dart'; - + class ImageTile extends StatelessWidget { const ImageTile({ super.key, @@ -2908,27 +2877,25 @@ steps: required this.title, required this.subtitle, }); - + final String image; final String title; final String subtitle; - + @override Widget build(BuildContext context) { return OutlinedCard( - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Expanded( - child: Image.asset(image, fit: BoxFit.cover), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [Expanded(child: Image.asset(image, fit: BoxFit.cover))], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), child: Text( title, @@ -2938,20 +2905,25 @@ steps: ), overflow: TextOverflow.ellipsis, maxLines: 1, - )), - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text( - subtitle, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center, + ), ), - ), - ], - ) - ]), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 10, + ), + child: Text( + subtitle, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ], + ), + ], + ), ); } } @@ -2961,13 +2933,13 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - + import '../playback/bloc/bloc.dart'; - + /// Widget which catches all incoming Spacebar presses and routes them to the /// [PlaybackBloc]. /// @@ -2976,21 +2948,16 @@ steps: /// shortcuts. By sitting below that machinery, this installs a global Spacebar /// listener which toggles Playback, as is customary in music-playing apps. class PlayPauseListener extends StatelessWidget { - const PlayPauseListener({ - super.key, - required this.child, - }); - + const PlayPauseListener({super.key, required this.child}); + final Widget child; - + @override Widget build(BuildContext context) { // Immediately catch any [_PlayPauseIntent] events released by the inner // [Shortcuts] widget. return Actions( - actions: >{ - _PlayPauseIntent: _PlayPauseAction(), - }, + actions: >{_PlayPauseIntent: _PlayPauseAction()}, child: Shortcuts( // Register a shortcut for Spacebar presses that release a // [_PlayPauseIntent] up the tree to the nearest [Actions] widget. @@ -2998,9 +2965,9 @@ steps: const SingleActivator(LogicalKeyboardKey.space): _PlayPauseIntent( // Create a closure which sends a [TogglePlayPause] event to the // [PlaybackBloc]. - () => BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ), + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()), ), }, child: child, @@ -3008,15 +2975,15 @@ steps: ); } } - + class _PlayPauseAction extends Action<_PlayPauseIntent> { @override void invoke(_PlayPauseIntent intent) => intent.handler(); } - + class _PlayPauseIntent extends Intent { const _PlayPauseIntent(this.handler); - + final VoidCallback handler; } - name: Add lib/src/shared/views/image_card.dart @@ -3025,26 +2992,27 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import '../../shared/extensions.dart'; import 'outlined_card.dart'; - + class ImageCard extends StatelessWidget { - const ImageCard( - {super.key, - required this.title, - required this.details, - required this.image, - this.subtitle, - this.clickable = false}); - + const ImageCard({ + super.key, + required this.title, + required this.details, + required this.image, + this.subtitle, + this.clickable = false, + }); + final String title; final String? subtitle; final String details; final String image; final bool clickable; - + @override Widget build(BuildContext context) { const padding = EdgeInsets.all(8.0); @@ -3052,54 +3020,51 @@ steps: clickable: clickable, child: Padding( padding: const EdgeInsets.all(8.0), - child: LayoutBuilder(builder: (context, constraints) { - return Row( - children: [ - if (constraints.maxWidth > 600) - SizedBox( - width: 170, - height: 170, - child: Image.asset( - image, - fit: BoxFit.cover, + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + if (constraints.maxWidth > 600) + SizedBox( + width: 170, + height: 170, + child: Image.asset(image, fit: BoxFit.cover), ), - ), - Expanded( - child: Padding( - padding: padding, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 5), - child: Text( - title, - style: context.titleLarge! - .copyWith(fontWeight: FontWeight.bold), - ), - ), - if (subtitle != null) + Expanded( + child: Padding( + padding: padding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Padding( - padding: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only(bottom: 5), child: Text( - subtitle!, - style: context.labelMedium, + title, + style: context.titleLarge!.copyWith( + fontWeight: FontWeight.bold, + ), ), ), - Text( - details, - style: context.labelMedium?.copyWith( - fontSize: 16, - height: 1.25, + if (subtitle != null) + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text(subtitle!, style: context.labelMedium), + ), + Text( + details, + style: context.labelMedium?.copyWith( + fontSize: 16, + height: 1.25, + ), ), - ), - ], + ], + ), ), ), - ), - ], - ); - }), + ], + ); + }, + ), ), ); } @@ -3110,13 +3075,13 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../classes/classes.dart'; import '../playback/bloc/bloc.dart'; import '../views/views.dart'; - + /// Renders the child widget when not hovered and a Play button when hovered. class HoverableSongPlayButton extends StatelessWidget { const HoverableSongPlayButton({ @@ -3126,21 +3091,22 @@ steps: this.size = const Size(50, 50), this.hoverMode = HoverMode.replace, }); - + final Widget child; final Size size; final Song song; final HoverMode hoverMode; - + @override Widget build(BuildContext context) { return HoverToggle( hoverChild: Center( child: GestureDetector( child: const Icon(Icons.play_arrow), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ), ), mode: hoverMode, @@ -3180,16 +3146,18 @@ steps: final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => _BottomBar( - artist: state.songWithProgress?.song.artist, - isMuted: state.isMuted, - isPlaying: state.isPlaying, - preferredSize: preferredSize, - progress: state.songWithProgress?.progress, - song: state.songWithProgress?.song, - togglePlayPause: () => bloc.add(const PlaybackEvent.togglePlayPause()), - volume: state.volume, - ), + builder: + (context, state) => _BottomBar( + artist: state.songWithProgress?.song.artist, + isMuted: state.isMuted, + isPlaying: state.isPlaying, + preferredSize: preferredSize, + progress: state.songWithProgress?.progress, + song: state.songWithProgress?.song, + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), + volume: state.volume, + ), ); } } @@ -3217,10 +3185,12 @@ steps: @override Widget build(BuildContext context) => LayoutBuilder( - builder: (context, constraints) => constraints.isTablet - ? _buildDesktopBar(context, constraints) - : _buildMobileBar(context, constraints), - ); + builder: + (context, constraints) => + constraints.isTablet + ? _buildDesktopBar(context, constraints) + : _buildMobileBar(context, constraints), + ); Widget _buildDesktopBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -3233,10 +3203,7 @@ steps: Row( children: [ _AlbumArt(song: song), - _SongDetails( - artist: artist, - song: song, - ), + _SongDetails(artist: artist, song: song), ], ), Flexible( @@ -3249,12 +3216,7 @@ steps: isPlaying: isPlaying, togglePlayPause: togglePlayPause, ), - Center( - child: _ProgressBar( - progress: progress, - song: song, - ), - ), + Center(child: _ProgressBar(progress: progress, song: song)), ], ), ), @@ -3268,17 +3230,18 @@ steps: final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _FullScreenPlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _FullScreenPlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -3290,10 +3253,10 @@ steps: } double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; Widget _buildMobileBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -3306,17 +3269,18 @@ steps: final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _MobilePlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _MobilePlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -3345,10 +3309,7 @@ steps: mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - song?.title ?? '', - style: context.labelMedium, - ), + Text(song?.title ?? '', style: context.labelMedium), Text( song?.artist.name ?? '', style: context.labelSmall, @@ -3374,10 +3335,7 @@ steps: } class _ProgressBar extends StatelessWidget { - const _ProgressBar({ - required this.progress, - required this.song, - }); + const _ProgressBar({required this.progress, required this.song}); /// Current playback depth into user is into [song]. final Duration? progress; @@ -3385,10 +3343,10 @@ steps: final Song? song; double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; @override Widget build(BuildContext context) { @@ -3406,29 +3364,32 @@ steps: children: [ const SizedBox(width: 10), SizedBox( - child: progress != null - ? Text(progress!.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + progress != null + ? Text( + progress!.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), Expanded( child: Slider( value: songProgress.clamp(0, 1), divisions: 1000, onChanged: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); }, onChangeEnd: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); // Because dragging pauses auto playback, resume playing // once the user finishes dragging. - BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ); + BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()); }, activeColor: Theme.of(context).colorScheme.onTertiaryContainer, @@ -3436,12 +3397,15 @@ steps: ), ), SizedBox( - child: song != null - ? Text(song!.length.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + song != null + ? Text( + song!.length.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), - const SizedBox(width: 10) + const SizedBox(width: 10), ], ), ); @@ -3451,10 +3415,7 @@ steps: } class _VolumeBar extends StatelessWidget { - const _VolumeBar({ - required this.volume, - required this.isMuted, - }); + const _VolumeBar({required this.volume, required this.isMuted}); /// The percentage, between 0 and 1, at which to render the volume slider. final double volume; @@ -3467,17 +3428,16 @@ steps: @override Widget build(BuildContext context) { return ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 200, - ), + constraints: const BoxConstraints(maxWidth: 200), child: Padding( padding: const EdgeInsets.all(8), child: Row( children: [ GestureDetector( - onTap: () => BlocProvider.of(context).add( - const PlaybackEvent.toggleMute(), - ), + onTap: + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.toggleMute()), child: Icon(!isMuted ? Icons.volume_mute : Icons.volume_off), ), Expanded( @@ -3486,8 +3446,10 @@ steps: min: 0, max: 1, divisions: 100, - onChanged: (newValue) => BlocProvider.of(context) - .add(PlaybackEvent.setVolume(newValue)), + onChanged: + (newValue) => BlocProvider.of( + context, + ).add(PlaybackEvent.setVolume(newValue)), activeColor: Theme.of(context).colorScheme.onTertiaryContainer, inactiveColor: Theme.of(context).colorScheme.onSurface, ), @@ -3510,49 +3472,50 @@ steps: @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - double iconSize = 24; - double playIconSize = 32; - double innerPadding = 16; - double playPadding = 20; - if (constraints.maxWidth < 500) { - iconSize = 21; - playIconSize = 28; - innerPadding = 14; - playPadding = 17; - } - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( + return LayoutBuilder( + builder: (context, constraints) { + double iconSize = 24; + double playIconSize = 32; + double innerPadding = 16; + double playPadding = 20; + if (constraints.maxWidth < 500) { + iconSize = 21; + playIconSize = 28; + innerPadding = 14; + playPadding = 17; + } + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( padding: EdgeInsets.fromLTRB(0, 0, innerPadding, 0), - child: Icon(Icons.shuffle, size: iconSize)), - Icon(Icons.skip_previous, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), - child: GestureDetector( - onTap: togglePlayPause, - child: Icon( - isPlaying ? Icons.pause_circle : Icons.play_circle, - size: playIconSize, + child: Icon(Icons.shuffle, size: iconSize), + ), + Icon(Icons.skip_previous, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), + child: GestureDetector( + onTap: togglePlayPause, + child: Icon( + isPlaying ? Icons.pause_circle : Icons.play_circle, + size: playIconSize, + ), ), ), - ), - Icon(Icons.skip_next, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), - child: Icon(Icons.repeat, size: iconSize), - ), - ], - ); - }); + Icon(Icons.skip_next, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), + child: Icon(Icons.repeat, size: iconSize), + ), + ], + ); + }, + ); } } class _AlbumArt extends StatelessWidget { - const _AlbumArt({ - required this.song, - }); + const _AlbumArt({required this.song}); final Song? song; @@ -3563,21 +3526,17 @@ steps: child: SizedBox( width: 70, height: 70, - child: song != null - ? Image.asset(song!.image.image) - : Container( - color: Colors.pink[100], - ), + child: + song != null + ? Image.asset(song!.image.image) + : Container(color: Colors.pink[100]), ), ); } } class _SongDetails extends StatelessWidget { - const _SongDetails({ - required this.artist, - required this.song, - }); + const _SongDetails({required this.artist, required this.song}); final Artist? artist; final Song? song; @@ -3609,9 +3568,7 @@ steps: } class _FullScreenPlayer extends StatefulWidget { - const _FullScreenPlayer({ - required this.onClose, - }); + const _FullScreenPlayer({required this.onClose}); final VoidCallback onClose; @@ -3643,29 +3600,33 @@ steps: final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return MouseRegion( - onHover: (_) { - setState(() { - _showControls = true; - }); - hideControls(); + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return MouseRegion( + onHover: (_) { + setState(() { + _showControls = true; + }); + hideControls(); + }, + child: buildPlayer(context, state, dimens), + ); }, - child: buildPlayer(context, state, dimens), - ); - }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; final song = current?.song; @@ -3673,26 +3634,25 @@ steps: fit: StackFit.expand, children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - song!.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset(song!.image.image, fit: BoxFit.cover), ), ), - ), ), Positioned( top: 20, right: 20, child: IconButton( - color: song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const Icon(Icons.fullscreen_exit), onPressed: widget.onClose, ), @@ -3723,8 +3683,9 @@ steps: Text( song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 20, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 20, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -3736,10 +3697,7 @@ steps: right: 20, left: 20, bottom: dimens.biggest.height * 0.2, - child: _ProgressBar( - progress: current?.progress, - song: song, - ), + child: _ProgressBar(progress: current?.progress, song: song), ), Positioned( right: 20, @@ -3752,8 +3710,8 @@ steps: scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), @@ -3765,9 +3723,7 @@ steps: } class _MobilePlayer extends StatelessWidget { - const _MobilePlayer({ - required this.onClose, - }); + const _MobilePlayer({required this.onClose}); final VoidCallback onClose; @@ -3776,46 +3732,52 @@ steps: final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return buildPlayer(context, state, dimens); - }, + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return buildPlayer(context, state, dimens); + }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; return Stack( children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - current.song.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset( + current.song.image.image, + fit: BoxFit.cover, + ), ), ), - ), ), Positioned( top: 20, left: 20, child: IconButton( - color: current?.song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + current?.song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const RotatedBox( quarterTurns: 1, child: Icon(Icons.chevron_right), @@ -3830,10 +3792,7 @@ steps: left: 0, right: 0, height: dimens.biggest.height * 0.5, - child: Image.asset( - current.song.image.image, - fit: BoxFit.contain, - ), + child: Image.asset(current.song.image.image, fit: BoxFit.contain), ), Positioned( left: 0, @@ -3859,8 +3818,9 @@ steps: Text( current.song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 12, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 12, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -3872,15 +3832,12 @@ steps: scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), - _ProgressBar( - progress: current.progress, - song: current.song, - ), + _ProgressBar(progress: current.progress, song: current.song), ], ), ), @@ -3895,11 +3852,11 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import 'image_clipper.dart'; - + class AdaptiveImageCard extends StatelessWidget { const AdaptiveImageCard({ super.key, @@ -3908,12 +3865,12 @@ steps: required this.constraints, this.axis = Axis.horizontal, }); - + final String image; final Widget child; final BoxConstraints constraints; final Axis axis; - + @override Widget build(BuildContext context) { if (axis == Axis.vertical) { @@ -3930,20 +3887,13 @@ steps: ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), + child: Padding(padding: const EdgeInsets.all(20), child: child), ), ], ); } return Padding( - padding: const EdgeInsets.only( - left: 20, - bottom: 20, - top: 20, - ), + padding: const EdgeInsets.only(left: 20, bottom: 20, top: 20), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, @@ -3959,11 +3909,8 @@ steps: ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), - ) + child: Padding(padding: const EdgeInsets.all(20), child: child), + ), ], ), ); @@ -3975,9 +3922,9 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + class ClippedImage extends StatelessWidget { const ClippedImage( this.image, { @@ -3986,11 +3933,11 @@ steps: this.width, super.key, }); - + final String image; final BoxFit? fit; final double? width, height; - + @override Widget build(BuildContext context) { return ClipRRect( @@ -4010,9 +3957,9 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + class AdaptiveTable extends StatelessWidget { const AdaptiveTable({ super.key, @@ -4022,13 +3969,13 @@ steps: required this.columns, this.breakpoint = 600, }); - + final List items; final Widget Function(T item, int index) itemBuilder; final DataRow Function(T item, int index) rowBuilder; final List columns; final double breakpoint; - + @override Widget build(BuildContext context) { return LayoutBuilder( @@ -4059,28 +4006,17 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + class CenterRow extends StatelessWidget { - const CenterRow({ - super.key, - required this.child, - }); - + const CenterRow({super.key, required this.child}); + final Widget child; - + @override Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Center( - child: child, - ), - ), - ], - ); + return Row(children: [Expanded(child: Center(child: child))]); } } - name: Add lib/src/shared/views/clickable.dart @@ -4089,23 +4025,20 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + class Clickable extends StatelessWidget { const Clickable({required this.child, required this.onTap, super.key}); - + final Widget child; final VoidCallback onTap; - + @override Widget build(BuildContext context) { return MouseRegion( cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: onTap, - child: child, - ), + child: GestureDetector(onTap: onTap, child: child), ); } } @@ -4115,87 +4048,85 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart' as go; import 'package:universal_platform/universal_platform.dart'; - + import '../playback/bloc/bloc.dart'; import '../router.dart' as router; import 'adaptive_navigation.dart'; import 'views.dart'; - + class RootLayout extends StatelessWidget { const RootLayout({ super.key, required this.child, required this.currentIndex, }); - + final Widget child; final int currentIndex; static const _switcherKey = ValueKey('switcherKey'); static const _navigationRailKey = ValueKey('navigationRailKey'); - + @override Widget build(BuildContext context) { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => LayoutBuilder(builder: (context, dimens) { - void onSelected(int index) { - final destination = router.destinations[index]; - go.GoRouter.of(context).go(destination.route); - } - - final current = state.songWithProgress; - return AdaptiveNavigation( - key: _navigationRailKey, - destinations: router.destinations - .map((e) => NavigationDestination( - icon: e.icon, - label: e.label, - )) - .toList(), - selectedIndex: currentIndex, - onDestinationSelected: onSelected, - child: Column( - children: [ - Expanded( - child: _Switcher( - key: _switcherKey, - child: child, + builder: + (context, state) => LayoutBuilder( + builder: (context, dimens) { + void onSelected(int index) { + final destination = router.destinations[index]; + go.GoRouter.of(context).go(destination.route); + } + + final current = state.songWithProgress; + return AdaptiveNavigation( + key: _navigationRailKey, + destinations: + router.destinations + .map( + (e) => NavigationDestination( + icon: e.icon, + label: e.label, + ), + ) + .toList(), + selectedIndex: currentIndex, + onDestinationSelected: onSelected, + child: Column( + children: [ + Expanded(child: _Switcher(key: _switcherKey, child: child)), + if (current != null) const BottomBar(), + ], ), - ), - if (current != null) const BottomBar(), - ], + ); + }, ), - ); - }), ); } } - + class _Switcher extends StatelessWidget { final Widget child; - - const _Switcher({ - required this.child, - super.key, - }); - + + const _Switcher({required this.child, super.key}); + @override Widget build(BuildContext context) { return UniversalPlatform.isDesktop ? child : AnimatedSwitcher( - key: key, - duration: const Duration(milliseconds: 200), - switchInCurve: Curves.easeInOut, - switchOutCurve: Curves.easeInOut, - child: child, - ); + key: key, + duration: const Duration(milliseconds: 200), + switchInCurve: Curves.easeInOut, + switchOutCurve: Curves.easeInOut, + child: child, + ); } } - name: Add lib/src/shared/views/views.dart @@ -4225,21 +4156,22 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import '../providers/providers.dart'; - + class BrightnessToggle extends StatelessWidget { const BrightnessToggle({super.key}); - + @override Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; return IconButton( - icon: Theme.of(context).brightness == Brightness.light - ? const Icon(Icons.brightness_3) - : const Icon(Icons.brightness_7), + icon: + Theme.of(context).brightness == Brightness.light + ? const Icon(Icons.brightness_3) + : const Icon(Icons.brightness_7), onPressed: () { final themeProvider = ThemeProvider.of(context); final settings = themeProvider.settings.value; @@ -4258,20 +4190,20 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; - + import '../classes/classes.dart'; import '../providers/providers.dart'; import 'views.dart'; - + class Events extends StatelessWidget { const Events({super.key, required this.artist, required this.constraints}); - + final Artist artist; final BoxConstraints constraints; - + @override Widget build(BuildContext context) { final theme = ThemeProvider.of(context); @@ -4281,43 +4213,18 @@ steps: child: DataTable( horizontalMargin: 5.0, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], rows: [ for (final event in artist.events) DataRow( cells: [ - DataCell( - Text(event.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(event.title)), - ]), - ), - DataCell( - Text(event.location), - ), + DataCell(Text(event.date)), + DataCell(Row(children: [Expanded(child: Text(event.title))])), + DataCell(Text(event.location)), DataCell( Clickable( child: Text( @@ -4327,8 +4234,9 @@ steps: decoration: TextDecoration.underline, ), ), - onTap: () => - launchUrl(Uri.parse('https://docs.flutter.dev')), + onTap: + () => + launchUrl(Uri.parse('https://docs.flutter.dev')), ), ), ], @@ -4342,7 +4250,7 @@ steps: children: artist.events.map((e) => buildTile(context, e)).toList(), ); } - + Widget buildTile(BuildContext context, Event event) { final dateParts = event.date.split('/'); final colors = Theme.of(context).colorScheme; @@ -4428,9 +4336,10 @@ steps: cursor: isHovered ? SystemMouseCursors.click : MouseCursor.defer, onEnter: (_) => setMaterialState(WidgetState.hovered, true), onExit: (_) => setMaterialState(WidgetState.hovered, false), - child: widget.mode == HoverMode.replace - ? _buildReplaceableChildren() - : _buildChildrenStack(), + child: + widget.mode == HoverMode.replace + ? _buildReplaceableChildren() + : _buildChildrenStack(), ), ); } @@ -4438,12 +4347,7 @@ steps: Widget _buildChildrenStack() { Widget child = isHovered ? Opacity(opacity: 0.2, child: widget.child) : widget.child; - return Stack( - children: [ - child, - if (isHovered) widget.hoverChild, - ], - ); + return Stack(children: [child, if (isHovered) widget.hoverChild]); } Widget _buildReplaceableChildren() => @@ -4457,20 +4361,20 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import '../classes/classes.dart'; import '../extensions.dart'; import '../providers/providers.dart'; import 'image_clipper.dart'; - + final playlistProvider = PlaylistsProvider(); final playlists = playlistProvider.playlists; - + class SideBar extends StatelessWidget { const SideBar({super.key}); - + @override Widget build(BuildContext context) { return SizedBox( @@ -4482,10 +4386,7 @@ steps: title: const Text('Home'), onTap: () => GoRouter.of(context).go('/'), ), - const ListTile( - leading: Icon(Icons.search), - title: Text('Search'), - ), + const ListTile(leading: Icon(Icons.search), title: Text('Search')), ListTile( leading: const Icon(Icons.person), title: const Text('Artists'), @@ -4506,10 +4407,10 @@ steps: ); } } - + class PlaylistNav extends StatelessWidget { const PlaylistNav({super.key}); - + @override Widget build(BuildContext context) { final colors = context.theme.colorScheme; @@ -4520,10 +4421,7 @@ steps: children: [ Padding( padding: const EdgeInsets.only(left: 16, top: 16), - child: Text( - 'Playlists', - style: context.titleMedium, - ), + child: Text('Playlists', style: context.titleMedium), ), Expanded( child: ListView( @@ -4547,35 +4445,34 @@ steps: ); } } - + class _PlaylistNavItem extends StatefulWidget { const _PlaylistNavItem({ required this.image, required this.playlistId, required this.title, }); - + final String image; final String playlistId; final String title; - + @override State<_PlaylistNavItem> createState() => _PlaylistNavItemState(); } - + class _PlaylistNavItemState extends State<_PlaylistNavItem> { bool _isSelected = false; late final FocusNode _focusNode; - + @override void initState() { super.initState(); - _focusNode = FocusNode(debugLabel: widget.title) - ..addListener(() { - setState(() => _isSelected = _focusNode.hasPrimaryFocus); - }); + _focusNode = FocusNode(debugLabel: widget.title)..addListener(() { + setState(() => _isSelected = _focusNode.hasPrimaryFocus); + }); } - + @override Widget build(BuildContext context) { return ListTile( @@ -4602,63 +4499,67 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:dynamic_color/dynamic_color.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - + import 'playback/bloc/bloc.dart'; import 'providers/theme.dart'; import 'router.dart'; import 'views/views.dart'; - + class MyApp extends StatefulWidget { const MyApp({super.key}); - + @override State createState() => _MyAppState(); } - + class _MyAppState extends State { - final settings = ValueNotifier(ThemeSettings( - sourceColor: Colors.pink, // Replace this color - themeMode: ThemeMode.system, - )); + final settings = ValueNotifier( + ThemeSettings( + sourceColor: Colors.pink, // Replace this color + themeMode: ThemeMode.system, + ), + ); @override Widget build(BuildContext context) { return BlocProvider( create: (context) => PlaybackBloc(), child: DynamicColorBuilder( - builder: (lightDynamic, darkDynamic) => ThemeProvider( - lightDynamic: lightDynamic, - darkDynamic: darkDynamic, - settings: settings, - child: NotificationListener( - onNotification: (notification) { - settings.value = notification.settings; - return true; - }, - child: ValueListenableBuilder( - valueListenable: settings, - builder: (context, value, _) { - // Create theme instance - return MaterialApp.router( - debugShowCheckedModeBanner: false, - title: 'Flutter Demo', - // Add theme - // Add dark theme - // Add theme mode - routeInformationParser: appRouter.routeInformationParser, - routeInformationProvider: - appRouter.routeInformationProvider, - routerDelegate: appRouter.routerDelegate, - builder: (context, child) { - return PlayPauseListener(child: child!); - }, - ); + builder: + (lightDynamic, darkDynamic) => ThemeProvider( + lightDynamic: lightDynamic, + darkDynamic: darkDynamic, + settings: settings, + child: NotificationListener( + onNotification: (notification) { + settings.value = notification.settings; + return true; }, + child: ValueListenableBuilder( + valueListenable: settings, + builder: (context, value, _) { + // Create theme instance + return MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + // Add theme + // Add dark theme + // Add theme mode + routeInformationParser: appRouter.routeInformationParser, + routeInformationProvider: + appRouter.routeInformationProvider, + routerDelegate: appRouter.routerDelegate, + builder: (context, child) { + return PlayPauseListener(child: child!); + }, + ); + }, + ), ), - )), + ), ), ); } @@ -73283,36 +73184,15 @@ steps: /ven/GIf8SbPFObFX1/Q+BzUPgc8gZsVfb/lj/j6+af8bZIM8AZsVff+EvmX/eOL/jKP+ItnhrNir6/o fA5qHwOeQM2Kvs/RK/pSDbs//ETkwzwBmxV9/wCBtQ/3guf+MT/8ROeCc2Kvr8A0GxzUPgc8gZsVfYAB qNj1zZ4/zYq//9k= - - name: Patch android/settings.gradle - path: myartist/android/settings.gradle - patch-u: | - --- b/boring_to_beautiful/step_01/android/settings.gradle - +++ a/boring_to_beautiful/step_01/android/settings.gradle - @@ -18,7 +18,7 @@ pluginManagement { - - plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - - id "com.android.application" version "8.1.0" apply false - + id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false - } - - name: Patch android/gradle/wrapper/gradle-wrapper.properties - path: myartist/android/gradle/wrapper/gradle-wrapper.properties - patch-u: | - --- b/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties - +++ a/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties - @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME - distributionPath=wrapper/dists - zipStoreBase=GRADLE_USER_HOME - zipStorePath=wrapper/dists - -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip - +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip - name: flutter doctor path: myartist flutter: doctor - name: flutter pub run build_runner path: myartist flutter: pub run build_runner build + - name: Format generated file + path: myartist + dart: format ./lib/src/shared/playback/bloc/playback_bloc.freezed.dart - name: Build iOS simulator bundle platforms: [ macos ] path: myartist @@ -73351,14 +73231,16 @@ steps: patch-u: | --- b/boring_to_beautiful/step_02/lib/src/shared/router.dart +++ a/boring_to_beautiful/step_02/lib/src/shared/router.dart - @@ -22,17 +22,17 @@ final playlistsProvider = PlaylistsProvider(); + @@ -20,19 +20,15 @@ final artistsProvider = ArtistsProvider(); + final playlistsProvider = PlaylistsProvider(); + const List destinations = [ - NavigationDestination( - label: 'Home', + - NavigationDestination( + - label: 'Home', - icon: Icon(Icons.arrow_right_rounded), // Modify this line - + icon: Icon(Icons.home), - route: '/', - ), + - route: '/', + - ), + + NavigationDestination(label: 'Home', icon: Icon(Icons.home), route: '/'), NavigationDestination( label: 'Playlists', - icon: Icon(Icons.arrow_right_rounded), // Modify this line @@ -73391,7 +73273,9 @@ steps: patch-u: | --- b/boring_to_beautiful/step_03/lib/src/shared/extensions.dart +++ a/boring_to_beautiful/step_03/lib/src/shared/extensions.dart - @@ -5,9 +5,9 @@ + @@ -3,11 +3,11 @@ + // found in the LICENSE file. + import 'package:flutter/material.dart'; -// Add Google Fonts Package import +import 'package:google_fonts/google_fonts.dart'; @@ -73401,8 +73285,8 @@ steps: - TextTheme get textTheme => theme.textTheme; // Modify this line + TextTheme get textTheme => GoogleFonts.montserratTextTheme(theme.textTheme); ColorScheme get colors => theme.colorScheme; - TextStyle? get displayLarge => textTheme.displayLarge?.copyWith( - color: colors.onSurface, + TextStyle? get displayLarge => + textTheme.displayLarge?.copyWith(color: colors.onSurface); - name: dart analyze path: myartist dart: analyze --fatal-infos @@ -73419,41 +73303,44 @@ steps: patch-u: | --- b/boring_to_beautiful/step_04/lib/src/shared/app.dart +++ a/boring_to_beautiful/step_04/lib/src/shared/app.dart - @@ -20,7 +20,7 @@ class MyApp extends StatefulWidget { + @@ -20,10 +20,7 @@ class MyApp extends StatefulWidget { class _MyAppState extends State { - final settings = ValueNotifier(ThemeSettings( - - sourceColor: Colors.pink, // Replace this color - + sourceColor: Colors.pink, - themeMode: ThemeMode.system, - )); + final settings = ValueNotifier( + - ThemeSettings( + - sourceColor: Colors.pink, // Replace this color + - themeMode: ThemeMode.system, + - ), + + ThemeSettings(sourceColor: Colors.pink, themeMode: ThemeMode.system), + ); @override - @@ -40,13 +40,13 @@ class _MyAppState extends State { - child: ValueListenableBuilder( - valueListenable: settings, - builder: (context, value, _) { - - // Create theme instance - + final theme = ThemeProvider.of(context); - return MaterialApp.router( - debugShowCheckedModeBanner: false, - title: 'Flutter Demo', - - // Add theme - - // Add dark theme - - // Add theme mode - + theme: theme.light(settings.value.sourceColor), - + darkTheme: theme.dark(settings.value.sourceColor), - + themeMode: theme.themeMode(), - routeInformationParser: appRouter.routeInformationParser, - routeInformationProvider: - appRouter.routeInformationProvider, + Widget build(BuildContext context) { + @@ -43,13 +40,13 @@ class _MyAppState extends State { + child: ValueListenableBuilder( + valueListenable: settings, + builder: (context, value, _) { + - // Create theme instance + + final theme = ThemeProvider.of(context); + return MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + - // Add theme + - // Add dark theme + - // Add theme mode + + theme: theme.light(settings.value.sourceColor), + + darkTheme: theme.dark(settings.value.sourceColor), + + themeMode: theme.themeMode(), + routeInformationParser: appRouter.routeInformationParser, + routeInformationProvider: + appRouter.routeInformationProvider, - name: Patch lib/src/shared/views/outlined_card.dart path: myartist/lib/src/shared/views/outlined_card.dart patch-u: | --- b/boring_to_beautiful/step_04/lib/src/shared/views/outlined_card.dart +++ a/boring_to_beautiful/step_04/lib/src/shared/views/outlined_card.dart - @@ -26,7 +26,12 @@ class _OutlinedCardState extends State { - ? SystemMouseCursors.click - : SystemMouseCursors.basic, + @@ -23,7 +23,12 @@ class _OutlinedCardState extends State { + ? SystemMouseCursors.click + : SystemMouseCursors.basic, child: Container( - // Add box decoration here + decoration: BoxDecoration( @@ -73481,7 +73368,7 @@ steps: patch-u: | --- b/boring_to_beautiful/step_05/lib/src/features/home/view/home_screen.dart +++ a/boring_to_beautiful/step_05/lib/src/features/home/view/home_screen.dart - @@ -30,8 +30,56 @@ class _HomeScreenState extends State { + @@ -30,8 +30,54 @@ class _HomeScreenState extends State { final List artists = artistsProvider.artists; return LayoutBuilder( builder: (context, constraints) { @@ -73506,33 +73393,31 @@ steps: + ), + ), + body: LayoutBuilder( - + builder: (context, constraints) => TabBarView( - + children: [ - + SingleChildScrollView( - + child: Column( - + children: [ - + const HomeHighlight(), - + HomeArtists( - + artists: artists, - + constraints: constraints, + + builder: + + (context, constraints) => TabBarView( + + children: [ + + SingleChildScrollView( + + child: Column( + + children: [ + + const HomeHighlight(), + + HomeArtists( + + artists: artists, + + constraints: constraints, + + ), + + ], + ), - + ], - + ), - + ), - + HomeRecent( - + playlists: playlists, - + axis: Axis.vertical, - + ), - + PlaylistSongs( - + playlist: topSongs, - + constraints: constraints, - + ), - + PlaylistSongs( - + playlist: newReleases, - + constraints: constraints, + + ), + + HomeRecent(playlists: playlists, axis: Axis.vertical), + + PlaylistSongs( + + playlist: topSongs, + + constraints: constraints, + + ), + + PlaylistSongs( + + playlist: newReleases, + + constraints: constraints, + + ), + + ], + ), - + ], - + ), + ), + ), + ); @@ -73545,7 +73430,7 @@ steps: patch-u: | --- b/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_navigation.dart +++ a/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_navigation.dart - @@ -23,29 +23,36 @@ class AdaptiveNavigation extends StatelessWidget { + @@ -23,32 +23,39 @@ class AdaptiveNavigation extends StatelessWidget { return LayoutBuilder( builder: (context, dimens) { // Tablet Layout @@ -73557,12 +73442,15 @@ steps: + NavigationRail( + extended: dimens.maxWidth >= 800, + minExtendedWidth: 180, - + destinations: destinations - + .map((e) => NavigationRailDestination( - + icon: e.icon, - + label: Text(e.label), - + )) - + .toList(), + + destinations: + + destinations + + .map( + + (e) => NavigationRailDestination( + + icon: e.icon, + + label: Text(e.label), + + ), + + ) + + .toList(), + selectedIndex: selectedIndex, + onDestinationSelected: onDestinationSelected, + ), @@ -73578,12 +73466,15 @@ steps: - NavigationRail( - extended: dimens.maxWidth >= 800, - minExtendedWidth: 180, - - destinations: destinations - - .map((e) => NavigationRailDestination( - - icon: e.icon, - - label: Text(e.label), - - )) - - .toList(), + - destinations: + - destinations + - .map( + - (e) => NavigationRailDestination( + - icon: e.icon, + - label: Text(e.label), + - ), + - ) + - .toList(), - selectedIndex: selectedIndex, - onDestinationSelected: onDestinationSelected, - ), @@ -73632,7 +73523,7 @@ steps: patch-u: | --- b/boring_to_beautiful/step_06/lib/src/features/home/view/home_screen.dart +++ a/boring_to_beautiful/step_06/lib/src/features/home/view/home_screen.dart - @@ -87,7 +87,7 @@ class _HomeScreenState extends State { + @@ -85,7 +85,7 @@ class _HomeScreenState extends State { AdaptiveContainer( columnSpan: 12, child: Padding( @@ -73641,7 +73532,7 @@ steps: child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - @@ -123,7 +123,10 @@ class _HomeScreenState extends State { + @@ -122,7 +122,10 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( @@ -73653,7 +73544,7 @@ steps: child: Text( 'Recently played', style: context.headlineSmall, - @@ -138,7 +141,7 @@ class _HomeScreenState extends State { + @@ -135,7 +138,7 @@ class _HomeScreenState extends State { AdaptiveContainer( columnSpan: 12, child: Padding( @@ -73662,16 +73553,21 @@ steps: child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - @@ -150,7 +153,7 @@ class _HomeScreenState extends State { + @@ -146,9 +149,10 @@ class _HomeScreenState extends State { + crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - - const EdgeInsets.all(2), // Modify this line - + const EdgeInsets.only(left: 8, bottom: 8), + - padding: const EdgeInsets.all( + - 2, + - ), // Modify this line + + padding: const EdgeInsets.only( + + left: 8, + + bottom: 8, + + ), child: Text( 'Top Songs Today', style: context.titleLarge, - @@ -166,7 +169,7 @@ class _HomeScreenState extends State { + @@ -164,7 +168,7 @@ class _HomeScreenState extends State { ], ), ), @@ -73680,12 +73576,17 @@ steps: Flexible( flex: 10, child: Column( - @@ -175,7 +178,7 @@ class _HomeScreenState extends State { + @@ -172,9 +176,10 @@ class _HomeScreenState extends State { + crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - - const EdgeInsets.all(2), // Modify this line - + const EdgeInsets.only(left: 8, bottom: 8), + - padding: const EdgeInsets.all( + - 2, + - ), // Modify this line + + padding: const EdgeInsets.only( + + left: 8, + + bottom: 8, + + ), child: Text( 'New Releases', style: context.titleLarge, @@ -73705,7 +73606,7 @@ steps: patch-u: | --- b/boring_to_beautiful/step_07/lib/src/shared/providers/theme.dart +++ a/boring_to_beautiful/step_07/lib/src/shared/providers/theme.dart - @@ -154,7 +154,7 @@ class ThemeProvider extends InheritedWidget { + @@ -146,7 +146,7 @@ class ThemeProvider extends InheritedWidget { ThemeData light([Color? targetColor]) { final colorScheme = colors(Brightness.light, targetColor); return ThemeData.light().copyWith( @@ -73714,7 +73615,7 @@ steps: colorScheme: colorScheme, appBarTheme: appBarTheme(colorScheme), cardTheme: cardTheme(), - @@ -171,7 +171,7 @@ class ThemeProvider extends InheritedWidget { + @@ -163,7 +163,7 @@ class ThemeProvider extends InheritedWidget { ThemeData dark([Color? targetColor]) { final colorScheme = colors(Brightness.dark, targetColor); return ThemeData.dark().copyWith( @@ -73739,32 +73640,32 @@ steps: patch-u: | --- b/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_songs.dart +++ a/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_songs.dart - @@ -44,11 +44,14 @@ class PlaylistSongs extends StatelessWidget { - index: index, - cells: [ - DataCell( - - // Add HoverableSongPlayButton - - Center( - - child: Text( - - (index + 1).toString(), - - textAlign: TextAlign.center, - + HoverableSongPlayButton( - + hoverMode: HoverMode.overlay, - + song: playlist.songs[index], - + child: Center( - + child: Text( - + (index + 1).toString(), - + textAlign: TextAlign.center, - + ), + @@ -43,11 +43,14 @@ class PlaylistSongs extends StatelessWidget { + index: index, + cells: [ + DataCell( + - // Add HoverableSongPlayButton + - Center( + - child: Text( + - (index + 1).toString(), + - textAlign: TextAlign.center, + + HoverableSongPlayButton( + + hoverMode: HoverMode.overlay, + + song: playlist.songs[index], + + child: Center( + + child: Text( + + (index + 1).toString(), + + textAlign: TextAlign.center, + + ), + ), + ), ), - ), - ), - name: Patch lib/src/shared/views/outlined_card.dart path: myartist/lib/src/shared/views/outlined_card.dart patch-u: | --- b/boring_to_beautiful/final/lib/src/shared/views/outlined_card.dart +++ a/boring_to_beautiful/final/lib/src/shared/views/outlined_card.dart - @@ -19,20 +19,55 @@ class OutlinedCard extends StatefulWidget { + @@ -15,21 +15,57 @@ class OutlinedCard extends StatefulWidget { } class _OutlinedCardState extends State { @@ -73787,9 +73688,10 @@ steps: + _hovered = false; + }); + }, - cursor: widget.clickable - ? SystemMouseCursors.click - : SystemMouseCursors.basic, + cursor: + widget.clickable + ? SystemMouseCursors.click + : SystemMouseCursors.basic, - child: Container( + child: AnimatedContainer( + duration: kThemeAnimationDuration, @@ -73802,20 +73704,21 @@ steps: + borderRadius: borderRadius, + ), + foregroundDecoration: BoxDecoration( - + color: Theme.of(context).colorScheme.onSurface.withAlpha( - + _hovered ? 30 : 0, - + ), + + color: Theme.of( + + context, + + ).colorScheme.onSurface.withAlpha(_hovered ? 30 : 0), + borderRadius: borderRadius, + ), + child: TweenAnimationBuilder( + duration: kThemeAnimationDuration, + curve: animationCurve, + tween: Tween(begin: BorderRadius.zero, end: borderRadius), - + builder: (context, borderRadius, child) => ClipRRect( - + clipBehavior: Clip.antiAlias, - + borderRadius: borderRadius, - + child: child, - + ), + + builder: + + (context, borderRadius, child) => ClipRRect( + + clipBehavior: Clip.antiAlias, + + borderRadius: borderRadius, + + child: child, + + ), + child: widget.child, ), - child: widget.child, diff --git a/boring_to_beautiful/final/android/.gitignore b/boring_to_beautiful/final/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/boring_to_beautiful/final/android/.gitignore +++ b/boring_to_beautiful/final/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/boring_to_beautiful/final/android/app/build.gradle b/boring_to_beautiful/final/android/app/build.gradle deleted file mode 100644 index 59485b6bb8..0000000000 --- a/boring_to_beautiful/final/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.myartist" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.myartist" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/boring_to_beautiful/final/android/app/build.gradle.kts b/boring_to_beautiful/final/android/app/build.gradle.kts new file mode 100644 index 0000000000..b2dbe0393c --- /dev/null +++ b/boring_to_beautiful/final/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.myartist" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.myartist" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/boring_to_beautiful/final/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt b/boring_to_beautiful/final/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt index 1e328c8556..b724a01056 100644 --- a/boring_to_beautiful/final/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt +++ b/boring_to_beautiful/final/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.myartist import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/boring_to_beautiful/final/android/build.gradle b/boring_to_beautiful/final/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/boring_to_beautiful/final/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/boring_to_beautiful/final/android/build.gradle.kts b/boring_to_beautiful/final/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/boring_to_beautiful/final/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/boring_to_beautiful/final/android/gradle.properties b/boring_to_beautiful/final/android/gradle.properties index 2597170821..f018a61817 100644 --- a/boring_to_beautiful/final/android/gradle.properties +++ b/boring_to_beautiful/final/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/boring_to_beautiful/final/android/gradle/wrapper/gradle-wrapper.properties b/boring_to_beautiful/final/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/boring_to_beautiful/final/android/gradle/wrapper/gradle-wrapper.properties +++ b/boring_to_beautiful/final/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/boring_to_beautiful/final/android/settings.gradle b/boring_to_beautiful/final/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/boring_to_beautiful/final/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/boring_to_beautiful/final/android/settings.gradle.kts b/boring_to_beautiful/final/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/boring_to_beautiful/final/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/boring_to_beautiful/final/ios/Podfile b/boring_to_beautiful/final/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/boring_to_beautiful/final/ios/Podfile +++ b/boring_to_beautiful/final/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/final/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/final/ios/Runner.xcodeproj/project.pbxproj index f7d849e7aa..b4912290dd 100644 --- a/boring_to_beautiful/final/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/final/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */; }; - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */; }; + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,15 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +60,19 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 85CFC060D2B515FA7FCB18AC /* Frameworks */ = { + 6171884CE7EC0B228274CDFE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */, + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */, + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 54241974C43F645BC41820B3 /* Pods */ = { + 4CD80B4456D2B04197B640AC /* Pods */ = { isa = PBXGroup; children = ( - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */, - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */, - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */, - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */, - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */, - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */, + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */, + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */, + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */, + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */, + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */, + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 54241974C43F645BC41820B3 /* Pods */, - DA6AE8ED33598C40BFC9FCAD /* Frameworks */, + 4CD80B4456D2B04197B640AC /* Pods */, + C4E673F63230E3A6805B11E9 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - DA6AE8ED33598C40BFC9FCAD /* Frameworks */ = { + C4E673F63230E3A6805B11E9 /* Frameworks */ = { isa = PBXGroup; children = ( - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */, - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */, + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */, + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */, + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 85CFC060D2B515FA7FCB18AC /* Frameworks */, + 6171884CE7EC0B228274CDFE /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */, + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */, + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,43 +270,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -323,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */ = { + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,7 +340,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */ = { + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/boring_to_beautiful/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/final/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artist_bio.dart b/boring_to_beautiful/final/lib/src/features/artists/view/artist_bio.dart index 227b8e91f9..8b614421db 100644 --- a/boring_to_beautiful/final/lib/src/features/artists/view/artist_bio.dart +++ b/boring_to_beautiful/final/lib/src/features/artists/view/artist_bio.dart @@ -18,9 +18,7 @@ class ArtistBio extends StatelessWidget { artist.bio, style: context.bodyLarge!.copyWith( fontSize: 16, - color: context.colors.onSurface.withAlpha( - 222, - ), + color: context.colors.onSurface.withAlpha(222), ), ); } diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artist_card.dart b/boring_to_beautiful/final/lib/src/features/artists/view/artist_card.dart index a63967f51d..1a56376a87 100644 --- a/boring_to_beautiful/final/lib/src/features/artists/view/artist_card.dart +++ b/boring_to_beautiful/final/lib/src/features/artists/view/artist_card.dart @@ -11,10 +11,7 @@ import '../../../shared/views/outlined_card.dart'; import '../../../shared/views/views.dart'; class ArtistCard extends StatelessWidget { - const ArtistCard({ - super.key, - required this.artist, - }); + const ArtistCard({super.key, required this.artist}); final Artist artist; @@ -24,65 +21,66 @@ class ArtistCard extends StatelessWidget { return OutlinedCard( child: LayoutBuilder( - builder: (context, dimens) => Row( - children: [ - SizedBox( - width: dimens.maxWidth * 0.4, - child: Image.asset( - artist.image.image, - fit: BoxFit.cover, - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - artist.name, - style: context.titleMedium, - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - const SizedBox(height: 10), - Text( - artist.bio, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 3, - ), - ]), - ), - if (dimens.maxHeight > 100) - Row( - children: [ - HoverableSongPlayButton( - size: const Size(50, 50), - song: nowPlaying, - child: Icon(Icons.play_circle, - color: context.colors.tertiary), + builder: + (context, dimens) => Row( + children: [ + SizedBox( + width: dimens.maxWidth * 0.4, + child: Image.asset(artist.image.image, fit: BoxFit.cover), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + artist.name, + style: context.titleMedium, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + const SizedBox(height: 10), + Text( + artist.bio, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 3, + ), + ], ), - Text( - nowPlaying.title, - maxLines: 1, - overflow: TextOverflow.clip, - style: context.labelMedium, + ), + if (dimens.maxHeight > 100) + Row( + children: [ + HoverableSongPlayButton( + size: const Size(50, 50), + song: nowPlaying, + child: Icon( + Icons.play_circle, + color: context.colors.tertiary, + ), + ), + Text( + nowPlaying.title, + maxLines: 1, + overflow: TextOverflow.clip, + style: context.labelMedium, + ), + ], ), - ], - ), - ], + ], + ), + ), ), - ), + ], ), - ], - ), ), ); } diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artist_events.dart b/boring_to_beautiful/final/lib/src/features/artists/view/artist_events.dart index 8b064759c6..58b61b37df 100644 --- a/boring_to_beautiful/final/lib/src/features/artists/view/artist_events.dart +++ b/boring_to_beautiful/final/lib/src/features/artists/view/artist_events.dart @@ -70,53 +70,32 @@ class ArtistEvents extends StatelessWidget { ); }, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], - rowBuilder: (item, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - Text(item.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(item.title)), - ]), - ), - DataCell( - Text(item.location), - ), - DataCell( - Clickable( - child: Text( - item.link, - style: TextStyle( - color: linkColor.value(theme), - decoration: TextDecoration.underline, + rowBuilder: + (item, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell(Text(item.date)), + DataCell(Row(children: [Expanded(child: Text(item.title))])), + DataCell(Text(item.location)), + DataCell( + Clickable( + child: Text( + item.link, + style: TextStyle( + color: linkColor.value(theme), + decoration: TextDecoration.underline, + ), + ), + onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ), ), - ), - onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ], ), - ), - ]), ); } } diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artist_ranked_songs.dart b/boring_to_beautiful/final/lib/src/features/artists/view/artist_ranked_songs.dart index e484ecb3d7..3d1f4e2cf1 100644 --- a/boring_to_beautiful/final/lib/src/features/artists/view/artist_ranked_songs.dart +++ b/boring_to_beautiful/final/lib/src/features/artists/view/artist_ranked_songs.dart @@ -27,52 +27,42 @@ class ArtistRankedSongs extends StatelessWidget { title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), trailing: Text(song.ranking.toString()), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ); }, columns: const [ - DataColumn( - label: Text( - 'Ranking', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Title', - ), - ), - DataColumn( - label: Text( - 'Length', - ), - ), + DataColumn(label: Text('Ranking'), numeric: true), + DataColumn(label: Text('Title')), + DataColumn(label: Text('Length')), ], - rowBuilder: (song, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - HoverableSongPlayButton( - song: song, - child: Center( - child: Text(song.ranking.toString()), - ), + rowBuilder: + (song, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + HoverableSongPlayButton( + song: song, + child: Center(child: Text(song.ranking.toString())), + ), + ), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(song.image.image), + ), + const SizedBox(width: 5.0), + Expanded(child: Text(song.title)), + ], + ), + ), + DataCell(Text(song.length.toHumanizedString())), + ], ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(song.image.image), - ), - const SizedBox(width: 5.0), - Expanded(child: Text(song.title)), - ]), - ), - DataCell( - Text(song.length.toHumanizedString()), - ), - ]), ); } } diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artist_updates.dart b/boring_to_beautiful/final/lib/src/features/artists/view/artist_updates.dart index e5b8bb5fe9..a0fabf7330 100644 --- a/boring_to_beautiful/final/lib/src/features/artists/view/artist_updates.dart +++ b/boring_to_beautiful/final/lib/src/features/artists/view/artist_updates.dart @@ -30,7 +30,7 @@ class ArtistUpdates extends StatelessWidget { child: Text(update), ), ), - ) + ), ], ); } diff --git a/boring_to_beautiful/final/lib/src/features/artists/view/artists_screen.dart b/boring_to_beautiful/final/lib/src/features/artists/view/artists_screen.dart index 8afe759807..225d74847b 100644 --- a/boring_to_beautiful/final/lib/src/features/artists/view/artists_screen.dart +++ b/boring_to_beautiful/final/lib/src/features/artists/view/artists_screen.dart @@ -17,33 +17,33 @@ class ArtistsScreen extends StatelessWidget { Widget build(BuildContext context) { final artistsProvider = ArtistsProvider(); final artists = artistsProvider.artists; - return LayoutBuilder(builder: (context, constraints) { - return Scaffold( - primary: false, - appBar: AppBar( - title: const Text('ARTISTS'), - toolbarHeight: kToolbarHeight * 2, - ), - body: GridView.builder( - padding: const EdgeInsets.all(15), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), - childAspectRatio: 2.5, - mainAxisSpacing: 10, - crossAxisSpacing: 10, + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + primary: false, + appBar: AppBar( + title: const Text('ARTISTS'), + toolbarHeight: kToolbarHeight * 2, ), - itemCount: artists.length, - itemBuilder: (context, index) { - final artist = artists[index]; - return GestureDetector( - child: ArtistCard( - artist: artist, - ), - onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), - ); - }, - ), - ); - }); + body: GridView.builder( + padding: const EdgeInsets.all(15), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), + childAspectRatio: 2.5, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + ), + itemCount: artists.length, + itemBuilder: (context, index) { + final artist = artists[index]; + return GestureDetector( + child: ArtistCard(artist: artist), + onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), + ); + }, + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/final/lib/src/features/home/view/home_artists.dart b/boring_to_beautiful/final/lib/src/features/home/view/home_artists.dart index beb2c0ece4..b5a3a33ecd 100644 --- a/boring_to_beautiful/final/lib/src/features/home/view/home_artists.dart +++ b/boring_to_beautiful/final/lib/src/features/home/view/home_artists.dart @@ -22,27 +22,25 @@ class HomeArtists extends StatelessWidget { Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(15), - child: constraints.isMobile - ? Column( - children: [ - for (final artist in artists) buildTile(context, artist), - ], - ) - : Row(children: [ - for (final artist in artists) - Flexible( - flex: 1, - child: buildTile(context, artist), - ), - ]), + child: + constraints.isMobile + ? Column( + children: [ + for (final artist in artists) buildTile(context, artist), + ], + ) + : Row( + children: [ + for (final artist in artists) + Flexible(flex: 1, child: buildTile(context, artist)), + ], + ), ); } Widget buildTile(BuildContext context, Artist artist) { return ListTile( - leading: CircleAvatar( - backgroundImage: AssetImage(artist.image.image), - ), + leading: CircleAvatar(backgroundImage: AssetImage(artist.image.image)), title: Text( artist.updates.first, maxLines: 2, diff --git a/boring_to_beautiful/final/lib/src/features/home/view/home_recent.dart b/boring_to_beautiful/final/lib/src/features/home/view/home_recent.dart index c77500a663..8ba86d117d 100644 --- a/boring_to_beautiful/final/lib/src/features/home/view/home_recent.dart +++ b/boring_to_beautiful/final/lib/src/features/home/view/home_recent.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/outlined_card.dart'; class HomeRecent extends StatelessWidget { - const HomeRecent( - {super.key, required this.playlists, this.axis = Axis.horizontal}); + const HomeRecent({ + super.key, + required this.playlists, + this.axis = Axis.horizontal, + }); final List playlists; final Axis axis; @@ -43,8 +46,10 @@ class HomeRecent extends StatelessWidget { Row( children: [ Expanded( - child: Image.asset(playlist.cover.image, - fit: BoxFit.cover), + child: Image.asset( + playlist.cover.image, + fit: BoxFit.cover, + ), ), ], ), @@ -79,10 +84,7 @@ class HomeRecent extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ - ClippedImage( - playlist.cover.image, - height: 200, - ), + ClippedImage(playlist.cover.image, height: 200), Expanded( child: Center( child: Padding( @@ -104,23 +106,24 @@ class HomeRecent extends StatelessWidget { return Column( children: [ Padding( - padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), - child: Text( - playlist.title, - style: context.titleSmall!.copyWith( - fontWeight: FontWeight.bold, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - textAlign: TextAlign.center, - )), + padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), + child: Text( + playlist.title, + style: context.titleSmall!.copyWith(fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, + textAlign: TextAlign.center, + ), + ), Padding( padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text(playlist.description, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center), + child: Text( + playlist.description, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), ), ], ); diff --git a/boring_to_beautiful/final/lib/src/features/home/view/home_screen.dart b/boring_to_beautiful/final/lib/src/features/home/view/home_screen.dart index a763bbd45a..c142c1e4c2 100644 --- a/boring_to_beautiful/final/lib/src/features/home/view/home_screen.dart +++ b/boring_to_beautiful/final/lib/src/features/home/view/home_screen.dart @@ -49,33 +49,31 @@ class _HomeScreenState extends State { ), ), body: LayoutBuilder( - builder: (context, constraints) => TabBarView( - children: [ - SingleChildScrollView( - child: Column( - children: [ - const HomeHighlight(), - HomeArtists( - artists: artists, - constraints: constraints, + builder: + (context, constraints) => TabBarView( + children: [ + SingleChildScrollView( + child: Column( + children: [ + const HomeHighlight(), + HomeArtists( + artists: artists, + constraints: constraints, + ), + ], ), - ], - ), - ), - HomeRecent( - playlists: playlists, - axis: Axis.vertical, - ), - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), - PlaylistSongs( - playlist: newReleases, - constraints: constraints, + ), + HomeRecent(playlists: playlists, axis: Axis.vertical), + PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), + PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), + ], ), - ], - ), ), ), ); @@ -109,10 +107,11 @@ class _HomeScreenState extends State { children: [ const HomeHighlight(), LayoutBuilder( - builder: (context, constraints) => HomeArtists( - artists: artists, - constraints: constraints, - ), + builder: + (context, constraints) => HomeArtists( + artists: artists, + constraints: constraints, + ), ), ], ), @@ -132,9 +131,7 @@ class _HomeScreenState extends State { style: context.headlineSmall, ), ), - HomeRecent( - playlists: playlists, - ), + HomeRecent(playlists: playlists), ], ), ), @@ -152,19 +149,21 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.only(left: 8, bottom: 8), + padding: const EdgeInsets.only( + left: 8, + bottom: 8, + ), child: Text( 'Top Songs Today', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), ), ], ), @@ -177,19 +176,21 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.only(left: 8, bottom: 8), + padding: const EdgeInsets.only( + left: 8, + bottom: 8, + ), child: Text( 'New Releases', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: newReleases, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), ), ], ), diff --git a/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_home_screen.dart b/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_home_screen.dart index a80d767930..978608ccad 100644 --- a/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_home_screen.dart +++ b/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_home_screen.dart @@ -44,8 +44,10 @@ class PlaylistHomeScreen extends StatelessWidget { title: playlist.title, subtitle: playlist.description, ), - onTap: () => - GoRouter.of(context).go('/playlists/${playlist.id}'), + onTap: + () => GoRouter.of( + context, + ).go('/playlists/${playlist.id}'), ); }, ), diff --git a/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_screen.dart b/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_screen.dart index 5dc2f0744f..c41f500a92 100644 --- a/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_screen.dart +++ b/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_screen.dart @@ -20,114 +20,116 @@ class PlaylistScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - final colors = Theme.of(context).colorScheme; - final double headerHeight = constraints.isMobile - ? max(constraints.biggest.height * 0.5, 450) - : max(constraints.biggest.height * 0.25, 250); - if (constraints.isMobile) { - return Scaffold( - appBar: AppBar( - leading: BackButton( - onPressed: () => GoRouter.of(context).go('/playlists'), - ), - title: Text(playlist.title), - actions: [ - IconButton( - icon: const Icon(Icons.play_circle_fill), - onPressed: () {}, - ), - IconButton( - onPressed: () {}, - icon: const Icon(Icons.shuffle), - ), - ], - ), - body: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, - ), - ), - ); - } - return Scaffold( - body: CustomScrollView( - slivers: [ - SliverAppBar( + return LayoutBuilder( + builder: (context, constraints) { + final colors = Theme.of(context).colorScheme; + final double headerHeight = + constraints.isMobile + ? max(constraints.biggest.height * 0.5, 450) + : max(constraints.biggest.height * 0.25, 250); + if (constraints.isMobile) { + return Scaffold( + appBar: AppBar( leading: BackButton( onPressed: () => GoRouter.of(context).go('/playlists'), ), - expandedHeight: headerHeight, - pinned: false, - flexibleSpace: FlexibleSpaceBar( - background: AdaptiveImageCard( - axis: constraints.isMobile ? Axis.vertical : Axis.horizontal, - constraints: - constraints.copyWith(maxHeight: headerHeight).normalize(), - image: playlist.cover.image, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'PLAYLIST', - style: context.titleSmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.title, - style: context.displaySmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.description, - style: context.bodyLarge!.copyWith( - color: colors.onSurface.withAlpha(204), + title: Text(playlist.title), + actions: [ + IconButton( + icon: const Icon(Icons.play_circle_fill), + onPressed: () {}, + ), + IconButton(onPressed: () {}, icon: const Icon(Icons.shuffle)), + ], + ), + body: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), + ), + ); + } + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + leading: BackButton( + onPressed: () => GoRouter.of(context).go('/playlists'), + ), + expandedHeight: headerHeight, + pinned: false, + flexibleSpace: FlexibleSpaceBar( + background: AdaptiveImageCard( + axis: + constraints.isMobile ? Axis.vertical : Axis.horizontal, + constraints: + constraints + .copyWith(maxHeight: headerHeight) + .normalize(), + image: playlist.cover.image, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'PLAYLIST', + style: context.titleSmall!.copyWith( + color: colors.onSurface, + ), ), - ), - const SizedBox(height: 8), - Row( - children: [ - IconButton( - icon: Icon( - Icons.play_circle_fill, - color: colors.tertiary, - ), - onPressed: () {}, + Text( + playlist.title, + style: context.displaySmall!.copyWith( + color: colors.onSurface, ), - TextButton.icon( - onPressed: () {}, - icon: Icon( - Icons.shuffle, - color: colors.tertiary, - ), - label: Text( - 'Shuffle', - style: context.bodySmall!.copyWith( + ), + Text( + playlist.description, + style: context.bodyLarge!.copyWith( + color: colors.onSurface.withAlpha(204), + ), + ), + const SizedBox(height: 8), + Row( + children: [ + IconButton( + icon: Icon( + Icons.play_circle_fill, color: colors.tertiary, ), + onPressed: () {}, ), - ), - ], - ), - ], + TextButton.icon( + onPressed: () {}, + icon: Icon(Icons.shuffle, color: colors.tertiary), + label: Text( + 'Shuffle', + style: context.bodySmall!.copyWith( + color: colors.tertiary, + ), + ), + ), + ], + ), + ], + ), ), ), ), - ), - SliverToBoxAdapter( - child: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, + SliverToBoxAdapter( + child: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), ), ), - ), - ], - ), - ); - }); + ], + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_songs.dart b/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_songs.dart index c0d0edcbb0..4ff442d00a 100644 --- a/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_songs.dart +++ b/boring_to_beautiful/final/lib/src/features/playlists/view/playlist_songs.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/views.dart'; class PlaylistSongs extends StatelessWidget { - const PlaylistSongs( - {super.key, required this.playlist, required this.constraints}); + const PlaylistSongs({ + super.key, + required this.playlist, + required this.constraints, + }); final Playlist playlist; final BoxConstraints constraints; @@ -25,14 +28,9 @@ class PlaylistSongs extends StatelessWidget { breakpoint: 450, columns: const [ DataColumn( - label: Padding( - padding: EdgeInsets.only(left: 20), - child: Text('#'), - ), - ), - DataColumn( - label: Text('Title'), + label: Padding(padding: EdgeInsets.only(left: 20), child: Text('#')), ), + DataColumn(label: Text('Title')), DataColumn( label: Padding( padding: EdgeInsets.only(right: 10), @@ -40,41 +38,43 @@ class PlaylistSongs extends StatelessWidget { ), ), ], - rowBuilder: (context, index) => DataRow.byIndex( - index: index, - cells: [ - DataCell( - HoverableSongPlayButton( - hoverMode: HoverMode.overlay, - song: playlist.songs[index], - child: Center( - child: Text( - (index + 1).toString(), - textAlign: TextAlign.center, + rowBuilder: + (context, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + HoverableSongPlayButton( + hoverMode: HoverMode.overlay, + song: playlist.songs[index], + child: Center( + child: Text( + (index + 1).toString(), + textAlign: TextAlign.center, + ), + ), ), ), - ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(playlist.songs[index].image.image), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(playlist.songs[index].image.image), + ), + const SizedBox(width: 10), + Expanded(child: Text(playlist.songs[index].title)), + ], + ), ), - const SizedBox(width: 10), - Expanded(child: Text(playlist.songs[index].title)), - ]), + DataCell(Text(playlist.songs[index].length.toHumanizedString())), + ], ), - DataCell( - Text(playlist.songs[index].length.toHumanizedString()), - ), - ], - ), itemBuilder: (song, index) { return ListTile( - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), leading: ClippedImage(song.image.image), title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), diff --git a/boring_to_beautiful/final/lib/src/shared/app.dart b/boring_to_beautiful/final/lib/src/shared/app.dart index 3910d8f276..ed27418bd4 100644 --- a/boring_to_beautiful/final/lib/src/shared/app.dart +++ b/boring_to_beautiful/final/lib/src/shared/app.dart @@ -19,45 +19,46 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - final settings = ValueNotifier(ThemeSettings( - sourceColor: Colors.pink, - themeMode: ThemeMode.system, - )); + final settings = ValueNotifier( + ThemeSettings(sourceColor: Colors.pink, themeMode: ThemeMode.system), + ); @override Widget build(BuildContext context) { return BlocProvider( create: (context) => PlaybackBloc(), child: DynamicColorBuilder( - builder: (lightDynamic, darkDynamic) => ThemeProvider( - lightDynamic: lightDynamic, - darkDynamic: darkDynamic, - settings: settings, - child: NotificationListener( - onNotification: (notification) { - settings.value = notification.settings; - return true; - }, - child: ValueListenableBuilder( - valueListenable: settings, - builder: (context, value, _) { - final theme = ThemeProvider.of(context); - return MaterialApp.router( - debugShowCheckedModeBanner: false, - title: 'Flutter Demo', - theme: theme.light(settings.value.sourceColor), - darkTheme: theme.dark(settings.value.sourceColor), - themeMode: theme.themeMode(), - routeInformationParser: appRouter.routeInformationParser, - routeInformationProvider: - appRouter.routeInformationProvider, - routerDelegate: appRouter.routerDelegate, - builder: (context, child) { - return PlayPauseListener(child: child!); - }, - ); + builder: + (lightDynamic, darkDynamic) => ThemeProvider( + lightDynamic: lightDynamic, + darkDynamic: darkDynamic, + settings: settings, + child: NotificationListener( + onNotification: (notification) { + settings.value = notification.settings; + return true; }, + child: ValueListenableBuilder( + valueListenable: settings, + builder: (context, value, _) { + final theme = ThemeProvider.of(context); + return MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + theme: theme.light(settings.value.sourceColor), + darkTheme: theme.dark(settings.value.sourceColor), + themeMode: theme.themeMode(), + routeInformationParser: appRouter.routeInformationParser, + routeInformationProvider: + appRouter.routeInformationProvider, + routerDelegate: appRouter.routerDelegate, + builder: (context, child) { + return PlayPauseListener(child: child!); + }, + ); + }, + ), ), - )), + ), ), ); } diff --git a/boring_to_beautiful/final/lib/src/shared/classes/image.dart b/boring_to_beautiful/final/lib/src/shared/classes/image.dart index a1ef427c1d..00a6472b4a 100644 --- a/boring_to_beautiful/final/lib/src/shared/classes/image.dart +++ b/boring_to_beautiful/final/lib/src/shared/classes/image.dart @@ -3,10 +3,11 @@ // found in the LICENSE file. class MyArtistImage { - const MyArtistImage( - {required this.image, - required this.sourceName, - required this.sourceLink}); + const MyArtistImage({ + required this.image, + required this.sourceName, + required this.sourceLink, + }); final String image; final String sourceName; diff --git a/boring_to_beautiful/final/lib/src/shared/classes/playlist.dart b/boring_to_beautiful/final/lib/src/shared/classes/playlist.dart index 59899dc619..5f0225059d 100644 --- a/boring_to_beautiful/final/lib/src/shared/classes/playlist.dart +++ b/boring_to_beautiful/final/lib/src/shared/classes/playlist.dart @@ -17,8 +17,9 @@ class Playlist { this.description = '', required this.songs, this.cover = const MyArtistImage( - image: 'assets/images/record.jpeg', - sourceName: 'Adobe Stock Images', - sourceLink: ''), + image: 'assets/images/record.jpeg', + sourceName: 'Adobe Stock Images', + sourceLink: '', + ), }); } diff --git a/boring_to_beautiful/final/lib/src/shared/classes/ranked_song.dart b/boring_to_beautiful/final/lib/src/shared/classes/ranked_song.dart index 5908268c8c..2362bfae64 100644 --- a/boring_to_beautiful/final/lib/src/shared/classes/ranked_song.dart +++ b/boring_to_beautiful/final/lib/src/shared/classes/ranked_song.dart @@ -7,7 +7,11 @@ import './classes.dart'; class RankedSong extends Song { final int ranking; - const RankedSong(this.ranking, String title, Artist artist, Duration length, - MyArtistImage image) - : super(title, artist, length, image); + const RankedSong( + this.ranking, + String title, + Artist artist, + Duration length, + MyArtistImage image, + ) : super(title, artist, length, image); } diff --git a/boring_to_beautiful/final/lib/src/shared/extensions.dart b/boring_to_beautiful/final/lib/src/shared/extensions.dart index 8b7e41b988..fe65add57c 100644 --- a/boring_to_beautiful/final/lib/src/shared/extensions.dart +++ b/boring_to_beautiful/final/lib/src/shared/extensions.dart @@ -9,51 +9,36 @@ extension TypographyUtils on BuildContext { ThemeData get theme => Theme.of(this); TextTheme get textTheme => GoogleFonts.montserratTextTheme(theme.textTheme); ColorScheme get colors => theme.colorScheme; - TextStyle? get displayLarge => textTheme.displayLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displayMedium => textTheme.displayMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displaySmall => textTheme.displaySmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineLarge => textTheme.headlineLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineMedium => textTheme.headlineMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineSmall => textTheme.headlineSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleLarge => textTheme.titleLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleMedium => textTheme.titleMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleSmall => textTheme.titleSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelLarge => textTheme.labelLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelMedium => textTheme.labelMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelSmall => textTheme.labelSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyLarge => textTheme.bodyLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyMedium => textTheme.bodyMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodySmall => textTheme.bodySmall?.copyWith( - color: colors.onSurface, - ); + TextStyle? get displayLarge => + textTheme.displayLarge?.copyWith(color: colors.onSurface); + TextStyle? get displayMedium => + textTheme.displayMedium?.copyWith(color: colors.onSurface); + TextStyle? get displaySmall => + textTheme.displaySmall?.copyWith(color: colors.onSurface); + TextStyle? get headlineLarge => + textTheme.headlineLarge?.copyWith(color: colors.onSurface); + TextStyle? get headlineMedium => + textTheme.headlineMedium?.copyWith(color: colors.onSurface); + TextStyle? get headlineSmall => + textTheme.headlineSmall?.copyWith(color: colors.onSurface); + TextStyle? get titleLarge => + textTheme.titleLarge?.copyWith(color: colors.onSurface); + TextStyle? get titleMedium => + textTheme.titleMedium?.copyWith(color: colors.onSurface); + TextStyle? get titleSmall => + textTheme.titleSmall?.copyWith(color: colors.onSurface); + TextStyle? get labelLarge => + textTheme.labelLarge?.copyWith(color: colors.onSurface); + TextStyle? get labelMedium => + textTheme.labelMedium?.copyWith(color: colors.onSurface); + TextStyle? get labelSmall => + textTheme.labelSmall?.copyWith(color: colors.onSurface); + TextStyle? get bodyLarge => + textTheme.bodyLarge?.copyWith(color: colors.onSurface); + TextStyle? get bodyMedium => + textTheme.bodyMedium?.copyWith(color: colors.onSurface); + TextStyle? get bodySmall => + textTheme.bodySmall?.copyWith(color: colors.onSurface); } extension BreakpointUtils on BoxConstraints { @@ -65,17 +50,17 @@ extension BreakpointUtils on BoxConstraints { extension DurationString on String { /// Assumes a string (roughly) of the format '\d{1,2}:\d{2}' Duration toDuration() => switch (split(':')) { - [var minutes, var seconds] => Duration( - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - [var hours, var minutes, var seconds] => Duration( - hours: int.parse(hours.trim()), - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - _ => throw Exception('Invalid duration string: $this'), - }; + [var minutes, var seconds] => Duration( + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + [var hours, var minutes, var seconds] => Duration( + hours: int.parse(hours.trim()), + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + _ => throw Exception('Invalid duration string: $this'), + }; } extension HumanizedDuration on Duration { diff --git a/boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_bloc.dart b/boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_bloc.dart index 73c2f4c436..c6c871937b 100644 --- a/boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_bloc.dart +++ b/boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_bloc.dart @@ -41,9 +41,8 @@ class PlaybackBloc extends Bloc { } } - void _handlePlaybackProgress(Duration progress) => add( - PlaybackEvent.songProgress(progress), - ); + void _handlePlaybackProgress(Duration progress) => + add(PlaybackEvent.songProgress(progress)); void _togglePlayPause(TogglePlayPause event, Emitter emit) { state.isPlaying ? _pausePlayback() : _resumePlayback(); @@ -52,8 +51,10 @@ class PlaybackBloc extends Bloc { void _pausePlayback() => _currentlyPlayingSubscription!.cancel(); - void _resumePlayback() => _currentlyPlayingSubscription = - _startPlayingStream().listen(_handlePlaybackProgress); + void _resumePlayback() => + _currentlyPlayingSubscription = _startPlayingStream().listen( + _handlePlaybackProgress, + ); void _changeSong(ChangeSong event, Emitter emit) { emit( @@ -69,19 +70,15 @@ class PlaybackBloc extends Bloc { } void _songProgress(SongProgress event, Emitter emit) => emit( - state.copyWith( - songWithProgress: state.songWithProgress!.copyWith( - progress: state.songWithProgress!.progress + event.duration, - ), - ), - ); + state.copyWith( + songWithProgress: state.songWithProgress!.copyWith( + progress: state.songWithProgress!.progress + event.duration, + ), + ), + ); void _setVolume(SetVolume event, Emitter emit) => emit( - state.copyWith( - volume: event.value, - isMuted: false, - previousVolume: null, - ), - ); + state.copyWith(volume: event.value, isMuted: false, previousVolume: null), + ); void _toggleMute(ToggleMute event, Emitter emit) { if (state.isMuted) { @@ -94,11 +91,7 @@ class PlaybackBloc extends Bloc { ); } else { emit( - state.copyWith( - isMuted: true, - volume: 0, - previousVolume: state.volume, - ), + state.copyWith(isMuted: true, volume: 0, previousVolume: state.volume), ); } } diff --git a/boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_bloc.freezed.dart b/boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_bloc.freezed.dart index 8a422cd449..54e870ab6f 100644 --- a/boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_bloc.freezed.dart +++ b/boring_to_beautiful/final/lib/src/shared/playback/bloc/playback_bloc.freezed.dart @@ -12,7 +12,8 @@ part of 'playback_bloc.dart'; T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models', +); /// @nodoc mixin _$PlaybackEvent { @@ -24,8 +25,7 @@ mixin _$PlaybackEvent { required TResult Function() toggleMute, required TResult Function(double percent) moveToInSong, required TResult Function(Duration duration) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? togglePlayPause, @@ -34,8 +34,7 @@ mixin _$PlaybackEvent { TResult? Function()? toggleMute, TResult? Function(double percent)? moveToInSong, TResult? Function(Duration duration)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ TResult Function()? togglePlayPause, @@ -45,8 +44,7 @@ mixin _$PlaybackEvent { TResult Function(double percent)? moveToInSong, TResult Function(Duration duration)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult map({ required TResult Function(TogglePlayPause value) togglePlayPause, @@ -55,8 +53,7 @@ mixin _$PlaybackEvent { required TResult Function(ToggleMute value) toggleMute, required TResult Function(MoveToInSong value) moveToInSong, required TResult Function(SongProgress value) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ TResult? Function(TogglePlayPause value)? togglePlayPause, @@ -65,8 +62,7 @@ mixin _$PlaybackEvent { TResult? Function(ToggleMute value)? toggleMute, TResult? Function(MoveToInSong value)? moveToInSong, TResult? Function(SongProgress value)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeMap({ TResult Function(TogglePlayPause value)? togglePlayPause, @@ -76,15 +72,15 @@ mixin _$PlaybackEvent { TResult Function(MoveToInSong value)? moveToInSong, TResult Function(SongProgress value)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; } /// @nodoc abstract class $PlaybackEventCopyWith<$Res> { factory $PlaybackEventCopyWith( - PlaybackEvent value, $Res Function(PlaybackEvent) then) = - _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; + PlaybackEvent value, + $Res Function(PlaybackEvent) then, + ) = _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; } /// @nodoc @@ -103,9 +99,10 @@ class _$PlaybackEventCopyWithImpl<$Res, $Val extends PlaybackEvent> /// @nodoc abstract class _$$TogglePlayPauseImplCopyWith<$Res> { - factory _$$TogglePlayPauseImplCopyWith(_$TogglePlayPauseImpl value, - $Res Function(_$TogglePlayPauseImpl) then) = - __$$TogglePlayPauseImplCopyWithImpl<$Res>; + factory _$$TogglePlayPauseImplCopyWith( + _$TogglePlayPauseImpl value, + $Res Function(_$TogglePlayPauseImpl) then, + ) = __$$TogglePlayPauseImplCopyWithImpl<$Res>; } /// @nodoc @@ -113,8 +110,9 @@ class __$$TogglePlayPauseImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$TogglePlayPauseImpl> implements _$$TogglePlayPauseImplCopyWith<$Res> { __$$TogglePlayPauseImplCopyWithImpl( - _$TogglePlayPauseImpl _value, $Res Function(_$TogglePlayPauseImpl) _then) - : super(_value, _then); + _$TogglePlayPauseImpl _value, + $Res Function(_$TogglePlayPauseImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -233,8 +231,9 @@ abstract class TogglePlayPause implements PlaybackEvent { /// @nodoc abstract class _$$ChangeSongImplCopyWith<$Res> { factory _$$ChangeSongImplCopyWith( - _$ChangeSongImpl value, $Res Function(_$ChangeSongImpl) then) = - __$$ChangeSongImplCopyWithImpl<$Res>; + _$ChangeSongImpl value, + $Res Function(_$ChangeSongImpl) then, + ) = __$$ChangeSongImplCopyWithImpl<$Res>; @useResult $Res call({Song song}); } @@ -244,22 +243,23 @@ class __$$ChangeSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ChangeSongImpl> implements _$$ChangeSongImplCopyWith<$Res> { __$$ChangeSongImplCopyWithImpl( - _$ChangeSongImpl _value, $Res Function(_$ChangeSongImpl) _then) - : super(_value, _then); + _$ChangeSongImpl _value, + $Res Function(_$ChangeSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? song = null, - }) { - return _then(_$ChangeSongImpl( - null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? song = null}) { + return _then( + _$ChangeSongImpl( + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -397,8 +397,9 @@ abstract class ChangeSong implements PlaybackEvent { /// @nodoc abstract class _$$SetVolumeImplCopyWith<$Res> { factory _$$SetVolumeImplCopyWith( - _$SetVolumeImpl value, $Res Function(_$SetVolumeImpl) then) = - __$$SetVolumeImplCopyWithImpl<$Res>; + _$SetVolumeImpl value, + $Res Function(_$SetVolumeImpl) then, + ) = __$$SetVolumeImplCopyWithImpl<$Res>; @useResult $Res call({double value}); } @@ -408,22 +409,23 @@ class __$$SetVolumeImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SetVolumeImpl> implements _$$SetVolumeImplCopyWith<$Res> { __$$SetVolumeImplCopyWithImpl( - _$SetVolumeImpl _value, $Res Function(_$SetVolumeImpl) _then) - : super(_value, _then); + _$SetVolumeImpl _value, + $Res Function(_$SetVolumeImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? value = null, - }) { - return _then(_$SetVolumeImpl( - null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? value = null}) { + return _then( + _$SetVolumeImpl( + null == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -561,8 +563,9 @@ abstract class SetVolume implements PlaybackEvent { /// @nodoc abstract class _$$ToggleMuteImplCopyWith<$Res> { factory _$$ToggleMuteImplCopyWith( - _$ToggleMuteImpl value, $Res Function(_$ToggleMuteImpl) then) = - __$$ToggleMuteImplCopyWithImpl<$Res>; + _$ToggleMuteImpl value, + $Res Function(_$ToggleMuteImpl) then, + ) = __$$ToggleMuteImplCopyWithImpl<$Res>; } /// @nodoc @@ -570,8 +573,9 @@ class __$$ToggleMuteImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ToggleMuteImpl> implements _$$ToggleMuteImplCopyWith<$Res> { __$$ToggleMuteImplCopyWithImpl( - _$ToggleMuteImpl _value, $Res Function(_$ToggleMuteImpl) _then) - : super(_value, _then); + _$ToggleMuteImpl _value, + $Res Function(_$ToggleMuteImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -690,8 +694,9 @@ abstract class ToggleMute implements PlaybackEvent { /// @nodoc abstract class _$$MoveToInSongImplCopyWith<$Res> { factory _$$MoveToInSongImplCopyWith( - _$MoveToInSongImpl value, $Res Function(_$MoveToInSongImpl) then) = - __$$MoveToInSongImplCopyWithImpl<$Res>; + _$MoveToInSongImpl value, + $Res Function(_$MoveToInSongImpl) then, + ) = __$$MoveToInSongImplCopyWithImpl<$Res>; @useResult $Res call({double percent}); } @@ -701,22 +706,23 @@ class __$$MoveToInSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$MoveToInSongImpl> implements _$$MoveToInSongImplCopyWith<$Res> { __$$MoveToInSongImplCopyWithImpl( - _$MoveToInSongImpl _value, $Res Function(_$MoveToInSongImpl) _then) - : super(_value, _then); + _$MoveToInSongImpl _value, + $Res Function(_$MoveToInSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? percent = null, - }) { - return _then(_$MoveToInSongImpl( - null == percent - ? _value.percent - : percent // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? percent = null}) { + return _then( + _$MoveToInSongImpl( + null == percent + ? _value.percent + : percent // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -854,8 +860,9 @@ abstract class MoveToInSong implements PlaybackEvent { /// @nodoc abstract class _$$SongProgressImplCopyWith<$Res> { factory _$$SongProgressImplCopyWith( - _$SongProgressImpl value, $Res Function(_$SongProgressImpl) then) = - __$$SongProgressImplCopyWithImpl<$Res>; + _$SongProgressImpl value, + $Res Function(_$SongProgressImpl) then, + ) = __$$SongProgressImplCopyWithImpl<$Res>; @useResult $Res call({Duration duration}); } @@ -865,22 +872,23 @@ class __$$SongProgressImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SongProgressImpl> implements _$$SongProgressImplCopyWith<$Res> { __$$SongProgressImplCopyWithImpl( - _$SongProgressImpl _value, $Res Function(_$SongProgressImpl) _then) - : super(_value, _then); + _$SongProgressImpl _value, + $Res Function(_$SongProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? duration = null, - }) { - return _then(_$SongProgressImpl( - null == duration - ? _value.duration - : duration // ignore: cast_nullable_to_non_nullable - as Duration, - )); + $Res call({Object? duration = null}) { + return _then( + _$SongProgressImpl( + null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as Duration, + ), + ); } } @@ -1037,15 +1045,17 @@ mixin _$PlaybackState { /// @nodoc abstract class $PlaybackStateCopyWith<$Res> { factory $PlaybackStateCopyWith( - PlaybackState value, $Res Function(PlaybackState) then) = - _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; + PlaybackState value, + $Res Function(PlaybackState) then, + ) = _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); $SongWithProgressCopyWith<$Res>? get songWithProgress; } @@ -1071,28 +1081,36 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_value.copyWith( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - ) as $Val); + return _then( + _value.copyWith( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ) + as $Val, + ); } /// Create a copy of PlaybackState @@ -1114,16 +1132,18 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> abstract class _$$PlaybackStateImplCopyWith<$Res> implements $PlaybackStateCopyWith<$Res> { factory _$$PlaybackStateImplCopyWith( - _$PlaybackStateImpl value, $Res Function(_$PlaybackStateImpl) then) = - __$$PlaybackStateImplCopyWithImpl<$Res>; + _$PlaybackStateImpl value, + $Res Function(_$PlaybackStateImpl) then, + ) = __$$PlaybackStateImplCopyWithImpl<$Res>; @override @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); @override $SongWithProgressCopyWith<$Res>? get songWithProgress; @@ -1134,8 +1154,9 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> extends _$PlaybackStateCopyWithImpl<$Res, _$PlaybackStateImpl> implements _$$PlaybackStateImplCopyWith<$Res> { __$$PlaybackStateImplCopyWithImpl( - _$PlaybackStateImpl _value, $Res Function(_$PlaybackStateImpl) _then) - : super(_value, _then); + _$PlaybackStateImpl _value, + $Res Function(_$PlaybackStateImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1148,40 +1169,48 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_$PlaybackStateImpl( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - )); + return _then( + _$PlaybackStateImpl( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ), + ); } } /// @nodoc class _$PlaybackStateImpl implements _PlaybackState { - const _$PlaybackStateImpl( - {this.volume = 0.5, - this.previousVolume, - this.isMuted = false, - this.isPlaying = false, - this.songWithProgress}); + const _$PlaybackStateImpl({ + this.volume = 0.5, + this.previousVolume, + this.isMuted = false, + this.isPlaying = false, + this.songWithProgress, + }); /// Legal values are between 0 and 1. @override @@ -1221,8 +1250,14 @@ class _$PlaybackStateImpl implements _PlaybackState { } @override - int get hashCode => Object.hash(runtimeType, volume, previousVolume, isMuted, - isPlaying, songWithProgress); + int get hashCode => Object.hash( + runtimeType, + volume, + previousVolume, + isMuted, + isPlaying, + songWithProgress, + ); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1234,12 +1269,13 @@ class _$PlaybackStateImpl implements _PlaybackState { } abstract class _PlaybackState implements PlaybackState { - const factory _PlaybackState( - {final double volume, - final double? previousVolume, - final bool isMuted, - final bool isPlaying, - final SongWithProgress? songWithProgress}) = _$PlaybackStateImpl; + const factory _PlaybackState({ + final double volume, + final double? previousVolume, + final bool isMuted, + final bool isPlaying, + final SongWithProgress? songWithProgress, + }) = _$PlaybackStateImpl; /// Legal values are between 0 and 1. @override @@ -1278,8 +1314,9 @@ mixin _$SongWithProgress { /// @nodoc abstract class $SongWithProgressCopyWith<$Res> { factory $SongWithProgressCopyWith( - SongWithProgress value, $Res Function(SongWithProgress) then) = - _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; + SongWithProgress value, + $Res Function(SongWithProgress) then, + ) = _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; @useResult $Res call({Duration progress, Song song}); } @@ -1298,29 +1335,32 @@ class _$SongWithProgressCopyWithImpl<$Res, $Val extends SongWithProgress> /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_value.copyWith( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - ) as $Val); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _value.copyWith( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ) + as $Val, + ); } } /// @nodoc abstract class _$$SongWithProgressImplCopyWith<$Res> implements $SongWithProgressCopyWith<$Res> { - factory _$$SongWithProgressImplCopyWith(_$SongWithProgressImpl value, - $Res Function(_$SongWithProgressImpl) then) = - __$$SongWithProgressImplCopyWithImpl<$Res>; + factory _$$SongWithProgressImplCopyWith( + _$SongWithProgressImpl value, + $Res Function(_$SongWithProgressImpl) then, + ) = __$$SongWithProgressImplCopyWithImpl<$Res>; @override @useResult $Res call({Duration progress, Song song}); @@ -1330,28 +1370,30 @@ abstract class _$$SongWithProgressImplCopyWith<$Res> class __$$SongWithProgressImplCopyWithImpl<$Res> extends _$SongWithProgressCopyWithImpl<$Res, _$SongWithProgressImpl> implements _$$SongWithProgressImplCopyWith<$Res> { - __$$SongWithProgressImplCopyWithImpl(_$SongWithProgressImpl _value, - $Res Function(_$SongWithProgressImpl) _then) - : super(_value, _then); + __$$SongWithProgressImplCopyWithImpl( + _$SongWithProgressImpl _value, + $Res Function(_$SongWithProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of SongWithProgress /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_$SongWithProgressImpl( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _$SongWithProgressImpl( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -1390,13 +1432,16 @@ class _$SongWithProgressImpl implements _SongWithProgress { @pragma('vm:prefer-inline') _$$SongWithProgressImplCopyWith<_$SongWithProgressImpl> get copyWith => __$$SongWithProgressImplCopyWithImpl<_$SongWithProgressImpl>( - this, _$identity); + this, + _$identity, + ); } abstract class _SongWithProgress implements SongWithProgress { - const factory _SongWithProgress( - {required final Duration progress, - required final Song song}) = _$SongWithProgressImpl; + const factory _SongWithProgress({ + required final Duration progress, + required final Song song, + }) = _$SongWithProgressImpl; @override Duration get progress; diff --git a/boring_to_beautiful/final/lib/src/shared/providers/artists.dart b/boring_to_beautiful/final/lib/src/shared/providers/artists.dart index d116ad9cdd..f9e4a8063e 100644 --- a/boring_to_beautiful/final/lib/src/shared/providers/artists.dart +++ b/boring_to_beautiful/final/lib/src/shared/providers/artists.dart @@ -11,162 +11,175 @@ class ArtistsProvider { static ArtistsProvider get shared => ArtistsProvider(); List get artists => const [ - Artist( - id: 'jmo', - name: 'Jessie Morrison', + Artist( + id: 'jmo', + name: 'Jessie Morrison', + image: MyArtistImage( + image: 'assets/images/artists/woman.jpeg', + sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', + sourceName: 'Daniel Monteiro', + ), + bio: + 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', + updates: [ + 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', + 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', + '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', + ], + events: [ + Event( + date: '1/20/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Mountain View, California', + link: 'Tickets', + ), + Event( + date: '1/22/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Austin, Texas', + link: 'Tickets', + ), + Event( + date: '1/23/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Houston, Texas', + link: 'Tickets', + ), + Event( + date: '2/8/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Los Angeles, California', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', + author: 'By Jacqueline Stewart', + blurb: + 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', image: MyArtistImage( - image: 'assets/images/artists/woman.jpeg', - sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', - sourceName: 'Daniel Monteiro', + image: 'assets/images/news/concert.jpeg', + sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', + sourceName: 'Anthony DELANOIX', ), - bio: - 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', - updates: [ - 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', - 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', - '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', - ], - events: [ - Event( - date: '1/20/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Mountain View, California', - link: 'Tickets'), - Event( - date: '1/22/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Austin, Texas', - link: 'Tickets'), - Event( - date: '1/23/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Houston, Texas', - link: 'Tickets'), - Event( - date: '2/8/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Los Angeles, California', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', - author: 'By Jacqueline Stewart', - blurb: - 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', - image: MyArtistImage( - image: 'assets/images/news/concert.jpeg', - sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', - sourceName: 'Anthony DELANOIX', - ), - ) - ], ), - Artist( - id: 'lb', - name: 'Lucas Bryant', + ], + ), + Artist( + id: 'lb', + name: 'Lucas Bryant', + image: MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + bio: + 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', + updates: [ + 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', + 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', + 'We\'re going all in this weekend! How are you doing, Vegas?!', + ], + events: [ + Event( + date: '5/16/22', + title: 'Back To My Hometown Tour', + location: 'Indianapolis, IN', + link: 'Tickets', + ), + Event( + date: '5/18/22', + title: 'Back To My Hometown Tour', + location: 'San Antonio, TX', + link: 'Tickets', + ), + Event( + date: '5/20/22', + title: 'Back To My Hometown Tour', + location: 'Phoenix, AZ', + link: 'Tickets', + ), + Event( + date: '5/23/22', + title: 'Back To My Hometown Tour', + location: 'San Diego, CA', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', + author: 'Lonnie Hall', + blurb: + 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', image: MyArtistImage( image: 'assets/images/albums/artist1-album2.jpg', sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', sourceName: 'Keagan Henman', ), - bio: - 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', - updates: [ - 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', - 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', - 'We\'re going all in this weekend! How are you doing, Vegas?!', - ], - events: [ - Event( - date: '5/16/22', - title: 'Back To My Hometown Tour', - location: 'Indianapolis, IN', - link: 'Tickets'), - Event( - date: '5/18/22', - title: 'Back To My Hometown Tour', - location: 'San Antonio, TX', - link: 'Tickets'), - Event( - date: '5/20/22', - title: 'Back To My Hometown Tour', - location: 'Phoenix, AZ', - link: 'Tickets'), - Event( - date: '5/23/22', - title: 'Back To My Hometown Tour', - location: 'San Diego, CA', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', - author: 'Lonnie Hall', - blurb: - 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', - image: MyArtistImage( - image: 'assets/images/albums/artist1-album2.jpg', - sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', - sourceName: 'Keagan Henman', - ), - ), - ], ), - Artist( - id: 'jonjames', - name: 'Jon James', + ], + ), + Artist( + id: 'jonjames', + name: 'Jon James', + image: MyArtistImage( + image: 'assets/images/artists/joe.jpg', + sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', + sourceName: 'Natalie Runnerstrom', + ), + bio: + 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', + updates: [ + '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', + '4 days until I get to share some of the favorite songs I\'ve ever written with you.', + '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', + ], + events: [ + Event( + date: '10/22/21', + title: 'Falling For You Tour', + location: 'Dallas, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/23/21', + title: 'Falling For You Tour', + location: 'Houston, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/26/21', + title: 'Falling For You Tour', + location: 'Phoenix, Arizona', + link: 'Ticketmaster', + ), + Event( + date: '10/27/21', + title: 'Falling For You Tour', + location: 'Los Angeles, California', + link: 'Ticketmaster', + ), + ], + news: [ + News( + title: + 'Jon James is excited for the release of his sixth album "Falling For You"', + author: 'Top Media Today', + blurb: + 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', image: MyArtistImage( - image: 'assets/images/artists/joe.jpg', - sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', - sourceName: 'Natalie Runnerstrom', + image: 'assets/images/news/recording_studio.jpg', + sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', + sourceName: 'Yohann LIBOT', ), - bio: - 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', - updates: [ - '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', - '4 days until I get to share some of the favorite songs I\'ve ever written with you.', - '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', - ], - events: [ - Event( - date: '10/22/21', - title: 'Falling For You Tour', - location: 'Dallas, Texas', - link: 'Ticketmaster'), - Event( - date: '10/23/21', - title: 'Falling For You Tour', - location: 'Houston, Texas', - link: 'Ticketmaster'), - Event( - date: '10/26/21', - title: 'Falling For You Tour', - location: 'Phoenix, Arizona', - link: 'Ticketmaster'), - Event( - date: '10/27/21', - title: 'Falling For You Tour', - location: 'Los Angeles, California', - link: 'Ticketmaster'), - ], - news: [ - News( - title: - 'Jon James is excited for the release of his sixth album "Falling For You"', - author: 'Top Media Today', - blurb: - 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', - image: MyArtistImage( - image: 'assets/images/news/recording_studio.jpg', - sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', - sourceName: 'Yohann LIBOT'), - ) - ], ), - ]; + ], + ), + ]; Artist? getArtist(String id) { return artists.firstWhereOrNull((artist) => artist.id == id); diff --git a/boring_to_beautiful/final/lib/src/shared/providers/playlists.dart b/boring_to_beautiful/final/lib/src/shared/providers/playlists.dart index e8bab994dd..f27f71b3ec 100644 --- a/boring_to_beautiful/final/lib/src/shared/providers/playlists.dart +++ b/boring_to_beautiful/final/lib/src/shared/providers/playlists.dart @@ -18,41 +18,50 @@ class PlaylistsProvider { static List images() { return [ const MyArtistImage( - image: 'assets/images/playlists/favorite.jpg', - sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/favorite.jpg', + sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/austin.jpg', - sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', - sourceName: 'Carlos Alfonso'), + image: 'assets/images/playlists/austin.jpg', + sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', + sourceName: 'Carlos Alfonso', + ), const MyArtistImage( - image: 'assets/images/playlists/reading.jpg', - sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', - sourceName: 'Alexandra Fuller'), + image: 'assets/images/playlists/reading.jpg', + sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', + sourceName: 'Alexandra Fuller', + ), const MyArtistImage( - image: 'assets/images/playlists/workout.jpg', - sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/workout.jpg', + sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/calm.jpg', - sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', - sourceName: 'Jared Rice'), + image: 'assets/images/playlists/calm.jpg', + sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', + sourceName: 'Jared Rice', + ), const MyArtistImage( - image: 'assets/images/playlists/coffee.jpg', - sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', - sourceName: 'Nathan Dumlao'), + image: 'assets/images/playlists/coffee.jpg', + sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', + sourceName: 'Nathan Dumlao', + ), const MyArtistImage( - image: 'assets/images/playlists/piano.jpg', - sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', - sourceName: 'Jordan Whitfield'), + image: 'assets/images/playlists/piano.jpg', + sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', + sourceName: 'Jordan Whitfield', + ), const MyArtistImage( - image: 'assets/images/playlists/studying.jpg', - sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', - sourceName: 'Humble Lamb'), + image: 'assets/images/playlists/studying.jpg', + sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', + sourceName: 'Humble Lamb', + ), const MyArtistImage( - image: 'assets/images/playlists/jazz.jpg', - sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', - sourceName: 'dimitri.photography'), + image: 'assets/images/playlists/jazz.jpg', + sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', + sourceName: 'dimitri.photography', + ), ]; } @@ -85,8 +94,10 @@ class PlaylistsProvider { ); } - static final List _randomPlaylists = - List.generate(10, (index) => randomLengthPlaylist()); + static final List _randomPlaylists = List.generate( + 10, + (index) => randomLengthPlaylist(), + ); } String randomId() { diff --git a/boring_to_beautiful/final/lib/src/shared/providers/songs.dart b/boring_to_beautiful/final/lib/src/shared/providers/songs.dart index ed018a83ff..f1205f2dcb 100644 --- a/boring_to_beautiful/final/lib/src/shared/providers/songs.dart +++ b/boring_to_beautiful/final/lib/src/shared/providers/songs.dart @@ -52,9 +52,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:35'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album2.jpg', - sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', - sourceName: 'Alexandru Acea'), + image: 'assets/images/albums/artist4-album2.jpg', + sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', + sourceName: 'Alexandru Acea', + ), ), RankedSong( 2, @@ -62,9 +63,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:52'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album1.jpg', - sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', - sourceName: 'Jr Korpa'), + image: 'assets/images/albums/artist4-album1.jpg', + sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', + sourceName: 'Jr Korpa', + ), ), RankedSong( 3, @@ -72,9 +74,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:39'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album3.jpg', - sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', - sourceName: 'Stormseeker'), + image: 'assets/images/albums/artist4-album3.jpg', + sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', + sourceName: 'Stormseeker', + ), ), RankedSong( 1, diff --git a/boring_to_beautiful/final/lib/src/shared/providers/theme.dart b/boring_to_beautiful/final/lib/src/shared/providers/theme.dart index 542d19b0fe..20f4a55e06 100644 --- a/boring_to_beautiful/final/lib/src/shared/providers/theme.dart +++ b/boring_to_beautiful/final/lib/src/shared/providers/theme.dart @@ -28,12 +28,13 @@ class ThemeSettingChange extends Notification { } class ThemeProvider extends InheritedWidget { - const ThemeProvider( - {super.key, - required this.settings, - required this.lightDynamic, - required this.darkDynamic, - required super.child}); + const ThemeProvider({ + super.key, + required this.settings, + required this.lightDynamic, + required this.darkDynamic, + required super.child, + }); final ValueNotifier settings; final ColorScheme? lightDynamic; @@ -59,8 +60,9 @@ class ThemeProvider extends InheritedWidget { Color blend(Color targetColor) { return Color( - // ignore: deprecated_member_use - Blend.harmonize(targetColor.value, settings.value.sourceColor.value)); + // ignore: deprecated_member_use + Blend.harmonize(targetColor.value, settings.value.sourceColor.value), + ); } Color source(Color? target) { @@ -72,18 +74,18 @@ class ThemeProvider extends InheritedWidget { } ColorScheme colors(Brightness brightness, Color? targetColor) { - final dynamicPrimary = brightness == Brightness.light - ? lightDynamic?.primary - : darkDynamic?.primary; + final dynamicPrimary = + brightness == Brightness.light + ? lightDynamic?.primary + : darkDynamic?.primary; return ColorScheme.fromSeed( seedColor: dynamicPrimary ?? source(targetColor), brightness: brightness, ); } - ShapeBorder get shapeMedium => RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ); + ShapeBorder get shapeMedium => + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)); CardTheme cardTheme() { return CardTheme( @@ -113,21 +115,13 @@ class ThemeProvider extends InheritedWidget { labelColor: colors.secondary, unselectedLabelColor: colors.onSurfaceVariant, indicator: BoxDecoration( - border: Border( - bottom: BorderSide( - color: colors.secondary, - width: 2, - ), - ), + border: Border(bottom: BorderSide(color: colors.secondary, width: 2)), ), ); } BottomAppBarTheme bottomAppBarTheme(ColorScheme colors) { - return BottomAppBarTheme( - color: colors.surface, - elevation: 0, - ); + return BottomAppBarTheme(color: colors.surface, elevation: 0); } BottomNavigationBarThemeData bottomNavigationBarTheme(ColorScheme colors) { @@ -146,9 +140,7 @@ class ThemeProvider extends InheritedWidget { } DrawerThemeData drawerTheme(ColorScheme colors) { - return DrawerThemeData( - backgroundColor: colors.surface, - ); + return DrawerThemeData(backgroundColor: colors.surface); } ThemeData light([Color? targetColor]) { @@ -207,10 +199,7 @@ class ThemeProvider extends InheritedWidget { } class ThemeSettings { - ThemeSettings({ - required this.sourceColor, - required this.themeMode, - }); + ThemeSettings({required this.sourceColor, required this.themeMode}); final Color sourceColor; final ThemeMode themeMode; @@ -221,10 +210,7 @@ Color randomColor() { } // Custom Colors -const linkColor = CustomColor( - name: 'Link Color', - color: Color(0xFF00B0FF), -); +const linkColor = CustomColor(name: 'Link Color', color: Color(0xFF00B0FF)); class CustomColor { const CustomColor({ diff --git a/boring_to_beautiful/final/lib/src/shared/router.dart b/boring_to_beautiful/final/lib/src/shared/router.dart index 3efb7362fa..db82627246 100644 --- a/boring_to_beautiful/final/lib/src/shared/router.dart +++ b/boring_to_beautiful/final/lib/src/shared/router.dart @@ -20,11 +20,7 @@ final artistsProvider = ArtistsProvider(); final playlistsProvider = PlaylistsProvider(); const List destinations = [ - NavigationDestination( - label: 'Home', - icon: Icon(Icons.home), - route: '/', - ), + NavigationDestination(label: 'Home', icon: Icon(Icons.home), route: '/'), NavigationDestination( label: 'Playlists', icon: Icon(Icons.playlist_add_check), @@ -56,41 +52,46 @@ final appRouter = GoRouter( // HomeScreen GoRoute( path: '/', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 0, - child: HomeScreen(), - ), - ), + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 0, + child: HomeScreen(), + ), + ), ), // PlaylistHomeScreen GoRoute( path: '/playlists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 1, - child: PlaylistHomeScreen(), - ), - ), - routes: [ - GoRoute( - path: ':pid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 1, - child: PlaylistScreen( - playlist: playlistsProvider - .getPlaylist(state.pathParameters['pid']!)!, - ), + child: PlaylistHomeScreen(), ), ), + routes: [ + GoRoute( + path: ':pid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 1, + child: PlaylistScreen( + playlist: + playlistsProvider.getPlaylist( + state.pathParameters['pid']!, + )!, + ), + ), + ), ), ], ), @@ -98,28 +99,32 @@ final appRouter = GoRouter( // ArtistHomeScreen GoRoute( path: '/artists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 2, - child: ArtistsScreen(), - ), - ), - routes: [ - GoRoute( - path: ':aid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 2, - child: ArtistScreen( - artist: - artistsProvider.getArtist(state.pathParameters['aid']!)!, - ), + child: ArtistsScreen(), ), ), + routes: [ + GoRoute( + path: ':aid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 2, + child: ArtistScreen( + artist: + artistsProvider.getArtist( + state.pathParameters['aid']!, + )!, + ), + ), + ), // builder: (context, state) => ArtistScreen( // id: state.params['aid']!, // ), @@ -129,14 +134,15 @@ final appRouter = GoRouter( for (final route in destinations.skip(3)) GoRoute( path: route.route, - pageBuilder: (context, state) => MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: destinations.indexOf(route), - child: const SizedBox(), - ), - ), + pageBuilder: + (context, state) => MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: destinations.indexOf(route), + child: const SizedBox(), + ), + ), ), ], ); diff --git a/boring_to_beautiful/final/lib/src/shared/views/adaptive_image_card.dart b/boring_to_beautiful/final/lib/src/shared/views/adaptive_image_card.dart index 07cab2b0d7..99f5be0837 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/adaptive_image_card.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/adaptive_image_card.dart @@ -36,20 +36,13 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), + child: Padding(padding: const EdgeInsets.all(20), child: child), ), ], ); } return Padding( - padding: const EdgeInsets.only( - left: 20, - bottom: 20, - top: 20, - ), + padding: const EdgeInsets.only(left: 20, bottom: 20, top: 20), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, @@ -65,11 +58,8 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), - ) + child: Padding(padding: const EdgeInsets.all(20), child: child), + ), ], ), ); diff --git a/boring_to_beautiful/final/lib/src/shared/views/adaptive_navigation.dart b/boring_to_beautiful/final/lib/src/shared/views/adaptive_navigation.dart index 067ea7d17f..709068ea07 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/adaptive_navigation.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/adaptive_navigation.dart @@ -30,12 +30,15 @@ class AdaptiveNavigation extends StatelessWidget { NavigationRail( extended: dimens.maxWidth >= 800, minExtendedWidth: 180, - destinations: destinations - .map((e) => NavigationRailDestination( - icon: e.icon, - label: Text(e.label), - )) - .toList(), + destinations: + destinations + .map( + (e) => NavigationRailDestination( + icon: e.icon, + label: Text(e.label), + ), + ) + .toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ), diff --git a/boring_to_beautiful/final/lib/src/shared/views/article_content.dart b/boring_to_beautiful/final/lib/src/shared/views/article_content.dart index af243f015b..c5a0b5e62a 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/article_content.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/article_content.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class ArticleContent extends StatelessWidget { - const ArticleContent({ - super.key, - required this.child, - this.maxWidth = 960, - }); + const ArticleContent({super.key, required this.child, this.maxWidth = 960}); final double maxWidth; final Widget child; @@ -19,13 +15,8 @@ class ArticleContent extends StatelessWidget { return Container( alignment: Alignment.topCenter, child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: maxWidth, - ), - child: Padding( - padding: const EdgeInsets.all(15), - child: child, - ), + constraints: BoxConstraints(maxWidth: maxWidth), + child: Padding(padding: const EdgeInsets.all(15), child: child), ), ); } diff --git a/boring_to_beautiful/final/lib/src/shared/views/bottom_bar.dart b/boring_to_beautiful/final/lib/src/shared/views/bottom_bar.dart index 06e085a9b6..bf15ad9bb0 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/bottom_bar.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/bottom_bar.dart @@ -26,16 +26,18 @@ class BottomBar extends StatelessWidget implements PreferredSizeWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => _BottomBar( - artist: state.songWithProgress?.song.artist, - isMuted: state.isMuted, - isPlaying: state.isPlaying, - preferredSize: preferredSize, - progress: state.songWithProgress?.progress, - song: state.songWithProgress?.song, - togglePlayPause: () => bloc.add(const PlaybackEvent.togglePlayPause()), - volume: state.volume, - ), + builder: + (context, state) => _BottomBar( + artist: state.songWithProgress?.song.artist, + isMuted: state.isMuted, + isPlaying: state.isPlaying, + preferredSize: preferredSize, + progress: state.songWithProgress?.progress, + song: state.songWithProgress?.song, + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), + volume: state.volume, + ), ); } } @@ -63,10 +65,12 @@ class _BottomBar extends StatelessWidget { @override Widget build(BuildContext context) => LayoutBuilder( - builder: (context, constraints) => constraints.isTablet - ? _buildDesktopBar(context, constraints) - : _buildMobileBar(context, constraints), - ); + builder: + (context, constraints) => + constraints.isTablet + ? _buildDesktopBar(context, constraints) + : _buildMobileBar(context, constraints), + ); Widget _buildDesktopBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -79,10 +83,7 @@ class _BottomBar extends StatelessWidget { Row( children: [ _AlbumArt(song: song), - _SongDetails( - artist: artist, - song: song, - ), + _SongDetails(artist: artist, song: song), ], ), Flexible( @@ -95,12 +96,7 @@ class _BottomBar extends StatelessWidget { isPlaying: isPlaying, togglePlayPause: togglePlayPause, ), - Center( - child: _ProgressBar( - progress: progress, - song: song, - ), - ), + Center(child: _ProgressBar(progress: progress, song: song)), ], ), ), @@ -114,17 +110,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _FullScreenPlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _FullScreenPlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -136,10 +133,10 @@ class _BottomBar extends StatelessWidget { } double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; Widget _buildMobileBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -152,17 +149,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _MobilePlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _MobilePlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -191,10 +189,7 @@ class _BottomBar extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - song?.title ?? '', - style: context.labelMedium, - ), + Text(song?.title ?? '', style: context.labelMedium), Text( song?.artist.name ?? '', style: context.labelSmall, @@ -220,10 +215,7 @@ class _BottomBar extends StatelessWidget { } class _ProgressBar extends StatelessWidget { - const _ProgressBar({ - required this.progress, - required this.song, - }); + const _ProgressBar({required this.progress, required this.song}); /// Current playback depth into user is into [song]. final Duration? progress; @@ -231,10 +223,10 @@ class _ProgressBar extends StatelessWidget { final Song? song; double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; @override Widget build(BuildContext context) { @@ -252,29 +244,32 @@ class _ProgressBar extends StatelessWidget { children: [ const SizedBox(width: 10), SizedBox( - child: progress != null - ? Text(progress!.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + progress != null + ? Text( + progress!.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), Expanded( child: Slider( value: songProgress.clamp(0, 1), divisions: 1000, onChanged: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); }, onChangeEnd: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); // Because dragging pauses auto playback, resume playing // once the user finishes dragging. - BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ); + BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()); }, activeColor: Theme.of(context).colorScheme.onTertiaryContainer, @@ -282,12 +277,15 @@ class _ProgressBar extends StatelessWidget { ), ), SizedBox( - child: song != null - ? Text(song!.length.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + song != null + ? Text( + song!.length.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), - const SizedBox(width: 10) + const SizedBox(width: 10), ], ), ); @@ -297,10 +295,7 @@ class _ProgressBar extends StatelessWidget { } class _VolumeBar extends StatelessWidget { - const _VolumeBar({ - required this.volume, - required this.isMuted, - }); + const _VolumeBar({required this.volume, required this.isMuted}); /// The percentage, between 0 and 1, at which to render the volume slider. final double volume; @@ -313,17 +308,16 @@ class _VolumeBar extends StatelessWidget { @override Widget build(BuildContext context) { return ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 200, - ), + constraints: const BoxConstraints(maxWidth: 200), child: Padding( padding: const EdgeInsets.all(8), child: Row( children: [ GestureDetector( - onTap: () => BlocProvider.of(context).add( - const PlaybackEvent.toggleMute(), - ), + onTap: + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.toggleMute()), child: Icon(!isMuted ? Icons.volume_mute : Icons.volume_off), ), Expanded( @@ -332,8 +326,10 @@ class _VolumeBar extends StatelessWidget { min: 0, max: 1, divisions: 100, - onChanged: (newValue) => BlocProvider.of(context) - .add(PlaybackEvent.setVolume(newValue)), + onChanged: + (newValue) => BlocProvider.of( + context, + ).add(PlaybackEvent.setVolume(newValue)), activeColor: Theme.of(context).colorScheme.onTertiaryContainer, inactiveColor: Theme.of(context).colorScheme.onSurface, ), @@ -356,49 +352,50 @@ class _PlaybackControls extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - double iconSize = 24; - double playIconSize = 32; - double innerPadding = 16; - double playPadding = 20; - if (constraints.maxWidth < 500) { - iconSize = 21; - playIconSize = 28; - innerPadding = 14; - playPadding = 17; - } - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( + return LayoutBuilder( + builder: (context, constraints) { + double iconSize = 24; + double playIconSize = 32; + double innerPadding = 16; + double playPadding = 20; + if (constraints.maxWidth < 500) { + iconSize = 21; + playIconSize = 28; + innerPadding = 14; + playPadding = 17; + } + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( padding: EdgeInsets.fromLTRB(0, 0, innerPadding, 0), - child: Icon(Icons.shuffle, size: iconSize)), - Icon(Icons.skip_previous, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), - child: GestureDetector( - onTap: togglePlayPause, - child: Icon( - isPlaying ? Icons.pause_circle : Icons.play_circle, - size: playIconSize, + child: Icon(Icons.shuffle, size: iconSize), + ), + Icon(Icons.skip_previous, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), + child: GestureDetector( + onTap: togglePlayPause, + child: Icon( + isPlaying ? Icons.pause_circle : Icons.play_circle, + size: playIconSize, + ), ), ), - ), - Icon(Icons.skip_next, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), - child: Icon(Icons.repeat, size: iconSize), - ), - ], - ); - }); + Icon(Icons.skip_next, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), + child: Icon(Icons.repeat, size: iconSize), + ), + ], + ); + }, + ); } } class _AlbumArt extends StatelessWidget { - const _AlbumArt({ - required this.song, - }); + const _AlbumArt({required this.song}); final Song? song; @@ -409,21 +406,17 @@ class _AlbumArt extends StatelessWidget { child: SizedBox( width: 70, height: 70, - child: song != null - ? Image.asset(song!.image.image) - : Container( - color: Colors.pink[100], - ), + child: + song != null + ? Image.asset(song!.image.image) + : Container(color: Colors.pink[100]), ), ); } } class _SongDetails extends StatelessWidget { - const _SongDetails({ - required this.artist, - required this.song, - }); + const _SongDetails({required this.artist, required this.song}); final Artist? artist; final Song? song; @@ -455,9 +448,7 @@ class _SongDetails extends StatelessWidget { } class _FullScreenPlayer extends StatefulWidget { - const _FullScreenPlayer({ - required this.onClose, - }); + const _FullScreenPlayer({required this.onClose}); final VoidCallback onClose; @@ -489,29 +480,33 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return MouseRegion( - onHover: (_) { - setState(() { - _showControls = true; - }); - hideControls(); + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return MouseRegion( + onHover: (_) { + setState(() { + _showControls = true; + }); + hideControls(); + }, + child: buildPlayer(context, state, dimens), + ); }, - child: buildPlayer(context, state, dimens), - ); - }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; final song = current?.song; @@ -519,26 +514,25 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { fit: StackFit.expand, children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - song!.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset(song!.image.image, fit: BoxFit.cover), ), ), - ), ), Positioned( top: 20, right: 20, child: IconButton( - color: song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const Icon(Icons.fullscreen_exit), onPressed: widget.onClose, ), @@ -569,8 +563,9 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { Text( song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 20, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 20, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -582,10 +577,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { right: 20, left: 20, bottom: dimens.biggest.height * 0.2, - child: _ProgressBar( - progress: current?.progress, - song: song, - ), + child: _ProgressBar(progress: current?.progress, song: song), ), Positioned( right: 20, @@ -598,8 +590,8 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), @@ -611,9 +603,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { } class _MobilePlayer extends StatelessWidget { - const _MobilePlayer({ - required this.onClose, - }); + const _MobilePlayer({required this.onClose}); final VoidCallback onClose; @@ -622,46 +612,52 @@ class _MobilePlayer extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return buildPlayer(context, state, dimens); - }, + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return buildPlayer(context, state, dimens); + }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; return Stack( children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - current.song.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset( + current.song.image.image, + fit: BoxFit.cover, + ), ), ), - ), ), Positioned( top: 20, left: 20, child: IconButton( - color: current?.song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + current?.song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const RotatedBox( quarterTurns: 1, child: Icon(Icons.chevron_right), @@ -676,10 +672,7 @@ class _MobilePlayer extends StatelessWidget { left: 0, right: 0, height: dimens.biggest.height * 0.5, - child: Image.asset( - current.song.image.image, - fit: BoxFit.contain, - ), + child: Image.asset(current.song.image.image, fit: BoxFit.contain), ), Positioned( left: 0, @@ -705,8 +698,9 @@ class _MobilePlayer extends StatelessWidget { Text( current.song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 12, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 12, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -718,15 +712,12 @@ class _MobilePlayer extends StatelessWidget { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), - _ProgressBar( - progress: current.progress, - song: current.song, - ), + _ProgressBar(progress: current.progress, song: current.song), ], ), ), diff --git a/boring_to_beautiful/final/lib/src/shared/views/brightness_toggle.dart b/boring_to_beautiful/final/lib/src/shared/views/brightness_toggle.dart index 46dde4810f..5b5332392b 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/brightness_toggle.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/brightness_toggle.dart @@ -13,9 +13,10 @@ class BrightnessToggle extends StatelessWidget { Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; return IconButton( - icon: Theme.of(context).brightness == Brightness.light - ? const Icon(Icons.brightness_3) - : const Icon(Icons.brightness_7), + icon: + Theme.of(context).brightness == Brightness.light + ? const Icon(Icons.brightness_3) + : const Icon(Icons.brightness_7), onPressed: () { final themeProvider = ThemeProvider.of(context); final settings = themeProvider.settings.value; diff --git a/boring_to_beautiful/final/lib/src/shared/views/center_row.dart b/boring_to_beautiful/final/lib/src/shared/views/center_row.dart index 36d428e3b8..c1f3effcc2 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/center_row.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/center_row.dart @@ -5,23 +5,12 @@ import 'package:flutter/material.dart'; class CenterRow extends StatelessWidget { - const CenterRow({ - super.key, - required this.child, - }); + const CenterRow({super.key, required this.child}); final Widget child; @override Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Center( - child: child, - ), - ), - ], - ); + return Row(children: [Expanded(child: Center(child: child))]); } } diff --git a/boring_to_beautiful/final/lib/src/shared/views/clickable.dart b/boring_to_beautiful/final/lib/src/shared/views/clickable.dart index cd7ef46268..f192f0b135 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/clickable.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/clickable.dart @@ -14,10 +14,7 @@ class Clickable extends StatelessWidget { Widget build(BuildContext context) { return MouseRegion( cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: onTap, - child: child, - ), + child: GestureDetector(onTap: onTap, child: child), ); } } diff --git a/boring_to_beautiful/final/lib/src/shared/views/events.dart b/boring_to_beautiful/final/lib/src/shared/views/events.dart index ed38465460..ab9140e56d 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/events.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/events.dart @@ -24,43 +24,18 @@ class Events extends StatelessWidget { child: DataTable( horizontalMargin: 5.0, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], rows: [ for (final event in artist.events) DataRow( cells: [ - DataCell( - Text(event.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(event.title)), - ]), - ), - DataCell( - Text(event.location), - ), + DataCell(Text(event.date)), + DataCell(Row(children: [Expanded(child: Text(event.title))])), + DataCell(Text(event.location)), DataCell( Clickable( child: Text( @@ -70,8 +45,9 @@ class Events extends StatelessWidget { decoration: TextDecoration.underline, ), ), - onTap: () => - launchUrl(Uri.parse('https://docs.flutter.dev')), + onTap: + () => + launchUrl(Uri.parse('https://docs.flutter.dev')), ), ), ], diff --git a/boring_to_beautiful/final/lib/src/shared/views/hover_toggle.dart b/boring_to_beautiful/final/lib/src/shared/views/hover_toggle.dart index ec98c2863c..649cfcab63 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/hover_toggle.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/hover_toggle.dart @@ -31,9 +31,10 @@ class _HoverToggleState extends State with MaterialStateMixin { cursor: isHovered ? SystemMouseCursors.click : MouseCursor.defer, onEnter: (_) => setMaterialState(WidgetState.hovered, true), onExit: (_) => setMaterialState(WidgetState.hovered, false), - child: widget.mode == HoverMode.replace - ? _buildReplaceableChildren() - : _buildChildrenStack(), + child: + widget.mode == HoverMode.replace + ? _buildReplaceableChildren() + : _buildChildrenStack(), ), ); } @@ -41,12 +42,7 @@ class _HoverToggleState extends State with MaterialStateMixin { Widget _buildChildrenStack() { Widget child = isHovered ? Opacity(opacity: 0.2, child: widget.child) : widget.child; - return Stack( - children: [ - child, - if (isHovered) widget.hoverChild, - ], - ); + return Stack(children: [child, if (isHovered) widget.hoverChild]); } Widget _buildReplaceableChildren() => diff --git a/boring_to_beautiful/final/lib/src/shared/views/hoverable_song_play_button.dart b/boring_to_beautiful/final/lib/src/shared/views/hoverable_song_play_button.dart index 512f3d1d3c..dd588e3dbe 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/hoverable_song_play_button.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/hoverable_song_play_button.dart @@ -29,9 +29,10 @@ class HoverableSongPlayButton extends StatelessWidget { hoverChild: Center( child: GestureDetector( child: const Icon(Icons.play_arrow), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ), ), mode: hoverMode, diff --git a/boring_to_beautiful/final/lib/src/shared/views/image_card.dart b/boring_to_beautiful/final/lib/src/shared/views/image_card.dart index 0af9f75f33..6e7f6cd42d 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/image_card.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/image_card.dart @@ -7,13 +7,14 @@ import '../../shared/extensions.dart'; import 'outlined_card.dart'; class ImageCard extends StatelessWidget { - const ImageCard( - {super.key, - required this.title, - required this.details, - required this.image, - this.subtitle, - this.clickable = false}); + const ImageCard({ + super.key, + required this.title, + required this.details, + required this.image, + this.subtitle, + this.clickable = false, + }); final String title; final String? subtitle; @@ -28,54 +29,51 @@ class ImageCard extends StatelessWidget { clickable: clickable, child: Padding( padding: const EdgeInsets.all(8.0), - child: LayoutBuilder(builder: (context, constraints) { - return Row( - children: [ - if (constraints.maxWidth > 600) - SizedBox( - width: 170, - height: 170, - child: Image.asset( - image, - fit: BoxFit.cover, + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + if (constraints.maxWidth > 600) + SizedBox( + width: 170, + height: 170, + child: Image.asset(image, fit: BoxFit.cover), ), - ), - Expanded( - child: Padding( - padding: padding, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 5), - child: Text( - title, - style: context.titleLarge! - .copyWith(fontWeight: FontWeight.bold), - ), - ), - if (subtitle != null) + Expanded( + child: Padding( + padding: padding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Padding( - padding: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only(bottom: 5), child: Text( - subtitle!, - style: context.labelMedium, + title, + style: context.titleLarge!.copyWith( + fontWeight: FontWeight.bold, + ), ), ), - Text( - details, - style: context.labelMedium?.copyWith( - fontSize: 16, - height: 1.25, + if (subtitle != null) + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text(subtitle!, style: context.labelMedium), + ), + Text( + details, + style: context.labelMedium?.copyWith( + fontSize: 16, + height: 1.25, + ), ), - ), - ], + ], + ), ), ), - ), - ], - ); - }), + ], + ); + }, + ), ), ); } diff --git a/boring_to_beautiful/final/lib/src/shared/views/image_tile.dart b/boring_to_beautiful/final/lib/src/shared/views/image_tile.dart index 4f2bbebb96..dd99152af5 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/image_tile.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/image_tile.dart @@ -21,19 +21,17 @@ class ImageTile extends StatelessWidget { @override Widget build(BuildContext context) { return OutlinedCard( - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Expanded( - child: Image.asset(image, fit: BoxFit.cover), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [Expanded(child: Image.asset(image, fit: BoxFit.cover))], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), child: Text( title, @@ -43,20 +41,25 @@ class ImageTile extends StatelessWidget { ), overflow: TextOverflow.ellipsis, maxLines: 1, - )), - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text( - subtitle, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center, + ), ), - ), - ], - ) - ]), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 10, + ), + child: Text( + subtitle, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ], + ), + ], + ), ); } } diff --git a/boring_to_beautiful/final/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/final/lib/src/shared/views/outlined_card.dart index 7eb25346dc..8521a2528d 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/outlined_card.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/outlined_card.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class OutlinedCard extends StatefulWidget { - const OutlinedCard({ - super.key, - required this.child, - this.clickable = true, - }); + const OutlinedCard({super.key, required this.child, this.clickable = true}); final Widget child; final bool clickable; @@ -38,9 +34,10 @@ class _OutlinedCardState extends State { _hovered = false; }); }, - cursor: widget.clickable - ? SystemMouseCursors.click - : SystemMouseCursors.basic, + cursor: + widget.clickable + ? SystemMouseCursors.click + : SystemMouseCursors.basic, child: AnimatedContainer( duration: kThemeAnimationDuration, curve: animationCurve, @@ -52,20 +49,21 @@ class _OutlinedCardState extends State { borderRadius: borderRadius, ), foregroundDecoration: BoxDecoration( - color: Theme.of(context).colorScheme.onSurface.withAlpha( - _hovered ? 30 : 0, - ), + color: Theme.of( + context, + ).colorScheme.onSurface.withAlpha(_hovered ? 30 : 0), borderRadius: borderRadius, ), child: TweenAnimationBuilder( duration: kThemeAnimationDuration, curve: animationCurve, tween: Tween(begin: BorderRadius.zero, end: borderRadius), - builder: (context, borderRadius, child) => ClipRRect( - clipBehavior: Clip.antiAlias, - borderRadius: borderRadius, - child: child, - ), + builder: + (context, borderRadius, child) => ClipRRect( + clipBehavior: Clip.antiAlias, + borderRadius: borderRadius, + child: child, + ), child: widget.child, ), ), diff --git a/boring_to_beautiful/final/lib/src/shared/views/play_pause_listener.dart b/boring_to_beautiful/final/lib/src/shared/views/play_pause_listener.dart index 52fad00863..6b4fc66709 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/play_pause_listener.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/play_pause_listener.dart @@ -16,10 +16,7 @@ import '../playback/bloc/bloc.dart'; /// shortcuts. By sitting below that machinery, this installs a global Spacebar /// listener which toggles Playback, as is customary in music-playing apps. class PlayPauseListener extends StatelessWidget { - const PlayPauseListener({ - super.key, - required this.child, - }); + const PlayPauseListener({super.key, required this.child}); final Widget child; @@ -28,9 +25,7 @@ class PlayPauseListener extends StatelessWidget { // Immediately catch any [_PlayPauseIntent] events released by the inner // [Shortcuts] widget. return Actions( - actions: >{ - _PlayPauseIntent: _PlayPauseAction(), - }, + actions: >{_PlayPauseIntent: _PlayPauseAction()}, child: Shortcuts( // Register a shortcut for Spacebar presses that release a // [_PlayPauseIntent] up the tree to the nearest [Actions] widget. @@ -38,9 +33,9 @@ class PlayPauseListener extends StatelessWidget { const SingleActivator(LogicalKeyboardKey.space): _PlayPauseIntent( // Create a closure which sends a [TogglePlayPause] event to the // [PlaybackBloc]. - () => BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ), + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()), ), }, child: child, diff --git a/boring_to_beautiful/final/lib/src/shared/views/root_layout.dart b/boring_to_beautiful/final/lib/src/shared/views/root_layout.dart index 878b57d729..ff6270248c 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/root_layout.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/root_layout.dart @@ -29,36 +29,37 @@ class RootLayout extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => LayoutBuilder(builder: (context, dimens) { - void onSelected(int index) { - final destination = router.destinations[index]; - go.GoRouter.of(context).go(destination.route); - } + builder: + (context, state) => LayoutBuilder( + builder: (context, dimens) { + void onSelected(int index) { + final destination = router.destinations[index]; + go.GoRouter.of(context).go(destination.route); + } - final current = state.songWithProgress; - return AdaptiveNavigation( - key: _navigationRailKey, - destinations: router.destinations - .map((e) => NavigationDestination( - icon: e.icon, - label: e.label, - )) - .toList(), - selectedIndex: currentIndex, - onDestinationSelected: onSelected, - child: Column( - children: [ - Expanded( - child: _Switcher( - key: _switcherKey, - child: child, + final current = state.songWithProgress; + return AdaptiveNavigation( + key: _navigationRailKey, + destinations: + router.destinations + .map( + (e) => NavigationDestination( + icon: e.icon, + label: e.label, + ), + ) + .toList(), + selectedIndex: currentIndex, + onDestinationSelected: onSelected, + child: Column( + children: [ + Expanded(child: _Switcher(key: _switcherKey, child: child)), + if (current != null) const BottomBar(), + ], ), - ), - if (current != null) const BottomBar(), - ], + ); + }, ), - ); - }), ); } } @@ -66,21 +67,18 @@ class RootLayout extends StatelessWidget { class _Switcher extends StatelessWidget { final Widget child; - const _Switcher({ - required this.child, - super.key, - }); + const _Switcher({required this.child, super.key}); @override Widget build(BuildContext context) { return UniversalPlatform.isDesktop ? child : AnimatedSwitcher( - key: key, - duration: const Duration(milliseconds: 200), - switchInCurve: Curves.easeInOut, - switchOutCurve: Curves.easeInOut, - child: child, - ); + key: key, + duration: const Duration(milliseconds: 200), + switchInCurve: Curves.easeInOut, + switchOutCurve: Curves.easeInOut, + child: child, + ); } } diff --git a/boring_to_beautiful/final/lib/src/shared/views/sidebar.dart b/boring_to_beautiful/final/lib/src/shared/views/sidebar.dart index 78c19b4d22..8815223b22 100644 --- a/boring_to_beautiful/final/lib/src/shared/views/sidebar.dart +++ b/boring_to_beautiful/final/lib/src/shared/views/sidebar.dart @@ -26,10 +26,7 @@ class SideBar extends StatelessWidget { title: const Text('Home'), onTap: () => GoRouter.of(context).go('/'), ), - const ListTile( - leading: Icon(Icons.search), - title: Text('Search'), - ), + const ListTile(leading: Icon(Icons.search), title: Text('Search')), ListTile( leading: const Icon(Icons.person), title: const Text('Artists'), @@ -64,10 +61,7 @@ class PlaylistNav extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(left: 16, top: 16), - child: Text( - 'Playlists', - style: context.titleMedium, - ), + child: Text('Playlists', style: context.titleMedium), ), Expanded( child: ListView( @@ -114,10 +108,9 @@ class _PlaylistNavItemState extends State<_PlaylistNavItem> { @override void initState() { super.initState(); - _focusNode = FocusNode(debugLabel: widget.title) - ..addListener(() { - setState(() => _isSelected = _focusNode.hasPrimaryFocus); - }); + _focusNode = FocusNode(debugLabel: widget.title)..addListener(() { + setState(() => _isSelected = _focusNode.hasPrimaryFocus); + }); } @override diff --git a/boring_to_beautiful/final/macos/Podfile b/boring_to_beautiful/final/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/boring_to_beautiful/final/macos/Podfile +++ b/boring_to_beautiful/final/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/final/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/final/macos/Runner.xcodeproj/project.pbxproj index 79604e1785..63e08baa02 100644 --- a/boring_to_beautiful/final/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/final/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */; }; - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */; }; + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */, + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */, + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 143267097A016AD19836D89A /* Pods */ = { + isa = PBXGroup; + children = ( + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */, + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */, + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */, + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */, + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */, + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A67056D7D61CD22438BA6931 /* Pods */, + 143267097A016AD19836D89A /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - A67056D7D61CD22438BA6931 /* Pods */ = { - isa = PBXGroup; - children = ( - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */, - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */, - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */, - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */, - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */, - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */, - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */, + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */, + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */, + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */, + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */, + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -361,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */ = { + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -378,7 +378,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */ = { + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +393,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */ = { + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/final/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/final/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index b9ba5fa149..888bfbb4c7 100644 --- a/boring_to_beautiful/final/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/final/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/final/pubspec.yaml b/boring_to_beautiful/final/pubspec.yaml index abe835e2e6..b02c951374 100644 --- a/boring_to_beautiful/final/pubspec.yaml +++ b/boring_to_beautiful/final/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,14 +13,14 @@ dependencies: adaptive_components: ^0.0.10 adaptive_navigation: ^0.0.10 animations: ^2.0.11 - collection: ^1.19.0 + collection: ^1.19.1 cupertino_icons: ^1.0.8 desktop_window: ^0.4.2 dynamic_color: ^1.7.0 english_words: ^4.0.0 flutter_bloc: ^9.0.0 freezed_annotation: ^2.4.4 - go_router: ^14.7.2 + go_router: ^14.8.0 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/step_01/android/.gitignore b/boring_to_beautiful/step_01/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/boring_to_beautiful/step_01/android/.gitignore +++ b/boring_to_beautiful/step_01/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/boring_to_beautiful/step_01/android/app/build.gradle b/boring_to_beautiful/step_01/android/app/build.gradle deleted file mode 100644 index 59485b6bb8..0000000000 --- a/boring_to_beautiful/step_01/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.myartist" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.myartist" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/boring_to_beautiful/step_01/android/app/build.gradle.kts b/boring_to_beautiful/step_01/android/app/build.gradle.kts new file mode 100644 index 0000000000..b2dbe0393c --- /dev/null +++ b/boring_to_beautiful/step_01/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.myartist" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.myartist" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/boring_to_beautiful/step_01/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt b/boring_to_beautiful/step_01/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt index 1e328c8556..b724a01056 100644 --- a/boring_to_beautiful/step_01/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt +++ b/boring_to_beautiful/step_01/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.myartist import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/boring_to_beautiful/step_01/android/build.gradle b/boring_to_beautiful/step_01/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/boring_to_beautiful/step_01/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/boring_to_beautiful/step_01/android/build.gradle.kts b/boring_to_beautiful/step_01/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/boring_to_beautiful/step_01/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/boring_to_beautiful/step_01/android/gradle.properties b/boring_to_beautiful/step_01/android/gradle.properties index 2597170821..f018a61817 100644 --- a/boring_to_beautiful/step_01/android/gradle.properties +++ b/boring_to_beautiful/step_01/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties b/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties +++ b/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/boring_to_beautiful/step_01/android/settings.gradle b/boring_to_beautiful/step_01/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/boring_to_beautiful/step_01/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/boring_to_beautiful/step_01/android/settings.gradle.kts b/boring_to_beautiful/step_01/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/boring_to_beautiful/step_01/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/boring_to_beautiful/step_01/ios/Podfile b/boring_to_beautiful/step_01/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/boring_to_beautiful/step_01/ios/Podfile +++ b/boring_to_beautiful/step_01/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_01/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_01/ios/Runner.xcodeproj/project.pbxproj index f7d849e7aa..b4912290dd 100644 --- a/boring_to_beautiful/step_01/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_01/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */; }; - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */; }; + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,15 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +60,19 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 85CFC060D2B515FA7FCB18AC /* Frameworks */ = { + 6171884CE7EC0B228274CDFE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */, + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */, + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 54241974C43F645BC41820B3 /* Pods */ = { + 4CD80B4456D2B04197B640AC /* Pods */ = { isa = PBXGroup; children = ( - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */, - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */, - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */, - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */, - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */, - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */, + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */, + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */, + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */, + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */, + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */, + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 54241974C43F645BC41820B3 /* Pods */, - DA6AE8ED33598C40BFC9FCAD /* Frameworks */, + 4CD80B4456D2B04197B640AC /* Pods */, + C4E673F63230E3A6805B11E9 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - DA6AE8ED33598C40BFC9FCAD /* Frameworks */ = { + C4E673F63230E3A6805B11E9 /* Frameworks */ = { isa = PBXGroup; children = ( - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */, - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */, + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */, + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */, + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 85CFC060D2B515FA7FCB18AC /* Frameworks */, + 6171884CE7EC0B228274CDFE /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */, + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */, + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,43 +270,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -323,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */ = { + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,7 +340,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */ = { + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_01/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_01/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/boring_to_beautiful/step_01/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_01/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_bio.dart b/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_bio.dart index 227b8e91f9..8b614421db 100644 --- a/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_bio.dart +++ b/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_bio.dart @@ -18,9 +18,7 @@ class ArtistBio extends StatelessWidget { artist.bio, style: context.bodyLarge!.copyWith( fontSize: 16, - color: context.colors.onSurface.withAlpha( - 222, - ), + color: context.colors.onSurface.withAlpha(222), ), ); } diff --git a/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_card.dart b/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_card.dart index a63967f51d..1a56376a87 100644 --- a/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_card.dart +++ b/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_card.dart @@ -11,10 +11,7 @@ import '../../../shared/views/outlined_card.dart'; import '../../../shared/views/views.dart'; class ArtistCard extends StatelessWidget { - const ArtistCard({ - super.key, - required this.artist, - }); + const ArtistCard({super.key, required this.artist}); final Artist artist; @@ -24,65 +21,66 @@ class ArtistCard extends StatelessWidget { return OutlinedCard( child: LayoutBuilder( - builder: (context, dimens) => Row( - children: [ - SizedBox( - width: dimens.maxWidth * 0.4, - child: Image.asset( - artist.image.image, - fit: BoxFit.cover, - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - artist.name, - style: context.titleMedium, - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - const SizedBox(height: 10), - Text( - artist.bio, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 3, - ), - ]), - ), - if (dimens.maxHeight > 100) - Row( - children: [ - HoverableSongPlayButton( - size: const Size(50, 50), - song: nowPlaying, - child: Icon(Icons.play_circle, - color: context.colors.tertiary), + builder: + (context, dimens) => Row( + children: [ + SizedBox( + width: dimens.maxWidth * 0.4, + child: Image.asset(artist.image.image, fit: BoxFit.cover), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + artist.name, + style: context.titleMedium, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + const SizedBox(height: 10), + Text( + artist.bio, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 3, + ), + ], ), - Text( - nowPlaying.title, - maxLines: 1, - overflow: TextOverflow.clip, - style: context.labelMedium, + ), + if (dimens.maxHeight > 100) + Row( + children: [ + HoverableSongPlayButton( + size: const Size(50, 50), + song: nowPlaying, + child: Icon( + Icons.play_circle, + color: context.colors.tertiary, + ), + ), + Text( + nowPlaying.title, + maxLines: 1, + overflow: TextOverflow.clip, + style: context.labelMedium, + ), + ], ), - ], - ), - ], + ], + ), + ), ), - ), + ], ), - ], - ), ), ); } diff --git a/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_events.dart b/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_events.dart index 8b064759c6..58b61b37df 100644 --- a/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_events.dart +++ b/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_events.dart @@ -70,53 +70,32 @@ class ArtistEvents extends StatelessWidget { ); }, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], - rowBuilder: (item, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - Text(item.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(item.title)), - ]), - ), - DataCell( - Text(item.location), - ), - DataCell( - Clickable( - child: Text( - item.link, - style: TextStyle( - color: linkColor.value(theme), - decoration: TextDecoration.underline, + rowBuilder: + (item, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell(Text(item.date)), + DataCell(Row(children: [Expanded(child: Text(item.title))])), + DataCell(Text(item.location)), + DataCell( + Clickable( + child: Text( + item.link, + style: TextStyle( + color: linkColor.value(theme), + decoration: TextDecoration.underline, + ), + ), + onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ), ), - ), - onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ], ), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_ranked_songs.dart b/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_ranked_songs.dart index e484ecb3d7..3d1f4e2cf1 100644 --- a/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_ranked_songs.dart +++ b/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_ranked_songs.dart @@ -27,52 +27,42 @@ class ArtistRankedSongs extends StatelessWidget { title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), trailing: Text(song.ranking.toString()), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ); }, columns: const [ - DataColumn( - label: Text( - 'Ranking', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Title', - ), - ), - DataColumn( - label: Text( - 'Length', - ), - ), + DataColumn(label: Text('Ranking'), numeric: true), + DataColumn(label: Text('Title')), + DataColumn(label: Text('Length')), ], - rowBuilder: (song, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - HoverableSongPlayButton( - song: song, - child: Center( - child: Text(song.ranking.toString()), - ), + rowBuilder: + (song, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + HoverableSongPlayButton( + song: song, + child: Center(child: Text(song.ranking.toString())), + ), + ), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(song.image.image), + ), + const SizedBox(width: 5.0), + Expanded(child: Text(song.title)), + ], + ), + ), + DataCell(Text(song.length.toHumanizedString())), + ], ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(song.image.image), - ), - const SizedBox(width: 5.0), - Expanded(child: Text(song.title)), - ]), - ), - DataCell( - Text(song.length.toHumanizedString()), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_updates.dart b/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_updates.dart index e5b8bb5fe9..a0fabf7330 100644 --- a/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_updates.dart +++ b/boring_to_beautiful/step_01/lib/src/features/artists/view/artist_updates.dart @@ -30,7 +30,7 @@ class ArtistUpdates extends StatelessWidget { child: Text(update), ), ), - ) + ), ], ); } diff --git a/boring_to_beautiful/step_01/lib/src/features/artists/view/artists_screen.dart b/boring_to_beautiful/step_01/lib/src/features/artists/view/artists_screen.dart index 8afe759807..225d74847b 100644 --- a/boring_to_beautiful/step_01/lib/src/features/artists/view/artists_screen.dart +++ b/boring_to_beautiful/step_01/lib/src/features/artists/view/artists_screen.dart @@ -17,33 +17,33 @@ class ArtistsScreen extends StatelessWidget { Widget build(BuildContext context) { final artistsProvider = ArtistsProvider(); final artists = artistsProvider.artists; - return LayoutBuilder(builder: (context, constraints) { - return Scaffold( - primary: false, - appBar: AppBar( - title: const Text('ARTISTS'), - toolbarHeight: kToolbarHeight * 2, - ), - body: GridView.builder( - padding: const EdgeInsets.all(15), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), - childAspectRatio: 2.5, - mainAxisSpacing: 10, - crossAxisSpacing: 10, + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + primary: false, + appBar: AppBar( + title: const Text('ARTISTS'), + toolbarHeight: kToolbarHeight * 2, ), - itemCount: artists.length, - itemBuilder: (context, index) { - final artist = artists[index]; - return GestureDetector( - child: ArtistCard( - artist: artist, - ), - onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), - ); - }, - ), - ); - }); + body: GridView.builder( + padding: const EdgeInsets.all(15), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), + childAspectRatio: 2.5, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + ), + itemCount: artists.length, + itemBuilder: (context, index) { + final artist = artists[index]; + return GestureDetector( + child: ArtistCard(artist: artist), + onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), + ); + }, + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_01/lib/src/features/home/view/home_artists.dart b/boring_to_beautiful/step_01/lib/src/features/home/view/home_artists.dart index beb2c0ece4..b5a3a33ecd 100644 --- a/boring_to_beautiful/step_01/lib/src/features/home/view/home_artists.dart +++ b/boring_to_beautiful/step_01/lib/src/features/home/view/home_artists.dart @@ -22,27 +22,25 @@ class HomeArtists extends StatelessWidget { Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(15), - child: constraints.isMobile - ? Column( - children: [ - for (final artist in artists) buildTile(context, artist), - ], - ) - : Row(children: [ - for (final artist in artists) - Flexible( - flex: 1, - child: buildTile(context, artist), - ), - ]), + child: + constraints.isMobile + ? Column( + children: [ + for (final artist in artists) buildTile(context, artist), + ], + ) + : Row( + children: [ + for (final artist in artists) + Flexible(flex: 1, child: buildTile(context, artist)), + ], + ), ); } Widget buildTile(BuildContext context, Artist artist) { return ListTile( - leading: CircleAvatar( - backgroundImage: AssetImage(artist.image.image), - ), + leading: CircleAvatar(backgroundImage: AssetImage(artist.image.image)), title: Text( artist.updates.first, maxLines: 2, diff --git a/boring_to_beautiful/step_01/lib/src/features/home/view/home_recent.dart b/boring_to_beautiful/step_01/lib/src/features/home/view/home_recent.dart index c77500a663..8ba86d117d 100644 --- a/boring_to_beautiful/step_01/lib/src/features/home/view/home_recent.dart +++ b/boring_to_beautiful/step_01/lib/src/features/home/view/home_recent.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/outlined_card.dart'; class HomeRecent extends StatelessWidget { - const HomeRecent( - {super.key, required this.playlists, this.axis = Axis.horizontal}); + const HomeRecent({ + super.key, + required this.playlists, + this.axis = Axis.horizontal, + }); final List playlists; final Axis axis; @@ -43,8 +46,10 @@ class HomeRecent extends StatelessWidget { Row( children: [ Expanded( - child: Image.asset(playlist.cover.image, - fit: BoxFit.cover), + child: Image.asset( + playlist.cover.image, + fit: BoxFit.cover, + ), ), ], ), @@ -79,10 +84,7 @@ class HomeRecent extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ - ClippedImage( - playlist.cover.image, - height: 200, - ), + ClippedImage(playlist.cover.image, height: 200), Expanded( child: Center( child: Padding( @@ -104,23 +106,24 @@ class HomeRecent extends StatelessWidget { return Column( children: [ Padding( - padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), - child: Text( - playlist.title, - style: context.titleSmall!.copyWith( - fontWeight: FontWeight.bold, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - textAlign: TextAlign.center, - )), + padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), + child: Text( + playlist.title, + style: context.titleSmall!.copyWith(fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, + textAlign: TextAlign.center, + ), + ), Padding( padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text(playlist.description, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center), + child: Text( + playlist.description, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), ), ], ); diff --git a/boring_to_beautiful/step_01/lib/src/features/home/view/home_screen.dart b/boring_to_beautiful/step_01/lib/src/features/home/view/home_screen.dart index 715ddf435c..bcff070874 100644 --- a/boring_to_beautiful/step_01/lib/src/features/home/view/home_screen.dart +++ b/boring_to_beautiful/step_01/lib/src/features/home/view/home_screen.dart @@ -61,10 +61,11 @@ class _HomeScreenState extends State { children: [ const HomeHighlight(), LayoutBuilder( - builder: (context, constraints) => HomeArtists( - artists: artists, - constraints: constraints, - ), + builder: + (context, constraints) => HomeArtists( + artists: artists, + constraints: constraints, + ), ), ], ), @@ -81,9 +82,7 @@ class _HomeScreenState extends State { style: context.headlineSmall, ), ), - HomeRecent( - playlists: playlists, - ), + HomeRecent(playlists: playlists), ], ), ), @@ -101,19 +100,20 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.all(2), // Modify this line + padding: const EdgeInsets.all( + 2, + ), // Modify this line child: Text( 'Top Songs Today', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), ), ], ), @@ -126,19 +126,20 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.all(2), // Modify this line + padding: const EdgeInsets.all( + 2, + ), // Modify this line child: Text( 'New Releases', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: newReleases, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), ), ], ), diff --git a/boring_to_beautiful/step_01/lib/src/features/playlists/view/playlist_home_screen.dart b/boring_to_beautiful/step_01/lib/src/features/playlists/view/playlist_home_screen.dart index a80d767930..978608ccad 100644 --- a/boring_to_beautiful/step_01/lib/src/features/playlists/view/playlist_home_screen.dart +++ b/boring_to_beautiful/step_01/lib/src/features/playlists/view/playlist_home_screen.dart @@ -44,8 +44,10 @@ class PlaylistHomeScreen extends StatelessWidget { title: playlist.title, subtitle: playlist.description, ), - onTap: () => - GoRouter.of(context).go('/playlists/${playlist.id}'), + onTap: + () => GoRouter.of( + context, + ).go('/playlists/${playlist.id}'), ); }, ), diff --git a/boring_to_beautiful/step_01/lib/src/features/playlists/view/playlist_screen.dart b/boring_to_beautiful/step_01/lib/src/features/playlists/view/playlist_screen.dart index 5dc2f0744f..c41f500a92 100644 --- a/boring_to_beautiful/step_01/lib/src/features/playlists/view/playlist_screen.dart +++ b/boring_to_beautiful/step_01/lib/src/features/playlists/view/playlist_screen.dart @@ -20,114 +20,116 @@ class PlaylistScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - final colors = Theme.of(context).colorScheme; - final double headerHeight = constraints.isMobile - ? max(constraints.biggest.height * 0.5, 450) - : max(constraints.biggest.height * 0.25, 250); - if (constraints.isMobile) { - return Scaffold( - appBar: AppBar( - leading: BackButton( - onPressed: () => GoRouter.of(context).go('/playlists'), - ), - title: Text(playlist.title), - actions: [ - IconButton( - icon: const Icon(Icons.play_circle_fill), - onPressed: () {}, - ), - IconButton( - onPressed: () {}, - icon: const Icon(Icons.shuffle), - ), - ], - ), - body: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, - ), - ), - ); - } - return Scaffold( - body: CustomScrollView( - slivers: [ - SliverAppBar( + return LayoutBuilder( + builder: (context, constraints) { + final colors = Theme.of(context).colorScheme; + final double headerHeight = + constraints.isMobile + ? max(constraints.biggest.height * 0.5, 450) + : max(constraints.biggest.height * 0.25, 250); + if (constraints.isMobile) { + return Scaffold( + appBar: AppBar( leading: BackButton( onPressed: () => GoRouter.of(context).go('/playlists'), ), - expandedHeight: headerHeight, - pinned: false, - flexibleSpace: FlexibleSpaceBar( - background: AdaptiveImageCard( - axis: constraints.isMobile ? Axis.vertical : Axis.horizontal, - constraints: - constraints.copyWith(maxHeight: headerHeight).normalize(), - image: playlist.cover.image, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'PLAYLIST', - style: context.titleSmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.title, - style: context.displaySmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.description, - style: context.bodyLarge!.copyWith( - color: colors.onSurface.withAlpha(204), + title: Text(playlist.title), + actions: [ + IconButton( + icon: const Icon(Icons.play_circle_fill), + onPressed: () {}, + ), + IconButton(onPressed: () {}, icon: const Icon(Icons.shuffle)), + ], + ), + body: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), + ), + ); + } + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + leading: BackButton( + onPressed: () => GoRouter.of(context).go('/playlists'), + ), + expandedHeight: headerHeight, + pinned: false, + flexibleSpace: FlexibleSpaceBar( + background: AdaptiveImageCard( + axis: + constraints.isMobile ? Axis.vertical : Axis.horizontal, + constraints: + constraints + .copyWith(maxHeight: headerHeight) + .normalize(), + image: playlist.cover.image, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'PLAYLIST', + style: context.titleSmall!.copyWith( + color: colors.onSurface, + ), ), - ), - const SizedBox(height: 8), - Row( - children: [ - IconButton( - icon: Icon( - Icons.play_circle_fill, - color: colors.tertiary, - ), - onPressed: () {}, + Text( + playlist.title, + style: context.displaySmall!.copyWith( + color: colors.onSurface, ), - TextButton.icon( - onPressed: () {}, - icon: Icon( - Icons.shuffle, - color: colors.tertiary, - ), - label: Text( - 'Shuffle', - style: context.bodySmall!.copyWith( + ), + Text( + playlist.description, + style: context.bodyLarge!.copyWith( + color: colors.onSurface.withAlpha(204), + ), + ), + const SizedBox(height: 8), + Row( + children: [ + IconButton( + icon: Icon( + Icons.play_circle_fill, color: colors.tertiary, ), + onPressed: () {}, ), - ), - ], - ), - ], + TextButton.icon( + onPressed: () {}, + icon: Icon(Icons.shuffle, color: colors.tertiary), + label: Text( + 'Shuffle', + style: context.bodySmall!.copyWith( + color: colors.tertiary, + ), + ), + ), + ], + ), + ], + ), ), ), ), - ), - SliverToBoxAdapter( - child: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, + SliverToBoxAdapter( + child: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), ), ), - ), - ], - ), - ); - }); + ], + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_01/lib/src/features/playlists/view/playlist_songs.dart b/boring_to_beautiful/step_01/lib/src/features/playlists/view/playlist_songs.dart index e944336540..1d5a2e9879 100644 --- a/boring_to_beautiful/step_01/lib/src/features/playlists/view/playlist_songs.dart +++ b/boring_to_beautiful/step_01/lib/src/features/playlists/view/playlist_songs.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/views.dart'; class PlaylistSongs extends StatelessWidget { - const PlaylistSongs( - {super.key, required this.playlist, required this.constraints}); + const PlaylistSongs({ + super.key, + required this.playlist, + required this.constraints, + }); final Playlist playlist; final BoxConstraints constraints; @@ -25,14 +28,9 @@ class PlaylistSongs extends StatelessWidget { breakpoint: 450, columns: const [ DataColumn( - label: Padding( - padding: EdgeInsets.only(left: 20), - child: Text('#'), - ), - ), - DataColumn( - label: Text('Title'), + label: Padding(padding: EdgeInsets.only(left: 20), child: Text('#')), ), + DataColumn(label: Text('Title')), DataColumn( label: Padding( padding: EdgeInsets.only(right: 10), @@ -40,38 +38,40 @@ class PlaylistSongs extends StatelessWidget { ), ), ], - rowBuilder: (context, index) => DataRow.byIndex( - index: index, - cells: [ - DataCell( - // Add HoverableSongPlayButton - Center( - child: Text( - (index + 1).toString(), - textAlign: TextAlign.center, + rowBuilder: + (context, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + // Add HoverableSongPlayButton + Center( + child: Text( + (index + 1).toString(), + textAlign: TextAlign.center, + ), + ), ), - ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(playlist.songs[index].image.image), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(playlist.songs[index].image.image), + ), + const SizedBox(width: 10), + Expanded(child: Text(playlist.songs[index].title)), + ], + ), ), - const SizedBox(width: 10), - Expanded(child: Text(playlist.songs[index].title)), - ]), - ), - DataCell( - Text(playlist.songs[index].length.toHumanizedString()), + DataCell(Text(playlist.songs[index].length.toHumanizedString())), + ], ), - ], - ), itemBuilder: (song, index) { return ListTile( - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), leading: ClippedImage(song.image.image), title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), diff --git a/boring_to_beautiful/step_01/lib/src/shared/app.dart b/boring_to_beautiful/step_01/lib/src/shared/app.dart index eced12177d..771a2be1ad 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/app.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/app.dart @@ -19,45 +19,49 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - final settings = ValueNotifier(ThemeSettings( - sourceColor: Colors.pink, // Replace this color - themeMode: ThemeMode.system, - )); + final settings = ValueNotifier( + ThemeSettings( + sourceColor: Colors.pink, // Replace this color + themeMode: ThemeMode.system, + ), + ); @override Widget build(BuildContext context) { return BlocProvider( create: (context) => PlaybackBloc(), child: DynamicColorBuilder( - builder: (lightDynamic, darkDynamic) => ThemeProvider( - lightDynamic: lightDynamic, - darkDynamic: darkDynamic, - settings: settings, - child: NotificationListener( - onNotification: (notification) { - settings.value = notification.settings; - return true; - }, - child: ValueListenableBuilder( - valueListenable: settings, - builder: (context, value, _) { - // Create theme instance - return MaterialApp.router( - debugShowCheckedModeBanner: false, - title: 'Flutter Demo', - // Add theme - // Add dark theme - // Add theme mode - routeInformationParser: appRouter.routeInformationParser, - routeInformationProvider: - appRouter.routeInformationProvider, - routerDelegate: appRouter.routerDelegate, - builder: (context, child) { - return PlayPauseListener(child: child!); - }, - ); + builder: + (lightDynamic, darkDynamic) => ThemeProvider( + lightDynamic: lightDynamic, + darkDynamic: darkDynamic, + settings: settings, + child: NotificationListener( + onNotification: (notification) { + settings.value = notification.settings; + return true; }, + child: ValueListenableBuilder( + valueListenable: settings, + builder: (context, value, _) { + // Create theme instance + return MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + // Add theme + // Add dark theme + // Add theme mode + routeInformationParser: appRouter.routeInformationParser, + routeInformationProvider: + appRouter.routeInformationProvider, + routerDelegate: appRouter.routerDelegate, + builder: (context, child) { + return PlayPauseListener(child: child!); + }, + ); + }, + ), ), - )), + ), ), ); } diff --git a/boring_to_beautiful/step_01/lib/src/shared/classes/image.dart b/boring_to_beautiful/step_01/lib/src/shared/classes/image.dart index a1ef427c1d..00a6472b4a 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/classes/image.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/classes/image.dart @@ -3,10 +3,11 @@ // found in the LICENSE file. class MyArtistImage { - const MyArtistImage( - {required this.image, - required this.sourceName, - required this.sourceLink}); + const MyArtistImage({ + required this.image, + required this.sourceName, + required this.sourceLink, + }); final String image; final String sourceName; diff --git a/boring_to_beautiful/step_01/lib/src/shared/classes/playlist.dart b/boring_to_beautiful/step_01/lib/src/shared/classes/playlist.dart index 59899dc619..5f0225059d 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/classes/playlist.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/classes/playlist.dart @@ -17,8 +17,9 @@ class Playlist { this.description = '', required this.songs, this.cover = const MyArtistImage( - image: 'assets/images/record.jpeg', - sourceName: 'Adobe Stock Images', - sourceLink: ''), + image: 'assets/images/record.jpeg', + sourceName: 'Adobe Stock Images', + sourceLink: '', + ), }); } diff --git a/boring_to_beautiful/step_01/lib/src/shared/classes/ranked_song.dart b/boring_to_beautiful/step_01/lib/src/shared/classes/ranked_song.dart index 5908268c8c..2362bfae64 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/classes/ranked_song.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/classes/ranked_song.dart @@ -7,7 +7,11 @@ import './classes.dart'; class RankedSong extends Song { final int ranking; - const RankedSong(this.ranking, String title, Artist artist, Duration length, - MyArtistImage image) - : super(title, artist, length, image); + const RankedSong( + this.ranking, + String title, + Artist artist, + Duration length, + MyArtistImage image, + ) : super(title, artist, length, image); } diff --git a/boring_to_beautiful/step_01/lib/src/shared/extensions.dart b/boring_to_beautiful/step_01/lib/src/shared/extensions.dart index 6d9ea1f480..6a03f8b8b1 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/extensions.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/extensions.dart @@ -9,51 +9,36 @@ extension TypographyUtils on BuildContext { ThemeData get theme => Theme.of(this); TextTheme get textTheme => theme.textTheme; // Modify this line ColorScheme get colors => theme.colorScheme; - TextStyle? get displayLarge => textTheme.displayLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displayMedium => textTheme.displayMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displaySmall => textTheme.displaySmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineLarge => textTheme.headlineLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineMedium => textTheme.headlineMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineSmall => textTheme.headlineSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleLarge => textTheme.titleLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleMedium => textTheme.titleMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleSmall => textTheme.titleSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelLarge => textTheme.labelLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelMedium => textTheme.labelMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelSmall => textTheme.labelSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyLarge => textTheme.bodyLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyMedium => textTheme.bodyMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodySmall => textTheme.bodySmall?.copyWith( - color: colors.onSurface, - ); + TextStyle? get displayLarge => + textTheme.displayLarge?.copyWith(color: colors.onSurface); + TextStyle? get displayMedium => + textTheme.displayMedium?.copyWith(color: colors.onSurface); + TextStyle? get displaySmall => + textTheme.displaySmall?.copyWith(color: colors.onSurface); + TextStyle? get headlineLarge => + textTheme.headlineLarge?.copyWith(color: colors.onSurface); + TextStyle? get headlineMedium => + textTheme.headlineMedium?.copyWith(color: colors.onSurface); + TextStyle? get headlineSmall => + textTheme.headlineSmall?.copyWith(color: colors.onSurface); + TextStyle? get titleLarge => + textTheme.titleLarge?.copyWith(color: colors.onSurface); + TextStyle? get titleMedium => + textTheme.titleMedium?.copyWith(color: colors.onSurface); + TextStyle? get titleSmall => + textTheme.titleSmall?.copyWith(color: colors.onSurface); + TextStyle? get labelLarge => + textTheme.labelLarge?.copyWith(color: colors.onSurface); + TextStyle? get labelMedium => + textTheme.labelMedium?.copyWith(color: colors.onSurface); + TextStyle? get labelSmall => + textTheme.labelSmall?.copyWith(color: colors.onSurface); + TextStyle? get bodyLarge => + textTheme.bodyLarge?.copyWith(color: colors.onSurface); + TextStyle? get bodyMedium => + textTheme.bodyMedium?.copyWith(color: colors.onSurface); + TextStyle? get bodySmall => + textTheme.bodySmall?.copyWith(color: colors.onSurface); } extension BreakpointUtils on BoxConstraints { @@ -65,17 +50,17 @@ extension BreakpointUtils on BoxConstraints { extension DurationString on String { /// Assumes a string (roughly) of the format '\d{1,2}:\d{2}' Duration toDuration() => switch (split(':')) { - [var minutes, var seconds] => Duration( - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - [var hours, var minutes, var seconds] => Duration( - hours: int.parse(hours.trim()), - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - _ => throw Exception('Invalid duration string: $this'), - }; + [var minutes, var seconds] => Duration( + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + [var hours, var minutes, var seconds] => Duration( + hours: int.parse(hours.trim()), + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + _ => throw Exception('Invalid duration string: $this'), + }; } extension HumanizedDuration on Duration { diff --git a/boring_to_beautiful/step_01/lib/src/shared/playback/bloc/playback_bloc.dart b/boring_to_beautiful/step_01/lib/src/shared/playback/bloc/playback_bloc.dart index 73c2f4c436..c6c871937b 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/playback/bloc/playback_bloc.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/playback/bloc/playback_bloc.dart @@ -41,9 +41,8 @@ class PlaybackBloc extends Bloc { } } - void _handlePlaybackProgress(Duration progress) => add( - PlaybackEvent.songProgress(progress), - ); + void _handlePlaybackProgress(Duration progress) => + add(PlaybackEvent.songProgress(progress)); void _togglePlayPause(TogglePlayPause event, Emitter emit) { state.isPlaying ? _pausePlayback() : _resumePlayback(); @@ -52,8 +51,10 @@ class PlaybackBloc extends Bloc { void _pausePlayback() => _currentlyPlayingSubscription!.cancel(); - void _resumePlayback() => _currentlyPlayingSubscription = - _startPlayingStream().listen(_handlePlaybackProgress); + void _resumePlayback() => + _currentlyPlayingSubscription = _startPlayingStream().listen( + _handlePlaybackProgress, + ); void _changeSong(ChangeSong event, Emitter emit) { emit( @@ -69,19 +70,15 @@ class PlaybackBloc extends Bloc { } void _songProgress(SongProgress event, Emitter emit) => emit( - state.copyWith( - songWithProgress: state.songWithProgress!.copyWith( - progress: state.songWithProgress!.progress + event.duration, - ), - ), - ); + state.copyWith( + songWithProgress: state.songWithProgress!.copyWith( + progress: state.songWithProgress!.progress + event.duration, + ), + ), + ); void _setVolume(SetVolume event, Emitter emit) => emit( - state.copyWith( - volume: event.value, - isMuted: false, - previousVolume: null, - ), - ); + state.copyWith(volume: event.value, isMuted: false, previousVolume: null), + ); void _toggleMute(ToggleMute event, Emitter emit) { if (state.isMuted) { @@ -94,11 +91,7 @@ class PlaybackBloc extends Bloc { ); } else { emit( - state.copyWith( - isMuted: true, - volume: 0, - previousVolume: state.volume, - ), + state.copyWith(isMuted: true, volume: 0, previousVolume: state.volume), ); } } diff --git a/boring_to_beautiful/step_01/lib/src/shared/playback/bloc/playback_bloc.freezed.dart b/boring_to_beautiful/step_01/lib/src/shared/playback/bloc/playback_bloc.freezed.dart index 8a422cd449..54e870ab6f 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/playback/bloc/playback_bloc.freezed.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/playback/bloc/playback_bloc.freezed.dart @@ -12,7 +12,8 @@ part of 'playback_bloc.dart'; T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models', +); /// @nodoc mixin _$PlaybackEvent { @@ -24,8 +25,7 @@ mixin _$PlaybackEvent { required TResult Function() toggleMute, required TResult Function(double percent) moveToInSong, required TResult Function(Duration duration) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? togglePlayPause, @@ -34,8 +34,7 @@ mixin _$PlaybackEvent { TResult? Function()? toggleMute, TResult? Function(double percent)? moveToInSong, TResult? Function(Duration duration)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ TResult Function()? togglePlayPause, @@ -45,8 +44,7 @@ mixin _$PlaybackEvent { TResult Function(double percent)? moveToInSong, TResult Function(Duration duration)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult map({ required TResult Function(TogglePlayPause value) togglePlayPause, @@ -55,8 +53,7 @@ mixin _$PlaybackEvent { required TResult Function(ToggleMute value) toggleMute, required TResult Function(MoveToInSong value) moveToInSong, required TResult Function(SongProgress value) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ TResult? Function(TogglePlayPause value)? togglePlayPause, @@ -65,8 +62,7 @@ mixin _$PlaybackEvent { TResult? Function(ToggleMute value)? toggleMute, TResult? Function(MoveToInSong value)? moveToInSong, TResult? Function(SongProgress value)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeMap({ TResult Function(TogglePlayPause value)? togglePlayPause, @@ -76,15 +72,15 @@ mixin _$PlaybackEvent { TResult Function(MoveToInSong value)? moveToInSong, TResult Function(SongProgress value)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; } /// @nodoc abstract class $PlaybackEventCopyWith<$Res> { factory $PlaybackEventCopyWith( - PlaybackEvent value, $Res Function(PlaybackEvent) then) = - _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; + PlaybackEvent value, + $Res Function(PlaybackEvent) then, + ) = _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; } /// @nodoc @@ -103,9 +99,10 @@ class _$PlaybackEventCopyWithImpl<$Res, $Val extends PlaybackEvent> /// @nodoc abstract class _$$TogglePlayPauseImplCopyWith<$Res> { - factory _$$TogglePlayPauseImplCopyWith(_$TogglePlayPauseImpl value, - $Res Function(_$TogglePlayPauseImpl) then) = - __$$TogglePlayPauseImplCopyWithImpl<$Res>; + factory _$$TogglePlayPauseImplCopyWith( + _$TogglePlayPauseImpl value, + $Res Function(_$TogglePlayPauseImpl) then, + ) = __$$TogglePlayPauseImplCopyWithImpl<$Res>; } /// @nodoc @@ -113,8 +110,9 @@ class __$$TogglePlayPauseImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$TogglePlayPauseImpl> implements _$$TogglePlayPauseImplCopyWith<$Res> { __$$TogglePlayPauseImplCopyWithImpl( - _$TogglePlayPauseImpl _value, $Res Function(_$TogglePlayPauseImpl) _then) - : super(_value, _then); + _$TogglePlayPauseImpl _value, + $Res Function(_$TogglePlayPauseImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -233,8 +231,9 @@ abstract class TogglePlayPause implements PlaybackEvent { /// @nodoc abstract class _$$ChangeSongImplCopyWith<$Res> { factory _$$ChangeSongImplCopyWith( - _$ChangeSongImpl value, $Res Function(_$ChangeSongImpl) then) = - __$$ChangeSongImplCopyWithImpl<$Res>; + _$ChangeSongImpl value, + $Res Function(_$ChangeSongImpl) then, + ) = __$$ChangeSongImplCopyWithImpl<$Res>; @useResult $Res call({Song song}); } @@ -244,22 +243,23 @@ class __$$ChangeSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ChangeSongImpl> implements _$$ChangeSongImplCopyWith<$Res> { __$$ChangeSongImplCopyWithImpl( - _$ChangeSongImpl _value, $Res Function(_$ChangeSongImpl) _then) - : super(_value, _then); + _$ChangeSongImpl _value, + $Res Function(_$ChangeSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? song = null, - }) { - return _then(_$ChangeSongImpl( - null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? song = null}) { + return _then( + _$ChangeSongImpl( + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -397,8 +397,9 @@ abstract class ChangeSong implements PlaybackEvent { /// @nodoc abstract class _$$SetVolumeImplCopyWith<$Res> { factory _$$SetVolumeImplCopyWith( - _$SetVolumeImpl value, $Res Function(_$SetVolumeImpl) then) = - __$$SetVolumeImplCopyWithImpl<$Res>; + _$SetVolumeImpl value, + $Res Function(_$SetVolumeImpl) then, + ) = __$$SetVolumeImplCopyWithImpl<$Res>; @useResult $Res call({double value}); } @@ -408,22 +409,23 @@ class __$$SetVolumeImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SetVolumeImpl> implements _$$SetVolumeImplCopyWith<$Res> { __$$SetVolumeImplCopyWithImpl( - _$SetVolumeImpl _value, $Res Function(_$SetVolumeImpl) _then) - : super(_value, _then); + _$SetVolumeImpl _value, + $Res Function(_$SetVolumeImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? value = null, - }) { - return _then(_$SetVolumeImpl( - null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? value = null}) { + return _then( + _$SetVolumeImpl( + null == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -561,8 +563,9 @@ abstract class SetVolume implements PlaybackEvent { /// @nodoc abstract class _$$ToggleMuteImplCopyWith<$Res> { factory _$$ToggleMuteImplCopyWith( - _$ToggleMuteImpl value, $Res Function(_$ToggleMuteImpl) then) = - __$$ToggleMuteImplCopyWithImpl<$Res>; + _$ToggleMuteImpl value, + $Res Function(_$ToggleMuteImpl) then, + ) = __$$ToggleMuteImplCopyWithImpl<$Res>; } /// @nodoc @@ -570,8 +573,9 @@ class __$$ToggleMuteImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ToggleMuteImpl> implements _$$ToggleMuteImplCopyWith<$Res> { __$$ToggleMuteImplCopyWithImpl( - _$ToggleMuteImpl _value, $Res Function(_$ToggleMuteImpl) _then) - : super(_value, _then); + _$ToggleMuteImpl _value, + $Res Function(_$ToggleMuteImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -690,8 +694,9 @@ abstract class ToggleMute implements PlaybackEvent { /// @nodoc abstract class _$$MoveToInSongImplCopyWith<$Res> { factory _$$MoveToInSongImplCopyWith( - _$MoveToInSongImpl value, $Res Function(_$MoveToInSongImpl) then) = - __$$MoveToInSongImplCopyWithImpl<$Res>; + _$MoveToInSongImpl value, + $Res Function(_$MoveToInSongImpl) then, + ) = __$$MoveToInSongImplCopyWithImpl<$Res>; @useResult $Res call({double percent}); } @@ -701,22 +706,23 @@ class __$$MoveToInSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$MoveToInSongImpl> implements _$$MoveToInSongImplCopyWith<$Res> { __$$MoveToInSongImplCopyWithImpl( - _$MoveToInSongImpl _value, $Res Function(_$MoveToInSongImpl) _then) - : super(_value, _then); + _$MoveToInSongImpl _value, + $Res Function(_$MoveToInSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? percent = null, - }) { - return _then(_$MoveToInSongImpl( - null == percent - ? _value.percent - : percent // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? percent = null}) { + return _then( + _$MoveToInSongImpl( + null == percent + ? _value.percent + : percent // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -854,8 +860,9 @@ abstract class MoveToInSong implements PlaybackEvent { /// @nodoc abstract class _$$SongProgressImplCopyWith<$Res> { factory _$$SongProgressImplCopyWith( - _$SongProgressImpl value, $Res Function(_$SongProgressImpl) then) = - __$$SongProgressImplCopyWithImpl<$Res>; + _$SongProgressImpl value, + $Res Function(_$SongProgressImpl) then, + ) = __$$SongProgressImplCopyWithImpl<$Res>; @useResult $Res call({Duration duration}); } @@ -865,22 +872,23 @@ class __$$SongProgressImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SongProgressImpl> implements _$$SongProgressImplCopyWith<$Res> { __$$SongProgressImplCopyWithImpl( - _$SongProgressImpl _value, $Res Function(_$SongProgressImpl) _then) - : super(_value, _then); + _$SongProgressImpl _value, + $Res Function(_$SongProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? duration = null, - }) { - return _then(_$SongProgressImpl( - null == duration - ? _value.duration - : duration // ignore: cast_nullable_to_non_nullable - as Duration, - )); + $Res call({Object? duration = null}) { + return _then( + _$SongProgressImpl( + null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as Duration, + ), + ); } } @@ -1037,15 +1045,17 @@ mixin _$PlaybackState { /// @nodoc abstract class $PlaybackStateCopyWith<$Res> { factory $PlaybackStateCopyWith( - PlaybackState value, $Res Function(PlaybackState) then) = - _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; + PlaybackState value, + $Res Function(PlaybackState) then, + ) = _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); $SongWithProgressCopyWith<$Res>? get songWithProgress; } @@ -1071,28 +1081,36 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_value.copyWith( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - ) as $Val); + return _then( + _value.copyWith( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ) + as $Val, + ); } /// Create a copy of PlaybackState @@ -1114,16 +1132,18 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> abstract class _$$PlaybackStateImplCopyWith<$Res> implements $PlaybackStateCopyWith<$Res> { factory _$$PlaybackStateImplCopyWith( - _$PlaybackStateImpl value, $Res Function(_$PlaybackStateImpl) then) = - __$$PlaybackStateImplCopyWithImpl<$Res>; + _$PlaybackStateImpl value, + $Res Function(_$PlaybackStateImpl) then, + ) = __$$PlaybackStateImplCopyWithImpl<$Res>; @override @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); @override $SongWithProgressCopyWith<$Res>? get songWithProgress; @@ -1134,8 +1154,9 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> extends _$PlaybackStateCopyWithImpl<$Res, _$PlaybackStateImpl> implements _$$PlaybackStateImplCopyWith<$Res> { __$$PlaybackStateImplCopyWithImpl( - _$PlaybackStateImpl _value, $Res Function(_$PlaybackStateImpl) _then) - : super(_value, _then); + _$PlaybackStateImpl _value, + $Res Function(_$PlaybackStateImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1148,40 +1169,48 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_$PlaybackStateImpl( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - )); + return _then( + _$PlaybackStateImpl( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ), + ); } } /// @nodoc class _$PlaybackStateImpl implements _PlaybackState { - const _$PlaybackStateImpl( - {this.volume = 0.5, - this.previousVolume, - this.isMuted = false, - this.isPlaying = false, - this.songWithProgress}); + const _$PlaybackStateImpl({ + this.volume = 0.5, + this.previousVolume, + this.isMuted = false, + this.isPlaying = false, + this.songWithProgress, + }); /// Legal values are between 0 and 1. @override @@ -1221,8 +1250,14 @@ class _$PlaybackStateImpl implements _PlaybackState { } @override - int get hashCode => Object.hash(runtimeType, volume, previousVolume, isMuted, - isPlaying, songWithProgress); + int get hashCode => Object.hash( + runtimeType, + volume, + previousVolume, + isMuted, + isPlaying, + songWithProgress, + ); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1234,12 +1269,13 @@ class _$PlaybackStateImpl implements _PlaybackState { } abstract class _PlaybackState implements PlaybackState { - const factory _PlaybackState( - {final double volume, - final double? previousVolume, - final bool isMuted, - final bool isPlaying, - final SongWithProgress? songWithProgress}) = _$PlaybackStateImpl; + const factory _PlaybackState({ + final double volume, + final double? previousVolume, + final bool isMuted, + final bool isPlaying, + final SongWithProgress? songWithProgress, + }) = _$PlaybackStateImpl; /// Legal values are between 0 and 1. @override @@ -1278,8 +1314,9 @@ mixin _$SongWithProgress { /// @nodoc abstract class $SongWithProgressCopyWith<$Res> { factory $SongWithProgressCopyWith( - SongWithProgress value, $Res Function(SongWithProgress) then) = - _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; + SongWithProgress value, + $Res Function(SongWithProgress) then, + ) = _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; @useResult $Res call({Duration progress, Song song}); } @@ -1298,29 +1335,32 @@ class _$SongWithProgressCopyWithImpl<$Res, $Val extends SongWithProgress> /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_value.copyWith( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - ) as $Val); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _value.copyWith( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ) + as $Val, + ); } } /// @nodoc abstract class _$$SongWithProgressImplCopyWith<$Res> implements $SongWithProgressCopyWith<$Res> { - factory _$$SongWithProgressImplCopyWith(_$SongWithProgressImpl value, - $Res Function(_$SongWithProgressImpl) then) = - __$$SongWithProgressImplCopyWithImpl<$Res>; + factory _$$SongWithProgressImplCopyWith( + _$SongWithProgressImpl value, + $Res Function(_$SongWithProgressImpl) then, + ) = __$$SongWithProgressImplCopyWithImpl<$Res>; @override @useResult $Res call({Duration progress, Song song}); @@ -1330,28 +1370,30 @@ abstract class _$$SongWithProgressImplCopyWith<$Res> class __$$SongWithProgressImplCopyWithImpl<$Res> extends _$SongWithProgressCopyWithImpl<$Res, _$SongWithProgressImpl> implements _$$SongWithProgressImplCopyWith<$Res> { - __$$SongWithProgressImplCopyWithImpl(_$SongWithProgressImpl _value, - $Res Function(_$SongWithProgressImpl) _then) - : super(_value, _then); + __$$SongWithProgressImplCopyWithImpl( + _$SongWithProgressImpl _value, + $Res Function(_$SongWithProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of SongWithProgress /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_$SongWithProgressImpl( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _$SongWithProgressImpl( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -1390,13 +1432,16 @@ class _$SongWithProgressImpl implements _SongWithProgress { @pragma('vm:prefer-inline') _$$SongWithProgressImplCopyWith<_$SongWithProgressImpl> get copyWith => __$$SongWithProgressImplCopyWithImpl<_$SongWithProgressImpl>( - this, _$identity); + this, + _$identity, + ); } abstract class _SongWithProgress implements SongWithProgress { - const factory _SongWithProgress( - {required final Duration progress, - required final Song song}) = _$SongWithProgressImpl; + const factory _SongWithProgress({ + required final Duration progress, + required final Song song, + }) = _$SongWithProgressImpl; @override Duration get progress; diff --git a/boring_to_beautiful/step_01/lib/src/shared/providers/artists.dart b/boring_to_beautiful/step_01/lib/src/shared/providers/artists.dart index d116ad9cdd..f9e4a8063e 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/providers/artists.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/providers/artists.dart @@ -11,162 +11,175 @@ class ArtistsProvider { static ArtistsProvider get shared => ArtistsProvider(); List get artists => const [ - Artist( - id: 'jmo', - name: 'Jessie Morrison', + Artist( + id: 'jmo', + name: 'Jessie Morrison', + image: MyArtistImage( + image: 'assets/images/artists/woman.jpeg', + sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', + sourceName: 'Daniel Monteiro', + ), + bio: + 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', + updates: [ + 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', + 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', + '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', + ], + events: [ + Event( + date: '1/20/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Mountain View, California', + link: 'Tickets', + ), + Event( + date: '1/22/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Austin, Texas', + link: 'Tickets', + ), + Event( + date: '1/23/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Houston, Texas', + link: 'Tickets', + ), + Event( + date: '2/8/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Los Angeles, California', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', + author: 'By Jacqueline Stewart', + blurb: + 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', image: MyArtistImage( - image: 'assets/images/artists/woman.jpeg', - sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', - sourceName: 'Daniel Monteiro', + image: 'assets/images/news/concert.jpeg', + sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', + sourceName: 'Anthony DELANOIX', ), - bio: - 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', - updates: [ - 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', - 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', - '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', - ], - events: [ - Event( - date: '1/20/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Mountain View, California', - link: 'Tickets'), - Event( - date: '1/22/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Austin, Texas', - link: 'Tickets'), - Event( - date: '1/23/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Houston, Texas', - link: 'Tickets'), - Event( - date: '2/8/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Los Angeles, California', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', - author: 'By Jacqueline Stewart', - blurb: - 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', - image: MyArtistImage( - image: 'assets/images/news/concert.jpeg', - sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', - sourceName: 'Anthony DELANOIX', - ), - ) - ], ), - Artist( - id: 'lb', - name: 'Lucas Bryant', + ], + ), + Artist( + id: 'lb', + name: 'Lucas Bryant', + image: MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + bio: + 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', + updates: [ + 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', + 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', + 'We\'re going all in this weekend! How are you doing, Vegas?!', + ], + events: [ + Event( + date: '5/16/22', + title: 'Back To My Hometown Tour', + location: 'Indianapolis, IN', + link: 'Tickets', + ), + Event( + date: '5/18/22', + title: 'Back To My Hometown Tour', + location: 'San Antonio, TX', + link: 'Tickets', + ), + Event( + date: '5/20/22', + title: 'Back To My Hometown Tour', + location: 'Phoenix, AZ', + link: 'Tickets', + ), + Event( + date: '5/23/22', + title: 'Back To My Hometown Tour', + location: 'San Diego, CA', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', + author: 'Lonnie Hall', + blurb: + 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', image: MyArtistImage( image: 'assets/images/albums/artist1-album2.jpg', sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', sourceName: 'Keagan Henman', ), - bio: - 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', - updates: [ - 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', - 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', - 'We\'re going all in this weekend! How are you doing, Vegas?!', - ], - events: [ - Event( - date: '5/16/22', - title: 'Back To My Hometown Tour', - location: 'Indianapolis, IN', - link: 'Tickets'), - Event( - date: '5/18/22', - title: 'Back To My Hometown Tour', - location: 'San Antonio, TX', - link: 'Tickets'), - Event( - date: '5/20/22', - title: 'Back To My Hometown Tour', - location: 'Phoenix, AZ', - link: 'Tickets'), - Event( - date: '5/23/22', - title: 'Back To My Hometown Tour', - location: 'San Diego, CA', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', - author: 'Lonnie Hall', - blurb: - 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', - image: MyArtistImage( - image: 'assets/images/albums/artist1-album2.jpg', - sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', - sourceName: 'Keagan Henman', - ), - ), - ], ), - Artist( - id: 'jonjames', - name: 'Jon James', + ], + ), + Artist( + id: 'jonjames', + name: 'Jon James', + image: MyArtistImage( + image: 'assets/images/artists/joe.jpg', + sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', + sourceName: 'Natalie Runnerstrom', + ), + bio: + 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', + updates: [ + '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', + '4 days until I get to share some of the favorite songs I\'ve ever written with you.', + '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', + ], + events: [ + Event( + date: '10/22/21', + title: 'Falling For You Tour', + location: 'Dallas, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/23/21', + title: 'Falling For You Tour', + location: 'Houston, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/26/21', + title: 'Falling For You Tour', + location: 'Phoenix, Arizona', + link: 'Ticketmaster', + ), + Event( + date: '10/27/21', + title: 'Falling For You Tour', + location: 'Los Angeles, California', + link: 'Ticketmaster', + ), + ], + news: [ + News( + title: + 'Jon James is excited for the release of his sixth album "Falling For You"', + author: 'Top Media Today', + blurb: + 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', image: MyArtistImage( - image: 'assets/images/artists/joe.jpg', - sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', - sourceName: 'Natalie Runnerstrom', + image: 'assets/images/news/recording_studio.jpg', + sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', + sourceName: 'Yohann LIBOT', ), - bio: - 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', - updates: [ - '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', - '4 days until I get to share some of the favorite songs I\'ve ever written with you.', - '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', - ], - events: [ - Event( - date: '10/22/21', - title: 'Falling For You Tour', - location: 'Dallas, Texas', - link: 'Ticketmaster'), - Event( - date: '10/23/21', - title: 'Falling For You Tour', - location: 'Houston, Texas', - link: 'Ticketmaster'), - Event( - date: '10/26/21', - title: 'Falling For You Tour', - location: 'Phoenix, Arizona', - link: 'Ticketmaster'), - Event( - date: '10/27/21', - title: 'Falling For You Tour', - location: 'Los Angeles, California', - link: 'Ticketmaster'), - ], - news: [ - News( - title: - 'Jon James is excited for the release of his sixth album "Falling For You"', - author: 'Top Media Today', - blurb: - 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', - image: MyArtistImage( - image: 'assets/images/news/recording_studio.jpg', - sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', - sourceName: 'Yohann LIBOT'), - ) - ], ), - ]; + ], + ), + ]; Artist? getArtist(String id) { return artists.firstWhereOrNull((artist) => artist.id == id); diff --git a/boring_to_beautiful/step_01/lib/src/shared/providers/playlists.dart b/boring_to_beautiful/step_01/lib/src/shared/providers/playlists.dart index e8bab994dd..f27f71b3ec 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/providers/playlists.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/providers/playlists.dart @@ -18,41 +18,50 @@ class PlaylistsProvider { static List images() { return [ const MyArtistImage( - image: 'assets/images/playlists/favorite.jpg', - sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/favorite.jpg', + sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/austin.jpg', - sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', - sourceName: 'Carlos Alfonso'), + image: 'assets/images/playlists/austin.jpg', + sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', + sourceName: 'Carlos Alfonso', + ), const MyArtistImage( - image: 'assets/images/playlists/reading.jpg', - sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', - sourceName: 'Alexandra Fuller'), + image: 'assets/images/playlists/reading.jpg', + sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', + sourceName: 'Alexandra Fuller', + ), const MyArtistImage( - image: 'assets/images/playlists/workout.jpg', - sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/workout.jpg', + sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/calm.jpg', - sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', - sourceName: 'Jared Rice'), + image: 'assets/images/playlists/calm.jpg', + sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', + sourceName: 'Jared Rice', + ), const MyArtistImage( - image: 'assets/images/playlists/coffee.jpg', - sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', - sourceName: 'Nathan Dumlao'), + image: 'assets/images/playlists/coffee.jpg', + sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', + sourceName: 'Nathan Dumlao', + ), const MyArtistImage( - image: 'assets/images/playlists/piano.jpg', - sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', - sourceName: 'Jordan Whitfield'), + image: 'assets/images/playlists/piano.jpg', + sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', + sourceName: 'Jordan Whitfield', + ), const MyArtistImage( - image: 'assets/images/playlists/studying.jpg', - sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', - sourceName: 'Humble Lamb'), + image: 'assets/images/playlists/studying.jpg', + sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', + sourceName: 'Humble Lamb', + ), const MyArtistImage( - image: 'assets/images/playlists/jazz.jpg', - sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', - sourceName: 'dimitri.photography'), + image: 'assets/images/playlists/jazz.jpg', + sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', + sourceName: 'dimitri.photography', + ), ]; } @@ -85,8 +94,10 @@ class PlaylistsProvider { ); } - static final List _randomPlaylists = - List.generate(10, (index) => randomLengthPlaylist()); + static final List _randomPlaylists = List.generate( + 10, + (index) => randomLengthPlaylist(), + ); } String randomId() { diff --git a/boring_to_beautiful/step_01/lib/src/shared/providers/songs.dart b/boring_to_beautiful/step_01/lib/src/shared/providers/songs.dart index ed018a83ff..f1205f2dcb 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/providers/songs.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/providers/songs.dart @@ -52,9 +52,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:35'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album2.jpg', - sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', - sourceName: 'Alexandru Acea'), + image: 'assets/images/albums/artist4-album2.jpg', + sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', + sourceName: 'Alexandru Acea', + ), ), RankedSong( 2, @@ -62,9 +63,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:52'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album1.jpg', - sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', - sourceName: 'Jr Korpa'), + image: 'assets/images/albums/artist4-album1.jpg', + sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', + sourceName: 'Jr Korpa', + ), ), RankedSong( 3, @@ -72,9 +74,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:39'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album3.jpg', - sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', - sourceName: 'Stormseeker'), + image: 'assets/images/albums/artist4-album3.jpg', + sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', + sourceName: 'Stormseeker', + ), ), RankedSong( 1, diff --git a/boring_to_beautiful/step_01/lib/src/shared/providers/theme.dart b/boring_to_beautiful/step_01/lib/src/shared/providers/theme.dart index f05527ff8f..5c2dd59042 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/providers/theme.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/providers/theme.dart @@ -28,12 +28,13 @@ class ThemeSettingChange extends Notification { } class ThemeProvider extends InheritedWidget { - const ThemeProvider( - {super.key, - required this.settings, - required this.lightDynamic, - required this.darkDynamic, - required super.child}); + const ThemeProvider({ + super.key, + required this.settings, + required this.lightDynamic, + required this.darkDynamic, + required super.child, + }); final ValueNotifier settings; final ColorScheme? lightDynamic; @@ -59,8 +60,9 @@ class ThemeProvider extends InheritedWidget { Color blend(Color targetColor) { return Color( - // ignore: deprecated_member_use - Blend.harmonize(targetColor.value, settings.value.sourceColor.value)); + // ignore: deprecated_member_use + Blend.harmonize(targetColor.value, settings.value.sourceColor.value), + ); } Color source(Color? target) { @@ -72,18 +74,18 @@ class ThemeProvider extends InheritedWidget { } ColorScheme colors(Brightness brightness, Color? targetColor) { - final dynamicPrimary = brightness == Brightness.light - ? lightDynamic?.primary - : darkDynamic?.primary; + final dynamicPrimary = + brightness == Brightness.light + ? lightDynamic?.primary + : darkDynamic?.primary; return ColorScheme.fromSeed( seedColor: dynamicPrimary ?? source(targetColor), brightness: brightness, ); } - ShapeBorder get shapeMedium => RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ); + ShapeBorder get shapeMedium => + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)); CardTheme cardTheme() { return CardTheme( @@ -113,21 +115,13 @@ class ThemeProvider extends InheritedWidget { labelColor: colors.secondary, unselectedLabelColor: colors.onSurfaceVariant, indicator: BoxDecoration( - border: Border( - bottom: BorderSide( - color: colors.secondary, - width: 2, - ), - ), + border: Border(bottom: BorderSide(color: colors.secondary, width: 2)), ), ); } BottomAppBarTheme bottomAppBarTheme(ColorScheme colors) { - return BottomAppBarTheme( - color: colors.surface, - elevation: 0, - ); + return BottomAppBarTheme(color: colors.surface, elevation: 0); } BottomNavigationBarThemeData bottomNavigationBarTheme(ColorScheme colors) { @@ -146,9 +140,7 @@ class ThemeProvider extends InheritedWidget { } DrawerThemeData drawerTheme(ColorScheme colors) { - return DrawerThemeData( - backgroundColor: colors.surface, - ); + return DrawerThemeData(backgroundColor: colors.surface); } ThemeData light([Color? targetColor]) { @@ -207,10 +199,7 @@ class ThemeProvider extends InheritedWidget { } class ThemeSettings { - ThemeSettings({ - required this.sourceColor, - required this.themeMode, - }); + ThemeSettings({required this.sourceColor, required this.themeMode}); final Color sourceColor; final ThemeMode themeMode; @@ -221,10 +210,7 @@ Color randomColor() { } // Custom Colors -const linkColor = CustomColor( - name: 'Link Color', - color: Color(0xFF00B0FF), -); +const linkColor = CustomColor(name: 'Link Color', color: Color(0xFF00B0FF)); class CustomColor { const CustomColor({ diff --git a/boring_to_beautiful/step_01/lib/src/shared/router.dart b/boring_to_beautiful/step_01/lib/src/shared/router.dart index 91d647ea86..0d20638569 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/router.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/router.dart @@ -56,41 +56,46 @@ final appRouter = GoRouter( // HomeScreen GoRoute( path: '/', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 0, - child: HomeScreen(), - ), - ), + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 0, + child: HomeScreen(), + ), + ), ), // PlaylistHomeScreen GoRoute( path: '/playlists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 1, - child: PlaylistHomeScreen(), - ), - ), - routes: [ - GoRoute( - path: ':pid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 1, - child: PlaylistScreen( - playlist: playlistsProvider - .getPlaylist(state.pathParameters['pid']!)!, - ), + child: PlaylistHomeScreen(), ), ), + routes: [ + GoRoute( + path: ':pid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 1, + child: PlaylistScreen( + playlist: + playlistsProvider.getPlaylist( + state.pathParameters['pid']!, + )!, + ), + ), + ), ), ], ), @@ -98,28 +103,32 @@ final appRouter = GoRouter( // ArtistHomeScreen GoRoute( path: '/artists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 2, - child: ArtistsScreen(), - ), - ), - routes: [ - GoRoute( - path: ':aid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 2, - child: ArtistScreen( - artist: - artistsProvider.getArtist(state.pathParameters['aid']!)!, - ), + child: ArtistsScreen(), ), ), + routes: [ + GoRoute( + path: ':aid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 2, + child: ArtistScreen( + artist: + artistsProvider.getArtist( + state.pathParameters['aid']!, + )!, + ), + ), + ), // builder: (context, state) => ArtistScreen( // id: state.params['aid']!, // ), @@ -129,14 +138,15 @@ final appRouter = GoRouter( for (final route in destinations.skip(3)) GoRoute( path: route.route, - pageBuilder: (context, state) => MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: destinations.indexOf(route), - child: const SizedBox(), - ), - ), + pageBuilder: + (context, state) => MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: destinations.indexOf(route), + child: const SizedBox(), + ), + ), ), ], ); diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/adaptive_image_card.dart b/boring_to_beautiful/step_01/lib/src/shared/views/adaptive_image_card.dart index 07cab2b0d7..99f5be0837 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/adaptive_image_card.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/adaptive_image_card.dart @@ -36,20 +36,13 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), + child: Padding(padding: const EdgeInsets.all(20), child: child), ), ], ); } return Padding( - padding: const EdgeInsets.only( - left: 20, - bottom: 20, - top: 20, - ), + padding: const EdgeInsets.only(left: 20, bottom: 20, top: 20), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, @@ -65,11 +58,8 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), - ) + child: Padding(padding: const EdgeInsets.all(20), child: child), + ), ], ), ); diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/adaptive_navigation.dart b/boring_to_beautiful/step_01/lib/src/shared/views/adaptive_navigation.dart index 92734c9005..aa78766292 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/adaptive_navigation.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/adaptive_navigation.dart @@ -30,12 +30,15 @@ class AdaptiveNavigation extends StatelessWidget { NavigationRail( extended: dimens.maxWidth >= 800, minExtendedWidth: 180, - destinations: destinations - .map((e) => NavigationRailDestination( - icon: e.icon, - label: Text(e.label), - )) - .toList(), + destinations: + destinations + .map( + (e) => NavigationRailDestination( + icon: e.icon, + label: Text(e.label), + ), + ) + .toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ), diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/article_content.dart b/boring_to_beautiful/step_01/lib/src/shared/views/article_content.dart index af243f015b..c5a0b5e62a 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/article_content.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/article_content.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class ArticleContent extends StatelessWidget { - const ArticleContent({ - super.key, - required this.child, - this.maxWidth = 960, - }); + const ArticleContent({super.key, required this.child, this.maxWidth = 960}); final double maxWidth; final Widget child; @@ -19,13 +15,8 @@ class ArticleContent extends StatelessWidget { return Container( alignment: Alignment.topCenter, child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: maxWidth, - ), - child: Padding( - padding: const EdgeInsets.all(15), - child: child, - ), + constraints: BoxConstraints(maxWidth: maxWidth), + child: Padding(padding: const EdgeInsets.all(15), child: child), ), ); } diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/bottom_bar.dart b/boring_to_beautiful/step_01/lib/src/shared/views/bottom_bar.dart index 06e085a9b6..bf15ad9bb0 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/bottom_bar.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/bottom_bar.dart @@ -26,16 +26,18 @@ class BottomBar extends StatelessWidget implements PreferredSizeWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => _BottomBar( - artist: state.songWithProgress?.song.artist, - isMuted: state.isMuted, - isPlaying: state.isPlaying, - preferredSize: preferredSize, - progress: state.songWithProgress?.progress, - song: state.songWithProgress?.song, - togglePlayPause: () => bloc.add(const PlaybackEvent.togglePlayPause()), - volume: state.volume, - ), + builder: + (context, state) => _BottomBar( + artist: state.songWithProgress?.song.artist, + isMuted: state.isMuted, + isPlaying: state.isPlaying, + preferredSize: preferredSize, + progress: state.songWithProgress?.progress, + song: state.songWithProgress?.song, + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), + volume: state.volume, + ), ); } } @@ -63,10 +65,12 @@ class _BottomBar extends StatelessWidget { @override Widget build(BuildContext context) => LayoutBuilder( - builder: (context, constraints) => constraints.isTablet - ? _buildDesktopBar(context, constraints) - : _buildMobileBar(context, constraints), - ); + builder: + (context, constraints) => + constraints.isTablet + ? _buildDesktopBar(context, constraints) + : _buildMobileBar(context, constraints), + ); Widget _buildDesktopBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -79,10 +83,7 @@ class _BottomBar extends StatelessWidget { Row( children: [ _AlbumArt(song: song), - _SongDetails( - artist: artist, - song: song, - ), + _SongDetails(artist: artist, song: song), ], ), Flexible( @@ -95,12 +96,7 @@ class _BottomBar extends StatelessWidget { isPlaying: isPlaying, togglePlayPause: togglePlayPause, ), - Center( - child: _ProgressBar( - progress: progress, - song: song, - ), - ), + Center(child: _ProgressBar(progress: progress, song: song)), ], ), ), @@ -114,17 +110,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _FullScreenPlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _FullScreenPlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -136,10 +133,10 @@ class _BottomBar extends StatelessWidget { } double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; Widget _buildMobileBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -152,17 +149,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _MobilePlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _MobilePlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -191,10 +189,7 @@ class _BottomBar extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - song?.title ?? '', - style: context.labelMedium, - ), + Text(song?.title ?? '', style: context.labelMedium), Text( song?.artist.name ?? '', style: context.labelSmall, @@ -220,10 +215,7 @@ class _BottomBar extends StatelessWidget { } class _ProgressBar extends StatelessWidget { - const _ProgressBar({ - required this.progress, - required this.song, - }); + const _ProgressBar({required this.progress, required this.song}); /// Current playback depth into user is into [song]. final Duration? progress; @@ -231,10 +223,10 @@ class _ProgressBar extends StatelessWidget { final Song? song; double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; @override Widget build(BuildContext context) { @@ -252,29 +244,32 @@ class _ProgressBar extends StatelessWidget { children: [ const SizedBox(width: 10), SizedBox( - child: progress != null - ? Text(progress!.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + progress != null + ? Text( + progress!.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), Expanded( child: Slider( value: songProgress.clamp(0, 1), divisions: 1000, onChanged: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); }, onChangeEnd: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); // Because dragging pauses auto playback, resume playing // once the user finishes dragging. - BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ); + BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()); }, activeColor: Theme.of(context).colorScheme.onTertiaryContainer, @@ -282,12 +277,15 @@ class _ProgressBar extends StatelessWidget { ), ), SizedBox( - child: song != null - ? Text(song!.length.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + song != null + ? Text( + song!.length.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), - const SizedBox(width: 10) + const SizedBox(width: 10), ], ), ); @@ -297,10 +295,7 @@ class _ProgressBar extends StatelessWidget { } class _VolumeBar extends StatelessWidget { - const _VolumeBar({ - required this.volume, - required this.isMuted, - }); + const _VolumeBar({required this.volume, required this.isMuted}); /// The percentage, between 0 and 1, at which to render the volume slider. final double volume; @@ -313,17 +308,16 @@ class _VolumeBar extends StatelessWidget { @override Widget build(BuildContext context) { return ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 200, - ), + constraints: const BoxConstraints(maxWidth: 200), child: Padding( padding: const EdgeInsets.all(8), child: Row( children: [ GestureDetector( - onTap: () => BlocProvider.of(context).add( - const PlaybackEvent.toggleMute(), - ), + onTap: + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.toggleMute()), child: Icon(!isMuted ? Icons.volume_mute : Icons.volume_off), ), Expanded( @@ -332,8 +326,10 @@ class _VolumeBar extends StatelessWidget { min: 0, max: 1, divisions: 100, - onChanged: (newValue) => BlocProvider.of(context) - .add(PlaybackEvent.setVolume(newValue)), + onChanged: + (newValue) => BlocProvider.of( + context, + ).add(PlaybackEvent.setVolume(newValue)), activeColor: Theme.of(context).colorScheme.onTertiaryContainer, inactiveColor: Theme.of(context).colorScheme.onSurface, ), @@ -356,49 +352,50 @@ class _PlaybackControls extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - double iconSize = 24; - double playIconSize = 32; - double innerPadding = 16; - double playPadding = 20; - if (constraints.maxWidth < 500) { - iconSize = 21; - playIconSize = 28; - innerPadding = 14; - playPadding = 17; - } - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( + return LayoutBuilder( + builder: (context, constraints) { + double iconSize = 24; + double playIconSize = 32; + double innerPadding = 16; + double playPadding = 20; + if (constraints.maxWidth < 500) { + iconSize = 21; + playIconSize = 28; + innerPadding = 14; + playPadding = 17; + } + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( padding: EdgeInsets.fromLTRB(0, 0, innerPadding, 0), - child: Icon(Icons.shuffle, size: iconSize)), - Icon(Icons.skip_previous, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), - child: GestureDetector( - onTap: togglePlayPause, - child: Icon( - isPlaying ? Icons.pause_circle : Icons.play_circle, - size: playIconSize, + child: Icon(Icons.shuffle, size: iconSize), + ), + Icon(Icons.skip_previous, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), + child: GestureDetector( + onTap: togglePlayPause, + child: Icon( + isPlaying ? Icons.pause_circle : Icons.play_circle, + size: playIconSize, + ), ), ), - ), - Icon(Icons.skip_next, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), - child: Icon(Icons.repeat, size: iconSize), - ), - ], - ); - }); + Icon(Icons.skip_next, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), + child: Icon(Icons.repeat, size: iconSize), + ), + ], + ); + }, + ); } } class _AlbumArt extends StatelessWidget { - const _AlbumArt({ - required this.song, - }); + const _AlbumArt({required this.song}); final Song? song; @@ -409,21 +406,17 @@ class _AlbumArt extends StatelessWidget { child: SizedBox( width: 70, height: 70, - child: song != null - ? Image.asset(song!.image.image) - : Container( - color: Colors.pink[100], - ), + child: + song != null + ? Image.asset(song!.image.image) + : Container(color: Colors.pink[100]), ), ); } } class _SongDetails extends StatelessWidget { - const _SongDetails({ - required this.artist, - required this.song, - }); + const _SongDetails({required this.artist, required this.song}); final Artist? artist; final Song? song; @@ -455,9 +448,7 @@ class _SongDetails extends StatelessWidget { } class _FullScreenPlayer extends StatefulWidget { - const _FullScreenPlayer({ - required this.onClose, - }); + const _FullScreenPlayer({required this.onClose}); final VoidCallback onClose; @@ -489,29 +480,33 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return MouseRegion( - onHover: (_) { - setState(() { - _showControls = true; - }); - hideControls(); + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return MouseRegion( + onHover: (_) { + setState(() { + _showControls = true; + }); + hideControls(); + }, + child: buildPlayer(context, state, dimens), + ); }, - child: buildPlayer(context, state, dimens), - ); - }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; final song = current?.song; @@ -519,26 +514,25 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { fit: StackFit.expand, children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - song!.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset(song!.image.image, fit: BoxFit.cover), ), ), - ), ), Positioned( top: 20, right: 20, child: IconButton( - color: song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const Icon(Icons.fullscreen_exit), onPressed: widget.onClose, ), @@ -569,8 +563,9 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { Text( song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 20, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 20, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -582,10 +577,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { right: 20, left: 20, bottom: dimens.biggest.height * 0.2, - child: _ProgressBar( - progress: current?.progress, - song: song, - ), + child: _ProgressBar(progress: current?.progress, song: song), ), Positioned( right: 20, @@ -598,8 +590,8 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), @@ -611,9 +603,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { } class _MobilePlayer extends StatelessWidget { - const _MobilePlayer({ - required this.onClose, - }); + const _MobilePlayer({required this.onClose}); final VoidCallback onClose; @@ -622,46 +612,52 @@ class _MobilePlayer extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return buildPlayer(context, state, dimens); - }, + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return buildPlayer(context, state, dimens); + }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; return Stack( children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - current.song.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset( + current.song.image.image, + fit: BoxFit.cover, + ), ), ), - ), ), Positioned( top: 20, left: 20, child: IconButton( - color: current?.song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + current?.song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const RotatedBox( quarterTurns: 1, child: Icon(Icons.chevron_right), @@ -676,10 +672,7 @@ class _MobilePlayer extends StatelessWidget { left: 0, right: 0, height: dimens.biggest.height * 0.5, - child: Image.asset( - current.song.image.image, - fit: BoxFit.contain, - ), + child: Image.asset(current.song.image.image, fit: BoxFit.contain), ), Positioned( left: 0, @@ -705,8 +698,9 @@ class _MobilePlayer extends StatelessWidget { Text( current.song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 12, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 12, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -718,15 +712,12 @@ class _MobilePlayer extends StatelessWidget { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), - _ProgressBar( - progress: current.progress, - song: current.song, - ), + _ProgressBar(progress: current.progress, song: current.song), ], ), ), diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/brightness_toggle.dart b/boring_to_beautiful/step_01/lib/src/shared/views/brightness_toggle.dart index 46dde4810f..5b5332392b 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/brightness_toggle.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/brightness_toggle.dart @@ -13,9 +13,10 @@ class BrightnessToggle extends StatelessWidget { Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; return IconButton( - icon: Theme.of(context).brightness == Brightness.light - ? const Icon(Icons.brightness_3) - : const Icon(Icons.brightness_7), + icon: + Theme.of(context).brightness == Brightness.light + ? const Icon(Icons.brightness_3) + : const Icon(Icons.brightness_7), onPressed: () { final themeProvider = ThemeProvider.of(context); final settings = themeProvider.settings.value; diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/center_row.dart b/boring_to_beautiful/step_01/lib/src/shared/views/center_row.dart index 36d428e3b8..c1f3effcc2 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/center_row.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/center_row.dart @@ -5,23 +5,12 @@ import 'package:flutter/material.dart'; class CenterRow extends StatelessWidget { - const CenterRow({ - super.key, - required this.child, - }); + const CenterRow({super.key, required this.child}); final Widget child; @override Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Center( - child: child, - ), - ), - ], - ); + return Row(children: [Expanded(child: Center(child: child))]); } } diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/clickable.dart b/boring_to_beautiful/step_01/lib/src/shared/views/clickable.dart index cd7ef46268..f192f0b135 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/clickable.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/clickable.dart @@ -14,10 +14,7 @@ class Clickable extends StatelessWidget { Widget build(BuildContext context) { return MouseRegion( cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: onTap, - child: child, - ), + child: GestureDetector(onTap: onTap, child: child), ); } } diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/events.dart b/boring_to_beautiful/step_01/lib/src/shared/views/events.dart index ed38465460..ab9140e56d 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/events.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/events.dart @@ -24,43 +24,18 @@ class Events extends StatelessWidget { child: DataTable( horizontalMargin: 5.0, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], rows: [ for (final event in artist.events) DataRow( cells: [ - DataCell( - Text(event.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(event.title)), - ]), - ), - DataCell( - Text(event.location), - ), + DataCell(Text(event.date)), + DataCell(Row(children: [Expanded(child: Text(event.title))])), + DataCell(Text(event.location)), DataCell( Clickable( child: Text( @@ -70,8 +45,9 @@ class Events extends StatelessWidget { decoration: TextDecoration.underline, ), ), - onTap: () => - launchUrl(Uri.parse('https://docs.flutter.dev')), + onTap: + () => + launchUrl(Uri.parse('https://docs.flutter.dev')), ), ), ], diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/hover_toggle.dart b/boring_to_beautiful/step_01/lib/src/shared/views/hover_toggle.dart index ec98c2863c..649cfcab63 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/hover_toggle.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/hover_toggle.dart @@ -31,9 +31,10 @@ class _HoverToggleState extends State with MaterialStateMixin { cursor: isHovered ? SystemMouseCursors.click : MouseCursor.defer, onEnter: (_) => setMaterialState(WidgetState.hovered, true), onExit: (_) => setMaterialState(WidgetState.hovered, false), - child: widget.mode == HoverMode.replace - ? _buildReplaceableChildren() - : _buildChildrenStack(), + child: + widget.mode == HoverMode.replace + ? _buildReplaceableChildren() + : _buildChildrenStack(), ), ); } @@ -41,12 +42,7 @@ class _HoverToggleState extends State with MaterialStateMixin { Widget _buildChildrenStack() { Widget child = isHovered ? Opacity(opacity: 0.2, child: widget.child) : widget.child; - return Stack( - children: [ - child, - if (isHovered) widget.hoverChild, - ], - ); + return Stack(children: [child, if (isHovered) widget.hoverChild]); } Widget _buildReplaceableChildren() => diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/hoverable_song_play_button.dart b/boring_to_beautiful/step_01/lib/src/shared/views/hoverable_song_play_button.dart index 512f3d1d3c..dd588e3dbe 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/hoverable_song_play_button.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/hoverable_song_play_button.dart @@ -29,9 +29,10 @@ class HoverableSongPlayButton extends StatelessWidget { hoverChild: Center( child: GestureDetector( child: const Icon(Icons.play_arrow), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ), ), mode: hoverMode, diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/image_card.dart b/boring_to_beautiful/step_01/lib/src/shared/views/image_card.dart index 0af9f75f33..6e7f6cd42d 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/image_card.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/image_card.dart @@ -7,13 +7,14 @@ import '../../shared/extensions.dart'; import 'outlined_card.dart'; class ImageCard extends StatelessWidget { - const ImageCard( - {super.key, - required this.title, - required this.details, - required this.image, - this.subtitle, - this.clickable = false}); + const ImageCard({ + super.key, + required this.title, + required this.details, + required this.image, + this.subtitle, + this.clickable = false, + }); final String title; final String? subtitle; @@ -28,54 +29,51 @@ class ImageCard extends StatelessWidget { clickable: clickable, child: Padding( padding: const EdgeInsets.all(8.0), - child: LayoutBuilder(builder: (context, constraints) { - return Row( - children: [ - if (constraints.maxWidth > 600) - SizedBox( - width: 170, - height: 170, - child: Image.asset( - image, - fit: BoxFit.cover, + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + if (constraints.maxWidth > 600) + SizedBox( + width: 170, + height: 170, + child: Image.asset(image, fit: BoxFit.cover), ), - ), - Expanded( - child: Padding( - padding: padding, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 5), - child: Text( - title, - style: context.titleLarge! - .copyWith(fontWeight: FontWeight.bold), - ), - ), - if (subtitle != null) + Expanded( + child: Padding( + padding: padding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Padding( - padding: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only(bottom: 5), child: Text( - subtitle!, - style: context.labelMedium, + title, + style: context.titleLarge!.copyWith( + fontWeight: FontWeight.bold, + ), ), ), - Text( - details, - style: context.labelMedium?.copyWith( - fontSize: 16, - height: 1.25, + if (subtitle != null) + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text(subtitle!, style: context.labelMedium), + ), + Text( + details, + style: context.labelMedium?.copyWith( + fontSize: 16, + height: 1.25, + ), ), - ), - ], + ], + ), ), ), - ), - ], - ); - }), + ], + ); + }, + ), ), ); } diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/image_tile.dart b/boring_to_beautiful/step_01/lib/src/shared/views/image_tile.dart index 4f2bbebb96..dd99152af5 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/image_tile.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/image_tile.dart @@ -21,19 +21,17 @@ class ImageTile extends StatelessWidget { @override Widget build(BuildContext context) { return OutlinedCard( - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Expanded( - child: Image.asset(image, fit: BoxFit.cover), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [Expanded(child: Image.asset(image, fit: BoxFit.cover))], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), child: Text( title, @@ -43,20 +41,25 @@ class ImageTile extends StatelessWidget { ), overflow: TextOverflow.ellipsis, maxLines: 1, - )), - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text( - subtitle, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center, + ), ), - ), - ], - ) - ]), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 10, + ), + child: Text( + subtitle, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ], + ), + ], + ), ); } } diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/step_01/lib/src/shared/views/outlined_card.dart index 61af3a0d64..a208659904 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/outlined_card.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/outlined_card.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class OutlinedCard extends StatefulWidget { - const OutlinedCard({ - super.key, - required this.child, - this.clickable = true, - }); + const OutlinedCard({super.key, required this.child, this.clickable = true}); final Widget child; final bool clickable; @@ -22,9 +18,10 @@ class _OutlinedCardState extends State { @override Widget build(BuildContext context) { return MouseRegion( - cursor: widget.clickable - ? SystemMouseCursors.click - : SystemMouseCursors.basic, + cursor: + widget.clickable + ? SystemMouseCursors.click + : SystemMouseCursors.basic, child: Container( // Add box decoration here child: widget.child, diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/play_pause_listener.dart b/boring_to_beautiful/step_01/lib/src/shared/views/play_pause_listener.dart index 52fad00863..6b4fc66709 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/play_pause_listener.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/play_pause_listener.dart @@ -16,10 +16,7 @@ import '../playback/bloc/bloc.dart'; /// shortcuts. By sitting below that machinery, this installs a global Spacebar /// listener which toggles Playback, as is customary in music-playing apps. class PlayPauseListener extends StatelessWidget { - const PlayPauseListener({ - super.key, - required this.child, - }); + const PlayPauseListener({super.key, required this.child}); final Widget child; @@ -28,9 +25,7 @@ class PlayPauseListener extends StatelessWidget { // Immediately catch any [_PlayPauseIntent] events released by the inner // [Shortcuts] widget. return Actions( - actions: >{ - _PlayPauseIntent: _PlayPauseAction(), - }, + actions: >{_PlayPauseIntent: _PlayPauseAction()}, child: Shortcuts( // Register a shortcut for Spacebar presses that release a // [_PlayPauseIntent] up the tree to the nearest [Actions] widget. @@ -38,9 +33,9 @@ class PlayPauseListener extends StatelessWidget { const SingleActivator(LogicalKeyboardKey.space): _PlayPauseIntent( // Create a closure which sends a [TogglePlayPause] event to the // [PlaybackBloc]. - () => BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ), + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()), ), }, child: child, diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/root_layout.dart b/boring_to_beautiful/step_01/lib/src/shared/views/root_layout.dart index 878b57d729..ff6270248c 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/root_layout.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/root_layout.dart @@ -29,36 +29,37 @@ class RootLayout extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => LayoutBuilder(builder: (context, dimens) { - void onSelected(int index) { - final destination = router.destinations[index]; - go.GoRouter.of(context).go(destination.route); - } + builder: + (context, state) => LayoutBuilder( + builder: (context, dimens) { + void onSelected(int index) { + final destination = router.destinations[index]; + go.GoRouter.of(context).go(destination.route); + } - final current = state.songWithProgress; - return AdaptiveNavigation( - key: _navigationRailKey, - destinations: router.destinations - .map((e) => NavigationDestination( - icon: e.icon, - label: e.label, - )) - .toList(), - selectedIndex: currentIndex, - onDestinationSelected: onSelected, - child: Column( - children: [ - Expanded( - child: _Switcher( - key: _switcherKey, - child: child, + final current = state.songWithProgress; + return AdaptiveNavigation( + key: _navigationRailKey, + destinations: + router.destinations + .map( + (e) => NavigationDestination( + icon: e.icon, + label: e.label, + ), + ) + .toList(), + selectedIndex: currentIndex, + onDestinationSelected: onSelected, + child: Column( + children: [ + Expanded(child: _Switcher(key: _switcherKey, child: child)), + if (current != null) const BottomBar(), + ], ), - ), - if (current != null) const BottomBar(), - ], + ); + }, ), - ); - }), ); } } @@ -66,21 +67,18 @@ class RootLayout extends StatelessWidget { class _Switcher extends StatelessWidget { final Widget child; - const _Switcher({ - required this.child, - super.key, - }); + const _Switcher({required this.child, super.key}); @override Widget build(BuildContext context) { return UniversalPlatform.isDesktop ? child : AnimatedSwitcher( - key: key, - duration: const Duration(milliseconds: 200), - switchInCurve: Curves.easeInOut, - switchOutCurve: Curves.easeInOut, - child: child, - ); + key: key, + duration: const Duration(milliseconds: 200), + switchInCurve: Curves.easeInOut, + switchOutCurve: Curves.easeInOut, + child: child, + ); } } diff --git a/boring_to_beautiful/step_01/lib/src/shared/views/sidebar.dart b/boring_to_beautiful/step_01/lib/src/shared/views/sidebar.dart index 78c19b4d22..8815223b22 100644 --- a/boring_to_beautiful/step_01/lib/src/shared/views/sidebar.dart +++ b/boring_to_beautiful/step_01/lib/src/shared/views/sidebar.dart @@ -26,10 +26,7 @@ class SideBar extends StatelessWidget { title: const Text('Home'), onTap: () => GoRouter.of(context).go('/'), ), - const ListTile( - leading: Icon(Icons.search), - title: Text('Search'), - ), + const ListTile(leading: Icon(Icons.search), title: Text('Search')), ListTile( leading: const Icon(Icons.person), title: const Text('Artists'), @@ -64,10 +61,7 @@ class PlaylistNav extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(left: 16, top: 16), - child: Text( - 'Playlists', - style: context.titleMedium, - ), + child: Text('Playlists', style: context.titleMedium), ), Expanded( child: ListView( @@ -114,10 +108,9 @@ class _PlaylistNavItemState extends State<_PlaylistNavItem> { @override void initState() { super.initState(); - _focusNode = FocusNode(debugLabel: widget.title) - ..addListener(() { - setState(() => _isSelected = _focusNode.hasPrimaryFocus); - }); + _focusNode = FocusNode(debugLabel: widget.title)..addListener(() { + setState(() => _isSelected = _focusNode.hasPrimaryFocus); + }); } @override diff --git a/boring_to_beautiful/step_01/macos/Podfile b/boring_to_beautiful/step_01/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/boring_to_beautiful/step_01/macos/Podfile +++ b/boring_to_beautiful/step_01/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_01/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_01/macos/Runner.xcodeproj/project.pbxproj index 79604e1785..63e08baa02 100644 --- a/boring_to_beautiful/step_01/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_01/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */; }; - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */; }; + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */, + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */, + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 143267097A016AD19836D89A /* Pods */ = { + isa = PBXGroup; + children = ( + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */, + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */, + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */, + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */, + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */, + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A67056D7D61CD22438BA6931 /* Pods */, + 143267097A016AD19836D89A /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - A67056D7D61CD22438BA6931 /* Pods */ = { - isa = PBXGroup; - children = ( - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */, - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */, - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */, - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */, - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */, - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */, - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */, + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */, + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */, + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */, + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */, + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -361,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */ = { + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -378,7 +378,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */ = { + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +393,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */ = { + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_01/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_01/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index b9ba5fa149..888bfbb4c7 100644 --- a/boring_to_beautiful/step_01/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_01/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_01/pubspec.yaml b/boring_to_beautiful/step_01/pubspec.yaml index 04c88a6e6f..6b913cee90 100644 --- a/boring_to_beautiful/step_01/pubspec.yaml +++ b/boring_to_beautiful/step_01/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,14 +13,14 @@ dependencies: adaptive_components: ^0.0.10 adaptive_navigation: ^0.0.10 animations: ^2.0.11 - collection: ^1.19.0 + collection: ^1.19.1 cupertino_icons: ^1.0.8 desktop_window: ^0.4.2 dynamic_color: ^1.7.0 english_words: ^4.0.0 flutter_bloc: ^9.0.0 freezed_annotation: ^2.4.4 - go_router: ^14.7.2 + go_router: ^14.8.0 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/step_02/android/.gitignore b/boring_to_beautiful/step_02/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/boring_to_beautiful/step_02/android/.gitignore +++ b/boring_to_beautiful/step_02/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/boring_to_beautiful/step_02/android/app/build.gradle b/boring_to_beautiful/step_02/android/app/build.gradle deleted file mode 100644 index 59485b6bb8..0000000000 --- a/boring_to_beautiful/step_02/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.myartist" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.myartist" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/boring_to_beautiful/step_02/android/app/build.gradle.kts b/boring_to_beautiful/step_02/android/app/build.gradle.kts new file mode 100644 index 0000000000..b2dbe0393c --- /dev/null +++ b/boring_to_beautiful/step_02/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.myartist" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.myartist" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/boring_to_beautiful/step_02/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt b/boring_to_beautiful/step_02/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt index 1e328c8556..b724a01056 100644 --- a/boring_to_beautiful/step_02/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt +++ b/boring_to_beautiful/step_02/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.myartist import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/boring_to_beautiful/step_02/android/build.gradle b/boring_to_beautiful/step_02/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/boring_to_beautiful/step_02/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/boring_to_beautiful/step_02/android/build.gradle.kts b/boring_to_beautiful/step_02/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/boring_to_beautiful/step_02/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/boring_to_beautiful/step_02/android/gradle.properties b/boring_to_beautiful/step_02/android/gradle.properties index 2597170821..f018a61817 100644 --- a/boring_to_beautiful/step_02/android/gradle.properties +++ b/boring_to_beautiful/step_02/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/boring_to_beautiful/step_02/android/gradle/wrapper/gradle-wrapper.properties b/boring_to_beautiful/step_02/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/boring_to_beautiful/step_02/android/gradle/wrapper/gradle-wrapper.properties +++ b/boring_to_beautiful/step_02/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/boring_to_beautiful/step_02/android/settings.gradle b/boring_to_beautiful/step_02/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/boring_to_beautiful/step_02/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/boring_to_beautiful/step_02/android/settings.gradle.kts b/boring_to_beautiful/step_02/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/boring_to_beautiful/step_02/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/boring_to_beautiful/step_02/ios/Podfile b/boring_to_beautiful/step_02/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/boring_to_beautiful/step_02/ios/Podfile +++ b/boring_to_beautiful/step_02/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_02/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_02/ios/Runner.xcodeproj/project.pbxproj index f7d849e7aa..b4912290dd 100644 --- a/boring_to_beautiful/step_02/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_02/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */; }; - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */; }; + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,15 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +60,19 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 85CFC060D2B515FA7FCB18AC /* Frameworks */ = { + 6171884CE7EC0B228274CDFE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */, + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */, + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 54241974C43F645BC41820B3 /* Pods */ = { + 4CD80B4456D2B04197B640AC /* Pods */ = { isa = PBXGroup; children = ( - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */, - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */, - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */, - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */, - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */, - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */, + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */, + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */, + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */, + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */, + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */, + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 54241974C43F645BC41820B3 /* Pods */, - DA6AE8ED33598C40BFC9FCAD /* Frameworks */, + 4CD80B4456D2B04197B640AC /* Pods */, + C4E673F63230E3A6805B11E9 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - DA6AE8ED33598C40BFC9FCAD /* Frameworks */ = { + C4E673F63230E3A6805B11E9 /* Frameworks */ = { isa = PBXGroup; children = ( - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */, - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */, + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */, + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */, + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 85CFC060D2B515FA7FCB18AC /* Frameworks */, + 6171884CE7EC0B228274CDFE /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */, + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */, + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,43 +270,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -323,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */ = { + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,7 +340,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */ = { + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/boring_to_beautiful/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_bio.dart b/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_bio.dart index 227b8e91f9..8b614421db 100644 --- a/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_bio.dart +++ b/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_bio.dart @@ -18,9 +18,7 @@ class ArtistBio extends StatelessWidget { artist.bio, style: context.bodyLarge!.copyWith( fontSize: 16, - color: context.colors.onSurface.withAlpha( - 222, - ), + color: context.colors.onSurface.withAlpha(222), ), ); } diff --git a/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_card.dart b/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_card.dart index a63967f51d..1a56376a87 100644 --- a/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_card.dart +++ b/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_card.dart @@ -11,10 +11,7 @@ import '../../../shared/views/outlined_card.dart'; import '../../../shared/views/views.dart'; class ArtistCard extends StatelessWidget { - const ArtistCard({ - super.key, - required this.artist, - }); + const ArtistCard({super.key, required this.artist}); final Artist artist; @@ -24,65 +21,66 @@ class ArtistCard extends StatelessWidget { return OutlinedCard( child: LayoutBuilder( - builder: (context, dimens) => Row( - children: [ - SizedBox( - width: dimens.maxWidth * 0.4, - child: Image.asset( - artist.image.image, - fit: BoxFit.cover, - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - artist.name, - style: context.titleMedium, - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - const SizedBox(height: 10), - Text( - artist.bio, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 3, - ), - ]), - ), - if (dimens.maxHeight > 100) - Row( - children: [ - HoverableSongPlayButton( - size: const Size(50, 50), - song: nowPlaying, - child: Icon(Icons.play_circle, - color: context.colors.tertiary), + builder: + (context, dimens) => Row( + children: [ + SizedBox( + width: dimens.maxWidth * 0.4, + child: Image.asset(artist.image.image, fit: BoxFit.cover), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + artist.name, + style: context.titleMedium, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + const SizedBox(height: 10), + Text( + artist.bio, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 3, + ), + ], ), - Text( - nowPlaying.title, - maxLines: 1, - overflow: TextOverflow.clip, - style: context.labelMedium, + ), + if (dimens.maxHeight > 100) + Row( + children: [ + HoverableSongPlayButton( + size: const Size(50, 50), + song: nowPlaying, + child: Icon( + Icons.play_circle, + color: context.colors.tertiary, + ), + ), + Text( + nowPlaying.title, + maxLines: 1, + overflow: TextOverflow.clip, + style: context.labelMedium, + ), + ], ), - ], - ), - ], + ], + ), + ), ), - ), + ], ), - ], - ), ), ); } diff --git a/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_events.dart b/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_events.dart index 8b064759c6..58b61b37df 100644 --- a/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_events.dart +++ b/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_events.dart @@ -70,53 +70,32 @@ class ArtistEvents extends StatelessWidget { ); }, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], - rowBuilder: (item, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - Text(item.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(item.title)), - ]), - ), - DataCell( - Text(item.location), - ), - DataCell( - Clickable( - child: Text( - item.link, - style: TextStyle( - color: linkColor.value(theme), - decoration: TextDecoration.underline, + rowBuilder: + (item, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell(Text(item.date)), + DataCell(Row(children: [Expanded(child: Text(item.title))])), + DataCell(Text(item.location)), + DataCell( + Clickable( + child: Text( + item.link, + style: TextStyle( + color: linkColor.value(theme), + decoration: TextDecoration.underline, + ), + ), + onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ), ), - ), - onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ], ), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_ranked_songs.dart b/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_ranked_songs.dart index e484ecb3d7..3d1f4e2cf1 100644 --- a/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_ranked_songs.dart +++ b/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_ranked_songs.dart @@ -27,52 +27,42 @@ class ArtistRankedSongs extends StatelessWidget { title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), trailing: Text(song.ranking.toString()), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ); }, columns: const [ - DataColumn( - label: Text( - 'Ranking', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Title', - ), - ), - DataColumn( - label: Text( - 'Length', - ), - ), + DataColumn(label: Text('Ranking'), numeric: true), + DataColumn(label: Text('Title')), + DataColumn(label: Text('Length')), ], - rowBuilder: (song, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - HoverableSongPlayButton( - song: song, - child: Center( - child: Text(song.ranking.toString()), - ), + rowBuilder: + (song, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + HoverableSongPlayButton( + song: song, + child: Center(child: Text(song.ranking.toString())), + ), + ), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(song.image.image), + ), + const SizedBox(width: 5.0), + Expanded(child: Text(song.title)), + ], + ), + ), + DataCell(Text(song.length.toHumanizedString())), + ], ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(song.image.image), - ), - const SizedBox(width: 5.0), - Expanded(child: Text(song.title)), - ]), - ), - DataCell( - Text(song.length.toHumanizedString()), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_updates.dart b/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_updates.dart index e5b8bb5fe9..a0fabf7330 100644 --- a/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_updates.dart +++ b/boring_to_beautiful/step_02/lib/src/features/artists/view/artist_updates.dart @@ -30,7 +30,7 @@ class ArtistUpdates extends StatelessWidget { child: Text(update), ), ), - ) + ), ], ); } diff --git a/boring_to_beautiful/step_02/lib/src/features/artists/view/artists_screen.dart b/boring_to_beautiful/step_02/lib/src/features/artists/view/artists_screen.dart index 8afe759807..225d74847b 100644 --- a/boring_to_beautiful/step_02/lib/src/features/artists/view/artists_screen.dart +++ b/boring_to_beautiful/step_02/lib/src/features/artists/view/artists_screen.dart @@ -17,33 +17,33 @@ class ArtistsScreen extends StatelessWidget { Widget build(BuildContext context) { final artistsProvider = ArtistsProvider(); final artists = artistsProvider.artists; - return LayoutBuilder(builder: (context, constraints) { - return Scaffold( - primary: false, - appBar: AppBar( - title: const Text('ARTISTS'), - toolbarHeight: kToolbarHeight * 2, - ), - body: GridView.builder( - padding: const EdgeInsets.all(15), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), - childAspectRatio: 2.5, - mainAxisSpacing: 10, - crossAxisSpacing: 10, + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + primary: false, + appBar: AppBar( + title: const Text('ARTISTS'), + toolbarHeight: kToolbarHeight * 2, ), - itemCount: artists.length, - itemBuilder: (context, index) { - final artist = artists[index]; - return GestureDetector( - child: ArtistCard( - artist: artist, - ), - onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), - ); - }, - ), - ); - }); + body: GridView.builder( + padding: const EdgeInsets.all(15), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), + childAspectRatio: 2.5, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + ), + itemCount: artists.length, + itemBuilder: (context, index) { + final artist = artists[index]; + return GestureDetector( + child: ArtistCard(artist: artist), + onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), + ); + }, + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_02/lib/src/features/home/view/home_artists.dart b/boring_to_beautiful/step_02/lib/src/features/home/view/home_artists.dart index beb2c0ece4..b5a3a33ecd 100644 --- a/boring_to_beautiful/step_02/lib/src/features/home/view/home_artists.dart +++ b/boring_to_beautiful/step_02/lib/src/features/home/view/home_artists.dart @@ -22,27 +22,25 @@ class HomeArtists extends StatelessWidget { Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(15), - child: constraints.isMobile - ? Column( - children: [ - for (final artist in artists) buildTile(context, artist), - ], - ) - : Row(children: [ - for (final artist in artists) - Flexible( - flex: 1, - child: buildTile(context, artist), - ), - ]), + child: + constraints.isMobile + ? Column( + children: [ + for (final artist in artists) buildTile(context, artist), + ], + ) + : Row( + children: [ + for (final artist in artists) + Flexible(flex: 1, child: buildTile(context, artist)), + ], + ), ); } Widget buildTile(BuildContext context, Artist artist) { return ListTile( - leading: CircleAvatar( - backgroundImage: AssetImage(artist.image.image), - ), + leading: CircleAvatar(backgroundImage: AssetImage(artist.image.image)), title: Text( artist.updates.first, maxLines: 2, diff --git a/boring_to_beautiful/step_02/lib/src/features/home/view/home_recent.dart b/boring_to_beautiful/step_02/lib/src/features/home/view/home_recent.dart index c77500a663..8ba86d117d 100644 --- a/boring_to_beautiful/step_02/lib/src/features/home/view/home_recent.dart +++ b/boring_to_beautiful/step_02/lib/src/features/home/view/home_recent.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/outlined_card.dart'; class HomeRecent extends StatelessWidget { - const HomeRecent( - {super.key, required this.playlists, this.axis = Axis.horizontal}); + const HomeRecent({ + super.key, + required this.playlists, + this.axis = Axis.horizontal, + }); final List playlists; final Axis axis; @@ -43,8 +46,10 @@ class HomeRecent extends StatelessWidget { Row( children: [ Expanded( - child: Image.asset(playlist.cover.image, - fit: BoxFit.cover), + child: Image.asset( + playlist.cover.image, + fit: BoxFit.cover, + ), ), ], ), @@ -79,10 +84,7 @@ class HomeRecent extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ - ClippedImage( - playlist.cover.image, - height: 200, - ), + ClippedImage(playlist.cover.image, height: 200), Expanded( child: Center( child: Padding( @@ -104,23 +106,24 @@ class HomeRecent extends StatelessWidget { return Column( children: [ Padding( - padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), - child: Text( - playlist.title, - style: context.titleSmall!.copyWith( - fontWeight: FontWeight.bold, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - textAlign: TextAlign.center, - )), + padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), + child: Text( + playlist.title, + style: context.titleSmall!.copyWith(fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, + textAlign: TextAlign.center, + ), + ), Padding( padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text(playlist.description, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center), + child: Text( + playlist.description, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), ), ], ); diff --git a/boring_to_beautiful/step_02/lib/src/features/home/view/home_screen.dart b/boring_to_beautiful/step_02/lib/src/features/home/view/home_screen.dart index 715ddf435c..bcff070874 100644 --- a/boring_to_beautiful/step_02/lib/src/features/home/view/home_screen.dart +++ b/boring_to_beautiful/step_02/lib/src/features/home/view/home_screen.dart @@ -61,10 +61,11 @@ class _HomeScreenState extends State { children: [ const HomeHighlight(), LayoutBuilder( - builder: (context, constraints) => HomeArtists( - artists: artists, - constraints: constraints, - ), + builder: + (context, constraints) => HomeArtists( + artists: artists, + constraints: constraints, + ), ), ], ), @@ -81,9 +82,7 @@ class _HomeScreenState extends State { style: context.headlineSmall, ), ), - HomeRecent( - playlists: playlists, - ), + HomeRecent(playlists: playlists), ], ), ), @@ -101,19 +100,20 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.all(2), // Modify this line + padding: const EdgeInsets.all( + 2, + ), // Modify this line child: Text( 'Top Songs Today', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), ), ], ), @@ -126,19 +126,20 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.all(2), // Modify this line + padding: const EdgeInsets.all( + 2, + ), // Modify this line child: Text( 'New Releases', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: newReleases, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), ), ], ), diff --git a/boring_to_beautiful/step_02/lib/src/features/playlists/view/playlist_home_screen.dart b/boring_to_beautiful/step_02/lib/src/features/playlists/view/playlist_home_screen.dart index a80d767930..978608ccad 100644 --- a/boring_to_beautiful/step_02/lib/src/features/playlists/view/playlist_home_screen.dart +++ b/boring_to_beautiful/step_02/lib/src/features/playlists/view/playlist_home_screen.dart @@ -44,8 +44,10 @@ class PlaylistHomeScreen extends StatelessWidget { title: playlist.title, subtitle: playlist.description, ), - onTap: () => - GoRouter.of(context).go('/playlists/${playlist.id}'), + onTap: + () => GoRouter.of( + context, + ).go('/playlists/${playlist.id}'), ); }, ), diff --git a/boring_to_beautiful/step_02/lib/src/features/playlists/view/playlist_screen.dart b/boring_to_beautiful/step_02/lib/src/features/playlists/view/playlist_screen.dart index 5dc2f0744f..c41f500a92 100644 --- a/boring_to_beautiful/step_02/lib/src/features/playlists/view/playlist_screen.dart +++ b/boring_to_beautiful/step_02/lib/src/features/playlists/view/playlist_screen.dart @@ -20,114 +20,116 @@ class PlaylistScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - final colors = Theme.of(context).colorScheme; - final double headerHeight = constraints.isMobile - ? max(constraints.biggest.height * 0.5, 450) - : max(constraints.biggest.height * 0.25, 250); - if (constraints.isMobile) { - return Scaffold( - appBar: AppBar( - leading: BackButton( - onPressed: () => GoRouter.of(context).go('/playlists'), - ), - title: Text(playlist.title), - actions: [ - IconButton( - icon: const Icon(Icons.play_circle_fill), - onPressed: () {}, - ), - IconButton( - onPressed: () {}, - icon: const Icon(Icons.shuffle), - ), - ], - ), - body: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, - ), - ), - ); - } - return Scaffold( - body: CustomScrollView( - slivers: [ - SliverAppBar( + return LayoutBuilder( + builder: (context, constraints) { + final colors = Theme.of(context).colorScheme; + final double headerHeight = + constraints.isMobile + ? max(constraints.biggest.height * 0.5, 450) + : max(constraints.biggest.height * 0.25, 250); + if (constraints.isMobile) { + return Scaffold( + appBar: AppBar( leading: BackButton( onPressed: () => GoRouter.of(context).go('/playlists'), ), - expandedHeight: headerHeight, - pinned: false, - flexibleSpace: FlexibleSpaceBar( - background: AdaptiveImageCard( - axis: constraints.isMobile ? Axis.vertical : Axis.horizontal, - constraints: - constraints.copyWith(maxHeight: headerHeight).normalize(), - image: playlist.cover.image, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'PLAYLIST', - style: context.titleSmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.title, - style: context.displaySmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.description, - style: context.bodyLarge!.copyWith( - color: colors.onSurface.withAlpha(204), + title: Text(playlist.title), + actions: [ + IconButton( + icon: const Icon(Icons.play_circle_fill), + onPressed: () {}, + ), + IconButton(onPressed: () {}, icon: const Icon(Icons.shuffle)), + ], + ), + body: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), + ), + ); + } + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + leading: BackButton( + onPressed: () => GoRouter.of(context).go('/playlists'), + ), + expandedHeight: headerHeight, + pinned: false, + flexibleSpace: FlexibleSpaceBar( + background: AdaptiveImageCard( + axis: + constraints.isMobile ? Axis.vertical : Axis.horizontal, + constraints: + constraints + .copyWith(maxHeight: headerHeight) + .normalize(), + image: playlist.cover.image, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'PLAYLIST', + style: context.titleSmall!.copyWith( + color: colors.onSurface, + ), ), - ), - const SizedBox(height: 8), - Row( - children: [ - IconButton( - icon: Icon( - Icons.play_circle_fill, - color: colors.tertiary, - ), - onPressed: () {}, + Text( + playlist.title, + style: context.displaySmall!.copyWith( + color: colors.onSurface, ), - TextButton.icon( - onPressed: () {}, - icon: Icon( - Icons.shuffle, - color: colors.tertiary, - ), - label: Text( - 'Shuffle', - style: context.bodySmall!.copyWith( + ), + Text( + playlist.description, + style: context.bodyLarge!.copyWith( + color: colors.onSurface.withAlpha(204), + ), + ), + const SizedBox(height: 8), + Row( + children: [ + IconButton( + icon: Icon( + Icons.play_circle_fill, color: colors.tertiary, ), + onPressed: () {}, ), - ), - ], - ), - ], + TextButton.icon( + onPressed: () {}, + icon: Icon(Icons.shuffle, color: colors.tertiary), + label: Text( + 'Shuffle', + style: context.bodySmall!.copyWith( + color: colors.tertiary, + ), + ), + ), + ], + ), + ], + ), ), ), ), - ), - SliverToBoxAdapter( - child: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, + SliverToBoxAdapter( + child: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), ), ), - ), - ], - ), - ); - }); + ], + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_02/lib/src/features/playlists/view/playlist_songs.dart b/boring_to_beautiful/step_02/lib/src/features/playlists/view/playlist_songs.dart index e944336540..1d5a2e9879 100644 --- a/boring_to_beautiful/step_02/lib/src/features/playlists/view/playlist_songs.dart +++ b/boring_to_beautiful/step_02/lib/src/features/playlists/view/playlist_songs.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/views.dart'; class PlaylistSongs extends StatelessWidget { - const PlaylistSongs( - {super.key, required this.playlist, required this.constraints}); + const PlaylistSongs({ + super.key, + required this.playlist, + required this.constraints, + }); final Playlist playlist; final BoxConstraints constraints; @@ -25,14 +28,9 @@ class PlaylistSongs extends StatelessWidget { breakpoint: 450, columns: const [ DataColumn( - label: Padding( - padding: EdgeInsets.only(left: 20), - child: Text('#'), - ), - ), - DataColumn( - label: Text('Title'), + label: Padding(padding: EdgeInsets.only(left: 20), child: Text('#')), ), + DataColumn(label: Text('Title')), DataColumn( label: Padding( padding: EdgeInsets.only(right: 10), @@ -40,38 +38,40 @@ class PlaylistSongs extends StatelessWidget { ), ), ], - rowBuilder: (context, index) => DataRow.byIndex( - index: index, - cells: [ - DataCell( - // Add HoverableSongPlayButton - Center( - child: Text( - (index + 1).toString(), - textAlign: TextAlign.center, + rowBuilder: + (context, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + // Add HoverableSongPlayButton + Center( + child: Text( + (index + 1).toString(), + textAlign: TextAlign.center, + ), + ), ), - ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(playlist.songs[index].image.image), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(playlist.songs[index].image.image), + ), + const SizedBox(width: 10), + Expanded(child: Text(playlist.songs[index].title)), + ], + ), ), - const SizedBox(width: 10), - Expanded(child: Text(playlist.songs[index].title)), - ]), - ), - DataCell( - Text(playlist.songs[index].length.toHumanizedString()), + DataCell(Text(playlist.songs[index].length.toHumanizedString())), + ], ), - ], - ), itemBuilder: (song, index) { return ListTile( - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), leading: ClippedImage(song.image.image), title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), diff --git a/boring_to_beautiful/step_02/lib/src/shared/app.dart b/boring_to_beautiful/step_02/lib/src/shared/app.dart index eced12177d..771a2be1ad 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/app.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/app.dart @@ -19,45 +19,49 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - final settings = ValueNotifier(ThemeSettings( - sourceColor: Colors.pink, // Replace this color - themeMode: ThemeMode.system, - )); + final settings = ValueNotifier( + ThemeSettings( + sourceColor: Colors.pink, // Replace this color + themeMode: ThemeMode.system, + ), + ); @override Widget build(BuildContext context) { return BlocProvider( create: (context) => PlaybackBloc(), child: DynamicColorBuilder( - builder: (lightDynamic, darkDynamic) => ThemeProvider( - lightDynamic: lightDynamic, - darkDynamic: darkDynamic, - settings: settings, - child: NotificationListener( - onNotification: (notification) { - settings.value = notification.settings; - return true; - }, - child: ValueListenableBuilder( - valueListenable: settings, - builder: (context, value, _) { - // Create theme instance - return MaterialApp.router( - debugShowCheckedModeBanner: false, - title: 'Flutter Demo', - // Add theme - // Add dark theme - // Add theme mode - routeInformationParser: appRouter.routeInformationParser, - routeInformationProvider: - appRouter.routeInformationProvider, - routerDelegate: appRouter.routerDelegate, - builder: (context, child) { - return PlayPauseListener(child: child!); - }, - ); + builder: + (lightDynamic, darkDynamic) => ThemeProvider( + lightDynamic: lightDynamic, + darkDynamic: darkDynamic, + settings: settings, + child: NotificationListener( + onNotification: (notification) { + settings.value = notification.settings; + return true; }, + child: ValueListenableBuilder( + valueListenable: settings, + builder: (context, value, _) { + // Create theme instance + return MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + // Add theme + // Add dark theme + // Add theme mode + routeInformationParser: appRouter.routeInformationParser, + routeInformationProvider: + appRouter.routeInformationProvider, + routerDelegate: appRouter.routerDelegate, + builder: (context, child) { + return PlayPauseListener(child: child!); + }, + ); + }, + ), ), - )), + ), ), ); } diff --git a/boring_to_beautiful/step_02/lib/src/shared/classes/image.dart b/boring_to_beautiful/step_02/lib/src/shared/classes/image.dart index a1ef427c1d..00a6472b4a 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/classes/image.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/classes/image.dart @@ -3,10 +3,11 @@ // found in the LICENSE file. class MyArtistImage { - const MyArtistImage( - {required this.image, - required this.sourceName, - required this.sourceLink}); + const MyArtistImage({ + required this.image, + required this.sourceName, + required this.sourceLink, + }); final String image; final String sourceName; diff --git a/boring_to_beautiful/step_02/lib/src/shared/classes/playlist.dart b/boring_to_beautiful/step_02/lib/src/shared/classes/playlist.dart index 59899dc619..5f0225059d 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/classes/playlist.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/classes/playlist.dart @@ -17,8 +17,9 @@ class Playlist { this.description = '', required this.songs, this.cover = const MyArtistImage( - image: 'assets/images/record.jpeg', - sourceName: 'Adobe Stock Images', - sourceLink: ''), + image: 'assets/images/record.jpeg', + sourceName: 'Adobe Stock Images', + sourceLink: '', + ), }); } diff --git a/boring_to_beautiful/step_02/lib/src/shared/classes/ranked_song.dart b/boring_to_beautiful/step_02/lib/src/shared/classes/ranked_song.dart index 5908268c8c..2362bfae64 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/classes/ranked_song.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/classes/ranked_song.dart @@ -7,7 +7,11 @@ import './classes.dart'; class RankedSong extends Song { final int ranking; - const RankedSong(this.ranking, String title, Artist artist, Duration length, - MyArtistImage image) - : super(title, artist, length, image); + const RankedSong( + this.ranking, + String title, + Artist artist, + Duration length, + MyArtistImage image, + ) : super(title, artist, length, image); } diff --git a/boring_to_beautiful/step_02/lib/src/shared/extensions.dart b/boring_to_beautiful/step_02/lib/src/shared/extensions.dart index 6d9ea1f480..6a03f8b8b1 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/extensions.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/extensions.dart @@ -9,51 +9,36 @@ extension TypographyUtils on BuildContext { ThemeData get theme => Theme.of(this); TextTheme get textTheme => theme.textTheme; // Modify this line ColorScheme get colors => theme.colorScheme; - TextStyle? get displayLarge => textTheme.displayLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displayMedium => textTheme.displayMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displaySmall => textTheme.displaySmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineLarge => textTheme.headlineLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineMedium => textTheme.headlineMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineSmall => textTheme.headlineSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleLarge => textTheme.titleLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleMedium => textTheme.titleMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleSmall => textTheme.titleSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelLarge => textTheme.labelLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelMedium => textTheme.labelMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelSmall => textTheme.labelSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyLarge => textTheme.bodyLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyMedium => textTheme.bodyMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodySmall => textTheme.bodySmall?.copyWith( - color: colors.onSurface, - ); + TextStyle? get displayLarge => + textTheme.displayLarge?.copyWith(color: colors.onSurface); + TextStyle? get displayMedium => + textTheme.displayMedium?.copyWith(color: colors.onSurface); + TextStyle? get displaySmall => + textTheme.displaySmall?.copyWith(color: colors.onSurface); + TextStyle? get headlineLarge => + textTheme.headlineLarge?.copyWith(color: colors.onSurface); + TextStyle? get headlineMedium => + textTheme.headlineMedium?.copyWith(color: colors.onSurface); + TextStyle? get headlineSmall => + textTheme.headlineSmall?.copyWith(color: colors.onSurface); + TextStyle? get titleLarge => + textTheme.titleLarge?.copyWith(color: colors.onSurface); + TextStyle? get titleMedium => + textTheme.titleMedium?.copyWith(color: colors.onSurface); + TextStyle? get titleSmall => + textTheme.titleSmall?.copyWith(color: colors.onSurface); + TextStyle? get labelLarge => + textTheme.labelLarge?.copyWith(color: colors.onSurface); + TextStyle? get labelMedium => + textTheme.labelMedium?.copyWith(color: colors.onSurface); + TextStyle? get labelSmall => + textTheme.labelSmall?.copyWith(color: colors.onSurface); + TextStyle? get bodyLarge => + textTheme.bodyLarge?.copyWith(color: colors.onSurface); + TextStyle? get bodyMedium => + textTheme.bodyMedium?.copyWith(color: colors.onSurface); + TextStyle? get bodySmall => + textTheme.bodySmall?.copyWith(color: colors.onSurface); } extension BreakpointUtils on BoxConstraints { @@ -65,17 +50,17 @@ extension BreakpointUtils on BoxConstraints { extension DurationString on String { /// Assumes a string (roughly) of the format '\d{1,2}:\d{2}' Duration toDuration() => switch (split(':')) { - [var minutes, var seconds] => Duration( - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - [var hours, var minutes, var seconds] => Duration( - hours: int.parse(hours.trim()), - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - _ => throw Exception('Invalid duration string: $this'), - }; + [var minutes, var seconds] => Duration( + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + [var hours, var minutes, var seconds] => Duration( + hours: int.parse(hours.trim()), + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + _ => throw Exception('Invalid duration string: $this'), + }; } extension HumanizedDuration on Duration { diff --git a/boring_to_beautiful/step_02/lib/src/shared/playback/bloc/playback_bloc.dart b/boring_to_beautiful/step_02/lib/src/shared/playback/bloc/playback_bloc.dart index 73c2f4c436..c6c871937b 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/playback/bloc/playback_bloc.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/playback/bloc/playback_bloc.dart @@ -41,9 +41,8 @@ class PlaybackBloc extends Bloc { } } - void _handlePlaybackProgress(Duration progress) => add( - PlaybackEvent.songProgress(progress), - ); + void _handlePlaybackProgress(Duration progress) => + add(PlaybackEvent.songProgress(progress)); void _togglePlayPause(TogglePlayPause event, Emitter emit) { state.isPlaying ? _pausePlayback() : _resumePlayback(); @@ -52,8 +51,10 @@ class PlaybackBloc extends Bloc { void _pausePlayback() => _currentlyPlayingSubscription!.cancel(); - void _resumePlayback() => _currentlyPlayingSubscription = - _startPlayingStream().listen(_handlePlaybackProgress); + void _resumePlayback() => + _currentlyPlayingSubscription = _startPlayingStream().listen( + _handlePlaybackProgress, + ); void _changeSong(ChangeSong event, Emitter emit) { emit( @@ -69,19 +70,15 @@ class PlaybackBloc extends Bloc { } void _songProgress(SongProgress event, Emitter emit) => emit( - state.copyWith( - songWithProgress: state.songWithProgress!.copyWith( - progress: state.songWithProgress!.progress + event.duration, - ), - ), - ); + state.copyWith( + songWithProgress: state.songWithProgress!.copyWith( + progress: state.songWithProgress!.progress + event.duration, + ), + ), + ); void _setVolume(SetVolume event, Emitter emit) => emit( - state.copyWith( - volume: event.value, - isMuted: false, - previousVolume: null, - ), - ); + state.copyWith(volume: event.value, isMuted: false, previousVolume: null), + ); void _toggleMute(ToggleMute event, Emitter emit) { if (state.isMuted) { @@ -94,11 +91,7 @@ class PlaybackBloc extends Bloc { ); } else { emit( - state.copyWith( - isMuted: true, - volume: 0, - previousVolume: state.volume, - ), + state.copyWith(isMuted: true, volume: 0, previousVolume: state.volume), ); } } diff --git a/boring_to_beautiful/step_02/lib/src/shared/playback/bloc/playback_bloc.freezed.dart b/boring_to_beautiful/step_02/lib/src/shared/playback/bloc/playback_bloc.freezed.dart index 8a422cd449..54e870ab6f 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/playback/bloc/playback_bloc.freezed.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/playback/bloc/playback_bloc.freezed.dart @@ -12,7 +12,8 @@ part of 'playback_bloc.dart'; T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models', +); /// @nodoc mixin _$PlaybackEvent { @@ -24,8 +25,7 @@ mixin _$PlaybackEvent { required TResult Function() toggleMute, required TResult Function(double percent) moveToInSong, required TResult Function(Duration duration) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? togglePlayPause, @@ -34,8 +34,7 @@ mixin _$PlaybackEvent { TResult? Function()? toggleMute, TResult? Function(double percent)? moveToInSong, TResult? Function(Duration duration)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ TResult Function()? togglePlayPause, @@ -45,8 +44,7 @@ mixin _$PlaybackEvent { TResult Function(double percent)? moveToInSong, TResult Function(Duration duration)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult map({ required TResult Function(TogglePlayPause value) togglePlayPause, @@ -55,8 +53,7 @@ mixin _$PlaybackEvent { required TResult Function(ToggleMute value) toggleMute, required TResult Function(MoveToInSong value) moveToInSong, required TResult Function(SongProgress value) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ TResult? Function(TogglePlayPause value)? togglePlayPause, @@ -65,8 +62,7 @@ mixin _$PlaybackEvent { TResult? Function(ToggleMute value)? toggleMute, TResult? Function(MoveToInSong value)? moveToInSong, TResult? Function(SongProgress value)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeMap({ TResult Function(TogglePlayPause value)? togglePlayPause, @@ -76,15 +72,15 @@ mixin _$PlaybackEvent { TResult Function(MoveToInSong value)? moveToInSong, TResult Function(SongProgress value)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; } /// @nodoc abstract class $PlaybackEventCopyWith<$Res> { factory $PlaybackEventCopyWith( - PlaybackEvent value, $Res Function(PlaybackEvent) then) = - _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; + PlaybackEvent value, + $Res Function(PlaybackEvent) then, + ) = _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; } /// @nodoc @@ -103,9 +99,10 @@ class _$PlaybackEventCopyWithImpl<$Res, $Val extends PlaybackEvent> /// @nodoc abstract class _$$TogglePlayPauseImplCopyWith<$Res> { - factory _$$TogglePlayPauseImplCopyWith(_$TogglePlayPauseImpl value, - $Res Function(_$TogglePlayPauseImpl) then) = - __$$TogglePlayPauseImplCopyWithImpl<$Res>; + factory _$$TogglePlayPauseImplCopyWith( + _$TogglePlayPauseImpl value, + $Res Function(_$TogglePlayPauseImpl) then, + ) = __$$TogglePlayPauseImplCopyWithImpl<$Res>; } /// @nodoc @@ -113,8 +110,9 @@ class __$$TogglePlayPauseImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$TogglePlayPauseImpl> implements _$$TogglePlayPauseImplCopyWith<$Res> { __$$TogglePlayPauseImplCopyWithImpl( - _$TogglePlayPauseImpl _value, $Res Function(_$TogglePlayPauseImpl) _then) - : super(_value, _then); + _$TogglePlayPauseImpl _value, + $Res Function(_$TogglePlayPauseImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -233,8 +231,9 @@ abstract class TogglePlayPause implements PlaybackEvent { /// @nodoc abstract class _$$ChangeSongImplCopyWith<$Res> { factory _$$ChangeSongImplCopyWith( - _$ChangeSongImpl value, $Res Function(_$ChangeSongImpl) then) = - __$$ChangeSongImplCopyWithImpl<$Res>; + _$ChangeSongImpl value, + $Res Function(_$ChangeSongImpl) then, + ) = __$$ChangeSongImplCopyWithImpl<$Res>; @useResult $Res call({Song song}); } @@ -244,22 +243,23 @@ class __$$ChangeSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ChangeSongImpl> implements _$$ChangeSongImplCopyWith<$Res> { __$$ChangeSongImplCopyWithImpl( - _$ChangeSongImpl _value, $Res Function(_$ChangeSongImpl) _then) - : super(_value, _then); + _$ChangeSongImpl _value, + $Res Function(_$ChangeSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? song = null, - }) { - return _then(_$ChangeSongImpl( - null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? song = null}) { + return _then( + _$ChangeSongImpl( + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -397,8 +397,9 @@ abstract class ChangeSong implements PlaybackEvent { /// @nodoc abstract class _$$SetVolumeImplCopyWith<$Res> { factory _$$SetVolumeImplCopyWith( - _$SetVolumeImpl value, $Res Function(_$SetVolumeImpl) then) = - __$$SetVolumeImplCopyWithImpl<$Res>; + _$SetVolumeImpl value, + $Res Function(_$SetVolumeImpl) then, + ) = __$$SetVolumeImplCopyWithImpl<$Res>; @useResult $Res call({double value}); } @@ -408,22 +409,23 @@ class __$$SetVolumeImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SetVolumeImpl> implements _$$SetVolumeImplCopyWith<$Res> { __$$SetVolumeImplCopyWithImpl( - _$SetVolumeImpl _value, $Res Function(_$SetVolumeImpl) _then) - : super(_value, _then); + _$SetVolumeImpl _value, + $Res Function(_$SetVolumeImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? value = null, - }) { - return _then(_$SetVolumeImpl( - null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? value = null}) { + return _then( + _$SetVolumeImpl( + null == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -561,8 +563,9 @@ abstract class SetVolume implements PlaybackEvent { /// @nodoc abstract class _$$ToggleMuteImplCopyWith<$Res> { factory _$$ToggleMuteImplCopyWith( - _$ToggleMuteImpl value, $Res Function(_$ToggleMuteImpl) then) = - __$$ToggleMuteImplCopyWithImpl<$Res>; + _$ToggleMuteImpl value, + $Res Function(_$ToggleMuteImpl) then, + ) = __$$ToggleMuteImplCopyWithImpl<$Res>; } /// @nodoc @@ -570,8 +573,9 @@ class __$$ToggleMuteImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ToggleMuteImpl> implements _$$ToggleMuteImplCopyWith<$Res> { __$$ToggleMuteImplCopyWithImpl( - _$ToggleMuteImpl _value, $Res Function(_$ToggleMuteImpl) _then) - : super(_value, _then); + _$ToggleMuteImpl _value, + $Res Function(_$ToggleMuteImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -690,8 +694,9 @@ abstract class ToggleMute implements PlaybackEvent { /// @nodoc abstract class _$$MoveToInSongImplCopyWith<$Res> { factory _$$MoveToInSongImplCopyWith( - _$MoveToInSongImpl value, $Res Function(_$MoveToInSongImpl) then) = - __$$MoveToInSongImplCopyWithImpl<$Res>; + _$MoveToInSongImpl value, + $Res Function(_$MoveToInSongImpl) then, + ) = __$$MoveToInSongImplCopyWithImpl<$Res>; @useResult $Res call({double percent}); } @@ -701,22 +706,23 @@ class __$$MoveToInSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$MoveToInSongImpl> implements _$$MoveToInSongImplCopyWith<$Res> { __$$MoveToInSongImplCopyWithImpl( - _$MoveToInSongImpl _value, $Res Function(_$MoveToInSongImpl) _then) - : super(_value, _then); + _$MoveToInSongImpl _value, + $Res Function(_$MoveToInSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? percent = null, - }) { - return _then(_$MoveToInSongImpl( - null == percent - ? _value.percent - : percent // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? percent = null}) { + return _then( + _$MoveToInSongImpl( + null == percent + ? _value.percent + : percent // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -854,8 +860,9 @@ abstract class MoveToInSong implements PlaybackEvent { /// @nodoc abstract class _$$SongProgressImplCopyWith<$Res> { factory _$$SongProgressImplCopyWith( - _$SongProgressImpl value, $Res Function(_$SongProgressImpl) then) = - __$$SongProgressImplCopyWithImpl<$Res>; + _$SongProgressImpl value, + $Res Function(_$SongProgressImpl) then, + ) = __$$SongProgressImplCopyWithImpl<$Res>; @useResult $Res call({Duration duration}); } @@ -865,22 +872,23 @@ class __$$SongProgressImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SongProgressImpl> implements _$$SongProgressImplCopyWith<$Res> { __$$SongProgressImplCopyWithImpl( - _$SongProgressImpl _value, $Res Function(_$SongProgressImpl) _then) - : super(_value, _then); + _$SongProgressImpl _value, + $Res Function(_$SongProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? duration = null, - }) { - return _then(_$SongProgressImpl( - null == duration - ? _value.duration - : duration // ignore: cast_nullable_to_non_nullable - as Duration, - )); + $Res call({Object? duration = null}) { + return _then( + _$SongProgressImpl( + null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as Duration, + ), + ); } } @@ -1037,15 +1045,17 @@ mixin _$PlaybackState { /// @nodoc abstract class $PlaybackStateCopyWith<$Res> { factory $PlaybackStateCopyWith( - PlaybackState value, $Res Function(PlaybackState) then) = - _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; + PlaybackState value, + $Res Function(PlaybackState) then, + ) = _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); $SongWithProgressCopyWith<$Res>? get songWithProgress; } @@ -1071,28 +1081,36 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_value.copyWith( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - ) as $Val); + return _then( + _value.copyWith( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ) + as $Val, + ); } /// Create a copy of PlaybackState @@ -1114,16 +1132,18 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> abstract class _$$PlaybackStateImplCopyWith<$Res> implements $PlaybackStateCopyWith<$Res> { factory _$$PlaybackStateImplCopyWith( - _$PlaybackStateImpl value, $Res Function(_$PlaybackStateImpl) then) = - __$$PlaybackStateImplCopyWithImpl<$Res>; + _$PlaybackStateImpl value, + $Res Function(_$PlaybackStateImpl) then, + ) = __$$PlaybackStateImplCopyWithImpl<$Res>; @override @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); @override $SongWithProgressCopyWith<$Res>? get songWithProgress; @@ -1134,8 +1154,9 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> extends _$PlaybackStateCopyWithImpl<$Res, _$PlaybackStateImpl> implements _$$PlaybackStateImplCopyWith<$Res> { __$$PlaybackStateImplCopyWithImpl( - _$PlaybackStateImpl _value, $Res Function(_$PlaybackStateImpl) _then) - : super(_value, _then); + _$PlaybackStateImpl _value, + $Res Function(_$PlaybackStateImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1148,40 +1169,48 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_$PlaybackStateImpl( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - )); + return _then( + _$PlaybackStateImpl( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ), + ); } } /// @nodoc class _$PlaybackStateImpl implements _PlaybackState { - const _$PlaybackStateImpl( - {this.volume = 0.5, - this.previousVolume, - this.isMuted = false, - this.isPlaying = false, - this.songWithProgress}); + const _$PlaybackStateImpl({ + this.volume = 0.5, + this.previousVolume, + this.isMuted = false, + this.isPlaying = false, + this.songWithProgress, + }); /// Legal values are between 0 and 1. @override @@ -1221,8 +1250,14 @@ class _$PlaybackStateImpl implements _PlaybackState { } @override - int get hashCode => Object.hash(runtimeType, volume, previousVolume, isMuted, - isPlaying, songWithProgress); + int get hashCode => Object.hash( + runtimeType, + volume, + previousVolume, + isMuted, + isPlaying, + songWithProgress, + ); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1234,12 +1269,13 @@ class _$PlaybackStateImpl implements _PlaybackState { } abstract class _PlaybackState implements PlaybackState { - const factory _PlaybackState( - {final double volume, - final double? previousVolume, - final bool isMuted, - final bool isPlaying, - final SongWithProgress? songWithProgress}) = _$PlaybackStateImpl; + const factory _PlaybackState({ + final double volume, + final double? previousVolume, + final bool isMuted, + final bool isPlaying, + final SongWithProgress? songWithProgress, + }) = _$PlaybackStateImpl; /// Legal values are between 0 and 1. @override @@ -1278,8 +1314,9 @@ mixin _$SongWithProgress { /// @nodoc abstract class $SongWithProgressCopyWith<$Res> { factory $SongWithProgressCopyWith( - SongWithProgress value, $Res Function(SongWithProgress) then) = - _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; + SongWithProgress value, + $Res Function(SongWithProgress) then, + ) = _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; @useResult $Res call({Duration progress, Song song}); } @@ -1298,29 +1335,32 @@ class _$SongWithProgressCopyWithImpl<$Res, $Val extends SongWithProgress> /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_value.copyWith( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - ) as $Val); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _value.copyWith( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ) + as $Val, + ); } } /// @nodoc abstract class _$$SongWithProgressImplCopyWith<$Res> implements $SongWithProgressCopyWith<$Res> { - factory _$$SongWithProgressImplCopyWith(_$SongWithProgressImpl value, - $Res Function(_$SongWithProgressImpl) then) = - __$$SongWithProgressImplCopyWithImpl<$Res>; + factory _$$SongWithProgressImplCopyWith( + _$SongWithProgressImpl value, + $Res Function(_$SongWithProgressImpl) then, + ) = __$$SongWithProgressImplCopyWithImpl<$Res>; @override @useResult $Res call({Duration progress, Song song}); @@ -1330,28 +1370,30 @@ abstract class _$$SongWithProgressImplCopyWith<$Res> class __$$SongWithProgressImplCopyWithImpl<$Res> extends _$SongWithProgressCopyWithImpl<$Res, _$SongWithProgressImpl> implements _$$SongWithProgressImplCopyWith<$Res> { - __$$SongWithProgressImplCopyWithImpl(_$SongWithProgressImpl _value, - $Res Function(_$SongWithProgressImpl) _then) - : super(_value, _then); + __$$SongWithProgressImplCopyWithImpl( + _$SongWithProgressImpl _value, + $Res Function(_$SongWithProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of SongWithProgress /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_$SongWithProgressImpl( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _$SongWithProgressImpl( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -1390,13 +1432,16 @@ class _$SongWithProgressImpl implements _SongWithProgress { @pragma('vm:prefer-inline') _$$SongWithProgressImplCopyWith<_$SongWithProgressImpl> get copyWith => __$$SongWithProgressImplCopyWithImpl<_$SongWithProgressImpl>( - this, _$identity); + this, + _$identity, + ); } abstract class _SongWithProgress implements SongWithProgress { - const factory _SongWithProgress( - {required final Duration progress, - required final Song song}) = _$SongWithProgressImpl; + const factory _SongWithProgress({ + required final Duration progress, + required final Song song, + }) = _$SongWithProgressImpl; @override Duration get progress; diff --git a/boring_to_beautiful/step_02/lib/src/shared/providers/artists.dart b/boring_to_beautiful/step_02/lib/src/shared/providers/artists.dart index d116ad9cdd..f9e4a8063e 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/providers/artists.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/providers/artists.dart @@ -11,162 +11,175 @@ class ArtistsProvider { static ArtistsProvider get shared => ArtistsProvider(); List get artists => const [ - Artist( - id: 'jmo', - name: 'Jessie Morrison', + Artist( + id: 'jmo', + name: 'Jessie Morrison', + image: MyArtistImage( + image: 'assets/images/artists/woman.jpeg', + sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', + sourceName: 'Daniel Monteiro', + ), + bio: + 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', + updates: [ + 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', + 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', + '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', + ], + events: [ + Event( + date: '1/20/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Mountain View, California', + link: 'Tickets', + ), + Event( + date: '1/22/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Austin, Texas', + link: 'Tickets', + ), + Event( + date: '1/23/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Houston, Texas', + link: 'Tickets', + ), + Event( + date: '2/8/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Los Angeles, California', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', + author: 'By Jacqueline Stewart', + blurb: + 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', image: MyArtistImage( - image: 'assets/images/artists/woman.jpeg', - sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', - sourceName: 'Daniel Monteiro', + image: 'assets/images/news/concert.jpeg', + sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', + sourceName: 'Anthony DELANOIX', ), - bio: - 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', - updates: [ - 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', - 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', - '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', - ], - events: [ - Event( - date: '1/20/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Mountain View, California', - link: 'Tickets'), - Event( - date: '1/22/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Austin, Texas', - link: 'Tickets'), - Event( - date: '1/23/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Houston, Texas', - link: 'Tickets'), - Event( - date: '2/8/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Los Angeles, California', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', - author: 'By Jacqueline Stewart', - blurb: - 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', - image: MyArtistImage( - image: 'assets/images/news/concert.jpeg', - sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', - sourceName: 'Anthony DELANOIX', - ), - ) - ], ), - Artist( - id: 'lb', - name: 'Lucas Bryant', + ], + ), + Artist( + id: 'lb', + name: 'Lucas Bryant', + image: MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + bio: + 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', + updates: [ + 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', + 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', + 'We\'re going all in this weekend! How are you doing, Vegas?!', + ], + events: [ + Event( + date: '5/16/22', + title: 'Back To My Hometown Tour', + location: 'Indianapolis, IN', + link: 'Tickets', + ), + Event( + date: '5/18/22', + title: 'Back To My Hometown Tour', + location: 'San Antonio, TX', + link: 'Tickets', + ), + Event( + date: '5/20/22', + title: 'Back To My Hometown Tour', + location: 'Phoenix, AZ', + link: 'Tickets', + ), + Event( + date: '5/23/22', + title: 'Back To My Hometown Tour', + location: 'San Diego, CA', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', + author: 'Lonnie Hall', + blurb: + 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', image: MyArtistImage( image: 'assets/images/albums/artist1-album2.jpg', sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', sourceName: 'Keagan Henman', ), - bio: - 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', - updates: [ - 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', - 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', - 'We\'re going all in this weekend! How are you doing, Vegas?!', - ], - events: [ - Event( - date: '5/16/22', - title: 'Back To My Hometown Tour', - location: 'Indianapolis, IN', - link: 'Tickets'), - Event( - date: '5/18/22', - title: 'Back To My Hometown Tour', - location: 'San Antonio, TX', - link: 'Tickets'), - Event( - date: '5/20/22', - title: 'Back To My Hometown Tour', - location: 'Phoenix, AZ', - link: 'Tickets'), - Event( - date: '5/23/22', - title: 'Back To My Hometown Tour', - location: 'San Diego, CA', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', - author: 'Lonnie Hall', - blurb: - 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', - image: MyArtistImage( - image: 'assets/images/albums/artist1-album2.jpg', - sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', - sourceName: 'Keagan Henman', - ), - ), - ], ), - Artist( - id: 'jonjames', - name: 'Jon James', + ], + ), + Artist( + id: 'jonjames', + name: 'Jon James', + image: MyArtistImage( + image: 'assets/images/artists/joe.jpg', + sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', + sourceName: 'Natalie Runnerstrom', + ), + bio: + 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', + updates: [ + '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', + '4 days until I get to share some of the favorite songs I\'ve ever written with you.', + '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', + ], + events: [ + Event( + date: '10/22/21', + title: 'Falling For You Tour', + location: 'Dallas, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/23/21', + title: 'Falling For You Tour', + location: 'Houston, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/26/21', + title: 'Falling For You Tour', + location: 'Phoenix, Arizona', + link: 'Ticketmaster', + ), + Event( + date: '10/27/21', + title: 'Falling For You Tour', + location: 'Los Angeles, California', + link: 'Ticketmaster', + ), + ], + news: [ + News( + title: + 'Jon James is excited for the release of his sixth album "Falling For You"', + author: 'Top Media Today', + blurb: + 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', image: MyArtistImage( - image: 'assets/images/artists/joe.jpg', - sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', - sourceName: 'Natalie Runnerstrom', + image: 'assets/images/news/recording_studio.jpg', + sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', + sourceName: 'Yohann LIBOT', ), - bio: - 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', - updates: [ - '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', - '4 days until I get to share some of the favorite songs I\'ve ever written with you.', - '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', - ], - events: [ - Event( - date: '10/22/21', - title: 'Falling For You Tour', - location: 'Dallas, Texas', - link: 'Ticketmaster'), - Event( - date: '10/23/21', - title: 'Falling For You Tour', - location: 'Houston, Texas', - link: 'Ticketmaster'), - Event( - date: '10/26/21', - title: 'Falling For You Tour', - location: 'Phoenix, Arizona', - link: 'Ticketmaster'), - Event( - date: '10/27/21', - title: 'Falling For You Tour', - location: 'Los Angeles, California', - link: 'Ticketmaster'), - ], - news: [ - News( - title: - 'Jon James is excited for the release of his sixth album "Falling For You"', - author: 'Top Media Today', - blurb: - 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', - image: MyArtistImage( - image: 'assets/images/news/recording_studio.jpg', - sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', - sourceName: 'Yohann LIBOT'), - ) - ], ), - ]; + ], + ), + ]; Artist? getArtist(String id) { return artists.firstWhereOrNull((artist) => artist.id == id); diff --git a/boring_to_beautiful/step_02/lib/src/shared/providers/playlists.dart b/boring_to_beautiful/step_02/lib/src/shared/providers/playlists.dart index e8bab994dd..f27f71b3ec 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/providers/playlists.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/providers/playlists.dart @@ -18,41 +18,50 @@ class PlaylistsProvider { static List images() { return [ const MyArtistImage( - image: 'assets/images/playlists/favorite.jpg', - sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/favorite.jpg', + sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/austin.jpg', - sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', - sourceName: 'Carlos Alfonso'), + image: 'assets/images/playlists/austin.jpg', + sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', + sourceName: 'Carlos Alfonso', + ), const MyArtistImage( - image: 'assets/images/playlists/reading.jpg', - sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', - sourceName: 'Alexandra Fuller'), + image: 'assets/images/playlists/reading.jpg', + sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', + sourceName: 'Alexandra Fuller', + ), const MyArtistImage( - image: 'assets/images/playlists/workout.jpg', - sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/workout.jpg', + sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/calm.jpg', - sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', - sourceName: 'Jared Rice'), + image: 'assets/images/playlists/calm.jpg', + sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', + sourceName: 'Jared Rice', + ), const MyArtistImage( - image: 'assets/images/playlists/coffee.jpg', - sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', - sourceName: 'Nathan Dumlao'), + image: 'assets/images/playlists/coffee.jpg', + sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', + sourceName: 'Nathan Dumlao', + ), const MyArtistImage( - image: 'assets/images/playlists/piano.jpg', - sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', - sourceName: 'Jordan Whitfield'), + image: 'assets/images/playlists/piano.jpg', + sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', + sourceName: 'Jordan Whitfield', + ), const MyArtistImage( - image: 'assets/images/playlists/studying.jpg', - sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', - sourceName: 'Humble Lamb'), + image: 'assets/images/playlists/studying.jpg', + sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', + sourceName: 'Humble Lamb', + ), const MyArtistImage( - image: 'assets/images/playlists/jazz.jpg', - sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', - sourceName: 'dimitri.photography'), + image: 'assets/images/playlists/jazz.jpg', + sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', + sourceName: 'dimitri.photography', + ), ]; } @@ -85,8 +94,10 @@ class PlaylistsProvider { ); } - static final List _randomPlaylists = - List.generate(10, (index) => randomLengthPlaylist()); + static final List _randomPlaylists = List.generate( + 10, + (index) => randomLengthPlaylist(), + ); } String randomId() { diff --git a/boring_to_beautiful/step_02/lib/src/shared/providers/songs.dart b/boring_to_beautiful/step_02/lib/src/shared/providers/songs.dart index ed018a83ff..f1205f2dcb 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/providers/songs.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/providers/songs.dart @@ -52,9 +52,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:35'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album2.jpg', - sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', - sourceName: 'Alexandru Acea'), + image: 'assets/images/albums/artist4-album2.jpg', + sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', + sourceName: 'Alexandru Acea', + ), ), RankedSong( 2, @@ -62,9 +63,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:52'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album1.jpg', - sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', - sourceName: 'Jr Korpa'), + image: 'assets/images/albums/artist4-album1.jpg', + sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', + sourceName: 'Jr Korpa', + ), ), RankedSong( 3, @@ -72,9 +74,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:39'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album3.jpg', - sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', - sourceName: 'Stormseeker'), + image: 'assets/images/albums/artist4-album3.jpg', + sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', + sourceName: 'Stormseeker', + ), ), RankedSong( 1, diff --git a/boring_to_beautiful/step_02/lib/src/shared/providers/theme.dart b/boring_to_beautiful/step_02/lib/src/shared/providers/theme.dart index f05527ff8f..5c2dd59042 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/providers/theme.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/providers/theme.dart @@ -28,12 +28,13 @@ class ThemeSettingChange extends Notification { } class ThemeProvider extends InheritedWidget { - const ThemeProvider( - {super.key, - required this.settings, - required this.lightDynamic, - required this.darkDynamic, - required super.child}); + const ThemeProvider({ + super.key, + required this.settings, + required this.lightDynamic, + required this.darkDynamic, + required super.child, + }); final ValueNotifier settings; final ColorScheme? lightDynamic; @@ -59,8 +60,9 @@ class ThemeProvider extends InheritedWidget { Color blend(Color targetColor) { return Color( - // ignore: deprecated_member_use - Blend.harmonize(targetColor.value, settings.value.sourceColor.value)); + // ignore: deprecated_member_use + Blend.harmonize(targetColor.value, settings.value.sourceColor.value), + ); } Color source(Color? target) { @@ -72,18 +74,18 @@ class ThemeProvider extends InheritedWidget { } ColorScheme colors(Brightness brightness, Color? targetColor) { - final dynamicPrimary = brightness == Brightness.light - ? lightDynamic?.primary - : darkDynamic?.primary; + final dynamicPrimary = + brightness == Brightness.light + ? lightDynamic?.primary + : darkDynamic?.primary; return ColorScheme.fromSeed( seedColor: dynamicPrimary ?? source(targetColor), brightness: brightness, ); } - ShapeBorder get shapeMedium => RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ); + ShapeBorder get shapeMedium => + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)); CardTheme cardTheme() { return CardTheme( @@ -113,21 +115,13 @@ class ThemeProvider extends InheritedWidget { labelColor: colors.secondary, unselectedLabelColor: colors.onSurfaceVariant, indicator: BoxDecoration( - border: Border( - bottom: BorderSide( - color: colors.secondary, - width: 2, - ), - ), + border: Border(bottom: BorderSide(color: colors.secondary, width: 2)), ), ); } BottomAppBarTheme bottomAppBarTheme(ColorScheme colors) { - return BottomAppBarTheme( - color: colors.surface, - elevation: 0, - ); + return BottomAppBarTheme(color: colors.surface, elevation: 0); } BottomNavigationBarThemeData bottomNavigationBarTheme(ColorScheme colors) { @@ -146,9 +140,7 @@ class ThemeProvider extends InheritedWidget { } DrawerThemeData drawerTheme(ColorScheme colors) { - return DrawerThemeData( - backgroundColor: colors.surface, - ); + return DrawerThemeData(backgroundColor: colors.surface); } ThemeData light([Color? targetColor]) { @@ -207,10 +199,7 @@ class ThemeProvider extends InheritedWidget { } class ThemeSettings { - ThemeSettings({ - required this.sourceColor, - required this.themeMode, - }); + ThemeSettings({required this.sourceColor, required this.themeMode}); final Color sourceColor; final ThemeMode themeMode; @@ -221,10 +210,7 @@ Color randomColor() { } // Custom Colors -const linkColor = CustomColor( - name: 'Link Color', - color: Color(0xFF00B0FF), -); +const linkColor = CustomColor(name: 'Link Color', color: Color(0xFF00B0FF)); class CustomColor { const CustomColor({ diff --git a/boring_to_beautiful/step_02/lib/src/shared/router.dart b/boring_to_beautiful/step_02/lib/src/shared/router.dart index 3efb7362fa..db82627246 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/router.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/router.dart @@ -20,11 +20,7 @@ final artistsProvider = ArtistsProvider(); final playlistsProvider = PlaylistsProvider(); const List destinations = [ - NavigationDestination( - label: 'Home', - icon: Icon(Icons.home), - route: '/', - ), + NavigationDestination(label: 'Home', icon: Icon(Icons.home), route: '/'), NavigationDestination( label: 'Playlists', icon: Icon(Icons.playlist_add_check), @@ -56,41 +52,46 @@ final appRouter = GoRouter( // HomeScreen GoRoute( path: '/', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 0, - child: HomeScreen(), - ), - ), + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 0, + child: HomeScreen(), + ), + ), ), // PlaylistHomeScreen GoRoute( path: '/playlists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 1, - child: PlaylistHomeScreen(), - ), - ), - routes: [ - GoRoute( - path: ':pid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 1, - child: PlaylistScreen( - playlist: playlistsProvider - .getPlaylist(state.pathParameters['pid']!)!, - ), + child: PlaylistHomeScreen(), ), ), + routes: [ + GoRoute( + path: ':pid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 1, + child: PlaylistScreen( + playlist: + playlistsProvider.getPlaylist( + state.pathParameters['pid']!, + )!, + ), + ), + ), ), ], ), @@ -98,28 +99,32 @@ final appRouter = GoRouter( // ArtistHomeScreen GoRoute( path: '/artists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 2, - child: ArtistsScreen(), - ), - ), - routes: [ - GoRoute( - path: ':aid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 2, - child: ArtistScreen( - artist: - artistsProvider.getArtist(state.pathParameters['aid']!)!, - ), + child: ArtistsScreen(), ), ), + routes: [ + GoRoute( + path: ':aid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 2, + child: ArtistScreen( + artist: + artistsProvider.getArtist( + state.pathParameters['aid']!, + )!, + ), + ), + ), // builder: (context, state) => ArtistScreen( // id: state.params['aid']!, // ), @@ -129,14 +134,15 @@ final appRouter = GoRouter( for (final route in destinations.skip(3)) GoRoute( path: route.route, - pageBuilder: (context, state) => MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: destinations.indexOf(route), - child: const SizedBox(), - ), - ), + pageBuilder: + (context, state) => MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: destinations.indexOf(route), + child: const SizedBox(), + ), + ), ), ], ); diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/adaptive_image_card.dart b/boring_to_beautiful/step_02/lib/src/shared/views/adaptive_image_card.dart index 07cab2b0d7..99f5be0837 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/adaptive_image_card.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/adaptive_image_card.dart @@ -36,20 +36,13 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), + child: Padding(padding: const EdgeInsets.all(20), child: child), ), ], ); } return Padding( - padding: const EdgeInsets.only( - left: 20, - bottom: 20, - top: 20, - ), + padding: const EdgeInsets.only(left: 20, bottom: 20, top: 20), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, @@ -65,11 +58,8 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), - ) + child: Padding(padding: const EdgeInsets.all(20), child: child), + ), ], ), ); diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/adaptive_navigation.dart b/boring_to_beautiful/step_02/lib/src/shared/views/adaptive_navigation.dart index 92734c9005..aa78766292 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/adaptive_navigation.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/adaptive_navigation.dart @@ -30,12 +30,15 @@ class AdaptiveNavigation extends StatelessWidget { NavigationRail( extended: dimens.maxWidth >= 800, minExtendedWidth: 180, - destinations: destinations - .map((e) => NavigationRailDestination( - icon: e.icon, - label: Text(e.label), - )) - .toList(), + destinations: + destinations + .map( + (e) => NavigationRailDestination( + icon: e.icon, + label: Text(e.label), + ), + ) + .toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ), diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/article_content.dart b/boring_to_beautiful/step_02/lib/src/shared/views/article_content.dart index af243f015b..c5a0b5e62a 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/article_content.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/article_content.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class ArticleContent extends StatelessWidget { - const ArticleContent({ - super.key, - required this.child, - this.maxWidth = 960, - }); + const ArticleContent({super.key, required this.child, this.maxWidth = 960}); final double maxWidth; final Widget child; @@ -19,13 +15,8 @@ class ArticleContent extends StatelessWidget { return Container( alignment: Alignment.topCenter, child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: maxWidth, - ), - child: Padding( - padding: const EdgeInsets.all(15), - child: child, - ), + constraints: BoxConstraints(maxWidth: maxWidth), + child: Padding(padding: const EdgeInsets.all(15), child: child), ), ); } diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/bottom_bar.dart b/boring_to_beautiful/step_02/lib/src/shared/views/bottom_bar.dart index 06e085a9b6..bf15ad9bb0 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/bottom_bar.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/bottom_bar.dart @@ -26,16 +26,18 @@ class BottomBar extends StatelessWidget implements PreferredSizeWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => _BottomBar( - artist: state.songWithProgress?.song.artist, - isMuted: state.isMuted, - isPlaying: state.isPlaying, - preferredSize: preferredSize, - progress: state.songWithProgress?.progress, - song: state.songWithProgress?.song, - togglePlayPause: () => bloc.add(const PlaybackEvent.togglePlayPause()), - volume: state.volume, - ), + builder: + (context, state) => _BottomBar( + artist: state.songWithProgress?.song.artist, + isMuted: state.isMuted, + isPlaying: state.isPlaying, + preferredSize: preferredSize, + progress: state.songWithProgress?.progress, + song: state.songWithProgress?.song, + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), + volume: state.volume, + ), ); } } @@ -63,10 +65,12 @@ class _BottomBar extends StatelessWidget { @override Widget build(BuildContext context) => LayoutBuilder( - builder: (context, constraints) => constraints.isTablet - ? _buildDesktopBar(context, constraints) - : _buildMobileBar(context, constraints), - ); + builder: + (context, constraints) => + constraints.isTablet + ? _buildDesktopBar(context, constraints) + : _buildMobileBar(context, constraints), + ); Widget _buildDesktopBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -79,10 +83,7 @@ class _BottomBar extends StatelessWidget { Row( children: [ _AlbumArt(song: song), - _SongDetails( - artist: artist, - song: song, - ), + _SongDetails(artist: artist, song: song), ], ), Flexible( @@ -95,12 +96,7 @@ class _BottomBar extends StatelessWidget { isPlaying: isPlaying, togglePlayPause: togglePlayPause, ), - Center( - child: _ProgressBar( - progress: progress, - song: song, - ), - ), + Center(child: _ProgressBar(progress: progress, song: song)), ], ), ), @@ -114,17 +110,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _FullScreenPlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _FullScreenPlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -136,10 +133,10 @@ class _BottomBar extends StatelessWidget { } double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; Widget _buildMobileBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -152,17 +149,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _MobilePlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _MobilePlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -191,10 +189,7 @@ class _BottomBar extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - song?.title ?? '', - style: context.labelMedium, - ), + Text(song?.title ?? '', style: context.labelMedium), Text( song?.artist.name ?? '', style: context.labelSmall, @@ -220,10 +215,7 @@ class _BottomBar extends StatelessWidget { } class _ProgressBar extends StatelessWidget { - const _ProgressBar({ - required this.progress, - required this.song, - }); + const _ProgressBar({required this.progress, required this.song}); /// Current playback depth into user is into [song]. final Duration? progress; @@ -231,10 +223,10 @@ class _ProgressBar extends StatelessWidget { final Song? song; double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; @override Widget build(BuildContext context) { @@ -252,29 +244,32 @@ class _ProgressBar extends StatelessWidget { children: [ const SizedBox(width: 10), SizedBox( - child: progress != null - ? Text(progress!.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + progress != null + ? Text( + progress!.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), Expanded( child: Slider( value: songProgress.clamp(0, 1), divisions: 1000, onChanged: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); }, onChangeEnd: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); // Because dragging pauses auto playback, resume playing // once the user finishes dragging. - BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ); + BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()); }, activeColor: Theme.of(context).colorScheme.onTertiaryContainer, @@ -282,12 +277,15 @@ class _ProgressBar extends StatelessWidget { ), ), SizedBox( - child: song != null - ? Text(song!.length.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + song != null + ? Text( + song!.length.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), - const SizedBox(width: 10) + const SizedBox(width: 10), ], ), ); @@ -297,10 +295,7 @@ class _ProgressBar extends StatelessWidget { } class _VolumeBar extends StatelessWidget { - const _VolumeBar({ - required this.volume, - required this.isMuted, - }); + const _VolumeBar({required this.volume, required this.isMuted}); /// The percentage, between 0 and 1, at which to render the volume slider. final double volume; @@ -313,17 +308,16 @@ class _VolumeBar extends StatelessWidget { @override Widget build(BuildContext context) { return ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 200, - ), + constraints: const BoxConstraints(maxWidth: 200), child: Padding( padding: const EdgeInsets.all(8), child: Row( children: [ GestureDetector( - onTap: () => BlocProvider.of(context).add( - const PlaybackEvent.toggleMute(), - ), + onTap: + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.toggleMute()), child: Icon(!isMuted ? Icons.volume_mute : Icons.volume_off), ), Expanded( @@ -332,8 +326,10 @@ class _VolumeBar extends StatelessWidget { min: 0, max: 1, divisions: 100, - onChanged: (newValue) => BlocProvider.of(context) - .add(PlaybackEvent.setVolume(newValue)), + onChanged: + (newValue) => BlocProvider.of( + context, + ).add(PlaybackEvent.setVolume(newValue)), activeColor: Theme.of(context).colorScheme.onTertiaryContainer, inactiveColor: Theme.of(context).colorScheme.onSurface, ), @@ -356,49 +352,50 @@ class _PlaybackControls extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - double iconSize = 24; - double playIconSize = 32; - double innerPadding = 16; - double playPadding = 20; - if (constraints.maxWidth < 500) { - iconSize = 21; - playIconSize = 28; - innerPadding = 14; - playPadding = 17; - } - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( + return LayoutBuilder( + builder: (context, constraints) { + double iconSize = 24; + double playIconSize = 32; + double innerPadding = 16; + double playPadding = 20; + if (constraints.maxWidth < 500) { + iconSize = 21; + playIconSize = 28; + innerPadding = 14; + playPadding = 17; + } + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( padding: EdgeInsets.fromLTRB(0, 0, innerPadding, 0), - child: Icon(Icons.shuffle, size: iconSize)), - Icon(Icons.skip_previous, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), - child: GestureDetector( - onTap: togglePlayPause, - child: Icon( - isPlaying ? Icons.pause_circle : Icons.play_circle, - size: playIconSize, + child: Icon(Icons.shuffle, size: iconSize), + ), + Icon(Icons.skip_previous, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), + child: GestureDetector( + onTap: togglePlayPause, + child: Icon( + isPlaying ? Icons.pause_circle : Icons.play_circle, + size: playIconSize, + ), ), ), - ), - Icon(Icons.skip_next, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), - child: Icon(Icons.repeat, size: iconSize), - ), - ], - ); - }); + Icon(Icons.skip_next, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), + child: Icon(Icons.repeat, size: iconSize), + ), + ], + ); + }, + ); } } class _AlbumArt extends StatelessWidget { - const _AlbumArt({ - required this.song, - }); + const _AlbumArt({required this.song}); final Song? song; @@ -409,21 +406,17 @@ class _AlbumArt extends StatelessWidget { child: SizedBox( width: 70, height: 70, - child: song != null - ? Image.asset(song!.image.image) - : Container( - color: Colors.pink[100], - ), + child: + song != null + ? Image.asset(song!.image.image) + : Container(color: Colors.pink[100]), ), ); } } class _SongDetails extends StatelessWidget { - const _SongDetails({ - required this.artist, - required this.song, - }); + const _SongDetails({required this.artist, required this.song}); final Artist? artist; final Song? song; @@ -455,9 +448,7 @@ class _SongDetails extends StatelessWidget { } class _FullScreenPlayer extends StatefulWidget { - const _FullScreenPlayer({ - required this.onClose, - }); + const _FullScreenPlayer({required this.onClose}); final VoidCallback onClose; @@ -489,29 +480,33 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return MouseRegion( - onHover: (_) { - setState(() { - _showControls = true; - }); - hideControls(); + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return MouseRegion( + onHover: (_) { + setState(() { + _showControls = true; + }); + hideControls(); + }, + child: buildPlayer(context, state, dimens), + ); }, - child: buildPlayer(context, state, dimens), - ); - }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; final song = current?.song; @@ -519,26 +514,25 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { fit: StackFit.expand, children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - song!.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset(song!.image.image, fit: BoxFit.cover), ), ), - ), ), Positioned( top: 20, right: 20, child: IconButton( - color: song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const Icon(Icons.fullscreen_exit), onPressed: widget.onClose, ), @@ -569,8 +563,9 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { Text( song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 20, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 20, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -582,10 +577,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { right: 20, left: 20, bottom: dimens.biggest.height * 0.2, - child: _ProgressBar( - progress: current?.progress, - song: song, - ), + child: _ProgressBar(progress: current?.progress, song: song), ), Positioned( right: 20, @@ -598,8 +590,8 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), @@ -611,9 +603,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { } class _MobilePlayer extends StatelessWidget { - const _MobilePlayer({ - required this.onClose, - }); + const _MobilePlayer({required this.onClose}); final VoidCallback onClose; @@ -622,46 +612,52 @@ class _MobilePlayer extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return buildPlayer(context, state, dimens); - }, + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return buildPlayer(context, state, dimens); + }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; return Stack( children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - current.song.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset( + current.song.image.image, + fit: BoxFit.cover, + ), ), ), - ), ), Positioned( top: 20, left: 20, child: IconButton( - color: current?.song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + current?.song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const RotatedBox( quarterTurns: 1, child: Icon(Icons.chevron_right), @@ -676,10 +672,7 @@ class _MobilePlayer extends StatelessWidget { left: 0, right: 0, height: dimens.biggest.height * 0.5, - child: Image.asset( - current.song.image.image, - fit: BoxFit.contain, - ), + child: Image.asset(current.song.image.image, fit: BoxFit.contain), ), Positioned( left: 0, @@ -705,8 +698,9 @@ class _MobilePlayer extends StatelessWidget { Text( current.song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 12, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 12, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -718,15 +712,12 @@ class _MobilePlayer extends StatelessWidget { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), - _ProgressBar( - progress: current.progress, - song: current.song, - ), + _ProgressBar(progress: current.progress, song: current.song), ], ), ), diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/brightness_toggle.dart b/boring_to_beautiful/step_02/lib/src/shared/views/brightness_toggle.dart index 46dde4810f..5b5332392b 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/brightness_toggle.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/brightness_toggle.dart @@ -13,9 +13,10 @@ class BrightnessToggle extends StatelessWidget { Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; return IconButton( - icon: Theme.of(context).brightness == Brightness.light - ? const Icon(Icons.brightness_3) - : const Icon(Icons.brightness_7), + icon: + Theme.of(context).brightness == Brightness.light + ? const Icon(Icons.brightness_3) + : const Icon(Icons.brightness_7), onPressed: () { final themeProvider = ThemeProvider.of(context); final settings = themeProvider.settings.value; diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/center_row.dart b/boring_to_beautiful/step_02/lib/src/shared/views/center_row.dart index 36d428e3b8..c1f3effcc2 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/center_row.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/center_row.dart @@ -5,23 +5,12 @@ import 'package:flutter/material.dart'; class CenterRow extends StatelessWidget { - const CenterRow({ - super.key, - required this.child, - }); + const CenterRow({super.key, required this.child}); final Widget child; @override Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Center( - child: child, - ), - ), - ], - ); + return Row(children: [Expanded(child: Center(child: child))]); } } diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/clickable.dart b/boring_to_beautiful/step_02/lib/src/shared/views/clickable.dart index cd7ef46268..f192f0b135 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/clickable.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/clickable.dart @@ -14,10 +14,7 @@ class Clickable extends StatelessWidget { Widget build(BuildContext context) { return MouseRegion( cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: onTap, - child: child, - ), + child: GestureDetector(onTap: onTap, child: child), ); } } diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/events.dart b/boring_to_beautiful/step_02/lib/src/shared/views/events.dart index ed38465460..ab9140e56d 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/events.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/events.dart @@ -24,43 +24,18 @@ class Events extends StatelessWidget { child: DataTable( horizontalMargin: 5.0, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], rows: [ for (final event in artist.events) DataRow( cells: [ - DataCell( - Text(event.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(event.title)), - ]), - ), - DataCell( - Text(event.location), - ), + DataCell(Text(event.date)), + DataCell(Row(children: [Expanded(child: Text(event.title))])), + DataCell(Text(event.location)), DataCell( Clickable( child: Text( @@ -70,8 +45,9 @@ class Events extends StatelessWidget { decoration: TextDecoration.underline, ), ), - onTap: () => - launchUrl(Uri.parse('https://docs.flutter.dev')), + onTap: + () => + launchUrl(Uri.parse('https://docs.flutter.dev')), ), ), ], diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/hover_toggle.dart b/boring_to_beautiful/step_02/lib/src/shared/views/hover_toggle.dart index ec98c2863c..649cfcab63 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/hover_toggle.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/hover_toggle.dart @@ -31,9 +31,10 @@ class _HoverToggleState extends State with MaterialStateMixin { cursor: isHovered ? SystemMouseCursors.click : MouseCursor.defer, onEnter: (_) => setMaterialState(WidgetState.hovered, true), onExit: (_) => setMaterialState(WidgetState.hovered, false), - child: widget.mode == HoverMode.replace - ? _buildReplaceableChildren() - : _buildChildrenStack(), + child: + widget.mode == HoverMode.replace + ? _buildReplaceableChildren() + : _buildChildrenStack(), ), ); } @@ -41,12 +42,7 @@ class _HoverToggleState extends State with MaterialStateMixin { Widget _buildChildrenStack() { Widget child = isHovered ? Opacity(opacity: 0.2, child: widget.child) : widget.child; - return Stack( - children: [ - child, - if (isHovered) widget.hoverChild, - ], - ); + return Stack(children: [child, if (isHovered) widget.hoverChild]); } Widget _buildReplaceableChildren() => diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/hoverable_song_play_button.dart b/boring_to_beautiful/step_02/lib/src/shared/views/hoverable_song_play_button.dart index 512f3d1d3c..dd588e3dbe 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/hoverable_song_play_button.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/hoverable_song_play_button.dart @@ -29,9 +29,10 @@ class HoverableSongPlayButton extends StatelessWidget { hoverChild: Center( child: GestureDetector( child: const Icon(Icons.play_arrow), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ), ), mode: hoverMode, diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/image_card.dart b/boring_to_beautiful/step_02/lib/src/shared/views/image_card.dart index 0af9f75f33..6e7f6cd42d 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/image_card.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/image_card.dart @@ -7,13 +7,14 @@ import '../../shared/extensions.dart'; import 'outlined_card.dart'; class ImageCard extends StatelessWidget { - const ImageCard( - {super.key, - required this.title, - required this.details, - required this.image, - this.subtitle, - this.clickable = false}); + const ImageCard({ + super.key, + required this.title, + required this.details, + required this.image, + this.subtitle, + this.clickable = false, + }); final String title; final String? subtitle; @@ -28,54 +29,51 @@ class ImageCard extends StatelessWidget { clickable: clickable, child: Padding( padding: const EdgeInsets.all(8.0), - child: LayoutBuilder(builder: (context, constraints) { - return Row( - children: [ - if (constraints.maxWidth > 600) - SizedBox( - width: 170, - height: 170, - child: Image.asset( - image, - fit: BoxFit.cover, + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + if (constraints.maxWidth > 600) + SizedBox( + width: 170, + height: 170, + child: Image.asset(image, fit: BoxFit.cover), ), - ), - Expanded( - child: Padding( - padding: padding, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 5), - child: Text( - title, - style: context.titleLarge! - .copyWith(fontWeight: FontWeight.bold), - ), - ), - if (subtitle != null) + Expanded( + child: Padding( + padding: padding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Padding( - padding: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only(bottom: 5), child: Text( - subtitle!, - style: context.labelMedium, + title, + style: context.titleLarge!.copyWith( + fontWeight: FontWeight.bold, + ), ), ), - Text( - details, - style: context.labelMedium?.copyWith( - fontSize: 16, - height: 1.25, + if (subtitle != null) + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text(subtitle!, style: context.labelMedium), + ), + Text( + details, + style: context.labelMedium?.copyWith( + fontSize: 16, + height: 1.25, + ), ), - ), - ], + ], + ), ), ), - ), - ], - ); - }), + ], + ); + }, + ), ), ); } diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/image_tile.dart b/boring_to_beautiful/step_02/lib/src/shared/views/image_tile.dart index 4f2bbebb96..dd99152af5 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/image_tile.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/image_tile.dart @@ -21,19 +21,17 @@ class ImageTile extends StatelessWidget { @override Widget build(BuildContext context) { return OutlinedCard( - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Expanded( - child: Image.asset(image, fit: BoxFit.cover), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [Expanded(child: Image.asset(image, fit: BoxFit.cover))], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), child: Text( title, @@ -43,20 +41,25 @@ class ImageTile extends StatelessWidget { ), overflow: TextOverflow.ellipsis, maxLines: 1, - )), - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text( - subtitle, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center, + ), ), - ), - ], - ) - ]), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 10, + ), + child: Text( + subtitle, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ], + ), + ], + ), ); } } diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/step_02/lib/src/shared/views/outlined_card.dart index 61af3a0d64..a208659904 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/outlined_card.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/outlined_card.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class OutlinedCard extends StatefulWidget { - const OutlinedCard({ - super.key, - required this.child, - this.clickable = true, - }); + const OutlinedCard({super.key, required this.child, this.clickable = true}); final Widget child; final bool clickable; @@ -22,9 +18,10 @@ class _OutlinedCardState extends State { @override Widget build(BuildContext context) { return MouseRegion( - cursor: widget.clickable - ? SystemMouseCursors.click - : SystemMouseCursors.basic, + cursor: + widget.clickable + ? SystemMouseCursors.click + : SystemMouseCursors.basic, child: Container( // Add box decoration here child: widget.child, diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/play_pause_listener.dart b/boring_to_beautiful/step_02/lib/src/shared/views/play_pause_listener.dart index 52fad00863..6b4fc66709 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/play_pause_listener.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/play_pause_listener.dart @@ -16,10 +16,7 @@ import '../playback/bloc/bloc.dart'; /// shortcuts. By sitting below that machinery, this installs a global Spacebar /// listener which toggles Playback, as is customary in music-playing apps. class PlayPauseListener extends StatelessWidget { - const PlayPauseListener({ - super.key, - required this.child, - }); + const PlayPauseListener({super.key, required this.child}); final Widget child; @@ -28,9 +25,7 @@ class PlayPauseListener extends StatelessWidget { // Immediately catch any [_PlayPauseIntent] events released by the inner // [Shortcuts] widget. return Actions( - actions: >{ - _PlayPauseIntent: _PlayPauseAction(), - }, + actions: >{_PlayPauseIntent: _PlayPauseAction()}, child: Shortcuts( // Register a shortcut for Spacebar presses that release a // [_PlayPauseIntent] up the tree to the nearest [Actions] widget. @@ -38,9 +33,9 @@ class PlayPauseListener extends StatelessWidget { const SingleActivator(LogicalKeyboardKey.space): _PlayPauseIntent( // Create a closure which sends a [TogglePlayPause] event to the // [PlaybackBloc]. - () => BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ), + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()), ), }, child: child, diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/root_layout.dart b/boring_to_beautiful/step_02/lib/src/shared/views/root_layout.dart index 878b57d729..ff6270248c 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/root_layout.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/root_layout.dart @@ -29,36 +29,37 @@ class RootLayout extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => LayoutBuilder(builder: (context, dimens) { - void onSelected(int index) { - final destination = router.destinations[index]; - go.GoRouter.of(context).go(destination.route); - } + builder: + (context, state) => LayoutBuilder( + builder: (context, dimens) { + void onSelected(int index) { + final destination = router.destinations[index]; + go.GoRouter.of(context).go(destination.route); + } - final current = state.songWithProgress; - return AdaptiveNavigation( - key: _navigationRailKey, - destinations: router.destinations - .map((e) => NavigationDestination( - icon: e.icon, - label: e.label, - )) - .toList(), - selectedIndex: currentIndex, - onDestinationSelected: onSelected, - child: Column( - children: [ - Expanded( - child: _Switcher( - key: _switcherKey, - child: child, + final current = state.songWithProgress; + return AdaptiveNavigation( + key: _navigationRailKey, + destinations: + router.destinations + .map( + (e) => NavigationDestination( + icon: e.icon, + label: e.label, + ), + ) + .toList(), + selectedIndex: currentIndex, + onDestinationSelected: onSelected, + child: Column( + children: [ + Expanded(child: _Switcher(key: _switcherKey, child: child)), + if (current != null) const BottomBar(), + ], ), - ), - if (current != null) const BottomBar(), - ], + ); + }, ), - ); - }), ); } } @@ -66,21 +67,18 @@ class RootLayout extends StatelessWidget { class _Switcher extends StatelessWidget { final Widget child; - const _Switcher({ - required this.child, - super.key, - }); + const _Switcher({required this.child, super.key}); @override Widget build(BuildContext context) { return UniversalPlatform.isDesktop ? child : AnimatedSwitcher( - key: key, - duration: const Duration(milliseconds: 200), - switchInCurve: Curves.easeInOut, - switchOutCurve: Curves.easeInOut, - child: child, - ); + key: key, + duration: const Duration(milliseconds: 200), + switchInCurve: Curves.easeInOut, + switchOutCurve: Curves.easeInOut, + child: child, + ); } } diff --git a/boring_to_beautiful/step_02/lib/src/shared/views/sidebar.dart b/boring_to_beautiful/step_02/lib/src/shared/views/sidebar.dart index 78c19b4d22..8815223b22 100644 --- a/boring_to_beautiful/step_02/lib/src/shared/views/sidebar.dart +++ b/boring_to_beautiful/step_02/lib/src/shared/views/sidebar.dart @@ -26,10 +26,7 @@ class SideBar extends StatelessWidget { title: const Text('Home'), onTap: () => GoRouter.of(context).go('/'), ), - const ListTile( - leading: Icon(Icons.search), - title: Text('Search'), - ), + const ListTile(leading: Icon(Icons.search), title: Text('Search')), ListTile( leading: const Icon(Icons.person), title: const Text('Artists'), @@ -64,10 +61,7 @@ class PlaylistNav extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(left: 16, top: 16), - child: Text( - 'Playlists', - style: context.titleMedium, - ), + child: Text('Playlists', style: context.titleMedium), ), Expanded( child: ListView( @@ -114,10 +108,9 @@ class _PlaylistNavItemState extends State<_PlaylistNavItem> { @override void initState() { super.initState(); - _focusNode = FocusNode(debugLabel: widget.title) - ..addListener(() { - setState(() => _isSelected = _focusNode.hasPrimaryFocus); - }); + _focusNode = FocusNode(debugLabel: widget.title)..addListener(() { + setState(() => _isSelected = _focusNode.hasPrimaryFocus); + }); } @override diff --git a/boring_to_beautiful/step_02/macos/Podfile b/boring_to_beautiful/step_02/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/boring_to_beautiful/step_02/macos/Podfile +++ b/boring_to_beautiful/step_02/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_02/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_02/macos/Runner.xcodeproj/project.pbxproj index 79604e1785..63e08baa02 100644 --- a/boring_to_beautiful/step_02/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_02/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */; }; - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */; }; + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */, + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */, + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 143267097A016AD19836D89A /* Pods */ = { + isa = PBXGroup; + children = ( + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */, + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */, + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */, + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */, + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */, + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A67056D7D61CD22438BA6931 /* Pods */, + 143267097A016AD19836D89A /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - A67056D7D61CD22438BA6931 /* Pods */ = { - isa = PBXGroup; - children = ( - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */, - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */, - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */, - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */, - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */, - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */, - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */, + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */, + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */, + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */, + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */, + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -361,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */ = { + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -378,7 +378,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */ = { + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +393,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */ = { + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index b9ba5fa149..888bfbb4c7 100644 --- a/boring_to_beautiful/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_02/pubspec.yaml b/boring_to_beautiful/step_02/pubspec.yaml index 04c88a6e6f..6b913cee90 100644 --- a/boring_to_beautiful/step_02/pubspec.yaml +++ b/boring_to_beautiful/step_02/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,14 +13,14 @@ dependencies: adaptive_components: ^0.0.10 adaptive_navigation: ^0.0.10 animations: ^2.0.11 - collection: ^1.19.0 + collection: ^1.19.1 cupertino_icons: ^1.0.8 desktop_window: ^0.4.2 dynamic_color: ^1.7.0 english_words: ^4.0.0 flutter_bloc: ^9.0.0 freezed_annotation: ^2.4.4 - go_router: ^14.7.2 + go_router: ^14.8.0 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/step_03/android/.gitignore b/boring_to_beautiful/step_03/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/boring_to_beautiful/step_03/android/.gitignore +++ b/boring_to_beautiful/step_03/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/boring_to_beautiful/step_03/android/app/build.gradle b/boring_to_beautiful/step_03/android/app/build.gradle deleted file mode 100644 index 59485b6bb8..0000000000 --- a/boring_to_beautiful/step_03/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.myartist" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.myartist" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/boring_to_beautiful/step_03/android/app/build.gradle.kts b/boring_to_beautiful/step_03/android/app/build.gradle.kts new file mode 100644 index 0000000000..b2dbe0393c --- /dev/null +++ b/boring_to_beautiful/step_03/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.myartist" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.myartist" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/boring_to_beautiful/step_03/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt b/boring_to_beautiful/step_03/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt index 1e328c8556..b724a01056 100644 --- a/boring_to_beautiful/step_03/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt +++ b/boring_to_beautiful/step_03/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.myartist import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/boring_to_beautiful/step_03/android/build.gradle b/boring_to_beautiful/step_03/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/boring_to_beautiful/step_03/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/boring_to_beautiful/step_03/android/build.gradle.kts b/boring_to_beautiful/step_03/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/boring_to_beautiful/step_03/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/boring_to_beautiful/step_03/android/gradle.properties b/boring_to_beautiful/step_03/android/gradle.properties index 2597170821..f018a61817 100644 --- a/boring_to_beautiful/step_03/android/gradle.properties +++ b/boring_to_beautiful/step_03/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/boring_to_beautiful/step_03/android/gradle/wrapper/gradle-wrapper.properties b/boring_to_beautiful/step_03/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/boring_to_beautiful/step_03/android/gradle/wrapper/gradle-wrapper.properties +++ b/boring_to_beautiful/step_03/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/boring_to_beautiful/step_03/android/settings.gradle b/boring_to_beautiful/step_03/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/boring_to_beautiful/step_03/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/boring_to_beautiful/step_03/android/settings.gradle.kts b/boring_to_beautiful/step_03/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/boring_to_beautiful/step_03/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/boring_to_beautiful/step_03/ios/Podfile b/boring_to_beautiful/step_03/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/boring_to_beautiful/step_03/ios/Podfile +++ b/boring_to_beautiful/step_03/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_03/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_03/ios/Runner.xcodeproj/project.pbxproj index f7d849e7aa..b4912290dd 100644 --- a/boring_to_beautiful/step_03/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_03/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */; }; - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */; }; + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,15 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +60,19 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 85CFC060D2B515FA7FCB18AC /* Frameworks */ = { + 6171884CE7EC0B228274CDFE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */, + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */, + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 54241974C43F645BC41820B3 /* Pods */ = { + 4CD80B4456D2B04197B640AC /* Pods */ = { isa = PBXGroup; children = ( - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */, - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */, - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */, - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */, - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */, - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */, + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */, + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */, + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */, + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */, + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */, + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 54241974C43F645BC41820B3 /* Pods */, - DA6AE8ED33598C40BFC9FCAD /* Frameworks */, + 4CD80B4456D2B04197B640AC /* Pods */, + C4E673F63230E3A6805B11E9 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - DA6AE8ED33598C40BFC9FCAD /* Frameworks */ = { + C4E673F63230E3A6805B11E9 /* Frameworks */ = { isa = PBXGroup; children = ( - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */, - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */, + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */, + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */, + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 85CFC060D2B515FA7FCB18AC /* Frameworks */, + 6171884CE7EC0B228274CDFE /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */, + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */, + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,43 +270,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -323,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */ = { + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,7 +340,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */ = { + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/boring_to_beautiful/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_bio.dart b/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_bio.dart index 227b8e91f9..8b614421db 100644 --- a/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_bio.dart +++ b/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_bio.dart @@ -18,9 +18,7 @@ class ArtistBio extends StatelessWidget { artist.bio, style: context.bodyLarge!.copyWith( fontSize: 16, - color: context.colors.onSurface.withAlpha( - 222, - ), + color: context.colors.onSurface.withAlpha(222), ), ); } diff --git a/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_card.dart b/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_card.dart index a63967f51d..1a56376a87 100644 --- a/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_card.dart +++ b/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_card.dart @@ -11,10 +11,7 @@ import '../../../shared/views/outlined_card.dart'; import '../../../shared/views/views.dart'; class ArtistCard extends StatelessWidget { - const ArtistCard({ - super.key, - required this.artist, - }); + const ArtistCard({super.key, required this.artist}); final Artist artist; @@ -24,65 +21,66 @@ class ArtistCard extends StatelessWidget { return OutlinedCard( child: LayoutBuilder( - builder: (context, dimens) => Row( - children: [ - SizedBox( - width: dimens.maxWidth * 0.4, - child: Image.asset( - artist.image.image, - fit: BoxFit.cover, - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - artist.name, - style: context.titleMedium, - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - const SizedBox(height: 10), - Text( - artist.bio, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 3, - ), - ]), - ), - if (dimens.maxHeight > 100) - Row( - children: [ - HoverableSongPlayButton( - size: const Size(50, 50), - song: nowPlaying, - child: Icon(Icons.play_circle, - color: context.colors.tertiary), + builder: + (context, dimens) => Row( + children: [ + SizedBox( + width: dimens.maxWidth * 0.4, + child: Image.asset(artist.image.image, fit: BoxFit.cover), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + artist.name, + style: context.titleMedium, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + const SizedBox(height: 10), + Text( + artist.bio, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 3, + ), + ], ), - Text( - nowPlaying.title, - maxLines: 1, - overflow: TextOverflow.clip, - style: context.labelMedium, + ), + if (dimens.maxHeight > 100) + Row( + children: [ + HoverableSongPlayButton( + size: const Size(50, 50), + song: nowPlaying, + child: Icon( + Icons.play_circle, + color: context.colors.tertiary, + ), + ), + Text( + nowPlaying.title, + maxLines: 1, + overflow: TextOverflow.clip, + style: context.labelMedium, + ), + ], ), - ], - ), - ], + ], + ), + ), ), - ), + ], ), - ], - ), ), ); } diff --git a/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_events.dart b/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_events.dart index 8b064759c6..58b61b37df 100644 --- a/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_events.dart +++ b/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_events.dart @@ -70,53 +70,32 @@ class ArtistEvents extends StatelessWidget { ); }, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], - rowBuilder: (item, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - Text(item.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(item.title)), - ]), - ), - DataCell( - Text(item.location), - ), - DataCell( - Clickable( - child: Text( - item.link, - style: TextStyle( - color: linkColor.value(theme), - decoration: TextDecoration.underline, + rowBuilder: + (item, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell(Text(item.date)), + DataCell(Row(children: [Expanded(child: Text(item.title))])), + DataCell(Text(item.location)), + DataCell( + Clickable( + child: Text( + item.link, + style: TextStyle( + color: linkColor.value(theme), + decoration: TextDecoration.underline, + ), + ), + onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ), ), - ), - onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ], ), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_ranked_songs.dart b/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_ranked_songs.dart index e484ecb3d7..3d1f4e2cf1 100644 --- a/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_ranked_songs.dart +++ b/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_ranked_songs.dart @@ -27,52 +27,42 @@ class ArtistRankedSongs extends StatelessWidget { title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), trailing: Text(song.ranking.toString()), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ); }, columns: const [ - DataColumn( - label: Text( - 'Ranking', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Title', - ), - ), - DataColumn( - label: Text( - 'Length', - ), - ), + DataColumn(label: Text('Ranking'), numeric: true), + DataColumn(label: Text('Title')), + DataColumn(label: Text('Length')), ], - rowBuilder: (song, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - HoverableSongPlayButton( - song: song, - child: Center( - child: Text(song.ranking.toString()), - ), + rowBuilder: + (song, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + HoverableSongPlayButton( + song: song, + child: Center(child: Text(song.ranking.toString())), + ), + ), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(song.image.image), + ), + const SizedBox(width: 5.0), + Expanded(child: Text(song.title)), + ], + ), + ), + DataCell(Text(song.length.toHumanizedString())), + ], ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(song.image.image), - ), - const SizedBox(width: 5.0), - Expanded(child: Text(song.title)), - ]), - ), - DataCell( - Text(song.length.toHumanizedString()), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_updates.dart b/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_updates.dart index e5b8bb5fe9..a0fabf7330 100644 --- a/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_updates.dart +++ b/boring_to_beautiful/step_03/lib/src/features/artists/view/artist_updates.dart @@ -30,7 +30,7 @@ class ArtistUpdates extends StatelessWidget { child: Text(update), ), ), - ) + ), ], ); } diff --git a/boring_to_beautiful/step_03/lib/src/features/artists/view/artists_screen.dart b/boring_to_beautiful/step_03/lib/src/features/artists/view/artists_screen.dart index 8afe759807..225d74847b 100644 --- a/boring_to_beautiful/step_03/lib/src/features/artists/view/artists_screen.dart +++ b/boring_to_beautiful/step_03/lib/src/features/artists/view/artists_screen.dart @@ -17,33 +17,33 @@ class ArtistsScreen extends StatelessWidget { Widget build(BuildContext context) { final artistsProvider = ArtistsProvider(); final artists = artistsProvider.artists; - return LayoutBuilder(builder: (context, constraints) { - return Scaffold( - primary: false, - appBar: AppBar( - title: const Text('ARTISTS'), - toolbarHeight: kToolbarHeight * 2, - ), - body: GridView.builder( - padding: const EdgeInsets.all(15), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), - childAspectRatio: 2.5, - mainAxisSpacing: 10, - crossAxisSpacing: 10, + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + primary: false, + appBar: AppBar( + title: const Text('ARTISTS'), + toolbarHeight: kToolbarHeight * 2, ), - itemCount: artists.length, - itemBuilder: (context, index) { - final artist = artists[index]; - return GestureDetector( - child: ArtistCard( - artist: artist, - ), - onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), - ); - }, - ), - ); - }); + body: GridView.builder( + padding: const EdgeInsets.all(15), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), + childAspectRatio: 2.5, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + ), + itemCount: artists.length, + itemBuilder: (context, index) { + final artist = artists[index]; + return GestureDetector( + child: ArtistCard(artist: artist), + onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), + ); + }, + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_03/lib/src/features/home/view/home_artists.dart b/boring_to_beautiful/step_03/lib/src/features/home/view/home_artists.dart index beb2c0ece4..b5a3a33ecd 100644 --- a/boring_to_beautiful/step_03/lib/src/features/home/view/home_artists.dart +++ b/boring_to_beautiful/step_03/lib/src/features/home/view/home_artists.dart @@ -22,27 +22,25 @@ class HomeArtists extends StatelessWidget { Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(15), - child: constraints.isMobile - ? Column( - children: [ - for (final artist in artists) buildTile(context, artist), - ], - ) - : Row(children: [ - for (final artist in artists) - Flexible( - flex: 1, - child: buildTile(context, artist), - ), - ]), + child: + constraints.isMobile + ? Column( + children: [ + for (final artist in artists) buildTile(context, artist), + ], + ) + : Row( + children: [ + for (final artist in artists) + Flexible(flex: 1, child: buildTile(context, artist)), + ], + ), ); } Widget buildTile(BuildContext context, Artist artist) { return ListTile( - leading: CircleAvatar( - backgroundImage: AssetImage(artist.image.image), - ), + leading: CircleAvatar(backgroundImage: AssetImage(artist.image.image)), title: Text( artist.updates.first, maxLines: 2, diff --git a/boring_to_beautiful/step_03/lib/src/features/home/view/home_recent.dart b/boring_to_beautiful/step_03/lib/src/features/home/view/home_recent.dart index c77500a663..8ba86d117d 100644 --- a/boring_to_beautiful/step_03/lib/src/features/home/view/home_recent.dart +++ b/boring_to_beautiful/step_03/lib/src/features/home/view/home_recent.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/outlined_card.dart'; class HomeRecent extends StatelessWidget { - const HomeRecent( - {super.key, required this.playlists, this.axis = Axis.horizontal}); + const HomeRecent({ + super.key, + required this.playlists, + this.axis = Axis.horizontal, + }); final List playlists; final Axis axis; @@ -43,8 +46,10 @@ class HomeRecent extends StatelessWidget { Row( children: [ Expanded( - child: Image.asset(playlist.cover.image, - fit: BoxFit.cover), + child: Image.asset( + playlist.cover.image, + fit: BoxFit.cover, + ), ), ], ), @@ -79,10 +84,7 @@ class HomeRecent extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ - ClippedImage( - playlist.cover.image, - height: 200, - ), + ClippedImage(playlist.cover.image, height: 200), Expanded( child: Center( child: Padding( @@ -104,23 +106,24 @@ class HomeRecent extends StatelessWidget { return Column( children: [ Padding( - padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), - child: Text( - playlist.title, - style: context.titleSmall!.copyWith( - fontWeight: FontWeight.bold, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - textAlign: TextAlign.center, - )), + padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), + child: Text( + playlist.title, + style: context.titleSmall!.copyWith(fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, + textAlign: TextAlign.center, + ), + ), Padding( padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text(playlist.description, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center), + child: Text( + playlist.description, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), ), ], ); diff --git a/boring_to_beautiful/step_03/lib/src/features/home/view/home_screen.dart b/boring_to_beautiful/step_03/lib/src/features/home/view/home_screen.dart index 715ddf435c..bcff070874 100644 --- a/boring_to_beautiful/step_03/lib/src/features/home/view/home_screen.dart +++ b/boring_to_beautiful/step_03/lib/src/features/home/view/home_screen.dart @@ -61,10 +61,11 @@ class _HomeScreenState extends State { children: [ const HomeHighlight(), LayoutBuilder( - builder: (context, constraints) => HomeArtists( - artists: artists, - constraints: constraints, - ), + builder: + (context, constraints) => HomeArtists( + artists: artists, + constraints: constraints, + ), ), ], ), @@ -81,9 +82,7 @@ class _HomeScreenState extends State { style: context.headlineSmall, ), ), - HomeRecent( - playlists: playlists, - ), + HomeRecent(playlists: playlists), ], ), ), @@ -101,19 +100,20 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.all(2), // Modify this line + padding: const EdgeInsets.all( + 2, + ), // Modify this line child: Text( 'Top Songs Today', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), ), ], ), @@ -126,19 +126,20 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.all(2), // Modify this line + padding: const EdgeInsets.all( + 2, + ), // Modify this line child: Text( 'New Releases', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: newReleases, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), ), ], ), diff --git a/boring_to_beautiful/step_03/lib/src/features/playlists/view/playlist_home_screen.dart b/boring_to_beautiful/step_03/lib/src/features/playlists/view/playlist_home_screen.dart index a80d767930..978608ccad 100644 --- a/boring_to_beautiful/step_03/lib/src/features/playlists/view/playlist_home_screen.dart +++ b/boring_to_beautiful/step_03/lib/src/features/playlists/view/playlist_home_screen.dart @@ -44,8 +44,10 @@ class PlaylistHomeScreen extends StatelessWidget { title: playlist.title, subtitle: playlist.description, ), - onTap: () => - GoRouter.of(context).go('/playlists/${playlist.id}'), + onTap: + () => GoRouter.of( + context, + ).go('/playlists/${playlist.id}'), ); }, ), diff --git a/boring_to_beautiful/step_03/lib/src/features/playlists/view/playlist_screen.dart b/boring_to_beautiful/step_03/lib/src/features/playlists/view/playlist_screen.dart index 5dc2f0744f..c41f500a92 100644 --- a/boring_to_beautiful/step_03/lib/src/features/playlists/view/playlist_screen.dart +++ b/boring_to_beautiful/step_03/lib/src/features/playlists/view/playlist_screen.dart @@ -20,114 +20,116 @@ class PlaylistScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - final colors = Theme.of(context).colorScheme; - final double headerHeight = constraints.isMobile - ? max(constraints.biggest.height * 0.5, 450) - : max(constraints.biggest.height * 0.25, 250); - if (constraints.isMobile) { - return Scaffold( - appBar: AppBar( - leading: BackButton( - onPressed: () => GoRouter.of(context).go('/playlists'), - ), - title: Text(playlist.title), - actions: [ - IconButton( - icon: const Icon(Icons.play_circle_fill), - onPressed: () {}, - ), - IconButton( - onPressed: () {}, - icon: const Icon(Icons.shuffle), - ), - ], - ), - body: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, - ), - ), - ); - } - return Scaffold( - body: CustomScrollView( - slivers: [ - SliverAppBar( + return LayoutBuilder( + builder: (context, constraints) { + final colors = Theme.of(context).colorScheme; + final double headerHeight = + constraints.isMobile + ? max(constraints.biggest.height * 0.5, 450) + : max(constraints.biggest.height * 0.25, 250); + if (constraints.isMobile) { + return Scaffold( + appBar: AppBar( leading: BackButton( onPressed: () => GoRouter.of(context).go('/playlists'), ), - expandedHeight: headerHeight, - pinned: false, - flexibleSpace: FlexibleSpaceBar( - background: AdaptiveImageCard( - axis: constraints.isMobile ? Axis.vertical : Axis.horizontal, - constraints: - constraints.copyWith(maxHeight: headerHeight).normalize(), - image: playlist.cover.image, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'PLAYLIST', - style: context.titleSmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.title, - style: context.displaySmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.description, - style: context.bodyLarge!.copyWith( - color: colors.onSurface.withAlpha(204), + title: Text(playlist.title), + actions: [ + IconButton( + icon: const Icon(Icons.play_circle_fill), + onPressed: () {}, + ), + IconButton(onPressed: () {}, icon: const Icon(Icons.shuffle)), + ], + ), + body: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), + ), + ); + } + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + leading: BackButton( + onPressed: () => GoRouter.of(context).go('/playlists'), + ), + expandedHeight: headerHeight, + pinned: false, + flexibleSpace: FlexibleSpaceBar( + background: AdaptiveImageCard( + axis: + constraints.isMobile ? Axis.vertical : Axis.horizontal, + constraints: + constraints + .copyWith(maxHeight: headerHeight) + .normalize(), + image: playlist.cover.image, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'PLAYLIST', + style: context.titleSmall!.copyWith( + color: colors.onSurface, + ), ), - ), - const SizedBox(height: 8), - Row( - children: [ - IconButton( - icon: Icon( - Icons.play_circle_fill, - color: colors.tertiary, - ), - onPressed: () {}, + Text( + playlist.title, + style: context.displaySmall!.copyWith( + color: colors.onSurface, ), - TextButton.icon( - onPressed: () {}, - icon: Icon( - Icons.shuffle, - color: colors.tertiary, - ), - label: Text( - 'Shuffle', - style: context.bodySmall!.copyWith( + ), + Text( + playlist.description, + style: context.bodyLarge!.copyWith( + color: colors.onSurface.withAlpha(204), + ), + ), + const SizedBox(height: 8), + Row( + children: [ + IconButton( + icon: Icon( + Icons.play_circle_fill, color: colors.tertiary, ), + onPressed: () {}, ), - ), - ], - ), - ], + TextButton.icon( + onPressed: () {}, + icon: Icon(Icons.shuffle, color: colors.tertiary), + label: Text( + 'Shuffle', + style: context.bodySmall!.copyWith( + color: colors.tertiary, + ), + ), + ), + ], + ), + ], + ), ), ), ), - ), - SliverToBoxAdapter( - child: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, + SliverToBoxAdapter( + child: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), ), ), - ), - ], - ), - ); - }); + ], + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_03/lib/src/features/playlists/view/playlist_songs.dart b/boring_to_beautiful/step_03/lib/src/features/playlists/view/playlist_songs.dart index e944336540..1d5a2e9879 100644 --- a/boring_to_beautiful/step_03/lib/src/features/playlists/view/playlist_songs.dart +++ b/boring_to_beautiful/step_03/lib/src/features/playlists/view/playlist_songs.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/views.dart'; class PlaylistSongs extends StatelessWidget { - const PlaylistSongs( - {super.key, required this.playlist, required this.constraints}); + const PlaylistSongs({ + super.key, + required this.playlist, + required this.constraints, + }); final Playlist playlist; final BoxConstraints constraints; @@ -25,14 +28,9 @@ class PlaylistSongs extends StatelessWidget { breakpoint: 450, columns: const [ DataColumn( - label: Padding( - padding: EdgeInsets.only(left: 20), - child: Text('#'), - ), - ), - DataColumn( - label: Text('Title'), + label: Padding(padding: EdgeInsets.only(left: 20), child: Text('#')), ), + DataColumn(label: Text('Title')), DataColumn( label: Padding( padding: EdgeInsets.only(right: 10), @@ -40,38 +38,40 @@ class PlaylistSongs extends StatelessWidget { ), ), ], - rowBuilder: (context, index) => DataRow.byIndex( - index: index, - cells: [ - DataCell( - // Add HoverableSongPlayButton - Center( - child: Text( - (index + 1).toString(), - textAlign: TextAlign.center, + rowBuilder: + (context, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + // Add HoverableSongPlayButton + Center( + child: Text( + (index + 1).toString(), + textAlign: TextAlign.center, + ), + ), ), - ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(playlist.songs[index].image.image), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(playlist.songs[index].image.image), + ), + const SizedBox(width: 10), + Expanded(child: Text(playlist.songs[index].title)), + ], + ), ), - const SizedBox(width: 10), - Expanded(child: Text(playlist.songs[index].title)), - ]), - ), - DataCell( - Text(playlist.songs[index].length.toHumanizedString()), + DataCell(Text(playlist.songs[index].length.toHumanizedString())), + ], ), - ], - ), itemBuilder: (song, index) { return ListTile( - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), leading: ClippedImage(song.image.image), title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), diff --git a/boring_to_beautiful/step_03/lib/src/shared/app.dart b/boring_to_beautiful/step_03/lib/src/shared/app.dart index eced12177d..771a2be1ad 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/app.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/app.dart @@ -19,45 +19,49 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - final settings = ValueNotifier(ThemeSettings( - sourceColor: Colors.pink, // Replace this color - themeMode: ThemeMode.system, - )); + final settings = ValueNotifier( + ThemeSettings( + sourceColor: Colors.pink, // Replace this color + themeMode: ThemeMode.system, + ), + ); @override Widget build(BuildContext context) { return BlocProvider( create: (context) => PlaybackBloc(), child: DynamicColorBuilder( - builder: (lightDynamic, darkDynamic) => ThemeProvider( - lightDynamic: lightDynamic, - darkDynamic: darkDynamic, - settings: settings, - child: NotificationListener( - onNotification: (notification) { - settings.value = notification.settings; - return true; - }, - child: ValueListenableBuilder( - valueListenable: settings, - builder: (context, value, _) { - // Create theme instance - return MaterialApp.router( - debugShowCheckedModeBanner: false, - title: 'Flutter Demo', - // Add theme - // Add dark theme - // Add theme mode - routeInformationParser: appRouter.routeInformationParser, - routeInformationProvider: - appRouter.routeInformationProvider, - routerDelegate: appRouter.routerDelegate, - builder: (context, child) { - return PlayPauseListener(child: child!); - }, - ); + builder: + (lightDynamic, darkDynamic) => ThemeProvider( + lightDynamic: lightDynamic, + darkDynamic: darkDynamic, + settings: settings, + child: NotificationListener( + onNotification: (notification) { + settings.value = notification.settings; + return true; }, + child: ValueListenableBuilder( + valueListenable: settings, + builder: (context, value, _) { + // Create theme instance + return MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + // Add theme + // Add dark theme + // Add theme mode + routeInformationParser: appRouter.routeInformationParser, + routeInformationProvider: + appRouter.routeInformationProvider, + routerDelegate: appRouter.routerDelegate, + builder: (context, child) { + return PlayPauseListener(child: child!); + }, + ); + }, + ), ), - )), + ), ), ); } diff --git a/boring_to_beautiful/step_03/lib/src/shared/classes/image.dart b/boring_to_beautiful/step_03/lib/src/shared/classes/image.dart index a1ef427c1d..00a6472b4a 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/classes/image.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/classes/image.dart @@ -3,10 +3,11 @@ // found in the LICENSE file. class MyArtistImage { - const MyArtistImage( - {required this.image, - required this.sourceName, - required this.sourceLink}); + const MyArtistImage({ + required this.image, + required this.sourceName, + required this.sourceLink, + }); final String image; final String sourceName; diff --git a/boring_to_beautiful/step_03/lib/src/shared/classes/playlist.dart b/boring_to_beautiful/step_03/lib/src/shared/classes/playlist.dart index 59899dc619..5f0225059d 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/classes/playlist.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/classes/playlist.dart @@ -17,8 +17,9 @@ class Playlist { this.description = '', required this.songs, this.cover = const MyArtistImage( - image: 'assets/images/record.jpeg', - sourceName: 'Adobe Stock Images', - sourceLink: ''), + image: 'assets/images/record.jpeg', + sourceName: 'Adobe Stock Images', + sourceLink: '', + ), }); } diff --git a/boring_to_beautiful/step_03/lib/src/shared/classes/ranked_song.dart b/boring_to_beautiful/step_03/lib/src/shared/classes/ranked_song.dart index 5908268c8c..2362bfae64 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/classes/ranked_song.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/classes/ranked_song.dart @@ -7,7 +7,11 @@ import './classes.dart'; class RankedSong extends Song { final int ranking; - const RankedSong(this.ranking, String title, Artist artist, Duration length, - MyArtistImage image) - : super(title, artist, length, image); + const RankedSong( + this.ranking, + String title, + Artist artist, + Duration length, + MyArtistImage image, + ) : super(title, artist, length, image); } diff --git a/boring_to_beautiful/step_03/lib/src/shared/extensions.dart b/boring_to_beautiful/step_03/lib/src/shared/extensions.dart index 8b7e41b988..fe65add57c 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/extensions.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/extensions.dart @@ -9,51 +9,36 @@ extension TypographyUtils on BuildContext { ThemeData get theme => Theme.of(this); TextTheme get textTheme => GoogleFonts.montserratTextTheme(theme.textTheme); ColorScheme get colors => theme.colorScheme; - TextStyle? get displayLarge => textTheme.displayLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displayMedium => textTheme.displayMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displaySmall => textTheme.displaySmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineLarge => textTheme.headlineLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineMedium => textTheme.headlineMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineSmall => textTheme.headlineSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleLarge => textTheme.titleLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleMedium => textTheme.titleMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleSmall => textTheme.titleSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelLarge => textTheme.labelLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelMedium => textTheme.labelMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelSmall => textTheme.labelSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyLarge => textTheme.bodyLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyMedium => textTheme.bodyMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodySmall => textTheme.bodySmall?.copyWith( - color: colors.onSurface, - ); + TextStyle? get displayLarge => + textTheme.displayLarge?.copyWith(color: colors.onSurface); + TextStyle? get displayMedium => + textTheme.displayMedium?.copyWith(color: colors.onSurface); + TextStyle? get displaySmall => + textTheme.displaySmall?.copyWith(color: colors.onSurface); + TextStyle? get headlineLarge => + textTheme.headlineLarge?.copyWith(color: colors.onSurface); + TextStyle? get headlineMedium => + textTheme.headlineMedium?.copyWith(color: colors.onSurface); + TextStyle? get headlineSmall => + textTheme.headlineSmall?.copyWith(color: colors.onSurface); + TextStyle? get titleLarge => + textTheme.titleLarge?.copyWith(color: colors.onSurface); + TextStyle? get titleMedium => + textTheme.titleMedium?.copyWith(color: colors.onSurface); + TextStyle? get titleSmall => + textTheme.titleSmall?.copyWith(color: colors.onSurface); + TextStyle? get labelLarge => + textTheme.labelLarge?.copyWith(color: colors.onSurface); + TextStyle? get labelMedium => + textTheme.labelMedium?.copyWith(color: colors.onSurface); + TextStyle? get labelSmall => + textTheme.labelSmall?.copyWith(color: colors.onSurface); + TextStyle? get bodyLarge => + textTheme.bodyLarge?.copyWith(color: colors.onSurface); + TextStyle? get bodyMedium => + textTheme.bodyMedium?.copyWith(color: colors.onSurface); + TextStyle? get bodySmall => + textTheme.bodySmall?.copyWith(color: colors.onSurface); } extension BreakpointUtils on BoxConstraints { @@ -65,17 +50,17 @@ extension BreakpointUtils on BoxConstraints { extension DurationString on String { /// Assumes a string (roughly) of the format '\d{1,2}:\d{2}' Duration toDuration() => switch (split(':')) { - [var minutes, var seconds] => Duration( - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - [var hours, var minutes, var seconds] => Duration( - hours: int.parse(hours.trim()), - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - _ => throw Exception('Invalid duration string: $this'), - }; + [var minutes, var seconds] => Duration( + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + [var hours, var minutes, var seconds] => Duration( + hours: int.parse(hours.trim()), + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + _ => throw Exception('Invalid duration string: $this'), + }; } extension HumanizedDuration on Duration { diff --git a/boring_to_beautiful/step_03/lib/src/shared/playback/bloc/playback_bloc.dart b/boring_to_beautiful/step_03/lib/src/shared/playback/bloc/playback_bloc.dart index 73c2f4c436..c6c871937b 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/playback/bloc/playback_bloc.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/playback/bloc/playback_bloc.dart @@ -41,9 +41,8 @@ class PlaybackBloc extends Bloc { } } - void _handlePlaybackProgress(Duration progress) => add( - PlaybackEvent.songProgress(progress), - ); + void _handlePlaybackProgress(Duration progress) => + add(PlaybackEvent.songProgress(progress)); void _togglePlayPause(TogglePlayPause event, Emitter emit) { state.isPlaying ? _pausePlayback() : _resumePlayback(); @@ -52,8 +51,10 @@ class PlaybackBloc extends Bloc { void _pausePlayback() => _currentlyPlayingSubscription!.cancel(); - void _resumePlayback() => _currentlyPlayingSubscription = - _startPlayingStream().listen(_handlePlaybackProgress); + void _resumePlayback() => + _currentlyPlayingSubscription = _startPlayingStream().listen( + _handlePlaybackProgress, + ); void _changeSong(ChangeSong event, Emitter emit) { emit( @@ -69,19 +70,15 @@ class PlaybackBloc extends Bloc { } void _songProgress(SongProgress event, Emitter emit) => emit( - state.copyWith( - songWithProgress: state.songWithProgress!.copyWith( - progress: state.songWithProgress!.progress + event.duration, - ), - ), - ); + state.copyWith( + songWithProgress: state.songWithProgress!.copyWith( + progress: state.songWithProgress!.progress + event.duration, + ), + ), + ); void _setVolume(SetVolume event, Emitter emit) => emit( - state.copyWith( - volume: event.value, - isMuted: false, - previousVolume: null, - ), - ); + state.copyWith(volume: event.value, isMuted: false, previousVolume: null), + ); void _toggleMute(ToggleMute event, Emitter emit) { if (state.isMuted) { @@ -94,11 +91,7 @@ class PlaybackBloc extends Bloc { ); } else { emit( - state.copyWith( - isMuted: true, - volume: 0, - previousVolume: state.volume, - ), + state.copyWith(isMuted: true, volume: 0, previousVolume: state.volume), ); } } diff --git a/boring_to_beautiful/step_03/lib/src/shared/playback/bloc/playback_bloc.freezed.dart b/boring_to_beautiful/step_03/lib/src/shared/playback/bloc/playback_bloc.freezed.dart index 8a422cd449..54e870ab6f 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/playback/bloc/playback_bloc.freezed.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/playback/bloc/playback_bloc.freezed.dart @@ -12,7 +12,8 @@ part of 'playback_bloc.dart'; T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models', +); /// @nodoc mixin _$PlaybackEvent { @@ -24,8 +25,7 @@ mixin _$PlaybackEvent { required TResult Function() toggleMute, required TResult Function(double percent) moveToInSong, required TResult Function(Duration duration) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? togglePlayPause, @@ -34,8 +34,7 @@ mixin _$PlaybackEvent { TResult? Function()? toggleMute, TResult? Function(double percent)? moveToInSong, TResult? Function(Duration duration)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ TResult Function()? togglePlayPause, @@ -45,8 +44,7 @@ mixin _$PlaybackEvent { TResult Function(double percent)? moveToInSong, TResult Function(Duration duration)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult map({ required TResult Function(TogglePlayPause value) togglePlayPause, @@ -55,8 +53,7 @@ mixin _$PlaybackEvent { required TResult Function(ToggleMute value) toggleMute, required TResult Function(MoveToInSong value) moveToInSong, required TResult Function(SongProgress value) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ TResult? Function(TogglePlayPause value)? togglePlayPause, @@ -65,8 +62,7 @@ mixin _$PlaybackEvent { TResult? Function(ToggleMute value)? toggleMute, TResult? Function(MoveToInSong value)? moveToInSong, TResult? Function(SongProgress value)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeMap({ TResult Function(TogglePlayPause value)? togglePlayPause, @@ -76,15 +72,15 @@ mixin _$PlaybackEvent { TResult Function(MoveToInSong value)? moveToInSong, TResult Function(SongProgress value)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; } /// @nodoc abstract class $PlaybackEventCopyWith<$Res> { factory $PlaybackEventCopyWith( - PlaybackEvent value, $Res Function(PlaybackEvent) then) = - _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; + PlaybackEvent value, + $Res Function(PlaybackEvent) then, + ) = _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; } /// @nodoc @@ -103,9 +99,10 @@ class _$PlaybackEventCopyWithImpl<$Res, $Val extends PlaybackEvent> /// @nodoc abstract class _$$TogglePlayPauseImplCopyWith<$Res> { - factory _$$TogglePlayPauseImplCopyWith(_$TogglePlayPauseImpl value, - $Res Function(_$TogglePlayPauseImpl) then) = - __$$TogglePlayPauseImplCopyWithImpl<$Res>; + factory _$$TogglePlayPauseImplCopyWith( + _$TogglePlayPauseImpl value, + $Res Function(_$TogglePlayPauseImpl) then, + ) = __$$TogglePlayPauseImplCopyWithImpl<$Res>; } /// @nodoc @@ -113,8 +110,9 @@ class __$$TogglePlayPauseImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$TogglePlayPauseImpl> implements _$$TogglePlayPauseImplCopyWith<$Res> { __$$TogglePlayPauseImplCopyWithImpl( - _$TogglePlayPauseImpl _value, $Res Function(_$TogglePlayPauseImpl) _then) - : super(_value, _then); + _$TogglePlayPauseImpl _value, + $Res Function(_$TogglePlayPauseImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -233,8 +231,9 @@ abstract class TogglePlayPause implements PlaybackEvent { /// @nodoc abstract class _$$ChangeSongImplCopyWith<$Res> { factory _$$ChangeSongImplCopyWith( - _$ChangeSongImpl value, $Res Function(_$ChangeSongImpl) then) = - __$$ChangeSongImplCopyWithImpl<$Res>; + _$ChangeSongImpl value, + $Res Function(_$ChangeSongImpl) then, + ) = __$$ChangeSongImplCopyWithImpl<$Res>; @useResult $Res call({Song song}); } @@ -244,22 +243,23 @@ class __$$ChangeSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ChangeSongImpl> implements _$$ChangeSongImplCopyWith<$Res> { __$$ChangeSongImplCopyWithImpl( - _$ChangeSongImpl _value, $Res Function(_$ChangeSongImpl) _then) - : super(_value, _then); + _$ChangeSongImpl _value, + $Res Function(_$ChangeSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? song = null, - }) { - return _then(_$ChangeSongImpl( - null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? song = null}) { + return _then( + _$ChangeSongImpl( + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -397,8 +397,9 @@ abstract class ChangeSong implements PlaybackEvent { /// @nodoc abstract class _$$SetVolumeImplCopyWith<$Res> { factory _$$SetVolumeImplCopyWith( - _$SetVolumeImpl value, $Res Function(_$SetVolumeImpl) then) = - __$$SetVolumeImplCopyWithImpl<$Res>; + _$SetVolumeImpl value, + $Res Function(_$SetVolumeImpl) then, + ) = __$$SetVolumeImplCopyWithImpl<$Res>; @useResult $Res call({double value}); } @@ -408,22 +409,23 @@ class __$$SetVolumeImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SetVolumeImpl> implements _$$SetVolumeImplCopyWith<$Res> { __$$SetVolumeImplCopyWithImpl( - _$SetVolumeImpl _value, $Res Function(_$SetVolumeImpl) _then) - : super(_value, _then); + _$SetVolumeImpl _value, + $Res Function(_$SetVolumeImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? value = null, - }) { - return _then(_$SetVolumeImpl( - null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? value = null}) { + return _then( + _$SetVolumeImpl( + null == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -561,8 +563,9 @@ abstract class SetVolume implements PlaybackEvent { /// @nodoc abstract class _$$ToggleMuteImplCopyWith<$Res> { factory _$$ToggleMuteImplCopyWith( - _$ToggleMuteImpl value, $Res Function(_$ToggleMuteImpl) then) = - __$$ToggleMuteImplCopyWithImpl<$Res>; + _$ToggleMuteImpl value, + $Res Function(_$ToggleMuteImpl) then, + ) = __$$ToggleMuteImplCopyWithImpl<$Res>; } /// @nodoc @@ -570,8 +573,9 @@ class __$$ToggleMuteImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ToggleMuteImpl> implements _$$ToggleMuteImplCopyWith<$Res> { __$$ToggleMuteImplCopyWithImpl( - _$ToggleMuteImpl _value, $Res Function(_$ToggleMuteImpl) _then) - : super(_value, _then); + _$ToggleMuteImpl _value, + $Res Function(_$ToggleMuteImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -690,8 +694,9 @@ abstract class ToggleMute implements PlaybackEvent { /// @nodoc abstract class _$$MoveToInSongImplCopyWith<$Res> { factory _$$MoveToInSongImplCopyWith( - _$MoveToInSongImpl value, $Res Function(_$MoveToInSongImpl) then) = - __$$MoveToInSongImplCopyWithImpl<$Res>; + _$MoveToInSongImpl value, + $Res Function(_$MoveToInSongImpl) then, + ) = __$$MoveToInSongImplCopyWithImpl<$Res>; @useResult $Res call({double percent}); } @@ -701,22 +706,23 @@ class __$$MoveToInSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$MoveToInSongImpl> implements _$$MoveToInSongImplCopyWith<$Res> { __$$MoveToInSongImplCopyWithImpl( - _$MoveToInSongImpl _value, $Res Function(_$MoveToInSongImpl) _then) - : super(_value, _then); + _$MoveToInSongImpl _value, + $Res Function(_$MoveToInSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? percent = null, - }) { - return _then(_$MoveToInSongImpl( - null == percent - ? _value.percent - : percent // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? percent = null}) { + return _then( + _$MoveToInSongImpl( + null == percent + ? _value.percent + : percent // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -854,8 +860,9 @@ abstract class MoveToInSong implements PlaybackEvent { /// @nodoc abstract class _$$SongProgressImplCopyWith<$Res> { factory _$$SongProgressImplCopyWith( - _$SongProgressImpl value, $Res Function(_$SongProgressImpl) then) = - __$$SongProgressImplCopyWithImpl<$Res>; + _$SongProgressImpl value, + $Res Function(_$SongProgressImpl) then, + ) = __$$SongProgressImplCopyWithImpl<$Res>; @useResult $Res call({Duration duration}); } @@ -865,22 +872,23 @@ class __$$SongProgressImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SongProgressImpl> implements _$$SongProgressImplCopyWith<$Res> { __$$SongProgressImplCopyWithImpl( - _$SongProgressImpl _value, $Res Function(_$SongProgressImpl) _then) - : super(_value, _then); + _$SongProgressImpl _value, + $Res Function(_$SongProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? duration = null, - }) { - return _then(_$SongProgressImpl( - null == duration - ? _value.duration - : duration // ignore: cast_nullable_to_non_nullable - as Duration, - )); + $Res call({Object? duration = null}) { + return _then( + _$SongProgressImpl( + null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as Duration, + ), + ); } } @@ -1037,15 +1045,17 @@ mixin _$PlaybackState { /// @nodoc abstract class $PlaybackStateCopyWith<$Res> { factory $PlaybackStateCopyWith( - PlaybackState value, $Res Function(PlaybackState) then) = - _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; + PlaybackState value, + $Res Function(PlaybackState) then, + ) = _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); $SongWithProgressCopyWith<$Res>? get songWithProgress; } @@ -1071,28 +1081,36 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_value.copyWith( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - ) as $Val); + return _then( + _value.copyWith( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ) + as $Val, + ); } /// Create a copy of PlaybackState @@ -1114,16 +1132,18 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> abstract class _$$PlaybackStateImplCopyWith<$Res> implements $PlaybackStateCopyWith<$Res> { factory _$$PlaybackStateImplCopyWith( - _$PlaybackStateImpl value, $Res Function(_$PlaybackStateImpl) then) = - __$$PlaybackStateImplCopyWithImpl<$Res>; + _$PlaybackStateImpl value, + $Res Function(_$PlaybackStateImpl) then, + ) = __$$PlaybackStateImplCopyWithImpl<$Res>; @override @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); @override $SongWithProgressCopyWith<$Res>? get songWithProgress; @@ -1134,8 +1154,9 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> extends _$PlaybackStateCopyWithImpl<$Res, _$PlaybackStateImpl> implements _$$PlaybackStateImplCopyWith<$Res> { __$$PlaybackStateImplCopyWithImpl( - _$PlaybackStateImpl _value, $Res Function(_$PlaybackStateImpl) _then) - : super(_value, _then); + _$PlaybackStateImpl _value, + $Res Function(_$PlaybackStateImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1148,40 +1169,48 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_$PlaybackStateImpl( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - )); + return _then( + _$PlaybackStateImpl( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ), + ); } } /// @nodoc class _$PlaybackStateImpl implements _PlaybackState { - const _$PlaybackStateImpl( - {this.volume = 0.5, - this.previousVolume, - this.isMuted = false, - this.isPlaying = false, - this.songWithProgress}); + const _$PlaybackStateImpl({ + this.volume = 0.5, + this.previousVolume, + this.isMuted = false, + this.isPlaying = false, + this.songWithProgress, + }); /// Legal values are between 0 and 1. @override @@ -1221,8 +1250,14 @@ class _$PlaybackStateImpl implements _PlaybackState { } @override - int get hashCode => Object.hash(runtimeType, volume, previousVolume, isMuted, - isPlaying, songWithProgress); + int get hashCode => Object.hash( + runtimeType, + volume, + previousVolume, + isMuted, + isPlaying, + songWithProgress, + ); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1234,12 +1269,13 @@ class _$PlaybackStateImpl implements _PlaybackState { } abstract class _PlaybackState implements PlaybackState { - const factory _PlaybackState( - {final double volume, - final double? previousVolume, - final bool isMuted, - final bool isPlaying, - final SongWithProgress? songWithProgress}) = _$PlaybackStateImpl; + const factory _PlaybackState({ + final double volume, + final double? previousVolume, + final bool isMuted, + final bool isPlaying, + final SongWithProgress? songWithProgress, + }) = _$PlaybackStateImpl; /// Legal values are between 0 and 1. @override @@ -1278,8 +1314,9 @@ mixin _$SongWithProgress { /// @nodoc abstract class $SongWithProgressCopyWith<$Res> { factory $SongWithProgressCopyWith( - SongWithProgress value, $Res Function(SongWithProgress) then) = - _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; + SongWithProgress value, + $Res Function(SongWithProgress) then, + ) = _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; @useResult $Res call({Duration progress, Song song}); } @@ -1298,29 +1335,32 @@ class _$SongWithProgressCopyWithImpl<$Res, $Val extends SongWithProgress> /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_value.copyWith( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - ) as $Val); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _value.copyWith( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ) + as $Val, + ); } } /// @nodoc abstract class _$$SongWithProgressImplCopyWith<$Res> implements $SongWithProgressCopyWith<$Res> { - factory _$$SongWithProgressImplCopyWith(_$SongWithProgressImpl value, - $Res Function(_$SongWithProgressImpl) then) = - __$$SongWithProgressImplCopyWithImpl<$Res>; + factory _$$SongWithProgressImplCopyWith( + _$SongWithProgressImpl value, + $Res Function(_$SongWithProgressImpl) then, + ) = __$$SongWithProgressImplCopyWithImpl<$Res>; @override @useResult $Res call({Duration progress, Song song}); @@ -1330,28 +1370,30 @@ abstract class _$$SongWithProgressImplCopyWith<$Res> class __$$SongWithProgressImplCopyWithImpl<$Res> extends _$SongWithProgressCopyWithImpl<$Res, _$SongWithProgressImpl> implements _$$SongWithProgressImplCopyWith<$Res> { - __$$SongWithProgressImplCopyWithImpl(_$SongWithProgressImpl _value, - $Res Function(_$SongWithProgressImpl) _then) - : super(_value, _then); + __$$SongWithProgressImplCopyWithImpl( + _$SongWithProgressImpl _value, + $Res Function(_$SongWithProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of SongWithProgress /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_$SongWithProgressImpl( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _$SongWithProgressImpl( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -1390,13 +1432,16 @@ class _$SongWithProgressImpl implements _SongWithProgress { @pragma('vm:prefer-inline') _$$SongWithProgressImplCopyWith<_$SongWithProgressImpl> get copyWith => __$$SongWithProgressImplCopyWithImpl<_$SongWithProgressImpl>( - this, _$identity); + this, + _$identity, + ); } abstract class _SongWithProgress implements SongWithProgress { - const factory _SongWithProgress( - {required final Duration progress, - required final Song song}) = _$SongWithProgressImpl; + const factory _SongWithProgress({ + required final Duration progress, + required final Song song, + }) = _$SongWithProgressImpl; @override Duration get progress; diff --git a/boring_to_beautiful/step_03/lib/src/shared/providers/artists.dart b/boring_to_beautiful/step_03/lib/src/shared/providers/artists.dart index d116ad9cdd..f9e4a8063e 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/providers/artists.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/providers/artists.dart @@ -11,162 +11,175 @@ class ArtistsProvider { static ArtistsProvider get shared => ArtistsProvider(); List get artists => const [ - Artist( - id: 'jmo', - name: 'Jessie Morrison', + Artist( + id: 'jmo', + name: 'Jessie Morrison', + image: MyArtistImage( + image: 'assets/images/artists/woman.jpeg', + sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', + sourceName: 'Daniel Monteiro', + ), + bio: + 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', + updates: [ + 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', + 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', + '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', + ], + events: [ + Event( + date: '1/20/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Mountain View, California', + link: 'Tickets', + ), + Event( + date: '1/22/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Austin, Texas', + link: 'Tickets', + ), + Event( + date: '1/23/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Houston, Texas', + link: 'Tickets', + ), + Event( + date: '2/8/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Los Angeles, California', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', + author: 'By Jacqueline Stewart', + blurb: + 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', image: MyArtistImage( - image: 'assets/images/artists/woman.jpeg', - sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', - sourceName: 'Daniel Monteiro', + image: 'assets/images/news/concert.jpeg', + sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', + sourceName: 'Anthony DELANOIX', ), - bio: - 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', - updates: [ - 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', - 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', - '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', - ], - events: [ - Event( - date: '1/20/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Mountain View, California', - link: 'Tickets'), - Event( - date: '1/22/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Austin, Texas', - link: 'Tickets'), - Event( - date: '1/23/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Houston, Texas', - link: 'Tickets'), - Event( - date: '2/8/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Los Angeles, California', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', - author: 'By Jacqueline Stewart', - blurb: - 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', - image: MyArtistImage( - image: 'assets/images/news/concert.jpeg', - sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', - sourceName: 'Anthony DELANOIX', - ), - ) - ], ), - Artist( - id: 'lb', - name: 'Lucas Bryant', + ], + ), + Artist( + id: 'lb', + name: 'Lucas Bryant', + image: MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + bio: + 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', + updates: [ + 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', + 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', + 'We\'re going all in this weekend! How are you doing, Vegas?!', + ], + events: [ + Event( + date: '5/16/22', + title: 'Back To My Hometown Tour', + location: 'Indianapolis, IN', + link: 'Tickets', + ), + Event( + date: '5/18/22', + title: 'Back To My Hometown Tour', + location: 'San Antonio, TX', + link: 'Tickets', + ), + Event( + date: '5/20/22', + title: 'Back To My Hometown Tour', + location: 'Phoenix, AZ', + link: 'Tickets', + ), + Event( + date: '5/23/22', + title: 'Back To My Hometown Tour', + location: 'San Diego, CA', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', + author: 'Lonnie Hall', + blurb: + 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', image: MyArtistImage( image: 'assets/images/albums/artist1-album2.jpg', sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', sourceName: 'Keagan Henman', ), - bio: - 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', - updates: [ - 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', - 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', - 'We\'re going all in this weekend! How are you doing, Vegas?!', - ], - events: [ - Event( - date: '5/16/22', - title: 'Back To My Hometown Tour', - location: 'Indianapolis, IN', - link: 'Tickets'), - Event( - date: '5/18/22', - title: 'Back To My Hometown Tour', - location: 'San Antonio, TX', - link: 'Tickets'), - Event( - date: '5/20/22', - title: 'Back To My Hometown Tour', - location: 'Phoenix, AZ', - link: 'Tickets'), - Event( - date: '5/23/22', - title: 'Back To My Hometown Tour', - location: 'San Diego, CA', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', - author: 'Lonnie Hall', - blurb: - 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', - image: MyArtistImage( - image: 'assets/images/albums/artist1-album2.jpg', - sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', - sourceName: 'Keagan Henman', - ), - ), - ], ), - Artist( - id: 'jonjames', - name: 'Jon James', + ], + ), + Artist( + id: 'jonjames', + name: 'Jon James', + image: MyArtistImage( + image: 'assets/images/artists/joe.jpg', + sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', + sourceName: 'Natalie Runnerstrom', + ), + bio: + 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', + updates: [ + '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', + '4 days until I get to share some of the favorite songs I\'ve ever written with you.', + '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', + ], + events: [ + Event( + date: '10/22/21', + title: 'Falling For You Tour', + location: 'Dallas, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/23/21', + title: 'Falling For You Tour', + location: 'Houston, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/26/21', + title: 'Falling For You Tour', + location: 'Phoenix, Arizona', + link: 'Ticketmaster', + ), + Event( + date: '10/27/21', + title: 'Falling For You Tour', + location: 'Los Angeles, California', + link: 'Ticketmaster', + ), + ], + news: [ + News( + title: + 'Jon James is excited for the release of his sixth album "Falling For You"', + author: 'Top Media Today', + blurb: + 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', image: MyArtistImage( - image: 'assets/images/artists/joe.jpg', - sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', - sourceName: 'Natalie Runnerstrom', + image: 'assets/images/news/recording_studio.jpg', + sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', + sourceName: 'Yohann LIBOT', ), - bio: - 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', - updates: [ - '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', - '4 days until I get to share some of the favorite songs I\'ve ever written with you.', - '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', - ], - events: [ - Event( - date: '10/22/21', - title: 'Falling For You Tour', - location: 'Dallas, Texas', - link: 'Ticketmaster'), - Event( - date: '10/23/21', - title: 'Falling For You Tour', - location: 'Houston, Texas', - link: 'Ticketmaster'), - Event( - date: '10/26/21', - title: 'Falling For You Tour', - location: 'Phoenix, Arizona', - link: 'Ticketmaster'), - Event( - date: '10/27/21', - title: 'Falling For You Tour', - location: 'Los Angeles, California', - link: 'Ticketmaster'), - ], - news: [ - News( - title: - 'Jon James is excited for the release of his sixth album "Falling For You"', - author: 'Top Media Today', - blurb: - 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', - image: MyArtistImage( - image: 'assets/images/news/recording_studio.jpg', - sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', - sourceName: 'Yohann LIBOT'), - ) - ], ), - ]; + ], + ), + ]; Artist? getArtist(String id) { return artists.firstWhereOrNull((artist) => artist.id == id); diff --git a/boring_to_beautiful/step_03/lib/src/shared/providers/playlists.dart b/boring_to_beautiful/step_03/lib/src/shared/providers/playlists.dart index e8bab994dd..f27f71b3ec 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/providers/playlists.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/providers/playlists.dart @@ -18,41 +18,50 @@ class PlaylistsProvider { static List images() { return [ const MyArtistImage( - image: 'assets/images/playlists/favorite.jpg', - sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/favorite.jpg', + sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/austin.jpg', - sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', - sourceName: 'Carlos Alfonso'), + image: 'assets/images/playlists/austin.jpg', + sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', + sourceName: 'Carlos Alfonso', + ), const MyArtistImage( - image: 'assets/images/playlists/reading.jpg', - sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', - sourceName: 'Alexandra Fuller'), + image: 'assets/images/playlists/reading.jpg', + sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', + sourceName: 'Alexandra Fuller', + ), const MyArtistImage( - image: 'assets/images/playlists/workout.jpg', - sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/workout.jpg', + sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/calm.jpg', - sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', - sourceName: 'Jared Rice'), + image: 'assets/images/playlists/calm.jpg', + sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', + sourceName: 'Jared Rice', + ), const MyArtistImage( - image: 'assets/images/playlists/coffee.jpg', - sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', - sourceName: 'Nathan Dumlao'), + image: 'assets/images/playlists/coffee.jpg', + sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', + sourceName: 'Nathan Dumlao', + ), const MyArtistImage( - image: 'assets/images/playlists/piano.jpg', - sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', - sourceName: 'Jordan Whitfield'), + image: 'assets/images/playlists/piano.jpg', + sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', + sourceName: 'Jordan Whitfield', + ), const MyArtistImage( - image: 'assets/images/playlists/studying.jpg', - sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', - sourceName: 'Humble Lamb'), + image: 'assets/images/playlists/studying.jpg', + sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', + sourceName: 'Humble Lamb', + ), const MyArtistImage( - image: 'assets/images/playlists/jazz.jpg', - sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', - sourceName: 'dimitri.photography'), + image: 'assets/images/playlists/jazz.jpg', + sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', + sourceName: 'dimitri.photography', + ), ]; } @@ -85,8 +94,10 @@ class PlaylistsProvider { ); } - static final List _randomPlaylists = - List.generate(10, (index) => randomLengthPlaylist()); + static final List _randomPlaylists = List.generate( + 10, + (index) => randomLengthPlaylist(), + ); } String randomId() { diff --git a/boring_to_beautiful/step_03/lib/src/shared/providers/songs.dart b/boring_to_beautiful/step_03/lib/src/shared/providers/songs.dart index ed018a83ff..f1205f2dcb 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/providers/songs.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/providers/songs.dart @@ -52,9 +52,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:35'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album2.jpg', - sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', - sourceName: 'Alexandru Acea'), + image: 'assets/images/albums/artist4-album2.jpg', + sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', + sourceName: 'Alexandru Acea', + ), ), RankedSong( 2, @@ -62,9 +63,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:52'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album1.jpg', - sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', - sourceName: 'Jr Korpa'), + image: 'assets/images/albums/artist4-album1.jpg', + sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', + sourceName: 'Jr Korpa', + ), ), RankedSong( 3, @@ -72,9 +74,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:39'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album3.jpg', - sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', - sourceName: 'Stormseeker'), + image: 'assets/images/albums/artist4-album3.jpg', + sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', + sourceName: 'Stormseeker', + ), ), RankedSong( 1, diff --git a/boring_to_beautiful/step_03/lib/src/shared/providers/theme.dart b/boring_to_beautiful/step_03/lib/src/shared/providers/theme.dart index f05527ff8f..5c2dd59042 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/providers/theme.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/providers/theme.dart @@ -28,12 +28,13 @@ class ThemeSettingChange extends Notification { } class ThemeProvider extends InheritedWidget { - const ThemeProvider( - {super.key, - required this.settings, - required this.lightDynamic, - required this.darkDynamic, - required super.child}); + const ThemeProvider({ + super.key, + required this.settings, + required this.lightDynamic, + required this.darkDynamic, + required super.child, + }); final ValueNotifier settings; final ColorScheme? lightDynamic; @@ -59,8 +60,9 @@ class ThemeProvider extends InheritedWidget { Color blend(Color targetColor) { return Color( - // ignore: deprecated_member_use - Blend.harmonize(targetColor.value, settings.value.sourceColor.value)); + // ignore: deprecated_member_use + Blend.harmonize(targetColor.value, settings.value.sourceColor.value), + ); } Color source(Color? target) { @@ -72,18 +74,18 @@ class ThemeProvider extends InheritedWidget { } ColorScheme colors(Brightness brightness, Color? targetColor) { - final dynamicPrimary = brightness == Brightness.light - ? lightDynamic?.primary - : darkDynamic?.primary; + final dynamicPrimary = + brightness == Brightness.light + ? lightDynamic?.primary + : darkDynamic?.primary; return ColorScheme.fromSeed( seedColor: dynamicPrimary ?? source(targetColor), brightness: brightness, ); } - ShapeBorder get shapeMedium => RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ); + ShapeBorder get shapeMedium => + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)); CardTheme cardTheme() { return CardTheme( @@ -113,21 +115,13 @@ class ThemeProvider extends InheritedWidget { labelColor: colors.secondary, unselectedLabelColor: colors.onSurfaceVariant, indicator: BoxDecoration( - border: Border( - bottom: BorderSide( - color: colors.secondary, - width: 2, - ), - ), + border: Border(bottom: BorderSide(color: colors.secondary, width: 2)), ), ); } BottomAppBarTheme bottomAppBarTheme(ColorScheme colors) { - return BottomAppBarTheme( - color: colors.surface, - elevation: 0, - ); + return BottomAppBarTheme(color: colors.surface, elevation: 0); } BottomNavigationBarThemeData bottomNavigationBarTheme(ColorScheme colors) { @@ -146,9 +140,7 @@ class ThemeProvider extends InheritedWidget { } DrawerThemeData drawerTheme(ColorScheme colors) { - return DrawerThemeData( - backgroundColor: colors.surface, - ); + return DrawerThemeData(backgroundColor: colors.surface); } ThemeData light([Color? targetColor]) { @@ -207,10 +199,7 @@ class ThemeProvider extends InheritedWidget { } class ThemeSettings { - ThemeSettings({ - required this.sourceColor, - required this.themeMode, - }); + ThemeSettings({required this.sourceColor, required this.themeMode}); final Color sourceColor; final ThemeMode themeMode; @@ -221,10 +210,7 @@ Color randomColor() { } // Custom Colors -const linkColor = CustomColor( - name: 'Link Color', - color: Color(0xFF00B0FF), -); +const linkColor = CustomColor(name: 'Link Color', color: Color(0xFF00B0FF)); class CustomColor { const CustomColor({ diff --git a/boring_to_beautiful/step_03/lib/src/shared/router.dart b/boring_to_beautiful/step_03/lib/src/shared/router.dart index 3efb7362fa..db82627246 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/router.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/router.dart @@ -20,11 +20,7 @@ final artistsProvider = ArtistsProvider(); final playlistsProvider = PlaylistsProvider(); const List destinations = [ - NavigationDestination( - label: 'Home', - icon: Icon(Icons.home), - route: '/', - ), + NavigationDestination(label: 'Home', icon: Icon(Icons.home), route: '/'), NavigationDestination( label: 'Playlists', icon: Icon(Icons.playlist_add_check), @@ -56,41 +52,46 @@ final appRouter = GoRouter( // HomeScreen GoRoute( path: '/', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 0, - child: HomeScreen(), - ), - ), + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 0, + child: HomeScreen(), + ), + ), ), // PlaylistHomeScreen GoRoute( path: '/playlists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 1, - child: PlaylistHomeScreen(), - ), - ), - routes: [ - GoRoute( - path: ':pid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 1, - child: PlaylistScreen( - playlist: playlistsProvider - .getPlaylist(state.pathParameters['pid']!)!, - ), + child: PlaylistHomeScreen(), ), ), + routes: [ + GoRoute( + path: ':pid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 1, + child: PlaylistScreen( + playlist: + playlistsProvider.getPlaylist( + state.pathParameters['pid']!, + )!, + ), + ), + ), ), ], ), @@ -98,28 +99,32 @@ final appRouter = GoRouter( // ArtistHomeScreen GoRoute( path: '/artists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 2, - child: ArtistsScreen(), - ), - ), - routes: [ - GoRoute( - path: ':aid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 2, - child: ArtistScreen( - artist: - artistsProvider.getArtist(state.pathParameters['aid']!)!, - ), + child: ArtistsScreen(), ), ), + routes: [ + GoRoute( + path: ':aid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 2, + child: ArtistScreen( + artist: + artistsProvider.getArtist( + state.pathParameters['aid']!, + )!, + ), + ), + ), // builder: (context, state) => ArtistScreen( // id: state.params['aid']!, // ), @@ -129,14 +134,15 @@ final appRouter = GoRouter( for (final route in destinations.skip(3)) GoRoute( path: route.route, - pageBuilder: (context, state) => MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: destinations.indexOf(route), - child: const SizedBox(), - ), - ), + pageBuilder: + (context, state) => MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: destinations.indexOf(route), + child: const SizedBox(), + ), + ), ), ], ); diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/adaptive_image_card.dart b/boring_to_beautiful/step_03/lib/src/shared/views/adaptive_image_card.dart index 07cab2b0d7..99f5be0837 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/adaptive_image_card.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/adaptive_image_card.dart @@ -36,20 +36,13 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), + child: Padding(padding: const EdgeInsets.all(20), child: child), ), ], ); } return Padding( - padding: const EdgeInsets.only( - left: 20, - bottom: 20, - top: 20, - ), + padding: const EdgeInsets.only(left: 20, bottom: 20, top: 20), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, @@ -65,11 +58,8 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), - ) + child: Padding(padding: const EdgeInsets.all(20), child: child), + ), ], ), ); diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/adaptive_navigation.dart b/boring_to_beautiful/step_03/lib/src/shared/views/adaptive_navigation.dart index 92734c9005..aa78766292 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/adaptive_navigation.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/adaptive_navigation.dart @@ -30,12 +30,15 @@ class AdaptiveNavigation extends StatelessWidget { NavigationRail( extended: dimens.maxWidth >= 800, minExtendedWidth: 180, - destinations: destinations - .map((e) => NavigationRailDestination( - icon: e.icon, - label: Text(e.label), - )) - .toList(), + destinations: + destinations + .map( + (e) => NavigationRailDestination( + icon: e.icon, + label: Text(e.label), + ), + ) + .toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ), diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/article_content.dart b/boring_to_beautiful/step_03/lib/src/shared/views/article_content.dart index af243f015b..c5a0b5e62a 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/article_content.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/article_content.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class ArticleContent extends StatelessWidget { - const ArticleContent({ - super.key, - required this.child, - this.maxWidth = 960, - }); + const ArticleContent({super.key, required this.child, this.maxWidth = 960}); final double maxWidth; final Widget child; @@ -19,13 +15,8 @@ class ArticleContent extends StatelessWidget { return Container( alignment: Alignment.topCenter, child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: maxWidth, - ), - child: Padding( - padding: const EdgeInsets.all(15), - child: child, - ), + constraints: BoxConstraints(maxWidth: maxWidth), + child: Padding(padding: const EdgeInsets.all(15), child: child), ), ); } diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/bottom_bar.dart b/boring_to_beautiful/step_03/lib/src/shared/views/bottom_bar.dart index 06e085a9b6..bf15ad9bb0 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/bottom_bar.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/bottom_bar.dart @@ -26,16 +26,18 @@ class BottomBar extends StatelessWidget implements PreferredSizeWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => _BottomBar( - artist: state.songWithProgress?.song.artist, - isMuted: state.isMuted, - isPlaying: state.isPlaying, - preferredSize: preferredSize, - progress: state.songWithProgress?.progress, - song: state.songWithProgress?.song, - togglePlayPause: () => bloc.add(const PlaybackEvent.togglePlayPause()), - volume: state.volume, - ), + builder: + (context, state) => _BottomBar( + artist: state.songWithProgress?.song.artist, + isMuted: state.isMuted, + isPlaying: state.isPlaying, + preferredSize: preferredSize, + progress: state.songWithProgress?.progress, + song: state.songWithProgress?.song, + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), + volume: state.volume, + ), ); } } @@ -63,10 +65,12 @@ class _BottomBar extends StatelessWidget { @override Widget build(BuildContext context) => LayoutBuilder( - builder: (context, constraints) => constraints.isTablet - ? _buildDesktopBar(context, constraints) - : _buildMobileBar(context, constraints), - ); + builder: + (context, constraints) => + constraints.isTablet + ? _buildDesktopBar(context, constraints) + : _buildMobileBar(context, constraints), + ); Widget _buildDesktopBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -79,10 +83,7 @@ class _BottomBar extends StatelessWidget { Row( children: [ _AlbumArt(song: song), - _SongDetails( - artist: artist, - song: song, - ), + _SongDetails(artist: artist, song: song), ], ), Flexible( @@ -95,12 +96,7 @@ class _BottomBar extends StatelessWidget { isPlaying: isPlaying, togglePlayPause: togglePlayPause, ), - Center( - child: _ProgressBar( - progress: progress, - song: song, - ), - ), + Center(child: _ProgressBar(progress: progress, song: song)), ], ), ), @@ -114,17 +110,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _FullScreenPlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _FullScreenPlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -136,10 +133,10 @@ class _BottomBar extends StatelessWidget { } double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; Widget _buildMobileBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -152,17 +149,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _MobilePlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _MobilePlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -191,10 +189,7 @@ class _BottomBar extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - song?.title ?? '', - style: context.labelMedium, - ), + Text(song?.title ?? '', style: context.labelMedium), Text( song?.artist.name ?? '', style: context.labelSmall, @@ -220,10 +215,7 @@ class _BottomBar extends StatelessWidget { } class _ProgressBar extends StatelessWidget { - const _ProgressBar({ - required this.progress, - required this.song, - }); + const _ProgressBar({required this.progress, required this.song}); /// Current playback depth into user is into [song]. final Duration? progress; @@ -231,10 +223,10 @@ class _ProgressBar extends StatelessWidget { final Song? song; double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; @override Widget build(BuildContext context) { @@ -252,29 +244,32 @@ class _ProgressBar extends StatelessWidget { children: [ const SizedBox(width: 10), SizedBox( - child: progress != null - ? Text(progress!.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + progress != null + ? Text( + progress!.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), Expanded( child: Slider( value: songProgress.clamp(0, 1), divisions: 1000, onChanged: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); }, onChangeEnd: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); // Because dragging pauses auto playback, resume playing // once the user finishes dragging. - BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ); + BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()); }, activeColor: Theme.of(context).colorScheme.onTertiaryContainer, @@ -282,12 +277,15 @@ class _ProgressBar extends StatelessWidget { ), ), SizedBox( - child: song != null - ? Text(song!.length.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + song != null + ? Text( + song!.length.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), - const SizedBox(width: 10) + const SizedBox(width: 10), ], ), ); @@ -297,10 +295,7 @@ class _ProgressBar extends StatelessWidget { } class _VolumeBar extends StatelessWidget { - const _VolumeBar({ - required this.volume, - required this.isMuted, - }); + const _VolumeBar({required this.volume, required this.isMuted}); /// The percentage, between 0 and 1, at which to render the volume slider. final double volume; @@ -313,17 +308,16 @@ class _VolumeBar extends StatelessWidget { @override Widget build(BuildContext context) { return ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 200, - ), + constraints: const BoxConstraints(maxWidth: 200), child: Padding( padding: const EdgeInsets.all(8), child: Row( children: [ GestureDetector( - onTap: () => BlocProvider.of(context).add( - const PlaybackEvent.toggleMute(), - ), + onTap: + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.toggleMute()), child: Icon(!isMuted ? Icons.volume_mute : Icons.volume_off), ), Expanded( @@ -332,8 +326,10 @@ class _VolumeBar extends StatelessWidget { min: 0, max: 1, divisions: 100, - onChanged: (newValue) => BlocProvider.of(context) - .add(PlaybackEvent.setVolume(newValue)), + onChanged: + (newValue) => BlocProvider.of( + context, + ).add(PlaybackEvent.setVolume(newValue)), activeColor: Theme.of(context).colorScheme.onTertiaryContainer, inactiveColor: Theme.of(context).colorScheme.onSurface, ), @@ -356,49 +352,50 @@ class _PlaybackControls extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - double iconSize = 24; - double playIconSize = 32; - double innerPadding = 16; - double playPadding = 20; - if (constraints.maxWidth < 500) { - iconSize = 21; - playIconSize = 28; - innerPadding = 14; - playPadding = 17; - } - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( + return LayoutBuilder( + builder: (context, constraints) { + double iconSize = 24; + double playIconSize = 32; + double innerPadding = 16; + double playPadding = 20; + if (constraints.maxWidth < 500) { + iconSize = 21; + playIconSize = 28; + innerPadding = 14; + playPadding = 17; + } + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( padding: EdgeInsets.fromLTRB(0, 0, innerPadding, 0), - child: Icon(Icons.shuffle, size: iconSize)), - Icon(Icons.skip_previous, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), - child: GestureDetector( - onTap: togglePlayPause, - child: Icon( - isPlaying ? Icons.pause_circle : Icons.play_circle, - size: playIconSize, + child: Icon(Icons.shuffle, size: iconSize), + ), + Icon(Icons.skip_previous, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), + child: GestureDetector( + onTap: togglePlayPause, + child: Icon( + isPlaying ? Icons.pause_circle : Icons.play_circle, + size: playIconSize, + ), ), ), - ), - Icon(Icons.skip_next, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), - child: Icon(Icons.repeat, size: iconSize), - ), - ], - ); - }); + Icon(Icons.skip_next, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), + child: Icon(Icons.repeat, size: iconSize), + ), + ], + ); + }, + ); } } class _AlbumArt extends StatelessWidget { - const _AlbumArt({ - required this.song, - }); + const _AlbumArt({required this.song}); final Song? song; @@ -409,21 +406,17 @@ class _AlbumArt extends StatelessWidget { child: SizedBox( width: 70, height: 70, - child: song != null - ? Image.asset(song!.image.image) - : Container( - color: Colors.pink[100], - ), + child: + song != null + ? Image.asset(song!.image.image) + : Container(color: Colors.pink[100]), ), ); } } class _SongDetails extends StatelessWidget { - const _SongDetails({ - required this.artist, - required this.song, - }); + const _SongDetails({required this.artist, required this.song}); final Artist? artist; final Song? song; @@ -455,9 +448,7 @@ class _SongDetails extends StatelessWidget { } class _FullScreenPlayer extends StatefulWidget { - const _FullScreenPlayer({ - required this.onClose, - }); + const _FullScreenPlayer({required this.onClose}); final VoidCallback onClose; @@ -489,29 +480,33 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return MouseRegion( - onHover: (_) { - setState(() { - _showControls = true; - }); - hideControls(); + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return MouseRegion( + onHover: (_) { + setState(() { + _showControls = true; + }); + hideControls(); + }, + child: buildPlayer(context, state, dimens), + ); }, - child: buildPlayer(context, state, dimens), - ); - }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; final song = current?.song; @@ -519,26 +514,25 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { fit: StackFit.expand, children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - song!.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset(song!.image.image, fit: BoxFit.cover), ), ), - ), ), Positioned( top: 20, right: 20, child: IconButton( - color: song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const Icon(Icons.fullscreen_exit), onPressed: widget.onClose, ), @@ -569,8 +563,9 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { Text( song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 20, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 20, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -582,10 +577,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { right: 20, left: 20, bottom: dimens.biggest.height * 0.2, - child: _ProgressBar( - progress: current?.progress, - song: song, - ), + child: _ProgressBar(progress: current?.progress, song: song), ), Positioned( right: 20, @@ -598,8 +590,8 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), @@ -611,9 +603,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { } class _MobilePlayer extends StatelessWidget { - const _MobilePlayer({ - required this.onClose, - }); + const _MobilePlayer({required this.onClose}); final VoidCallback onClose; @@ -622,46 +612,52 @@ class _MobilePlayer extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return buildPlayer(context, state, dimens); - }, + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return buildPlayer(context, state, dimens); + }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; return Stack( children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - current.song.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset( + current.song.image.image, + fit: BoxFit.cover, + ), ), ), - ), ), Positioned( top: 20, left: 20, child: IconButton( - color: current?.song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + current?.song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const RotatedBox( quarterTurns: 1, child: Icon(Icons.chevron_right), @@ -676,10 +672,7 @@ class _MobilePlayer extends StatelessWidget { left: 0, right: 0, height: dimens.biggest.height * 0.5, - child: Image.asset( - current.song.image.image, - fit: BoxFit.contain, - ), + child: Image.asset(current.song.image.image, fit: BoxFit.contain), ), Positioned( left: 0, @@ -705,8 +698,9 @@ class _MobilePlayer extends StatelessWidget { Text( current.song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 12, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 12, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -718,15 +712,12 @@ class _MobilePlayer extends StatelessWidget { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), - _ProgressBar( - progress: current.progress, - song: current.song, - ), + _ProgressBar(progress: current.progress, song: current.song), ], ), ), diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/brightness_toggle.dart b/boring_to_beautiful/step_03/lib/src/shared/views/brightness_toggle.dart index 46dde4810f..5b5332392b 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/brightness_toggle.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/brightness_toggle.dart @@ -13,9 +13,10 @@ class BrightnessToggle extends StatelessWidget { Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; return IconButton( - icon: Theme.of(context).brightness == Brightness.light - ? const Icon(Icons.brightness_3) - : const Icon(Icons.brightness_7), + icon: + Theme.of(context).brightness == Brightness.light + ? const Icon(Icons.brightness_3) + : const Icon(Icons.brightness_7), onPressed: () { final themeProvider = ThemeProvider.of(context); final settings = themeProvider.settings.value; diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/center_row.dart b/boring_to_beautiful/step_03/lib/src/shared/views/center_row.dart index 36d428e3b8..c1f3effcc2 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/center_row.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/center_row.dart @@ -5,23 +5,12 @@ import 'package:flutter/material.dart'; class CenterRow extends StatelessWidget { - const CenterRow({ - super.key, - required this.child, - }); + const CenterRow({super.key, required this.child}); final Widget child; @override Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Center( - child: child, - ), - ), - ], - ); + return Row(children: [Expanded(child: Center(child: child))]); } } diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/clickable.dart b/boring_to_beautiful/step_03/lib/src/shared/views/clickable.dart index cd7ef46268..f192f0b135 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/clickable.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/clickable.dart @@ -14,10 +14,7 @@ class Clickable extends StatelessWidget { Widget build(BuildContext context) { return MouseRegion( cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: onTap, - child: child, - ), + child: GestureDetector(onTap: onTap, child: child), ); } } diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/events.dart b/boring_to_beautiful/step_03/lib/src/shared/views/events.dart index ed38465460..ab9140e56d 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/events.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/events.dart @@ -24,43 +24,18 @@ class Events extends StatelessWidget { child: DataTable( horizontalMargin: 5.0, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], rows: [ for (final event in artist.events) DataRow( cells: [ - DataCell( - Text(event.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(event.title)), - ]), - ), - DataCell( - Text(event.location), - ), + DataCell(Text(event.date)), + DataCell(Row(children: [Expanded(child: Text(event.title))])), + DataCell(Text(event.location)), DataCell( Clickable( child: Text( @@ -70,8 +45,9 @@ class Events extends StatelessWidget { decoration: TextDecoration.underline, ), ), - onTap: () => - launchUrl(Uri.parse('https://docs.flutter.dev')), + onTap: + () => + launchUrl(Uri.parse('https://docs.flutter.dev')), ), ), ], diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/hover_toggle.dart b/boring_to_beautiful/step_03/lib/src/shared/views/hover_toggle.dart index ec98c2863c..649cfcab63 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/hover_toggle.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/hover_toggle.dart @@ -31,9 +31,10 @@ class _HoverToggleState extends State with MaterialStateMixin { cursor: isHovered ? SystemMouseCursors.click : MouseCursor.defer, onEnter: (_) => setMaterialState(WidgetState.hovered, true), onExit: (_) => setMaterialState(WidgetState.hovered, false), - child: widget.mode == HoverMode.replace - ? _buildReplaceableChildren() - : _buildChildrenStack(), + child: + widget.mode == HoverMode.replace + ? _buildReplaceableChildren() + : _buildChildrenStack(), ), ); } @@ -41,12 +42,7 @@ class _HoverToggleState extends State with MaterialStateMixin { Widget _buildChildrenStack() { Widget child = isHovered ? Opacity(opacity: 0.2, child: widget.child) : widget.child; - return Stack( - children: [ - child, - if (isHovered) widget.hoverChild, - ], - ); + return Stack(children: [child, if (isHovered) widget.hoverChild]); } Widget _buildReplaceableChildren() => diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/hoverable_song_play_button.dart b/boring_to_beautiful/step_03/lib/src/shared/views/hoverable_song_play_button.dart index 512f3d1d3c..dd588e3dbe 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/hoverable_song_play_button.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/hoverable_song_play_button.dart @@ -29,9 +29,10 @@ class HoverableSongPlayButton extends StatelessWidget { hoverChild: Center( child: GestureDetector( child: const Icon(Icons.play_arrow), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ), ), mode: hoverMode, diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/image_card.dart b/boring_to_beautiful/step_03/lib/src/shared/views/image_card.dart index 0af9f75f33..6e7f6cd42d 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/image_card.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/image_card.dart @@ -7,13 +7,14 @@ import '../../shared/extensions.dart'; import 'outlined_card.dart'; class ImageCard extends StatelessWidget { - const ImageCard( - {super.key, - required this.title, - required this.details, - required this.image, - this.subtitle, - this.clickable = false}); + const ImageCard({ + super.key, + required this.title, + required this.details, + required this.image, + this.subtitle, + this.clickable = false, + }); final String title; final String? subtitle; @@ -28,54 +29,51 @@ class ImageCard extends StatelessWidget { clickable: clickable, child: Padding( padding: const EdgeInsets.all(8.0), - child: LayoutBuilder(builder: (context, constraints) { - return Row( - children: [ - if (constraints.maxWidth > 600) - SizedBox( - width: 170, - height: 170, - child: Image.asset( - image, - fit: BoxFit.cover, + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + if (constraints.maxWidth > 600) + SizedBox( + width: 170, + height: 170, + child: Image.asset(image, fit: BoxFit.cover), ), - ), - Expanded( - child: Padding( - padding: padding, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 5), - child: Text( - title, - style: context.titleLarge! - .copyWith(fontWeight: FontWeight.bold), - ), - ), - if (subtitle != null) + Expanded( + child: Padding( + padding: padding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Padding( - padding: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only(bottom: 5), child: Text( - subtitle!, - style: context.labelMedium, + title, + style: context.titleLarge!.copyWith( + fontWeight: FontWeight.bold, + ), ), ), - Text( - details, - style: context.labelMedium?.copyWith( - fontSize: 16, - height: 1.25, + if (subtitle != null) + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text(subtitle!, style: context.labelMedium), + ), + Text( + details, + style: context.labelMedium?.copyWith( + fontSize: 16, + height: 1.25, + ), ), - ), - ], + ], + ), ), ), - ), - ], - ); - }), + ], + ); + }, + ), ), ); } diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/image_tile.dart b/boring_to_beautiful/step_03/lib/src/shared/views/image_tile.dart index 4f2bbebb96..dd99152af5 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/image_tile.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/image_tile.dart @@ -21,19 +21,17 @@ class ImageTile extends StatelessWidget { @override Widget build(BuildContext context) { return OutlinedCard( - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Expanded( - child: Image.asset(image, fit: BoxFit.cover), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [Expanded(child: Image.asset(image, fit: BoxFit.cover))], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), child: Text( title, @@ -43,20 +41,25 @@ class ImageTile extends StatelessWidget { ), overflow: TextOverflow.ellipsis, maxLines: 1, - )), - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text( - subtitle, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center, + ), ), - ), - ], - ) - ]), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 10, + ), + child: Text( + subtitle, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ], + ), + ], + ), ); } } diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/step_03/lib/src/shared/views/outlined_card.dart index 61af3a0d64..a208659904 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/outlined_card.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/outlined_card.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class OutlinedCard extends StatefulWidget { - const OutlinedCard({ - super.key, - required this.child, - this.clickable = true, - }); + const OutlinedCard({super.key, required this.child, this.clickable = true}); final Widget child; final bool clickable; @@ -22,9 +18,10 @@ class _OutlinedCardState extends State { @override Widget build(BuildContext context) { return MouseRegion( - cursor: widget.clickable - ? SystemMouseCursors.click - : SystemMouseCursors.basic, + cursor: + widget.clickable + ? SystemMouseCursors.click + : SystemMouseCursors.basic, child: Container( // Add box decoration here child: widget.child, diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/play_pause_listener.dart b/boring_to_beautiful/step_03/lib/src/shared/views/play_pause_listener.dart index 52fad00863..6b4fc66709 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/play_pause_listener.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/play_pause_listener.dart @@ -16,10 +16,7 @@ import '../playback/bloc/bloc.dart'; /// shortcuts. By sitting below that machinery, this installs a global Spacebar /// listener which toggles Playback, as is customary in music-playing apps. class PlayPauseListener extends StatelessWidget { - const PlayPauseListener({ - super.key, - required this.child, - }); + const PlayPauseListener({super.key, required this.child}); final Widget child; @@ -28,9 +25,7 @@ class PlayPauseListener extends StatelessWidget { // Immediately catch any [_PlayPauseIntent] events released by the inner // [Shortcuts] widget. return Actions( - actions: >{ - _PlayPauseIntent: _PlayPauseAction(), - }, + actions: >{_PlayPauseIntent: _PlayPauseAction()}, child: Shortcuts( // Register a shortcut for Spacebar presses that release a // [_PlayPauseIntent] up the tree to the nearest [Actions] widget. @@ -38,9 +33,9 @@ class PlayPauseListener extends StatelessWidget { const SingleActivator(LogicalKeyboardKey.space): _PlayPauseIntent( // Create a closure which sends a [TogglePlayPause] event to the // [PlaybackBloc]. - () => BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ), + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()), ), }, child: child, diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/root_layout.dart b/boring_to_beautiful/step_03/lib/src/shared/views/root_layout.dart index 878b57d729..ff6270248c 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/root_layout.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/root_layout.dart @@ -29,36 +29,37 @@ class RootLayout extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => LayoutBuilder(builder: (context, dimens) { - void onSelected(int index) { - final destination = router.destinations[index]; - go.GoRouter.of(context).go(destination.route); - } + builder: + (context, state) => LayoutBuilder( + builder: (context, dimens) { + void onSelected(int index) { + final destination = router.destinations[index]; + go.GoRouter.of(context).go(destination.route); + } - final current = state.songWithProgress; - return AdaptiveNavigation( - key: _navigationRailKey, - destinations: router.destinations - .map((e) => NavigationDestination( - icon: e.icon, - label: e.label, - )) - .toList(), - selectedIndex: currentIndex, - onDestinationSelected: onSelected, - child: Column( - children: [ - Expanded( - child: _Switcher( - key: _switcherKey, - child: child, + final current = state.songWithProgress; + return AdaptiveNavigation( + key: _navigationRailKey, + destinations: + router.destinations + .map( + (e) => NavigationDestination( + icon: e.icon, + label: e.label, + ), + ) + .toList(), + selectedIndex: currentIndex, + onDestinationSelected: onSelected, + child: Column( + children: [ + Expanded(child: _Switcher(key: _switcherKey, child: child)), + if (current != null) const BottomBar(), + ], ), - ), - if (current != null) const BottomBar(), - ], + ); + }, ), - ); - }), ); } } @@ -66,21 +67,18 @@ class RootLayout extends StatelessWidget { class _Switcher extends StatelessWidget { final Widget child; - const _Switcher({ - required this.child, - super.key, - }); + const _Switcher({required this.child, super.key}); @override Widget build(BuildContext context) { return UniversalPlatform.isDesktop ? child : AnimatedSwitcher( - key: key, - duration: const Duration(milliseconds: 200), - switchInCurve: Curves.easeInOut, - switchOutCurve: Curves.easeInOut, - child: child, - ); + key: key, + duration: const Duration(milliseconds: 200), + switchInCurve: Curves.easeInOut, + switchOutCurve: Curves.easeInOut, + child: child, + ); } } diff --git a/boring_to_beautiful/step_03/lib/src/shared/views/sidebar.dart b/boring_to_beautiful/step_03/lib/src/shared/views/sidebar.dart index 78c19b4d22..8815223b22 100644 --- a/boring_to_beautiful/step_03/lib/src/shared/views/sidebar.dart +++ b/boring_to_beautiful/step_03/lib/src/shared/views/sidebar.dart @@ -26,10 +26,7 @@ class SideBar extends StatelessWidget { title: const Text('Home'), onTap: () => GoRouter.of(context).go('/'), ), - const ListTile( - leading: Icon(Icons.search), - title: Text('Search'), - ), + const ListTile(leading: Icon(Icons.search), title: Text('Search')), ListTile( leading: const Icon(Icons.person), title: const Text('Artists'), @@ -64,10 +61,7 @@ class PlaylistNav extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(left: 16, top: 16), - child: Text( - 'Playlists', - style: context.titleMedium, - ), + child: Text('Playlists', style: context.titleMedium), ), Expanded( child: ListView( @@ -114,10 +108,9 @@ class _PlaylistNavItemState extends State<_PlaylistNavItem> { @override void initState() { super.initState(); - _focusNode = FocusNode(debugLabel: widget.title) - ..addListener(() { - setState(() => _isSelected = _focusNode.hasPrimaryFocus); - }); + _focusNode = FocusNode(debugLabel: widget.title)..addListener(() { + setState(() => _isSelected = _focusNode.hasPrimaryFocus); + }); } @override diff --git a/boring_to_beautiful/step_03/macos/Podfile b/boring_to_beautiful/step_03/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/boring_to_beautiful/step_03/macos/Podfile +++ b/boring_to_beautiful/step_03/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_03/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_03/macos/Runner.xcodeproj/project.pbxproj index 79604e1785..63e08baa02 100644 --- a/boring_to_beautiful/step_03/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_03/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */; }; - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */; }; + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */, + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */, + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 143267097A016AD19836D89A /* Pods */ = { + isa = PBXGroup; + children = ( + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */, + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */, + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */, + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */, + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */, + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A67056D7D61CD22438BA6931 /* Pods */, + 143267097A016AD19836D89A /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - A67056D7D61CD22438BA6931 /* Pods */ = { - isa = PBXGroup; - children = ( - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */, - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */, - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */, - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */, - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */, - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */, - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */, + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */, + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */, + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */, + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */, + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -361,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */ = { + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -378,7 +378,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */ = { + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +393,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */ = { + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index b9ba5fa149..888bfbb4c7 100644 --- a/boring_to_beautiful/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_03/pubspec.yaml b/boring_to_beautiful/step_03/pubspec.yaml index abe835e2e6..b02c951374 100644 --- a/boring_to_beautiful/step_03/pubspec.yaml +++ b/boring_to_beautiful/step_03/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,14 +13,14 @@ dependencies: adaptive_components: ^0.0.10 adaptive_navigation: ^0.0.10 animations: ^2.0.11 - collection: ^1.19.0 + collection: ^1.19.1 cupertino_icons: ^1.0.8 desktop_window: ^0.4.2 dynamic_color: ^1.7.0 english_words: ^4.0.0 flutter_bloc: ^9.0.0 freezed_annotation: ^2.4.4 - go_router: ^14.7.2 + go_router: ^14.8.0 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/step_04/android/.gitignore b/boring_to_beautiful/step_04/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/boring_to_beautiful/step_04/android/.gitignore +++ b/boring_to_beautiful/step_04/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/boring_to_beautiful/step_04/android/app/build.gradle b/boring_to_beautiful/step_04/android/app/build.gradle deleted file mode 100644 index 59485b6bb8..0000000000 --- a/boring_to_beautiful/step_04/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.myartist" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.myartist" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/boring_to_beautiful/step_04/android/app/build.gradle.kts b/boring_to_beautiful/step_04/android/app/build.gradle.kts new file mode 100644 index 0000000000..b2dbe0393c --- /dev/null +++ b/boring_to_beautiful/step_04/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.myartist" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.myartist" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/boring_to_beautiful/step_04/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt b/boring_to_beautiful/step_04/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt index 1e328c8556..b724a01056 100644 --- a/boring_to_beautiful/step_04/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt +++ b/boring_to_beautiful/step_04/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.myartist import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/boring_to_beautiful/step_04/android/build.gradle b/boring_to_beautiful/step_04/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/boring_to_beautiful/step_04/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/boring_to_beautiful/step_04/android/build.gradle.kts b/boring_to_beautiful/step_04/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/boring_to_beautiful/step_04/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/boring_to_beautiful/step_04/android/gradle.properties b/boring_to_beautiful/step_04/android/gradle.properties index 2597170821..f018a61817 100644 --- a/boring_to_beautiful/step_04/android/gradle.properties +++ b/boring_to_beautiful/step_04/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/boring_to_beautiful/step_04/android/gradle/wrapper/gradle-wrapper.properties b/boring_to_beautiful/step_04/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/boring_to_beautiful/step_04/android/gradle/wrapper/gradle-wrapper.properties +++ b/boring_to_beautiful/step_04/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/boring_to_beautiful/step_04/android/settings.gradle b/boring_to_beautiful/step_04/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/boring_to_beautiful/step_04/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/boring_to_beautiful/step_04/android/settings.gradle.kts b/boring_to_beautiful/step_04/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/boring_to_beautiful/step_04/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/boring_to_beautiful/step_04/ios/Podfile b/boring_to_beautiful/step_04/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/boring_to_beautiful/step_04/ios/Podfile +++ b/boring_to_beautiful/step_04/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_04/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_04/ios/Runner.xcodeproj/project.pbxproj index f7d849e7aa..b4912290dd 100644 --- a/boring_to_beautiful/step_04/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_04/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */; }; - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */; }; + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,15 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +60,19 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 85CFC060D2B515FA7FCB18AC /* Frameworks */ = { + 6171884CE7EC0B228274CDFE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */, + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */, + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 54241974C43F645BC41820B3 /* Pods */ = { + 4CD80B4456D2B04197B640AC /* Pods */ = { isa = PBXGroup; children = ( - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */, - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */, - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */, - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */, - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */, - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */, + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */, + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */, + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */, + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */, + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */, + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 54241974C43F645BC41820B3 /* Pods */, - DA6AE8ED33598C40BFC9FCAD /* Frameworks */, + 4CD80B4456D2B04197B640AC /* Pods */, + C4E673F63230E3A6805B11E9 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - DA6AE8ED33598C40BFC9FCAD /* Frameworks */ = { + C4E673F63230E3A6805B11E9 /* Frameworks */ = { isa = PBXGroup; children = ( - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */, - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */, + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */, + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */, + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 85CFC060D2B515FA7FCB18AC /* Frameworks */, + 6171884CE7EC0B228274CDFE /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */, + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */, + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,43 +270,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -323,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */ = { + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,7 +340,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */ = { + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/boring_to_beautiful/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_bio.dart b/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_bio.dart index 227b8e91f9..8b614421db 100644 --- a/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_bio.dart +++ b/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_bio.dart @@ -18,9 +18,7 @@ class ArtistBio extends StatelessWidget { artist.bio, style: context.bodyLarge!.copyWith( fontSize: 16, - color: context.colors.onSurface.withAlpha( - 222, - ), + color: context.colors.onSurface.withAlpha(222), ), ); } diff --git a/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_card.dart b/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_card.dart index a63967f51d..1a56376a87 100644 --- a/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_card.dart +++ b/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_card.dart @@ -11,10 +11,7 @@ import '../../../shared/views/outlined_card.dart'; import '../../../shared/views/views.dart'; class ArtistCard extends StatelessWidget { - const ArtistCard({ - super.key, - required this.artist, - }); + const ArtistCard({super.key, required this.artist}); final Artist artist; @@ -24,65 +21,66 @@ class ArtistCard extends StatelessWidget { return OutlinedCard( child: LayoutBuilder( - builder: (context, dimens) => Row( - children: [ - SizedBox( - width: dimens.maxWidth * 0.4, - child: Image.asset( - artist.image.image, - fit: BoxFit.cover, - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - artist.name, - style: context.titleMedium, - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - const SizedBox(height: 10), - Text( - artist.bio, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 3, - ), - ]), - ), - if (dimens.maxHeight > 100) - Row( - children: [ - HoverableSongPlayButton( - size: const Size(50, 50), - song: nowPlaying, - child: Icon(Icons.play_circle, - color: context.colors.tertiary), + builder: + (context, dimens) => Row( + children: [ + SizedBox( + width: dimens.maxWidth * 0.4, + child: Image.asset(artist.image.image, fit: BoxFit.cover), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + artist.name, + style: context.titleMedium, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + const SizedBox(height: 10), + Text( + artist.bio, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 3, + ), + ], ), - Text( - nowPlaying.title, - maxLines: 1, - overflow: TextOverflow.clip, - style: context.labelMedium, + ), + if (dimens.maxHeight > 100) + Row( + children: [ + HoverableSongPlayButton( + size: const Size(50, 50), + song: nowPlaying, + child: Icon( + Icons.play_circle, + color: context.colors.tertiary, + ), + ), + Text( + nowPlaying.title, + maxLines: 1, + overflow: TextOverflow.clip, + style: context.labelMedium, + ), + ], ), - ], - ), - ], + ], + ), + ), ), - ), + ], ), - ], - ), ), ); } diff --git a/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_events.dart b/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_events.dart index 8b064759c6..58b61b37df 100644 --- a/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_events.dart +++ b/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_events.dart @@ -70,53 +70,32 @@ class ArtistEvents extends StatelessWidget { ); }, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], - rowBuilder: (item, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - Text(item.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(item.title)), - ]), - ), - DataCell( - Text(item.location), - ), - DataCell( - Clickable( - child: Text( - item.link, - style: TextStyle( - color: linkColor.value(theme), - decoration: TextDecoration.underline, + rowBuilder: + (item, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell(Text(item.date)), + DataCell(Row(children: [Expanded(child: Text(item.title))])), + DataCell(Text(item.location)), + DataCell( + Clickable( + child: Text( + item.link, + style: TextStyle( + color: linkColor.value(theme), + decoration: TextDecoration.underline, + ), + ), + onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ), ), - ), - onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ], ), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_ranked_songs.dart b/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_ranked_songs.dart index e484ecb3d7..3d1f4e2cf1 100644 --- a/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_ranked_songs.dart +++ b/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_ranked_songs.dart @@ -27,52 +27,42 @@ class ArtistRankedSongs extends StatelessWidget { title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), trailing: Text(song.ranking.toString()), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ); }, columns: const [ - DataColumn( - label: Text( - 'Ranking', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Title', - ), - ), - DataColumn( - label: Text( - 'Length', - ), - ), + DataColumn(label: Text('Ranking'), numeric: true), + DataColumn(label: Text('Title')), + DataColumn(label: Text('Length')), ], - rowBuilder: (song, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - HoverableSongPlayButton( - song: song, - child: Center( - child: Text(song.ranking.toString()), - ), + rowBuilder: + (song, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + HoverableSongPlayButton( + song: song, + child: Center(child: Text(song.ranking.toString())), + ), + ), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(song.image.image), + ), + const SizedBox(width: 5.0), + Expanded(child: Text(song.title)), + ], + ), + ), + DataCell(Text(song.length.toHumanizedString())), + ], ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(song.image.image), - ), - const SizedBox(width: 5.0), - Expanded(child: Text(song.title)), - ]), - ), - DataCell( - Text(song.length.toHumanizedString()), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_updates.dart b/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_updates.dart index e5b8bb5fe9..a0fabf7330 100644 --- a/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_updates.dart +++ b/boring_to_beautiful/step_04/lib/src/features/artists/view/artist_updates.dart @@ -30,7 +30,7 @@ class ArtistUpdates extends StatelessWidget { child: Text(update), ), ), - ) + ), ], ); } diff --git a/boring_to_beautiful/step_04/lib/src/features/artists/view/artists_screen.dart b/boring_to_beautiful/step_04/lib/src/features/artists/view/artists_screen.dart index 8afe759807..225d74847b 100644 --- a/boring_to_beautiful/step_04/lib/src/features/artists/view/artists_screen.dart +++ b/boring_to_beautiful/step_04/lib/src/features/artists/view/artists_screen.dart @@ -17,33 +17,33 @@ class ArtistsScreen extends StatelessWidget { Widget build(BuildContext context) { final artistsProvider = ArtistsProvider(); final artists = artistsProvider.artists; - return LayoutBuilder(builder: (context, constraints) { - return Scaffold( - primary: false, - appBar: AppBar( - title: const Text('ARTISTS'), - toolbarHeight: kToolbarHeight * 2, - ), - body: GridView.builder( - padding: const EdgeInsets.all(15), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), - childAspectRatio: 2.5, - mainAxisSpacing: 10, - crossAxisSpacing: 10, + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + primary: false, + appBar: AppBar( + title: const Text('ARTISTS'), + toolbarHeight: kToolbarHeight * 2, ), - itemCount: artists.length, - itemBuilder: (context, index) { - final artist = artists[index]; - return GestureDetector( - child: ArtistCard( - artist: artist, - ), - onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), - ); - }, - ), - ); - }); + body: GridView.builder( + padding: const EdgeInsets.all(15), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), + childAspectRatio: 2.5, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + ), + itemCount: artists.length, + itemBuilder: (context, index) { + final artist = artists[index]; + return GestureDetector( + child: ArtistCard(artist: artist), + onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), + ); + }, + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_04/lib/src/features/home/view/home_artists.dart b/boring_to_beautiful/step_04/lib/src/features/home/view/home_artists.dart index beb2c0ece4..b5a3a33ecd 100644 --- a/boring_to_beautiful/step_04/lib/src/features/home/view/home_artists.dart +++ b/boring_to_beautiful/step_04/lib/src/features/home/view/home_artists.dart @@ -22,27 +22,25 @@ class HomeArtists extends StatelessWidget { Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(15), - child: constraints.isMobile - ? Column( - children: [ - for (final artist in artists) buildTile(context, artist), - ], - ) - : Row(children: [ - for (final artist in artists) - Flexible( - flex: 1, - child: buildTile(context, artist), - ), - ]), + child: + constraints.isMobile + ? Column( + children: [ + for (final artist in artists) buildTile(context, artist), + ], + ) + : Row( + children: [ + for (final artist in artists) + Flexible(flex: 1, child: buildTile(context, artist)), + ], + ), ); } Widget buildTile(BuildContext context, Artist artist) { return ListTile( - leading: CircleAvatar( - backgroundImage: AssetImage(artist.image.image), - ), + leading: CircleAvatar(backgroundImage: AssetImage(artist.image.image)), title: Text( artist.updates.first, maxLines: 2, diff --git a/boring_to_beautiful/step_04/lib/src/features/home/view/home_recent.dart b/boring_to_beautiful/step_04/lib/src/features/home/view/home_recent.dart index c77500a663..8ba86d117d 100644 --- a/boring_to_beautiful/step_04/lib/src/features/home/view/home_recent.dart +++ b/boring_to_beautiful/step_04/lib/src/features/home/view/home_recent.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/outlined_card.dart'; class HomeRecent extends StatelessWidget { - const HomeRecent( - {super.key, required this.playlists, this.axis = Axis.horizontal}); + const HomeRecent({ + super.key, + required this.playlists, + this.axis = Axis.horizontal, + }); final List playlists; final Axis axis; @@ -43,8 +46,10 @@ class HomeRecent extends StatelessWidget { Row( children: [ Expanded( - child: Image.asset(playlist.cover.image, - fit: BoxFit.cover), + child: Image.asset( + playlist.cover.image, + fit: BoxFit.cover, + ), ), ], ), @@ -79,10 +84,7 @@ class HomeRecent extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ - ClippedImage( - playlist.cover.image, - height: 200, - ), + ClippedImage(playlist.cover.image, height: 200), Expanded( child: Center( child: Padding( @@ -104,23 +106,24 @@ class HomeRecent extends StatelessWidget { return Column( children: [ Padding( - padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), - child: Text( - playlist.title, - style: context.titleSmall!.copyWith( - fontWeight: FontWeight.bold, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - textAlign: TextAlign.center, - )), + padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), + child: Text( + playlist.title, + style: context.titleSmall!.copyWith(fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, + textAlign: TextAlign.center, + ), + ), Padding( padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text(playlist.description, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center), + child: Text( + playlist.description, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), ), ], ); diff --git a/boring_to_beautiful/step_04/lib/src/features/home/view/home_screen.dart b/boring_to_beautiful/step_04/lib/src/features/home/view/home_screen.dart index 715ddf435c..bcff070874 100644 --- a/boring_to_beautiful/step_04/lib/src/features/home/view/home_screen.dart +++ b/boring_to_beautiful/step_04/lib/src/features/home/view/home_screen.dart @@ -61,10 +61,11 @@ class _HomeScreenState extends State { children: [ const HomeHighlight(), LayoutBuilder( - builder: (context, constraints) => HomeArtists( - artists: artists, - constraints: constraints, - ), + builder: + (context, constraints) => HomeArtists( + artists: artists, + constraints: constraints, + ), ), ], ), @@ -81,9 +82,7 @@ class _HomeScreenState extends State { style: context.headlineSmall, ), ), - HomeRecent( - playlists: playlists, - ), + HomeRecent(playlists: playlists), ], ), ), @@ -101,19 +100,20 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.all(2), // Modify this line + padding: const EdgeInsets.all( + 2, + ), // Modify this line child: Text( 'Top Songs Today', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), ), ], ), @@ -126,19 +126,20 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.all(2), // Modify this line + padding: const EdgeInsets.all( + 2, + ), // Modify this line child: Text( 'New Releases', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: newReleases, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), ), ], ), diff --git a/boring_to_beautiful/step_04/lib/src/features/playlists/view/playlist_home_screen.dart b/boring_to_beautiful/step_04/lib/src/features/playlists/view/playlist_home_screen.dart index a80d767930..978608ccad 100644 --- a/boring_to_beautiful/step_04/lib/src/features/playlists/view/playlist_home_screen.dart +++ b/boring_to_beautiful/step_04/lib/src/features/playlists/view/playlist_home_screen.dart @@ -44,8 +44,10 @@ class PlaylistHomeScreen extends StatelessWidget { title: playlist.title, subtitle: playlist.description, ), - onTap: () => - GoRouter.of(context).go('/playlists/${playlist.id}'), + onTap: + () => GoRouter.of( + context, + ).go('/playlists/${playlist.id}'), ); }, ), diff --git a/boring_to_beautiful/step_04/lib/src/features/playlists/view/playlist_screen.dart b/boring_to_beautiful/step_04/lib/src/features/playlists/view/playlist_screen.dart index 5dc2f0744f..c41f500a92 100644 --- a/boring_to_beautiful/step_04/lib/src/features/playlists/view/playlist_screen.dart +++ b/boring_to_beautiful/step_04/lib/src/features/playlists/view/playlist_screen.dart @@ -20,114 +20,116 @@ class PlaylistScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - final colors = Theme.of(context).colorScheme; - final double headerHeight = constraints.isMobile - ? max(constraints.biggest.height * 0.5, 450) - : max(constraints.biggest.height * 0.25, 250); - if (constraints.isMobile) { - return Scaffold( - appBar: AppBar( - leading: BackButton( - onPressed: () => GoRouter.of(context).go('/playlists'), - ), - title: Text(playlist.title), - actions: [ - IconButton( - icon: const Icon(Icons.play_circle_fill), - onPressed: () {}, - ), - IconButton( - onPressed: () {}, - icon: const Icon(Icons.shuffle), - ), - ], - ), - body: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, - ), - ), - ); - } - return Scaffold( - body: CustomScrollView( - slivers: [ - SliverAppBar( + return LayoutBuilder( + builder: (context, constraints) { + final colors = Theme.of(context).colorScheme; + final double headerHeight = + constraints.isMobile + ? max(constraints.biggest.height * 0.5, 450) + : max(constraints.biggest.height * 0.25, 250); + if (constraints.isMobile) { + return Scaffold( + appBar: AppBar( leading: BackButton( onPressed: () => GoRouter.of(context).go('/playlists'), ), - expandedHeight: headerHeight, - pinned: false, - flexibleSpace: FlexibleSpaceBar( - background: AdaptiveImageCard( - axis: constraints.isMobile ? Axis.vertical : Axis.horizontal, - constraints: - constraints.copyWith(maxHeight: headerHeight).normalize(), - image: playlist.cover.image, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'PLAYLIST', - style: context.titleSmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.title, - style: context.displaySmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.description, - style: context.bodyLarge!.copyWith( - color: colors.onSurface.withAlpha(204), + title: Text(playlist.title), + actions: [ + IconButton( + icon: const Icon(Icons.play_circle_fill), + onPressed: () {}, + ), + IconButton(onPressed: () {}, icon: const Icon(Icons.shuffle)), + ], + ), + body: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), + ), + ); + } + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + leading: BackButton( + onPressed: () => GoRouter.of(context).go('/playlists'), + ), + expandedHeight: headerHeight, + pinned: false, + flexibleSpace: FlexibleSpaceBar( + background: AdaptiveImageCard( + axis: + constraints.isMobile ? Axis.vertical : Axis.horizontal, + constraints: + constraints + .copyWith(maxHeight: headerHeight) + .normalize(), + image: playlist.cover.image, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'PLAYLIST', + style: context.titleSmall!.copyWith( + color: colors.onSurface, + ), ), - ), - const SizedBox(height: 8), - Row( - children: [ - IconButton( - icon: Icon( - Icons.play_circle_fill, - color: colors.tertiary, - ), - onPressed: () {}, + Text( + playlist.title, + style: context.displaySmall!.copyWith( + color: colors.onSurface, ), - TextButton.icon( - onPressed: () {}, - icon: Icon( - Icons.shuffle, - color: colors.tertiary, - ), - label: Text( - 'Shuffle', - style: context.bodySmall!.copyWith( + ), + Text( + playlist.description, + style: context.bodyLarge!.copyWith( + color: colors.onSurface.withAlpha(204), + ), + ), + const SizedBox(height: 8), + Row( + children: [ + IconButton( + icon: Icon( + Icons.play_circle_fill, color: colors.tertiary, ), + onPressed: () {}, ), - ), - ], - ), - ], + TextButton.icon( + onPressed: () {}, + icon: Icon(Icons.shuffle, color: colors.tertiary), + label: Text( + 'Shuffle', + style: context.bodySmall!.copyWith( + color: colors.tertiary, + ), + ), + ), + ], + ), + ], + ), ), ), ), - ), - SliverToBoxAdapter( - child: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, + SliverToBoxAdapter( + child: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), ), ), - ), - ], - ), - ); - }); + ], + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_04/lib/src/features/playlists/view/playlist_songs.dart b/boring_to_beautiful/step_04/lib/src/features/playlists/view/playlist_songs.dart index e944336540..1d5a2e9879 100644 --- a/boring_to_beautiful/step_04/lib/src/features/playlists/view/playlist_songs.dart +++ b/boring_to_beautiful/step_04/lib/src/features/playlists/view/playlist_songs.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/views.dart'; class PlaylistSongs extends StatelessWidget { - const PlaylistSongs( - {super.key, required this.playlist, required this.constraints}); + const PlaylistSongs({ + super.key, + required this.playlist, + required this.constraints, + }); final Playlist playlist; final BoxConstraints constraints; @@ -25,14 +28,9 @@ class PlaylistSongs extends StatelessWidget { breakpoint: 450, columns: const [ DataColumn( - label: Padding( - padding: EdgeInsets.only(left: 20), - child: Text('#'), - ), - ), - DataColumn( - label: Text('Title'), + label: Padding(padding: EdgeInsets.only(left: 20), child: Text('#')), ), + DataColumn(label: Text('Title')), DataColumn( label: Padding( padding: EdgeInsets.only(right: 10), @@ -40,38 +38,40 @@ class PlaylistSongs extends StatelessWidget { ), ), ], - rowBuilder: (context, index) => DataRow.byIndex( - index: index, - cells: [ - DataCell( - // Add HoverableSongPlayButton - Center( - child: Text( - (index + 1).toString(), - textAlign: TextAlign.center, + rowBuilder: + (context, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + // Add HoverableSongPlayButton + Center( + child: Text( + (index + 1).toString(), + textAlign: TextAlign.center, + ), + ), ), - ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(playlist.songs[index].image.image), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(playlist.songs[index].image.image), + ), + const SizedBox(width: 10), + Expanded(child: Text(playlist.songs[index].title)), + ], + ), ), - const SizedBox(width: 10), - Expanded(child: Text(playlist.songs[index].title)), - ]), - ), - DataCell( - Text(playlist.songs[index].length.toHumanizedString()), + DataCell(Text(playlist.songs[index].length.toHumanizedString())), + ], ), - ], - ), itemBuilder: (song, index) { return ListTile( - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), leading: ClippedImage(song.image.image), title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), diff --git a/boring_to_beautiful/step_04/lib/src/shared/app.dart b/boring_to_beautiful/step_04/lib/src/shared/app.dart index 3910d8f276..ed27418bd4 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/app.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/app.dart @@ -19,45 +19,46 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - final settings = ValueNotifier(ThemeSettings( - sourceColor: Colors.pink, - themeMode: ThemeMode.system, - )); + final settings = ValueNotifier( + ThemeSettings(sourceColor: Colors.pink, themeMode: ThemeMode.system), + ); @override Widget build(BuildContext context) { return BlocProvider( create: (context) => PlaybackBloc(), child: DynamicColorBuilder( - builder: (lightDynamic, darkDynamic) => ThemeProvider( - lightDynamic: lightDynamic, - darkDynamic: darkDynamic, - settings: settings, - child: NotificationListener( - onNotification: (notification) { - settings.value = notification.settings; - return true; - }, - child: ValueListenableBuilder( - valueListenable: settings, - builder: (context, value, _) { - final theme = ThemeProvider.of(context); - return MaterialApp.router( - debugShowCheckedModeBanner: false, - title: 'Flutter Demo', - theme: theme.light(settings.value.sourceColor), - darkTheme: theme.dark(settings.value.sourceColor), - themeMode: theme.themeMode(), - routeInformationParser: appRouter.routeInformationParser, - routeInformationProvider: - appRouter.routeInformationProvider, - routerDelegate: appRouter.routerDelegate, - builder: (context, child) { - return PlayPauseListener(child: child!); - }, - ); + builder: + (lightDynamic, darkDynamic) => ThemeProvider( + lightDynamic: lightDynamic, + darkDynamic: darkDynamic, + settings: settings, + child: NotificationListener( + onNotification: (notification) { + settings.value = notification.settings; + return true; }, + child: ValueListenableBuilder( + valueListenable: settings, + builder: (context, value, _) { + final theme = ThemeProvider.of(context); + return MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + theme: theme.light(settings.value.sourceColor), + darkTheme: theme.dark(settings.value.sourceColor), + themeMode: theme.themeMode(), + routeInformationParser: appRouter.routeInformationParser, + routeInformationProvider: + appRouter.routeInformationProvider, + routerDelegate: appRouter.routerDelegate, + builder: (context, child) { + return PlayPauseListener(child: child!); + }, + ); + }, + ), ), - )), + ), ), ); } diff --git a/boring_to_beautiful/step_04/lib/src/shared/classes/image.dart b/boring_to_beautiful/step_04/lib/src/shared/classes/image.dart index a1ef427c1d..00a6472b4a 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/classes/image.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/classes/image.dart @@ -3,10 +3,11 @@ // found in the LICENSE file. class MyArtistImage { - const MyArtistImage( - {required this.image, - required this.sourceName, - required this.sourceLink}); + const MyArtistImage({ + required this.image, + required this.sourceName, + required this.sourceLink, + }); final String image; final String sourceName; diff --git a/boring_to_beautiful/step_04/lib/src/shared/classes/playlist.dart b/boring_to_beautiful/step_04/lib/src/shared/classes/playlist.dart index 59899dc619..5f0225059d 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/classes/playlist.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/classes/playlist.dart @@ -17,8 +17,9 @@ class Playlist { this.description = '', required this.songs, this.cover = const MyArtistImage( - image: 'assets/images/record.jpeg', - sourceName: 'Adobe Stock Images', - sourceLink: ''), + image: 'assets/images/record.jpeg', + sourceName: 'Adobe Stock Images', + sourceLink: '', + ), }); } diff --git a/boring_to_beautiful/step_04/lib/src/shared/classes/ranked_song.dart b/boring_to_beautiful/step_04/lib/src/shared/classes/ranked_song.dart index 5908268c8c..2362bfae64 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/classes/ranked_song.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/classes/ranked_song.dart @@ -7,7 +7,11 @@ import './classes.dart'; class RankedSong extends Song { final int ranking; - const RankedSong(this.ranking, String title, Artist artist, Duration length, - MyArtistImage image) - : super(title, artist, length, image); + const RankedSong( + this.ranking, + String title, + Artist artist, + Duration length, + MyArtistImage image, + ) : super(title, artist, length, image); } diff --git a/boring_to_beautiful/step_04/lib/src/shared/extensions.dart b/boring_to_beautiful/step_04/lib/src/shared/extensions.dart index 8b7e41b988..fe65add57c 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/extensions.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/extensions.dart @@ -9,51 +9,36 @@ extension TypographyUtils on BuildContext { ThemeData get theme => Theme.of(this); TextTheme get textTheme => GoogleFonts.montserratTextTheme(theme.textTheme); ColorScheme get colors => theme.colorScheme; - TextStyle? get displayLarge => textTheme.displayLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displayMedium => textTheme.displayMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displaySmall => textTheme.displaySmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineLarge => textTheme.headlineLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineMedium => textTheme.headlineMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineSmall => textTheme.headlineSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleLarge => textTheme.titleLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleMedium => textTheme.titleMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleSmall => textTheme.titleSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelLarge => textTheme.labelLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelMedium => textTheme.labelMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelSmall => textTheme.labelSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyLarge => textTheme.bodyLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyMedium => textTheme.bodyMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodySmall => textTheme.bodySmall?.copyWith( - color: colors.onSurface, - ); + TextStyle? get displayLarge => + textTheme.displayLarge?.copyWith(color: colors.onSurface); + TextStyle? get displayMedium => + textTheme.displayMedium?.copyWith(color: colors.onSurface); + TextStyle? get displaySmall => + textTheme.displaySmall?.copyWith(color: colors.onSurface); + TextStyle? get headlineLarge => + textTheme.headlineLarge?.copyWith(color: colors.onSurface); + TextStyle? get headlineMedium => + textTheme.headlineMedium?.copyWith(color: colors.onSurface); + TextStyle? get headlineSmall => + textTheme.headlineSmall?.copyWith(color: colors.onSurface); + TextStyle? get titleLarge => + textTheme.titleLarge?.copyWith(color: colors.onSurface); + TextStyle? get titleMedium => + textTheme.titleMedium?.copyWith(color: colors.onSurface); + TextStyle? get titleSmall => + textTheme.titleSmall?.copyWith(color: colors.onSurface); + TextStyle? get labelLarge => + textTheme.labelLarge?.copyWith(color: colors.onSurface); + TextStyle? get labelMedium => + textTheme.labelMedium?.copyWith(color: colors.onSurface); + TextStyle? get labelSmall => + textTheme.labelSmall?.copyWith(color: colors.onSurface); + TextStyle? get bodyLarge => + textTheme.bodyLarge?.copyWith(color: colors.onSurface); + TextStyle? get bodyMedium => + textTheme.bodyMedium?.copyWith(color: colors.onSurface); + TextStyle? get bodySmall => + textTheme.bodySmall?.copyWith(color: colors.onSurface); } extension BreakpointUtils on BoxConstraints { @@ -65,17 +50,17 @@ extension BreakpointUtils on BoxConstraints { extension DurationString on String { /// Assumes a string (roughly) of the format '\d{1,2}:\d{2}' Duration toDuration() => switch (split(':')) { - [var minutes, var seconds] => Duration( - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - [var hours, var minutes, var seconds] => Duration( - hours: int.parse(hours.trim()), - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - _ => throw Exception('Invalid duration string: $this'), - }; + [var minutes, var seconds] => Duration( + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + [var hours, var minutes, var seconds] => Duration( + hours: int.parse(hours.trim()), + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + _ => throw Exception('Invalid duration string: $this'), + }; } extension HumanizedDuration on Duration { diff --git a/boring_to_beautiful/step_04/lib/src/shared/playback/bloc/playback_bloc.dart b/boring_to_beautiful/step_04/lib/src/shared/playback/bloc/playback_bloc.dart index 73c2f4c436..c6c871937b 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/playback/bloc/playback_bloc.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/playback/bloc/playback_bloc.dart @@ -41,9 +41,8 @@ class PlaybackBloc extends Bloc { } } - void _handlePlaybackProgress(Duration progress) => add( - PlaybackEvent.songProgress(progress), - ); + void _handlePlaybackProgress(Duration progress) => + add(PlaybackEvent.songProgress(progress)); void _togglePlayPause(TogglePlayPause event, Emitter emit) { state.isPlaying ? _pausePlayback() : _resumePlayback(); @@ -52,8 +51,10 @@ class PlaybackBloc extends Bloc { void _pausePlayback() => _currentlyPlayingSubscription!.cancel(); - void _resumePlayback() => _currentlyPlayingSubscription = - _startPlayingStream().listen(_handlePlaybackProgress); + void _resumePlayback() => + _currentlyPlayingSubscription = _startPlayingStream().listen( + _handlePlaybackProgress, + ); void _changeSong(ChangeSong event, Emitter emit) { emit( @@ -69,19 +70,15 @@ class PlaybackBloc extends Bloc { } void _songProgress(SongProgress event, Emitter emit) => emit( - state.copyWith( - songWithProgress: state.songWithProgress!.copyWith( - progress: state.songWithProgress!.progress + event.duration, - ), - ), - ); + state.copyWith( + songWithProgress: state.songWithProgress!.copyWith( + progress: state.songWithProgress!.progress + event.duration, + ), + ), + ); void _setVolume(SetVolume event, Emitter emit) => emit( - state.copyWith( - volume: event.value, - isMuted: false, - previousVolume: null, - ), - ); + state.copyWith(volume: event.value, isMuted: false, previousVolume: null), + ); void _toggleMute(ToggleMute event, Emitter emit) { if (state.isMuted) { @@ -94,11 +91,7 @@ class PlaybackBloc extends Bloc { ); } else { emit( - state.copyWith( - isMuted: true, - volume: 0, - previousVolume: state.volume, - ), + state.copyWith(isMuted: true, volume: 0, previousVolume: state.volume), ); } } diff --git a/boring_to_beautiful/step_04/lib/src/shared/playback/bloc/playback_bloc.freezed.dart b/boring_to_beautiful/step_04/lib/src/shared/playback/bloc/playback_bloc.freezed.dart index 8a422cd449..54e870ab6f 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/playback/bloc/playback_bloc.freezed.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/playback/bloc/playback_bloc.freezed.dart @@ -12,7 +12,8 @@ part of 'playback_bloc.dart'; T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models', +); /// @nodoc mixin _$PlaybackEvent { @@ -24,8 +25,7 @@ mixin _$PlaybackEvent { required TResult Function() toggleMute, required TResult Function(double percent) moveToInSong, required TResult Function(Duration duration) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? togglePlayPause, @@ -34,8 +34,7 @@ mixin _$PlaybackEvent { TResult? Function()? toggleMute, TResult? Function(double percent)? moveToInSong, TResult? Function(Duration duration)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ TResult Function()? togglePlayPause, @@ -45,8 +44,7 @@ mixin _$PlaybackEvent { TResult Function(double percent)? moveToInSong, TResult Function(Duration duration)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult map({ required TResult Function(TogglePlayPause value) togglePlayPause, @@ -55,8 +53,7 @@ mixin _$PlaybackEvent { required TResult Function(ToggleMute value) toggleMute, required TResult Function(MoveToInSong value) moveToInSong, required TResult Function(SongProgress value) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ TResult? Function(TogglePlayPause value)? togglePlayPause, @@ -65,8 +62,7 @@ mixin _$PlaybackEvent { TResult? Function(ToggleMute value)? toggleMute, TResult? Function(MoveToInSong value)? moveToInSong, TResult? Function(SongProgress value)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeMap({ TResult Function(TogglePlayPause value)? togglePlayPause, @@ -76,15 +72,15 @@ mixin _$PlaybackEvent { TResult Function(MoveToInSong value)? moveToInSong, TResult Function(SongProgress value)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; } /// @nodoc abstract class $PlaybackEventCopyWith<$Res> { factory $PlaybackEventCopyWith( - PlaybackEvent value, $Res Function(PlaybackEvent) then) = - _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; + PlaybackEvent value, + $Res Function(PlaybackEvent) then, + ) = _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; } /// @nodoc @@ -103,9 +99,10 @@ class _$PlaybackEventCopyWithImpl<$Res, $Val extends PlaybackEvent> /// @nodoc abstract class _$$TogglePlayPauseImplCopyWith<$Res> { - factory _$$TogglePlayPauseImplCopyWith(_$TogglePlayPauseImpl value, - $Res Function(_$TogglePlayPauseImpl) then) = - __$$TogglePlayPauseImplCopyWithImpl<$Res>; + factory _$$TogglePlayPauseImplCopyWith( + _$TogglePlayPauseImpl value, + $Res Function(_$TogglePlayPauseImpl) then, + ) = __$$TogglePlayPauseImplCopyWithImpl<$Res>; } /// @nodoc @@ -113,8 +110,9 @@ class __$$TogglePlayPauseImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$TogglePlayPauseImpl> implements _$$TogglePlayPauseImplCopyWith<$Res> { __$$TogglePlayPauseImplCopyWithImpl( - _$TogglePlayPauseImpl _value, $Res Function(_$TogglePlayPauseImpl) _then) - : super(_value, _then); + _$TogglePlayPauseImpl _value, + $Res Function(_$TogglePlayPauseImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -233,8 +231,9 @@ abstract class TogglePlayPause implements PlaybackEvent { /// @nodoc abstract class _$$ChangeSongImplCopyWith<$Res> { factory _$$ChangeSongImplCopyWith( - _$ChangeSongImpl value, $Res Function(_$ChangeSongImpl) then) = - __$$ChangeSongImplCopyWithImpl<$Res>; + _$ChangeSongImpl value, + $Res Function(_$ChangeSongImpl) then, + ) = __$$ChangeSongImplCopyWithImpl<$Res>; @useResult $Res call({Song song}); } @@ -244,22 +243,23 @@ class __$$ChangeSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ChangeSongImpl> implements _$$ChangeSongImplCopyWith<$Res> { __$$ChangeSongImplCopyWithImpl( - _$ChangeSongImpl _value, $Res Function(_$ChangeSongImpl) _then) - : super(_value, _then); + _$ChangeSongImpl _value, + $Res Function(_$ChangeSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? song = null, - }) { - return _then(_$ChangeSongImpl( - null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? song = null}) { + return _then( + _$ChangeSongImpl( + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -397,8 +397,9 @@ abstract class ChangeSong implements PlaybackEvent { /// @nodoc abstract class _$$SetVolumeImplCopyWith<$Res> { factory _$$SetVolumeImplCopyWith( - _$SetVolumeImpl value, $Res Function(_$SetVolumeImpl) then) = - __$$SetVolumeImplCopyWithImpl<$Res>; + _$SetVolumeImpl value, + $Res Function(_$SetVolumeImpl) then, + ) = __$$SetVolumeImplCopyWithImpl<$Res>; @useResult $Res call({double value}); } @@ -408,22 +409,23 @@ class __$$SetVolumeImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SetVolumeImpl> implements _$$SetVolumeImplCopyWith<$Res> { __$$SetVolumeImplCopyWithImpl( - _$SetVolumeImpl _value, $Res Function(_$SetVolumeImpl) _then) - : super(_value, _then); + _$SetVolumeImpl _value, + $Res Function(_$SetVolumeImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? value = null, - }) { - return _then(_$SetVolumeImpl( - null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? value = null}) { + return _then( + _$SetVolumeImpl( + null == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -561,8 +563,9 @@ abstract class SetVolume implements PlaybackEvent { /// @nodoc abstract class _$$ToggleMuteImplCopyWith<$Res> { factory _$$ToggleMuteImplCopyWith( - _$ToggleMuteImpl value, $Res Function(_$ToggleMuteImpl) then) = - __$$ToggleMuteImplCopyWithImpl<$Res>; + _$ToggleMuteImpl value, + $Res Function(_$ToggleMuteImpl) then, + ) = __$$ToggleMuteImplCopyWithImpl<$Res>; } /// @nodoc @@ -570,8 +573,9 @@ class __$$ToggleMuteImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ToggleMuteImpl> implements _$$ToggleMuteImplCopyWith<$Res> { __$$ToggleMuteImplCopyWithImpl( - _$ToggleMuteImpl _value, $Res Function(_$ToggleMuteImpl) _then) - : super(_value, _then); + _$ToggleMuteImpl _value, + $Res Function(_$ToggleMuteImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -690,8 +694,9 @@ abstract class ToggleMute implements PlaybackEvent { /// @nodoc abstract class _$$MoveToInSongImplCopyWith<$Res> { factory _$$MoveToInSongImplCopyWith( - _$MoveToInSongImpl value, $Res Function(_$MoveToInSongImpl) then) = - __$$MoveToInSongImplCopyWithImpl<$Res>; + _$MoveToInSongImpl value, + $Res Function(_$MoveToInSongImpl) then, + ) = __$$MoveToInSongImplCopyWithImpl<$Res>; @useResult $Res call({double percent}); } @@ -701,22 +706,23 @@ class __$$MoveToInSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$MoveToInSongImpl> implements _$$MoveToInSongImplCopyWith<$Res> { __$$MoveToInSongImplCopyWithImpl( - _$MoveToInSongImpl _value, $Res Function(_$MoveToInSongImpl) _then) - : super(_value, _then); + _$MoveToInSongImpl _value, + $Res Function(_$MoveToInSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? percent = null, - }) { - return _then(_$MoveToInSongImpl( - null == percent - ? _value.percent - : percent // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? percent = null}) { + return _then( + _$MoveToInSongImpl( + null == percent + ? _value.percent + : percent // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -854,8 +860,9 @@ abstract class MoveToInSong implements PlaybackEvent { /// @nodoc abstract class _$$SongProgressImplCopyWith<$Res> { factory _$$SongProgressImplCopyWith( - _$SongProgressImpl value, $Res Function(_$SongProgressImpl) then) = - __$$SongProgressImplCopyWithImpl<$Res>; + _$SongProgressImpl value, + $Res Function(_$SongProgressImpl) then, + ) = __$$SongProgressImplCopyWithImpl<$Res>; @useResult $Res call({Duration duration}); } @@ -865,22 +872,23 @@ class __$$SongProgressImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SongProgressImpl> implements _$$SongProgressImplCopyWith<$Res> { __$$SongProgressImplCopyWithImpl( - _$SongProgressImpl _value, $Res Function(_$SongProgressImpl) _then) - : super(_value, _then); + _$SongProgressImpl _value, + $Res Function(_$SongProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? duration = null, - }) { - return _then(_$SongProgressImpl( - null == duration - ? _value.duration - : duration // ignore: cast_nullable_to_non_nullable - as Duration, - )); + $Res call({Object? duration = null}) { + return _then( + _$SongProgressImpl( + null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as Duration, + ), + ); } } @@ -1037,15 +1045,17 @@ mixin _$PlaybackState { /// @nodoc abstract class $PlaybackStateCopyWith<$Res> { factory $PlaybackStateCopyWith( - PlaybackState value, $Res Function(PlaybackState) then) = - _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; + PlaybackState value, + $Res Function(PlaybackState) then, + ) = _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); $SongWithProgressCopyWith<$Res>? get songWithProgress; } @@ -1071,28 +1081,36 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_value.copyWith( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - ) as $Val); + return _then( + _value.copyWith( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ) + as $Val, + ); } /// Create a copy of PlaybackState @@ -1114,16 +1132,18 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> abstract class _$$PlaybackStateImplCopyWith<$Res> implements $PlaybackStateCopyWith<$Res> { factory _$$PlaybackStateImplCopyWith( - _$PlaybackStateImpl value, $Res Function(_$PlaybackStateImpl) then) = - __$$PlaybackStateImplCopyWithImpl<$Res>; + _$PlaybackStateImpl value, + $Res Function(_$PlaybackStateImpl) then, + ) = __$$PlaybackStateImplCopyWithImpl<$Res>; @override @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); @override $SongWithProgressCopyWith<$Res>? get songWithProgress; @@ -1134,8 +1154,9 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> extends _$PlaybackStateCopyWithImpl<$Res, _$PlaybackStateImpl> implements _$$PlaybackStateImplCopyWith<$Res> { __$$PlaybackStateImplCopyWithImpl( - _$PlaybackStateImpl _value, $Res Function(_$PlaybackStateImpl) _then) - : super(_value, _then); + _$PlaybackStateImpl _value, + $Res Function(_$PlaybackStateImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1148,40 +1169,48 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_$PlaybackStateImpl( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - )); + return _then( + _$PlaybackStateImpl( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ), + ); } } /// @nodoc class _$PlaybackStateImpl implements _PlaybackState { - const _$PlaybackStateImpl( - {this.volume = 0.5, - this.previousVolume, - this.isMuted = false, - this.isPlaying = false, - this.songWithProgress}); + const _$PlaybackStateImpl({ + this.volume = 0.5, + this.previousVolume, + this.isMuted = false, + this.isPlaying = false, + this.songWithProgress, + }); /// Legal values are between 0 and 1. @override @@ -1221,8 +1250,14 @@ class _$PlaybackStateImpl implements _PlaybackState { } @override - int get hashCode => Object.hash(runtimeType, volume, previousVolume, isMuted, - isPlaying, songWithProgress); + int get hashCode => Object.hash( + runtimeType, + volume, + previousVolume, + isMuted, + isPlaying, + songWithProgress, + ); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1234,12 +1269,13 @@ class _$PlaybackStateImpl implements _PlaybackState { } abstract class _PlaybackState implements PlaybackState { - const factory _PlaybackState( - {final double volume, - final double? previousVolume, - final bool isMuted, - final bool isPlaying, - final SongWithProgress? songWithProgress}) = _$PlaybackStateImpl; + const factory _PlaybackState({ + final double volume, + final double? previousVolume, + final bool isMuted, + final bool isPlaying, + final SongWithProgress? songWithProgress, + }) = _$PlaybackStateImpl; /// Legal values are between 0 and 1. @override @@ -1278,8 +1314,9 @@ mixin _$SongWithProgress { /// @nodoc abstract class $SongWithProgressCopyWith<$Res> { factory $SongWithProgressCopyWith( - SongWithProgress value, $Res Function(SongWithProgress) then) = - _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; + SongWithProgress value, + $Res Function(SongWithProgress) then, + ) = _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; @useResult $Res call({Duration progress, Song song}); } @@ -1298,29 +1335,32 @@ class _$SongWithProgressCopyWithImpl<$Res, $Val extends SongWithProgress> /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_value.copyWith( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - ) as $Val); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _value.copyWith( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ) + as $Val, + ); } } /// @nodoc abstract class _$$SongWithProgressImplCopyWith<$Res> implements $SongWithProgressCopyWith<$Res> { - factory _$$SongWithProgressImplCopyWith(_$SongWithProgressImpl value, - $Res Function(_$SongWithProgressImpl) then) = - __$$SongWithProgressImplCopyWithImpl<$Res>; + factory _$$SongWithProgressImplCopyWith( + _$SongWithProgressImpl value, + $Res Function(_$SongWithProgressImpl) then, + ) = __$$SongWithProgressImplCopyWithImpl<$Res>; @override @useResult $Res call({Duration progress, Song song}); @@ -1330,28 +1370,30 @@ abstract class _$$SongWithProgressImplCopyWith<$Res> class __$$SongWithProgressImplCopyWithImpl<$Res> extends _$SongWithProgressCopyWithImpl<$Res, _$SongWithProgressImpl> implements _$$SongWithProgressImplCopyWith<$Res> { - __$$SongWithProgressImplCopyWithImpl(_$SongWithProgressImpl _value, - $Res Function(_$SongWithProgressImpl) _then) - : super(_value, _then); + __$$SongWithProgressImplCopyWithImpl( + _$SongWithProgressImpl _value, + $Res Function(_$SongWithProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of SongWithProgress /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_$SongWithProgressImpl( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _$SongWithProgressImpl( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -1390,13 +1432,16 @@ class _$SongWithProgressImpl implements _SongWithProgress { @pragma('vm:prefer-inline') _$$SongWithProgressImplCopyWith<_$SongWithProgressImpl> get copyWith => __$$SongWithProgressImplCopyWithImpl<_$SongWithProgressImpl>( - this, _$identity); + this, + _$identity, + ); } abstract class _SongWithProgress implements SongWithProgress { - const factory _SongWithProgress( - {required final Duration progress, - required final Song song}) = _$SongWithProgressImpl; + const factory _SongWithProgress({ + required final Duration progress, + required final Song song, + }) = _$SongWithProgressImpl; @override Duration get progress; diff --git a/boring_to_beautiful/step_04/lib/src/shared/providers/artists.dart b/boring_to_beautiful/step_04/lib/src/shared/providers/artists.dart index d116ad9cdd..f9e4a8063e 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/providers/artists.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/providers/artists.dart @@ -11,162 +11,175 @@ class ArtistsProvider { static ArtistsProvider get shared => ArtistsProvider(); List get artists => const [ - Artist( - id: 'jmo', - name: 'Jessie Morrison', + Artist( + id: 'jmo', + name: 'Jessie Morrison', + image: MyArtistImage( + image: 'assets/images/artists/woman.jpeg', + sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', + sourceName: 'Daniel Monteiro', + ), + bio: + 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', + updates: [ + 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', + 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', + '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', + ], + events: [ + Event( + date: '1/20/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Mountain View, California', + link: 'Tickets', + ), + Event( + date: '1/22/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Austin, Texas', + link: 'Tickets', + ), + Event( + date: '1/23/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Houston, Texas', + link: 'Tickets', + ), + Event( + date: '2/8/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Los Angeles, California', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', + author: 'By Jacqueline Stewart', + blurb: + 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', image: MyArtistImage( - image: 'assets/images/artists/woman.jpeg', - sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', - sourceName: 'Daniel Monteiro', + image: 'assets/images/news/concert.jpeg', + sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', + sourceName: 'Anthony DELANOIX', ), - bio: - 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', - updates: [ - 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', - 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', - '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', - ], - events: [ - Event( - date: '1/20/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Mountain View, California', - link: 'Tickets'), - Event( - date: '1/22/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Austin, Texas', - link: 'Tickets'), - Event( - date: '1/23/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Houston, Texas', - link: 'Tickets'), - Event( - date: '2/8/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Los Angeles, California', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', - author: 'By Jacqueline Stewart', - blurb: - 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', - image: MyArtistImage( - image: 'assets/images/news/concert.jpeg', - sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', - sourceName: 'Anthony DELANOIX', - ), - ) - ], ), - Artist( - id: 'lb', - name: 'Lucas Bryant', + ], + ), + Artist( + id: 'lb', + name: 'Lucas Bryant', + image: MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + bio: + 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', + updates: [ + 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', + 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', + 'We\'re going all in this weekend! How are you doing, Vegas?!', + ], + events: [ + Event( + date: '5/16/22', + title: 'Back To My Hometown Tour', + location: 'Indianapolis, IN', + link: 'Tickets', + ), + Event( + date: '5/18/22', + title: 'Back To My Hometown Tour', + location: 'San Antonio, TX', + link: 'Tickets', + ), + Event( + date: '5/20/22', + title: 'Back To My Hometown Tour', + location: 'Phoenix, AZ', + link: 'Tickets', + ), + Event( + date: '5/23/22', + title: 'Back To My Hometown Tour', + location: 'San Diego, CA', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', + author: 'Lonnie Hall', + blurb: + 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', image: MyArtistImage( image: 'assets/images/albums/artist1-album2.jpg', sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', sourceName: 'Keagan Henman', ), - bio: - 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', - updates: [ - 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', - 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', - 'We\'re going all in this weekend! How are you doing, Vegas?!', - ], - events: [ - Event( - date: '5/16/22', - title: 'Back To My Hometown Tour', - location: 'Indianapolis, IN', - link: 'Tickets'), - Event( - date: '5/18/22', - title: 'Back To My Hometown Tour', - location: 'San Antonio, TX', - link: 'Tickets'), - Event( - date: '5/20/22', - title: 'Back To My Hometown Tour', - location: 'Phoenix, AZ', - link: 'Tickets'), - Event( - date: '5/23/22', - title: 'Back To My Hometown Tour', - location: 'San Diego, CA', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', - author: 'Lonnie Hall', - blurb: - 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', - image: MyArtistImage( - image: 'assets/images/albums/artist1-album2.jpg', - sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', - sourceName: 'Keagan Henman', - ), - ), - ], ), - Artist( - id: 'jonjames', - name: 'Jon James', + ], + ), + Artist( + id: 'jonjames', + name: 'Jon James', + image: MyArtistImage( + image: 'assets/images/artists/joe.jpg', + sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', + sourceName: 'Natalie Runnerstrom', + ), + bio: + 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', + updates: [ + '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', + '4 days until I get to share some of the favorite songs I\'ve ever written with you.', + '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', + ], + events: [ + Event( + date: '10/22/21', + title: 'Falling For You Tour', + location: 'Dallas, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/23/21', + title: 'Falling For You Tour', + location: 'Houston, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/26/21', + title: 'Falling For You Tour', + location: 'Phoenix, Arizona', + link: 'Ticketmaster', + ), + Event( + date: '10/27/21', + title: 'Falling For You Tour', + location: 'Los Angeles, California', + link: 'Ticketmaster', + ), + ], + news: [ + News( + title: + 'Jon James is excited for the release of his sixth album "Falling For You"', + author: 'Top Media Today', + blurb: + 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', image: MyArtistImage( - image: 'assets/images/artists/joe.jpg', - sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', - sourceName: 'Natalie Runnerstrom', + image: 'assets/images/news/recording_studio.jpg', + sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', + sourceName: 'Yohann LIBOT', ), - bio: - 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', - updates: [ - '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', - '4 days until I get to share some of the favorite songs I\'ve ever written with you.', - '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', - ], - events: [ - Event( - date: '10/22/21', - title: 'Falling For You Tour', - location: 'Dallas, Texas', - link: 'Ticketmaster'), - Event( - date: '10/23/21', - title: 'Falling For You Tour', - location: 'Houston, Texas', - link: 'Ticketmaster'), - Event( - date: '10/26/21', - title: 'Falling For You Tour', - location: 'Phoenix, Arizona', - link: 'Ticketmaster'), - Event( - date: '10/27/21', - title: 'Falling For You Tour', - location: 'Los Angeles, California', - link: 'Ticketmaster'), - ], - news: [ - News( - title: - 'Jon James is excited for the release of his sixth album "Falling For You"', - author: 'Top Media Today', - blurb: - 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', - image: MyArtistImage( - image: 'assets/images/news/recording_studio.jpg', - sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', - sourceName: 'Yohann LIBOT'), - ) - ], ), - ]; + ], + ), + ]; Artist? getArtist(String id) { return artists.firstWhereOrNull((artist) => artist.id == id); diff --git a/boring_to_beautiful/step_04/lib/src/shared/providers/playlists.dart b/boring_to_beautiful/step_04/lib/src/shared/providers/playlists.dart index e8bab994dd..f27f71b3ec 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/providers/playlists.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/providers/playlists.dart @@ -18,41 +18,50 @@ class PlaylistsProvider { static List images() { return [ const MyArtistImage( - image: 'assets/images/playlists/favorite.jpg', - sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/favorite.jpg', + sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/austin.jpg', - sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', - sourceName: 'Carlos Alfonso'), + image: 'assets/images/playlists/austin.jpg', + sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', + sourceName: 'Carlos Alfonso', + ), const MyArtistImage( - image: 'assets/images/playlists/reading.jpg', - sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', - sourceName: 'Alexandra Fuller'), + image: 'assets/images/playlists/reading.jpg', + sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', + sourceName: 'Alexandra Fuller', + ), const MyArtistImage( - image: 'assets/images/playlists/workout.jpg', - sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/workout.jpg', + sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/calm.jpg', - sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', - sourceName: 'Jared Rice'), + image: 'assets/images/playlists/calm.jpg', + sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', + sourceName: 'Jared Rice', + ), const MyArtistImage( - image: 'assets/images/playlists/coffee.jpg', - sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', - sourceName: 'Nathan Dumlao'), + image: 'assets/images/playlists/coffee.jpg', + sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', + sourceName: 'Nathan Dumlao', + ), const MyArtistImage( - image: 'assets/images/playlists/piano.jpg', - sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', - sourceName: 'Jordan Whitfield'), + image: 'assets/images/playlists/piano.jpg', + sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', + sourceName: 'Jordan Whitfield', + ), const MyArtistImage( - image: 'assets/images/playlists/studying.jpg', - sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', - sourceName: 'Humble Lamb'), + image: 'assets/images/playlists/studying.jpg', + sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', + sourceName: 'Humble Lamb', + ), const MyArtistImage( - image: 'assets/images/playlists/jazz.jpg', - sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', - sourceName: 'dimitri.photography'), + image: 'assets/images/playlists/jazz.jpg', + sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', + sourceName: 'dimitri.photography', + ), ]; } @@ -85,8 +94,10 @@ class PlaylistsProvider { ); } - static final List _randomPlaylists = - List.generate(10, (index) => randomLengthPlaylist()); + static final List _randomPlaylists = List.generate( + 10, + (index) => randomLengthPlaylist(), + ); } String randomId() { diff --git a/boring_to_beautiful/step_04/lib/src/shared/providers/songs.dart b/boring_to_beautiful/step_04/lib/src/shared/providers/songs.dart index ed018a83ff..f1205f2dcb 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/providers/songs.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/providers/songs.dart @@ -52,9 +52,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:35'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album2.jpg', - sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', - sourceName: 'Alexandru Acea'), + image: 'assets/images/albums/artist4-album2.jpg', + sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', + sourceName: 'Alexandru Acea', + ), ), RankedSong( 2, @@ -62,9 +63,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:52'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album1.jpg', - sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', - sourceName: 'Jr Korpa'), + image: 'assets/images/albums/artist4-album1.jpg', + sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', + sourceName: 'Jr Korpa', + ), ), RankedSong( 3, @@ -72,9 +74,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:39'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album3.jpg', - sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', - sourceName: 'Stormseeker'), + image: 'assets/images/albums/artist4-album3.jpg', + sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', + sourceName: 'Stormseeker', + ), ), RankedSong( 1, diff --git a/boring_to_beautiful/step_04/lib/src/shared/providers/theme.dart b/boring_to_beautiful/step_04/lib/src/shared/providers/theme.dart index f05527ff8f..5c2dd59042 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/providers/theme.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/providers/theme.dart @@ -28,12 +28,13 @@ class ThemeSettingChange extends Notification { } class ThemeProvider extends InheritedWidget { - const ThemeProvider( - {super.key, - required this.settings, - required this.lightDynamic, - required this.darkDynamic, - required super.child}); + const ThemeProvider({ + super.key, + required this.settings, + required this.lightDynamic, + required this.darkDynamic, + required super.child, + }); final ValueNotifier settings; final ColorScheme? lightDynamic; @@ -59,8 +60,9 @@ class ThemeProvider extends InheritedWidget { Color blend(Color targetColor) { return Color( - // ignore: deprecated_member_use - Blend.harmonize(targetColor.value, settings.value.sourceColor.value)); + // ignore: deprecated_member_use + Blend.harmonize(targetColor.value, settings.value.sourceColor.value), + ); } Color source(Color? target) { @@ -72,18 +74,18 @@ class ThemeProvider extends InheritedWidget { } ColorScheme colors(Brightness brightness, Color? targetColor) { - final dynamicPrimary = brightness == Brightness.light - ? lightDynamic?.primary - : darkDynamic?.primary; + final dynamicPrimary = + brightness == Brightness.light + ? lightDynamic?.primary + : darkDynamic?.primary; return ColorScheme.fromSeed( seedColor: dynamicPrimary ?? source(targetColor), brightness: brightness, ); } - ShapeBorder get shapeMedium => RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ); + ShapeBorder get shapeMedium => + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)); CardTheme cardTheme() { return CardTheme( @@ -113,21 +115,13 @@ class ThemeProvider extends InheritedWidget { labelColor: colors.secondary, unselectedLabelColor: colors.onSurfaceVariant, indicator: BoxDecoration( - border: Border( - bottom: BorderSide( - color: colors.secondary, - width: 2, - ), - ), + border: Border(bottom: BorderSide(color: colors.secondary, width: 2)), ), ); } BottomAppBarTheme bottomAppBarTheme(ColorScheme colors) { - return BottomAppBarTheme( - color: colors.surface, - elevation: 0, - ); + return BottomAppBarTheme(color: colors.surface, elevation: 0); } BottomNavigationBarThemeData bottomNavigationBarTheme(ColorScheme colors) { @@ -146,9 +140,7 @@ class ThemeProvider extends InheritedWidget { } DrawerThemeData drawerTheme(ColorScheme colors) { - return DrawerThemeData( - backgroundColor: colors.surface, - ); + return DrawerThemeData(backgroundColor: colors.surface); } ThemeData light([Color? targetColor]) { @@ -207,10 +199,7 @@ class ThemeProvider extends InheritedWidget { } class ThemeSettings { - ThemeSettings({ - required this.sourceColor, - required this.themeMode, - }); + ThemeSettings({required this.sourceColor, required this.themeMode}); final Color sourceColor; final ThemeMode themeMode; @@ -221,10 +210,7 @@ Color randomColor() { } // Custom Colors -const linkColor = CustomColor( - name: 'Link Color', - color: Color(0xFF00B0FF), -); +const linkColor = CustomColor(name: 'Link Color', color: Color(0xFF00B0FF)); class CustomColor { const CustomColor({ diff --git a/boring_to_beautiful/step_04/lib/src/shared/router.dart b/boring_to_beautiful/step_04/lib/src/shared/router.dart index 3efb7362fa..db82627246 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/router.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/router.dart @@ -20,11 +20,7 @@ final artistsProvider = ArtistsProvider(); final playlistsProvider = PlaylistsProvider(); const List destinations = [ - NavigationDestination( - label: 'Home', - icon: Icon(Icons.home), - route: '/', - ), + NavigationDestination(label: 'Home', icon: Icon(Icons.home), route: '/'), NavigationDestination( label: 'Playlists', icon: Icon(Icons.playlist_add_check), @@ -56,41 +52,46 @@ final appRouter = GoRouter( // HomeScreen GoRoute( path: '/', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 0, - child: HomeScreen(), - ), - ), + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 0, + child: HomeScreen(), + ), + ), ), // PlaylistHomeScreen GoRoute( path: '/playlists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 1, - child: PlaylistHomeScreen(), - ), - ), - routes: [ - GoRoute( - path: ':pid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 1, - child: PlaylistScreen( - playlist: playlistsProvider - .getPlaylist(state.pathParameters['pid']!)!, - ), + child: PlaylistHomeScreen(), ), ), + routes: [ + GoRoute( + path: ':pid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 1, + child: PlaylistScreen( + playlist: + playlistsProvider.getPlaylist( + state.pathParameters['pid']!, + )!, + ), + ), + ), ), ], ), @@ -98,28 +99,32 @@ final appRouter = GoRouter( // ArtistHomeScreen GoRoute( path: '/artists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 2, - child: ArtistsScreen(), - ), - ), - routes: [ - GoRoute( - path: ':aid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 2, - child: ArtistScreen( - artist: - artistsProvider.getArtist(state.pathParameters['aid']!)!, - ), + child: ArtistsScreen(), ), ), + routes: [ + GoRoute( + path: ':aid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 2, + child: ArtistScreen( + artist: + artistsProvider.getArtist( + state.pathParameters['aid']!, + )!, + ), + ), + ), // builder: (context, state) => ArtistScreen( // id: state.params['aid']!, // ), @@ -129,14 +134,15 @@ final appRouter = GoRouter( for (final route in destinations.skip(3)) GoRoute( path: route.route, - pageBuilder: (context, state) => MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: destinations.indexOf(route), - child: const SizedBox(), - ), - ), + pageBuilder: + (context, state) => MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: destinations.indexOf(route), + child: const SizedBox(), + ), + ), ), ], ); diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/adaptive_image_card.dart b/boring_to_beautiful/step_04/lib/src/shared/views/adaptive_image_card.dart index 07cab2b0d7..99f5be0837 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/adaptive_image_card.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/adaptive_image_card.dart @@ -36,20 +36,13 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), + child: Padding(padding: const EdgeInsets.all(20), child: child), ), ], ); } return Padding( - padding: const EdgeInsets.only( - left: 20, - bottom: 20, - top: 20, - ), + padding: const EdgeInsets.only(left: 20, bottom: 20, top: 20), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, @@ -65,11 +58,8 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), - ) + child: Padding(padding: const EdgeInsets.all(20), child: child), + ), ], ), ); diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/adaptive_navigation.dart b/boring_to_beautiful/step_04/lib/src/shared/views/adaptive_navigation.dart index 92734c9005..aa78766292 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/adaptive_navigation.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/adaptive_navigation.dart @@ -30,12 +30,15 @@ class AdaptiveNavigation extends StatelessWidget { NavigationRail( extended: dimens.maxWidth >= 800, minExtendedWidth: 180, - destinations: destinations - .map((e) => NavigationRailDestination( - icon: e.icon, - label: Text(e.label), - )) - .toList(), + destinations: + destinations + .map( + (e) => NavigationRailDestination( + icon: e.icon, + label: Text(e.label), + ), + ) + .toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ), diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/article_content.dart b/boring_to_beautiful/step_04/lib/src/shared/views/article_content.dart index af243f015b..c5a0b5e62a 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/article_content.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/article_content.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class ArticleContent extends StatelessWidget { - const ArticleContent({ - super.key, - required this.child, - this.maxWidth = 960, - }); + const ArticleContent({super.key, required this.child, this.maxWidth = 960}); final double maxWidth; final Widget child; @@ -19,13 +15,8 @@ class ArticleContent extends StatelessWidget { return Container( alignment: Alignment.topCenter, child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: maxWidth, - ), - child: Padding( - padding: const EdgeInsets.all(15), - child: child, - ), + constraints: BoxConstraints(maxWidth: maxWidth), + child: Padding(padding: const EdgeInsets.all(15), child: child), ), ); } diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/bottom_bar.dart b/boring_to_beautiful/step_04/lib/src/shared/views/bottom_bar.dart index 06e085a9b6..bf15ad9bb0 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/bottom_bar.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/bottom_bar.dart @@ -26,16 +26,18 @@ class BottomBar extends StatelessWidget implements PreferredSizeWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => _BottomBar( - artist: state.songWithProgress?.song.artist, - isMuted: state.isMuted, - isPlaying: state.isPlaying, - preferredSize: preferredSize, - progress: state.songWithProgress?.progress, - song: state.songWithProgress?.song, - togglePlayPause: () => bloc.add(const PlaybackEvent.togglePlayPause()), - volume: state.volume, - ), + builder: + (context, state) => _BottomBar( + artist: state.songWithProgress?.song.artist, + isMuted: state.isMuted, + isPlaying: state.isPlaying, + preferredSize: preferredSize, + progress: state.songWithProgress?.progress, + song: state.songWithProgress?.song, + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), + volume: state.volume, + ), ); } } @@ -63,10 +65,12 @@ class _BottomBar extends StatelessWidget { @override Widget build(BuildContext context) => LayoutBuilder( - builder: (context, constraints) => constraints.isTablet - ? _buildDesktopBar(context, constraints) - : _buildMobileBar(context, constraints), - ); + builder: + (context, constraints) => + constraints.isTablet + ? _buildDesktopBar(context, constraints) + : _buildMobileBar(context, constraints), + ); Widget _buildDesktopBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -79,10 +83,7 @@ class _BottomBar extends StatelessWidget { Row( children: [ _AlbumArt(song: song), - _SongDetails( - artist: artist, - song: song, - ), + _SongDetails(artist: artist, song: song), ], ), Flexible( @@ -95,12 +96,7 @@ class _BottomBar extends StatelessWidget { isPlaying: isPlaying, togglePlayPause: togglePlayPause, ), - Center( - child: _ProgressBar( - progress: progress, - song: song, - ), - ), + Center(child: _ProgressBar(progress: progress, song: song)), ], ), ), @@ -114,17 +110,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _FullScreenPlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _FullScreenPlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -136,10 +133,10 @@ class _BottomBar extends StatelessWidget { } double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; Widget _buildMobileBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -152,17 +149,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _MobilePlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _MobilePlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -191,10 +189,7 @@ class _BottomBar extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - song?.title ?? '', - style: context.labelMedium, - ), + Text(song?.title ?? '', style: context.labelMedium), Text( song?.artist.name ?? '', style: context.labelSmall, @@ -220,10 +215,7 @@ class _BottomBar extends StatelessWidget { } class _ProgressBar extends StatelessWidget { - const _ProgressBar({ - required this.progress, - required this.song, - }); + const _ProgressBar({required this.progress, required this.song}); /// Current playback depth into user is into [song]. final Duration? progress; @@ -231,10 +223,10 @@ class _ProgressBar extends StatelessWidget { final Song? song; double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; @override Widget build(BuildContext context) { @@ -252,29 +244,32 @@ class _ProgressBar extends StatelessWidget { children: [ const SizedBox(width: 10), SizedBox( - child: progress != null - ? Text(progress!.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + progress != null + ? Text( + progress!.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), Expanded( child: Slider( value: songProgress.clamp(0, 1), divisions: 1000, onChanged: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); }, onChangeEnd: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); // Because dragging pauses auto playback, resume playing // once the user finishes dragging. - BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ); + BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()); }, activeColor: Theme.of(context).colorScheme.onTertiaryContainer, @@ -282,12 +277,15 @@ class _ProgressBar extends StatelessWidget { ), ), SizedBox( - child: song != null - ? Text(song!.length.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + song != null + ? Text( + song!.length.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), - const SizedBox(width: 10) + const SizedBox(width: 10), ], ), ); @@ -297,10 +295,7 @@ class _ProgressBar extends StatelessWidget { } class _VolumeBar extends StatelessWidget { - const _VolumeBar({ - required this.volume, - required this.isMuted, - }); + const _VolumeBar({required this.volume, required this.isMuted}); /// The percentage, between 0 and 1, at which to render the volume slider. final double volume; @@ -313,17 +308,16 @@ class _VolumeBar extends StatelessWidget { @override Widget build(BuildContext context) { return ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 200, - ), + constraints: const BoxConstraints(maxWidth: 200), child: Padding( padding: const EdgeInsets.all(8), child: Row( children: [ GestureDetector( - onTap: () => BlocProvider.of(context).add( - const PlaybackEvent.toggleMute(), - ), + onTap: + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.toggleMute()), child: Icon(!isMuted ? Icons.volume_mute : Icons.volume_off), ), Expanded( @@ -332,8 +326,10 @@ class _VolumeBar extends StatelessWidget { min: 0, max: 1, divisions: 100, - onChanged: (newValue) => BlocProvider.of(context) - .add(PlaybackEvent.setVolume(newValue)), + onChanged: + (newValue) => BlocProvider.of( + context, + ).add(PlaybackEvent.setVolume(newValue)), activeColor: Theme.of(context).colorScheme.onTertiaryContainer, inactiveColor: Theme.of(context).colorScheme.onSurface, ), @@ -356,49 +352,50 @@ class _PlaybackControls extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - double iconSize = 24; - double playIconSize = 32; - double innerPadding = 16; - double playPadding = 20; - if (constraints.maxWidth < 500) { - iconSize = 21; - playIconSize = 28; - innerPadding = 14; - playPadding = 17; - } - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( + return LayoutBuilder( + builder: (context, constraints) { + double iconSize = 24; + double playIconSize = 32; + double innerPadding = 16; + double playPadding = 20; + if (constraints.maxWidth < 500) { + iconSize = 21; + playIconSize = 28; + innerPadding = 14; + playPadding = 17; + } + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( padding: EdgeInsets.fromLTRB(0, 0, innerPadding, 0), - child: Icon(Icons.shuffle, size: iconSize)), - Icon(Icons.skip_previous, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), - child: GestureDetector( - onTap: togglePlayPause, - child: Icon( - isPlaying ? Icons.pause_circle : Icons.play_circle, - size: playIconSize, + child: Icon(Icons.shuffle, size: iconSize), + ), + Icon(Icons.skip_previous, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), + child: GestureDetector( + onTap: togglePlayPause, + child: Icon( + isPlaying ? Icons.pause_circle : Icons.play_circle, + size: playIconSize, + ), ), ), - ), - Icon(Icons.skip_next, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), - child: Icon(Icons.repeat, size: iconSize), - ), - ], - ); - }); + Icon(Icons.skip_next, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), + child: Icon(Icons.repeat, size: iconSize), + ), + ], + ); + }, + ); } } class _AlbumArt extends StatelessWidget { - const _AlbumArt({ - required this.song, - }); + const _AlbumArt({required this.song}); final Song? song; @@ -409,21 +406,17 @@ class _AlbumArt extends StatelessWidget { child: SizedBox( width: 70, height: 70, - child: song != null - ? Image.asset(song!.image.image) - : Container( - color: Colors.pink[100], - ), + child: + song != null + ? Image.asset(song!.image.image) + : Container(color: Colors.pink[100]), ), ); } } class _SongDetails extends StatelessWidget { - const _SongDetails({ - required this.artist, - required this.song, - }); + const _SongDetails({required this.artist, required this.song}); final Artist? artist; final Song? song; @@ -455,9 +448,7 @@ class _SongDetails extends StatelessWidget { } class _FullScreenPlayer extends StatefulWidget { - const _FullScreenPlayer({ - required this.onClose, - }); + const _FullScreenPlayer({required this.onClose}); final VoidCallback onClose; @@ -489,29 +480,33 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return MouseRegion( - onHover: (_) { - setState(() { - _showControls = true; - }); - hideControls(); + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return MouseRegion( + onHover: (_) { + setState(() { + _showControls = true; + }); + hideControls(); + }, + child: buildPlayer(context, state, dimens), + ); }, - child: buildPlayer(context, state, dimens), - ); - }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; final song = current?.song; @@ -519,26 +514,25 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { fit: StackFit.expand, children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - song!.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset(song!.image.image, fit: BoxFit.cover), ), ), - ), ), Positioned( top: 20, right: 20, child: IconButton( - color: song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const Icon(Icons.fullscreen_exit), onPressed: widget.onClose, ), @@ -569,8 +563,9 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { Text( song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 20, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 20, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -582,10 +577,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { right: 20, left: 20, bottom: dimens.biggest.height * 0.2, - child: _ProgressBar( - progress: current?.progress, - song: song, - ), + child: _ProgressBar(progress: current?.progress, song: song), ), Positioned( right: 20, @@ -598,8 +590,8 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), @@ -611,9 +603,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { } class _MobilePlayer extends StatelessWidget { - const _MobilePlayer({ - required this.onClose, - }); + const _MobilePlayer({required this.onClose}); final VoidCallback onClose; @@ -622,46 +612,52 @@ class _MobilePlayer extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return buildPlayer(context, state, dimens); - }, + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return buildPlayer(context, state, dimens); + }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; return Stack( children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - current.song.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset( + current.song.image.image, + fit: BoxFit.cover, + ), ), ), - ), ), Positioned( top: 20, left: 20, child: IconButton( - color: current?.song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + current?.song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const RotatedBox( quarterTurns: 1, child: Icon(Icons.chevron_right), @@ -676,10 +672,7 @@ class _MobilePlayer extends StatelessWidget { left: 0, right: 0, height: dimens.biggest.height * 0.5, - child: Image.asset( - current.song.image.image, - fit: BoxFit.contain, - ), + child: Image.asset(current.song.image.image, fit: BoxFit.contain), ), Positioned( left: 0, @@ -705,8 +698,9 @@ class _MobilePlayer extends StatelessWidget { Text( current.song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 12, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 12, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -718,15 +712,12 @@ class _MobilePlayer extends StatelessWidget { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), - _ProgressBar( - progress: current.progress, - song: current.song, - ), + _ProgressBar(progress: current.progress, song: current.song), ], ), ), diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/brightness_toggle.dart b/boring_to_beautiful/step_04/lib/src/shared/views/brightness_toggle.dart index 46dde4810f..5b5332392b 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/brightness_toggle.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/brightness_toggle.dart @@ -13,9 +13,10 @@ class BrightnessToggle extends StatelessWidget { Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; return IconButton( - icon: Theme.of(context).brightness == Brightness.light - ? const Icon(Icons.brightness_3) - : const Icon(Icons.brightness_7), + icon: + Theme.of(context).brightness == Brightness.light + ? const Icon(Icons.brightness_3) + : const Icon(Icons.brightness_7), onPressed: () { final themeProvider = ThemeProvider.of(context); final settings = themeProvider.settings.value; diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/center_row.dart b/boring_to_beautiful/step_04/lib/src/shared/views/center_row.dart index 36d428e3b8..c1f3effcc2 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/center_row.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/center_row.dart @@ -5,23 +5,12 @@ import 'package:flutter/material.dart'; class CenterRow extends StatelessWidget { - const CenterRow({ - super.key, - required this.child, - }); + const CenterRow({super.key, required this.child}); final Widget child; @override Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Center( - child: child, - ), - ), - ], - ); + return Row(children: [Expanded(child: Center(child: child))]); } } diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/clickable.dart b/boring_to_beautiful/step_04/lib/src/shared/views/clickable.dart index cd7ef46268..f192f0b135 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/clickable.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/clickable.dart @@ -14,10 +14,7 @@ class Clickable extends StatelessWidget { Widget build(BuildContext context) { return MouseRegion( cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: onTap, - child: child, - ), + child: GestureDetector(onTap: onTap, child: child), ); } } diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/events.dart b/boring_to_beautiful/step_04/lib/src/shared/views/events.dart index ed38465460..ab9140e56d 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/events.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/events.dart @@ -24,43 +24,18 @@ class Events extends StatelessWidget { child: DataTable( horizontalMargin: 5.0, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], rows: [ for (final event in artist.events) DataRow( cells: [ - DataCell( - Text(event.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(event.title)), - ]), - ), - DataCell( - Text(event.location), - ), + DataCell(Text(event.date)), + DataCell(Row(children: [Expanded(child: Text(event.title))])), + DataCell(Text(event.location)), DataCell( Clickable( child: Text( @@ -70,8 +45,9 @@ class Events extends StatelessWidget { decoration: TextDecoration.underline, ), ), - onTap: () => - launchUrl(Uri.parse('https://docs.flutter.dev')), + onTap: + () => + launchUrl(Uri.parse('https://docs.flutter.dev')), ), ), ], diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/hover_toggle.dart b/boring_to_beautiful/step_04/lib/src/shared/views/hover_toggle.dart index ec98c2863c..649cfcab63 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/hover_toggle.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/hover_toggle.dart @@ -31,9 +31,10 @@ class _HoverToggleState extends State with MaterialStateMixin { cursor: isHovered ? SystemMouseCursors.click : MouseCursor.defer, onEnter: (_) => setMaterialState(WidgetState.hovered, true), onExit: (_) => setMaterialState(WidgetState.hovered, false), - child: widget.mode == HoverMode.replace - ? _buildReplaceableChildren() - : _buildChildrenStack(), + child: + widget.mode == HoverMode.replace + ? _buildReplaceableChildren() + : _buildChildrenStack(), ), ); } @@ -41,12 +42,7 @@ class _HoverToggleState extends State with MaterialStateMixin { Widget _buildChildrenStack() { Widget child = isHovered ? Opacity(opacity: 0.2, child: widget.child) : widget.child; - return Stack( - children: [ - child, - if (isHovered) widget.hoverChild, - ], - ); + return Stack(children: [child, if (isHovered) widget.hoverChild]); } Widget _buildReplaceableChildren() => diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/hoverable_song_play_button.dart b/boring_to_beautiful/step_04/lib/src/shared/views/hoverable_song_play_button.dart index 512f3d1d3c..dd588e3dbe 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/hoverable_song_play_button.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/hoverable_song_play_button.dart @@ -29,9 +29,10 @@ class HoverableSongPlayButton extends StatelessWidget { hoverChild: Center( child: GestureDetector( child: const Icon(Icons.play_arrow), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ), ), mode: hoverMode, diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/image_card.dart b/boring_to_beautiful/step_04/lib/src/shared/views/image_card.dart index 0af9f75f33..6e7f6cd42d 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/image_card.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/image_card.dart @@ -7,13 +7,14 @@ import '../../shared/extensions.dart'; import 'outlined_card.dart'; class ImageCard extends StatelessWidget { - const ImageCard( - {super.key, - required this.title, - required this.details, - required this.image, - this.subtitle, - this.clickable = false}); + const ImageCard({ + super.key, + required this.title, + required this.details, + required this.image, + this.subtitle, + this.clickable = false, + }); final String title; final String? subtitle; @@ -28,54 +29,51 @@ class ImageCard extends StatelessWidget { clickable: clickable, child: Padding( padding: const EdgeInsets.all(8.0), - child: LayoutBuilder(builder: (context, constraints) { - return Row( - children: [ - if (constraints.maxWidth > 600) - SizedBox( - width: 170, - height: 170, - child: Image.asset( - image, - fit: BoxFit.cover, + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + if (constraints.maxWidth > 600) + SizedBox( + width: 170, + height: 170, + child: Image.asset(image, fit: BoxFit.cover), ), - ), - Expanded( - child: Padding( - padding: padding, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 5), - child: Text( - title, - style: context.titleLarge! - .copyWith(fontWeight: FontWeight.bold), - ), - ), - if (subtitle != null) + Expanded( + child: Padding( + padding: padding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Padding( - padding: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only(bottom: 5), child: Text( - subtitle!, - style: context.labelMedium, + title, + style: context.titleLarge!.copyWith( + fontWeight: FontWeight.bold, + ), ), ), - Text( - details, - style: context.labelMedium?.copyWith( - fontSize: 16, - height: 1.25, + if (subtitle != null) + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text(subtitle!, style: context.labelMedium), + ), + Text( + details, + style: context.labelMedium?.copyWith( + fontSize: 16, + height: 1.25, + ), ), - ), - ], + ], + ), ), ), - ), - ], - ); - }), + ], + ); + }, + ), ), ); } diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/image_tile.dart b/boring_to_beautiful/step_04/lib/src/shared/views/image_tile.dart index 4f2bbebb96..dd99152af5 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/image_tile.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/image_tile.dart @@ -21,19 +21,17 @@ class ImageTile extends StatelessWidget { @override Widget build(BuildContext context) { return OutlinedCard( - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Expanded( - child: Image.asset(image, fit: BoxFit.cover), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [Expanded(child: Image.asset(image, fit: BoxFit.cover))], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), child: Text( title, @@ -43,20 +41,25 @@ class ImageTile extends StatelessWidget { ), overflow: TextOverflow.ellipsis, maxLines: 1, - )), - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text( - subtitle, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center, + ), ), - ), - ], - ) - ]), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 10, + ), + child: Text( + subtitle, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ], + ), + ], + ), ); } } diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/step_04/lib/src/shared/views/outlined_card.dart index 0d886e2c54..ff49275dc9 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/outlined_card.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/outlined_card.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class OutlinedCard extends StatefulWidget { - const OutlinedCard({ - super.key, - required this.child, - this.clickable = true, - }); + const OutlinedCard({super.key, required this.child, this.clickable = true}); final Widget child; final bool clickable; @@ -22,9 +18,10 @@ class _OutlinedCardState extends State { @override Widget build(BuildContext context) { return MouseRegion( - cursor: widget.clickable - ? SystemMouseCursors.click - : SystemMouseCursors.basic, + cursor: + widget.clickable + ? SystemMouseCursors.click + : SystemMouseCursors.basic, child: Container( decoration: BoxDecoration( border: Border.all( diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/play_pause_listener.dart b/boring_to_beautiful/step_04/lib/src/shared/views/play_pause_listener.dart index 52fad00863..6b4fc66709 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/play_pause_listener.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/play_pause_listener.dart @@ -16,10 +16,7 @@ import '../playback/bloc/bloc.dart'; /// shortcuts. By sitting below that machinery, this installs a global Spacebar /// listener which toggles Playback, as is customary in music-playing apps. class PlayPauseListener extends StatelessWidget { - const PlayPauseListener({ - super.key, - required this.child, - }); + const PlayPauseListener({super.key, required this.child}); final Widget child; @@ -28,9 +25,7 @@ class PlayPauseListener extends StatelessWidget { // Immediately catch any [_PlayPauseIntent] events released by the inner // [Shortcuts] widget. return Actions( - actions: >{ - _PlayPauseIntent: _PlayPauseAction(), - }, + actions: >{_PlayPauseIntent: _PlayPauseAction()}, child: Shortcuts( // Register a shortcut for Spacebar presses that release a // [_PlayPauseIntent] up the tree to the nearest [Actions] widget. @@ -38,9 +33,9 @@ class PlayPauseListener extends StatelessWidget { const SingleActivator(LogicalKeyboardKey.space): _PlayPauseIntent( // Create a closure which sends a [TogglePlayPause] event to the // [PlaybackBloc]. - () => BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ), + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()), ), }, child: child, diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/root_layout.dart b/boring_to_beautiful/step_04/lib/src/shared/views/root_layout.dart index 878b57d729..ff6270248c 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/root_layout.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/root_layout.dart @@ -29,36 +29,37 @@ class RootLayout extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => LayoutBuilder(builder: (context, dimens) { - void onSelected(int index) { - final destination = router.destinations[index]; - go.GoRouter.of(context).go(destination.route); - } + builder: + (context, state) => LayoutBuilder( + builder: (context, dimens) { + void onSelected(int index) { + final destination = router.destinations[index]; + go.GoRouter.of(context).go(destination.route); + } - final current = state.songWithProgress; - return AdaptiveNavigation( - key: _navigationRailKey, - destinations: router.destinations - .map((e) => NavigationDestination( - icon: e.icon, - label: e.label, - )) - .toList(), - selectedIndex: currentIndex, - onDestinationSelected: onSelected, - child: Column( - children: [ - Expanded( - child: _Switcher( - key: _switcherKey, - child: child, + final current = state.songWithProgress; + return AdaptiveNavigation( + key: _navigationRailKey, + destinations: + router.destinations + .map( + (e) => NavigationDestination( + icon: e.icon, + label: e.label, + ), + ) + .toList(), + selectedIndex: currentIndex, + onDestinationSelected: onSelected, + child: Column( + children: [ + Expanded(child: _Switcher(key: _switcherKey, child: child)), + if (current != null) const BottomBar(), + ], ), - ), - if (current != null) const BottomBar(), - ], + ); + }, ), - ); - }), ); } } @@ -66,21 +67,18 @@ class RootLayout extends StatelessWidget { class _Switcher extends StatelessWidget { final Widget child; - const _Switcher({ - required this.child, - super.key, - }); + const _Switcher({required this.child, super.key}); @override Widget build(BuildContext context) { return UniversalPlatform.isDesktop ? child : AnimatedSwitcher( - key: key, - duration: const Duration(milliseconds: 200), - switchInCurve: Curves.easeInOut, - switchOutCurve: Curves.easeInOut, - child: child, - ); + key: key, + duration: const Duration(milliseconds: 200), + switchInCurve: Curves.easeInOut, + switchOutCurve: Curves.easeInOut, + child: child, + ); } } diff --git a/boring_to_beautiful/step_04/lib/src/shared/views/sidebar.dart b/boring_to_beautiful/step_04/lib/src/shared/views/sidebar.dart index 78c19b4d22..8815223b22 100644 --- a/boring_to_beautiful/step_04/lib/src/shared/views/sidebar.dart +++ b/boring_to_beautiful/step_04/lib/src/shared/views/sidebar.dart @@ -26,10 +26,7 @@ class SideBar extends StatelessWidget { title: const Text('Home'), onTap: () => GoRouter.of(context).go('/'), ), - const ListTile( - leading: Icon(Icons.search), - title: Text('Search'), - ), + const ListTile(leading: Icon(Icons.search), title: Text('Search')), ListTile( leading: const Icon(Icons.person), title: const Text('Artists'), @@ -64,10 +61,7 @@ class PlaylistNav extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(left: 16, top: 16), - child: Text( - 'Playlists', - style: context.titleMedium, - ), + child: Text('Playlists', style: context.titleMedium), ), Expanded( child: ListView( @@ -114,10 +108,9 @@ class _PlaylistNavItemState extends State<_PlaylistNavItem> { @override void initState() { super.initState(); - _focusNode = FocusNode(debugLabel: widget.title) - ..addListener(() { - setState(() => _isSelected = _focusNode.hasPrimaryFocus); - }); + _focusNode = FocusNode(debugLabel: widget.title)..addListener(() { + setState(() => _isSelected = _focusNode.hasPrimaryFocus); + }); } @override diff --git a/boring_to_beautiful/step_04/macos/Podfile b/boring_to_beautiful/step_04/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/boring_to_beautiful/step_04/macos/Podfile +++ b/boring_to_beautiful/step_04/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_04/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_04/macos/Runner.xcodeproj/project.pbxproj index 79604e1785..63e08baa02 100644 --- a/boring_to_beautiful/step_04/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_04/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */; }; - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */; }; + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */, + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */, + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 143267097A016AD19836D89A /* Pods */ = { + isa = PBXGroup; + children = ( + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */, + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */, + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */, + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */, + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */, + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A67056D7D61CD22438BA6931 /* Pods */, + 143267097A016AD19836D89A /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - A67056D7D61CD22438BA6931 /* Pods */ = { - isa = PBXGroup; - children = ( - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */, - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */, - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */, - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */, - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */, - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */, - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */, + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */, + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */, + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */, + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */, + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -361,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */ = { + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -378,7 +378,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */ = { + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +393,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */ = { + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index b9ba5fa149..888bfbb4c7 100644 --- a/boring_to_beautiful/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_04/pubspec.yaml b/boring_to_beautiful/step_04/pubspec.yaml index abe835e2e6..b02c951374 100644 --- a/boring_to_beautiful/step_04/pubspec.yaml +++ b/boring_to_beautiful/step_04/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,14 +13,14 @@ dependencies: adaptive_components: ^0.0.10 adaptive_navigation: ^0.0.10 animations: ^2.0.11 - collection: ^1.19.0 + collection: ^1.19.1 cupertino_icons: ^1.0.8 desktop_window: ^0.4.2 dynamic_color: ^1.7.0 english_words: ^4.0.0 flutter_bloc: ^9.0.0 freezed_annotation: ^2.4.4 - go_router: ^14.7.2 + go_router: ^14.8.0 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/step_05/android/.gitignore b/boring_to_beautiful/step_05/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/boring_to_beautiful/step_05/android/.gitignore +++ b/boring_to_beautiful/step_05/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/boring_to_beautiful/step_05/android/app/build.gradle b/boring_to_beautiful/step_05/android/app/build.gradle deleted file mode 100644 index 59485b6bb8..0000000000 --- a/boring_to_beautiful/step_05/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.myartist" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.myartist" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/boring_to_beautiful/step_05/android/app/build.gradle.kts b/boring_to_beautiful/step_05/android/app/build.gradle.kts new file mode 100644 index 0000000000..b2dbe0393c --- /dev/null +++ b/boring_to_beautiful/step_05/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.myartist" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.myartist" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/boring_to_beautiful/step_05/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt b/boring_to_beautiful/step_05/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt index 1e328c8556..b724a01056 100644 --- a/boring_to_beautiful/step_05/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt +++ b/boring_to_beautiful/step_05/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.myartist import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/boring_to_beautiful/step_05/android/build.gradle b/boring_to_beautiful/step_05/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/boring_to_beautiful/step_05/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/boring_to_beautiful/step_05/android/build.gradle.kts b/boring_to_beautiful/step_05/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/boring_to_beautiful/step_05/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/boring_to_beautiful/step_05/android/gradle.properties b/boring_to_beautiful/step_05/android/gradle.properties index 2597170821..f018a61817 100644 --- a/boring_to_beautiful/step_05/android/gradle.properties +++ b/boring_to_beautiful/step_05/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/boring_to_beautiful/step_05/android/gradle/wrapper/gradle-wrapper.properties b/boring_to_beautiful/step_05/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/boring_to_beautiful/step_05/android/gradle/wrapper/gradle-wrapper.properties +++ b/boring_to_beautiful/step_05/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/boring_to_beautiful/step_05/android/settings.gradle b/boring_to_beautiful/step_05/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/boring_to_beautiful/step_05/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/boring_to_beautiful/step_05/android/settings.gradle.kts b/boring_to_beautiful/step_05/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/boring_to_beautiful/step_05/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/boring_to_beautiful/step_05/ios/Podfile b/boring_to_beautiful/step_05/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/boring_to_beautiful/step_05/ios/Podfile +++ b/boring_to_beautiful/step_05/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.pbxproj index f7d849e7aa..b4912290dd 100644 --- a/boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_05/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */; }; - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */; }; + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,15 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +60,19 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 85CFC060D2B515FA7FCB18AC /* Frameworks */ = { + 6171884CE7EC0B228274CDFE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */, + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */, + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 54241974C43F645BC41820B3 /* Pods */ = { + 4CD80B4456D2B04197B640AC /* Pods */ = { isa = PBXGroup; children = ( - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */, - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */, - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */, - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */, - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */, - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */, + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */, + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */, + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */, + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */, + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */, + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 54241974C43F645BC41820B3 /* Pods */, - DA6AE8ED33598C40BFC9FCAD /* Frameworks */, + 4CD80B4456D2B04197B640AC /* Pods */, + C4E673F63230E3A6805B11E9 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - DA6AE8ED33598C40BFC9FCAD /* Frameworks */ = { + C4E673F63230E3A6805B11E9 /* Frameworks */ = { isa = PBXGroup; children = ( - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */, - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */, + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */, + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */, + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 85CFC060D2B515FA7FCB18AC /* Frameworks */, + 6171884CE7EC0B228274CDFE /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */, + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */, + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,43 +270,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -323,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */ = { + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,7 +340,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */ = { + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/boring_to_beautiful/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_bio.dart b/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_bio.dart index 227b8e91f9..8b614421db 100644 --- a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_bio.dart +++ b/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_bio.dart @@ -18,9 +18,7 @@ class ArtistBio extends StatelessWidget { artist.bio, style: context.bodyLarge!.copyWith( fontSize: 16, - color: context.colors.onSurface.withAlpha( - 222, - ), + color: context.colors.onSurface.withAlpha(222), ), ); } diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_card.dart b/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_card.dart index a63967f51d..1a56376a87 100644 --- a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_card.dart +++ b/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_card.dart @@ -11,10 +11,7 @@ import '../../../shared/views/outlined_card.dart'; import '../../../shared/views/views.dart'; class ArtistCard extends StatelessWidget { - const ArtistCard({ - super.key, - required this.artist, - }); + const ArtistCard({super.key, required this.artist}); final Artist artist; @@ -24,65 +21,66 @@ class ArtistCard extends StatelessWidget { return OutlinedCard( child: LayoutBuilder( - builder: (context, dimens) => Row( - children: [ - SizedBox( - width: dimens.maxWidth * 0.4, - child: Image.asset( - artist.image.image, - fit: BoxFit.cover, - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - artist.name, - style: context.titleMedium, - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - const SizedBox(height: 10), - Text( - artist.bio, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 3, - ), - ]), - ), - if (dimens.maxHeight > 100) - Row( - children: [ - HoverableSongPlayButton( - size: const Size(50, 50), - song: nowPlaying, - child: Icon(Icons.play_circle, - color: context.colors.tertiary), + builder: + (context, dimens) => Row( + children: [ + SizedBox( + width: dimens.maxWidth * 0.4, + child: Image.asset(artist.image.image, fit: BoxFit.cover), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + artist.name, + style: context.titleMedium, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + const SizedBox(height: 10), + Text( + artist.bio, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 3, + ), + ], ), - Text( - nowPlaying.title, - maxLines: 1, - overflow: TextOverflow.clip, - style: context.labelMedium, + ), + if (dimens.maxHeight > 100) + Row( + children: [ + HoverableSongPlayButton( + size: const Size(50, 50), + song: nowPlaying, + child: Icon( + Icons.play_circle, + color: context.colors.tertiary, + ), + ), + Text( + nowPlaying.title, + maxLines: 1, + overflow: TextOverflow.clip, + style: context.labelMedium, + ), + ], ), - ], - ), - ], + ], + ), + ), ), - ), + ], ), - ], - ), ), ); } diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_events.dart b/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_events.dart index 8b064759c6..58b61b37df 100644 --- a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_events.dart +++ b/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_events.dart @@ -70,53 +70,32 @@ class ArtistEvents extends StatelessWidget { ); }, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], - rowBuilder: (item, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - Text(item.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(item.title)), - ]), - ), - DataCell( - Text(item.location), - ), - DataCell( - Clickable( - child: Text( - item.link, - style: TextStyle( - color: linkColor.value(theme), - decoration: TextDecoration.underline, + rowBuilder: + (item, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell(Text(item.date)), + DataCell(Row(children: [Expanded(child: Text(item.title))])), + DataCell(Text(item.location)), + DataCell( + Clickable( + child: Text( + item.link, + style: TextStyle( + color: linkColor.value(theme), + decoration: TextDecoration.underline, + ), + ), + onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ), ), - ), - onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ], ), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_ranked_songs.dart b/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_ranked_songs.dart index e484ecb3d7..3d1f4e2cf1 100644 --- a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_ranked_songs.dart +++ b/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_ranked_songs.dart @@ -27,52 +27,42 @@ class ArtistRankedSongs extends StatelessWidget { title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), trailing: Text(song.ranking.toString()), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ); }, columns: const [ - DataColumn( - label: Text( - 'Ranking', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Title', - ), - ), - DataColumn( - label: Text( - 'Length', - ), - ), + DataColumn(label: Text('Ranking'), numeric: true), + DataColumn(label: Text('Title')), + DataColumn(label: Text('Length')), ], - rowBuilder: (song, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - HoverableSongPlayButton( - song: song, - child: Center( - child: Text(song.ranking.toString()), - ), + rowBuilder: + (song, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + HoverableSongPlayButton( + song: song, + child: Center(child: Text(song.ranking.toString())), + ), + ), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(song.image.image), + ), + const SizedBox(width: 5.0), + Expanded(child: Text(song.title)), + ], + ), + ), + DataCell(Text(song.length.toHumanizedString())), + ], ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(song.image.image), - ), - const SizedBox(width: 5.0), - Expanded(child: Text(song.title)), - ]), - ), - DataCell( - Text(song.length.toHumanizedString()), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_updates.dart b/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_updates.dart index e5b8bb5fe9..a0fabf7330 100644 --- a/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_updates.dart +++ b/boring_to_beautiful/step_05/lib/src/features/artists/view/artist_updates.dart @@ -30,7 +30,7 @@ class ArtistUpdates extends StatelessWidget { child: Text(update), ), ), - ) + ), ], ); } diff --git a/boring_to_beautiful/step_05/lib/src/features/artists/view/artists_screen.dart b/boring_to_beautiful/step_05/lib/src/features/artists/view/artists_screen.dart index 8afe759807..225d74847b 100644 --- a/boring_to_beautiful/step_05/lib/src/features/artists/view/artists_screen.dart +++ b/boring_to_beautiful/step_05/lib/src/features/artists/view/artists_screen.dart @@ -17,33 +17,33 @@ class ArtistsScreen extends StatelessWidget { Widget build(BuildContext context) { final artistsProvider = ArtistsProvider(); final artists = artistsProvider.artists; - return LayoutBuilder(builder: (context, constraints) { - return Scaffold( - primary: false, - appBar: AppBar( - title: const Text('ARTISTS'), - toolbarHeight: kToolbarHeight * 2, - ), - body: GridView.builder( - padding: const EdgeInsets.all(15), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), - childAspectRatio: 2.5, - mainAxisSpacing: 10, - crossAxisSpacing: 10, + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + primary: false, + appBar: AppBar( + title: const Text('ARTISTS'), + toolbarHeight: kToolbarHeight * 2, ), - itemCount: artists.length, - itemBuilder: (context, index) { - final artist = artists[index]; - return GestureDetector( - child: ArtistCard( - artist: artist, - ), - onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), - ); - }, - ), - ); - }); + body: GridView.builder( + padding: const EdgeInsets.all(15), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), + childAspectRatio: 2.5, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + ), + itemCount: artists.length, + itemBuilder: (context, index) { + final artist = artists[index]; + return GestureDetector( + child: ArtistCard(artist: artist), + onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), + ); + }, + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_05/lib/src/features/home/view/home_artists.dart b/boring_to_beautiful/step_05/lib/src/features/home/view/home_artists.dart index beb2c0ece4..b5a3a33ecd 100644 --- a/boring_to_beautiful/step_05/lib/src/features/home/view/home_artists.dart +++ b/boring_to_beautiful/step_05/lib/src/features/home/view/home_artists.dart @@ -22,27 +22,25 @@ class HomeArtists extends StatelessWidget { Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(15), - child: constraints.isMobile - ? Column( - children: [ - for (final artist in artists) buildTile(context, artist), - ], - ) - : Row(children: [ - for (final artist in artists) - Flexible( - flex: 1, - child: buildTile(context, artist), - ), - ]), + child: + constraints.isMobile + ? Column( + children: [ + for (final artist in artists) buildTile(context, artist), + ], + ) + : Row( + children: [ + for (final artist in artists) + Flexible(flex: 1, child: buildTile(context, artist)), + ], + ), ); } Widget buildTile(BuildContext context, Artist artist) { return ListTile( - leading: CircleAvatar( - backgroundImage: AssetImage(artist.image.image), - ), + leading: CircleAvatar(backgroundImage: AssetImage(artist.image.image)), title: Text( artist.updates.first, maxLines: 2, diff --git a/boring_to_beautiful/step_05/lib/src/features/home/view/home_recent.dart b/boring_to_beautiful/step_05/lib/src/features/home/view/home_recent.dart index c77500a663..8ba86d117d 100644 --- a/boring_to_beautiful/step_05/lib/src/features/home/view/home_recent.dart +++ b/boring_to_beautiful/step_05/lib/src/features/home/view/home_recent.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/outlined_card.dart'; class HomeRecent extends StatelessWidget { - const HomeRecent( - {super.key, required this.playlists, this.axis = Axis.horizontal}); + const HomeRecent({ + super.key, + required this.playlists, + this.axis = Axis.horizontal, + }); final List playlists; final Axis axis; @@ -43,8 +46,10 @@ class HomeRecent extends StatelessWidget { Row( children: [ Expanded( - child: Image.asset(playlist.cover.image, - fit: BoxFit.cover), + child: Image.asset( + playlist.cover.image, + fit: BoxFit.cover, + ), ), ], ), @@ -79,10 +84,7 @@ class HomeRecent extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ - ClippedImage( - playlist.cover.image, - height: 200, - ), + ClippedImage(playlist.cover.image, height: 200), Expanded( child: Center( child: Padding( @@ -104,23 +106,24 @@ class HomeRecent extends StatelessWidget { return Column( children: [ Padding( - padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), - child: Text( - playlist.title, - style: context.titleSmall!.copyWith( - fontWeight: FontWeight.bold, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - textAlign: TextAlign.center, - )), + padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), + child: Text( + playlist.title, + style: context.titleSmall!.copyWith(fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, + textAlign: TextAlign.center, + ), + ), Padding( padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text(playlist.description, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center), + child: Text( + playlist.description, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), ), ], ); diff --git a/boring_to_beautiful/step_05/lib/src/features/home/view/home_screen.dart b/boring_to_beautiful/step_05/lib/src/features/home/view/home_screen.dart index a0214a2c37..34ecdb1163 100644 --- a/boring_to_beautiful/step_05/lib/src/features/home/view/home_screen.dart +++ b/boring_to_beautiful/step_05/lib/src/features/home/view/home_screen.dart @@ -49,33 +49,31 @@ class _HomeScreenState extends State { ), ), body: LayoutBuilder( - builder: (context, constraints) => TabBarView( - children: [ - SingleChildScrollView( - child: Column( - children: [ - const HomeHighlight(), - HomeArtists( - artists: artists, - constraints: constraints, + builder: + (context, constraints) => TabBarView( + children: [ + SingleChildScrollView( + child: Column( + children: [ + const HomeHighlight(), + HomeArtists( + artists: artists, + constraints: constraints, + ), + ], ), - ], - ), - ), - HomeRecent( - playlists: playlists, - axis: Axis.vertical, - ), - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), - PlaylistSongs( - playlist: newReleases, - constraints: constraints, + ), + HomeRecent(playlists: playlists, axis: Axis.vertical), + PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), + PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), + ], ), - ], - ), ), ), ); @@ -109,10 +107,11 @@ class _HomeScreenState extends State { children: [ const HomeHighlight(), LayoutBuilder( - builder: (context, constraints) => HomeArtists( - artists: artists, - constraints: constraints, - ), + builder: + (context, constraints) => HomeArtists( + artists: artists, + constraints: constraints, + ), ), ], ), @@ -129,9 +128,7 @@ class _HomeScreenState extends State { style: context.headlineSmall, ), ), - HomeRecent( - playlists: playlists, - ), + HomeRecent(playlists: playlists), ], ), ), @@ -149,19 +146,20 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.all(2), // Modify this line + padding: const EdgeInsets.all( + 2, + ), // Modify this line child: Text( 'Top Songs Today', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), ), ], ), @@ -174,19 +172,20 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.all(2), // Modify this line + padding: const EdgeInsets.all( + 2, + ), // Modify this line child: Text( 'New Releases', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: newReleases, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), ), ], ), diff --git a/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_home_screen.dart b/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_home_screen.dart index a80d767930..978608ccad 100644 --- a/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_home_screen.dart +++ b/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_home_screen.dart @@ -44,8 +44,10 @@ class PlaylistHomeScreen extends StatelessWidget { title: playlist.title, subtitle: playlist.description, ), - onTap: () => - GoRouter.of(context).go('/playlists/${playlist.id}'), + onTap: + () => GoRouter.of( + context, + ).go('/playlists/${playlist.id}'), ); }, ), diff --git a/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_screen.dart b/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_screen.dart index 5dc2f0744f..c41f500a92 100644 --- a/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_screen.dart +++ b/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_screen.dart @@ -20,114 +20,116 @@ class PlaylistScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - final colors = Theme.of(context).colorScheme; - final double headerHeight = constraints.isMobile - ? max(constraints.biggest.height * 0.5, 450) - : max(constraints.biggest.height * 0.25, 250); - if (constraints.isMobile) { - return Scaffold( - appBar: AppBar( - leading: BackButton( - onPressed: () => GoRouter.of(context).go('/playlists'), - ), - title: Text(playlist.title), - actions: [ - IconButton( - icon: const Icon(Icons.play_circle_fill), - onPressed: () {}, - ), - IconButton( - onPressed: () {}, - icon: const Icon(Icons.shuffle), - ), - ], - ), - body: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, - ), - ), - ); - } - return Scaffold( - body: CustomScrollView( - slivers: [ - SliverAppBar( + return LayoutBuilder( + builder: (context, constraints) { + final colors = Theme.of(context).colorScheme; + final double headerHeight = + constraints.isMobile + ? max(constraints.biggest.height * 0.5, 450) + : max(constraints.biggest.height * 0.25, 250); + if (constraints.isMobile) { + return Scaffold( + appBar: AppBar( leading: BackButton( onPressed: () => GoRouter.of(context).go('/playlists'), ), - expandedHeight: headerHeight, - pinned: false, - flexibleSpace: FlexibleSpaceBar( - background: AdaptiveImageCard( - axis: constraints.isMobile ? Axis.vertical : Axis.horizontal, - constraints: - constraints.copyWith(maxHeight: headerHeight).normalize(), - image: playlist.cover.image, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'PLAYLIST', - style: context.titleSmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.title, - style: context.displaySmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.description, - style: context.bodyLarge!.copyWith( - color: colors.onSurface.withAlpha(204), + title: Text(playlist.title), + actions: [ + IconButton( + icon: const Icon(Icons.play_circle_fill), + onPressed: () {}, + ), + IconButton(onPressed: () {}, icon: const Icon(Icons.shuffle)), + ], + ), + body: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), + ), + ); + } + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + leading: BackButton( + onPressed: () => GoRouter.of(context).go('/playlists'), + ), + expandedHeight: headerHeight, + pinned: false, + flexibleSpace: FlexibleSpaceBar( + background: AdaptiveImageCard( + axis: + constraints.isMobile ? Axis.vertical : Axis.horizontal, + constraints: + constraints + .copyWith(maxHeight: headerHeight) + .normalize(), + image: playlist.cover.image, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'PLAYLIST', + style: context.titleSmall!.copyWith( + color: colors.onSurface, + ), ), - ), - const SizedBox(height: 8), - Row( - children: [ - IconButton( - icon: Icon( - Icons.play_circle_fill, - color: colors.tertiary, - ), - onPressed: () {}, + Text( + playlist.title, + style: context.displaySmall!.copyWith( + color: colors.onSurface, ), - TextButton.icon( - onPressed: () {}, - icon: Icon( - Icons.shuffle, - color: colors.tertiary, - ), - label: Text( - 'Shuffle', - style: context.bodySmall!.copyWith( + ), + Text( + playlist.description, + style: context.bodyLarge!.copyWith( + color: colors.onSurface.withAlpha(204), + ), + ), + const SizedBox(height: 8), + Row( + children: [ + IconButton( + icon: Icon( + Icons.play_circle_fill, color: colors.tertiary, ), + onPressed: () {}, ), - ), - ], - ), - ], + TextButton.icon( + onPressed: () {}, + icon: Icon(Icons.shuffle, color: colors.tertiary), + label: Text( + 'Shuffle', + style: context.bodySmall!.copyWith( + color: colors.tertiary, + ), + ), + ), + ], + ), + ], + ), ), ), ), - ), - SliverToBoxAdapter( - child: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, + SliverToBoxAdapter( + child: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), ), ), - ), - ], - ), - ); - }); + ], + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_songs.dart b/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_songs.dart index e944336540..1d5a2e9879 100644 --- a/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_songs.dart +++ b/boring_to_beautiful/step_05/lib/src/features/playlists/view/playlist_songs.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/views.dart'; class PlaylistSongs extends StatelessWidget { - const PlaylistSongs( - {super.key, required this.playlist, required this.constraints}); + const PlaylistSongs({ + super.key, + required this.playlist, + required this.constraints, + }); final Playlist playlist; final BoxConstraints constraints; @@ -25,14 +28,9 @@ class PlaylistSongs extends StatelessWidget { breakpoint: 450, columns: const [ DataColumn( - label: Padding( - padding: EdgeInsets.only(left: 20), - child: Text('#'), - ), - ), - DataColumn( - label: Text('Title'), + label: Padding(padding: EdgeInsets.only(left: 20), child: Text('#')), ), + DataColumn(label: Text('Title')), DataColumn( label: Padding( padding: EdgeInsets.only(right: 10), @@ -40,38 +38,40 @@ class PlaylistSongs extends StatelessWidget { ), ), ], - rowBuilder: (context, index) => DataRow.byIndex( - index: index, - cells: [ - DataCell( - // Add HoverableSongPlayButton - Center( - child: Text( - (index + 1).toString(), - textAlign: TextAlign.center, + rowBuilder: + (context, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + // Add HoverableSongPlayButton + Center( + child: Text( + (index + 1).toString(), + textAlign: TextAlign.center, + ), + ), ), - ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(playlist.songs[index].image.image), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(playlist.songs[index].image.image), + ), + const SizedBox(width: 10), + Expanded(child: Text(playlist.songs[index].title)), + ], + ), ), - const SizedBox(width: 10), - Expanded(child: Text(playlist.songs[index].title)), - ]), - ), - DataCell( - Text(playlist.songs[index].length.toHumanizedString()), + DataCell(Text(playlist.songs[index].length.toHumanizedString())), + ], ), - ], - ), itemBuilder: (song, index) { return ListTile( - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), leading: ClippedImage(song.image.image), title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), diff --git a/boring_to_beautiful/step_05/lib/src/shared/app.dart b/boring_to_beautiful/step_05/lib/src/shared/app.dart index 3910d8f276..ed27418bd4 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/app.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/app.dart @@ -19,45 +19,46 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - final settings = ValueNotifier(ThemeSettings( - sourceColor: Colors.pink, - themeMode: ThemeMode.system, - )); + final settings = ValueNotifier( + ThemeSettings(sourceColor: Colors.pink, themeMode: ThemeMode.system), + ); @override Widget build(BuildContext context) { return BlocProvider( create: (context) => PlaybackBloc(), child: DynamicColorBuilder( - builder: (lightDynamic, darkDynamic) => ThemeProvider( - lightDynamic: lightDynamic, - darkDynamic: darkDynamic, - settings: settings, - child: NotificationListener( - onNotification: (notification) { - settings.value = notification.settings; - return true; - }, - child: ValueListenableBuilder( - valueListenable: settings, - builder: (context, value, _) { - final theme = ThemeProvider.of(context); - return MaterialApp.router( - debugShowCheckedModeBanner: false, - title: 'Flutter Demo', - theme: theme.light(settings.value.sourceColor), - darkTheme: theme.dark(settings.value.sourceColor), - themeMode: theme.themeMode(), - routeInformationParser: appRouter.routeInformationParser, - routeInformationProvider: - appRouter.routeInformationProvider, - routerDelegate: appRouter.routerDelegate, - builder: (context, child) { - return PlayPauseListener(child: child!); - }, - ); + builder: + (lightDynamic, darkDynamic) => ThemeProvider( + lightDynamic: lightDynamic, + darkDynamic: darkDynamic, + settings: settings, + child: NotificationListener( + onNotification: (notification) { + settings.value = notification.settings; + return true; }, + child: ValueListenableBuilder( + valueListenable: settings, + builder: (context, value, _) { + final theme = ThemeProvider.of(context); + return MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + theme: theme.light(settings.value.sourceColor), + darkTheme: theme.dark(settings.value.sourceColor), + themeMode: theme.themeMode(), + routeInformationParser: appRouter.routeInformationParser, + routeInformationProvider: + appRouter.routeInformationProvider, + routerDelegate: appRouter.routerDelegate, + builder: (context, child) { + return PlayPauseListener(child: child!); + }, + ); + }, + ), ), - )), + ), ), ); } diff --git a/boring_to_beautiful/step_05/lib/src/shared/classes/image.dart b/boring_to_beautiful/step_05/lib/src/shared/classes/image.dart index a1ef427c1d..00a6472b4a 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/classes/image.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/classes/image.dart @@ -3,10 +3,11 @@ // found in the LICENSE file. class MyArtistImage { - const MyArtistImage( - {required this.image, - required this.sourceName, - required this.sourceLink}); + const MyArtistImage({ + required this.image, + required this.sourceName, + required this.sourceLink, + }); final String image; final String sourceName; diff --git a/boring_to_beautiful/step_05/lib/src/shared/classes/playlist.dart b/boring_to_beautiful/step_05/lib/src/shared/classes/playlist.dart index 59899dc619..5f0225059d 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/classes/playlist.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/classes/playlist.dart @@ -17,8 +17,9 @@ class Playlist { this.description = '', required this.songs, this.cover = const MyArtistImage( - image: 'assets/images/record.jpeg', - sourceName: 'Adobe Stock Images', - sourceLink: ''), + image: 'assets/images/record.jpeg', + sourceName: 'Adobe Stock Images', + sourceLink: '', + ), }); } diff --git a/boring_to_beautiful/step_05/lib/src/shared/classes/ranked_song.dart b/boring_to_beautiful/step_05/lib/src/shared/classes/ranked_song.dart index 5908268c8c..2362bfae64 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/classes/ranked_song.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/classes/ranked_song.dart @@ -7,7 +7,11 @@ import './classes.dart'; class RankedSong extends Song { final int ranking; - const RankedSong(this.ranking, String title, Artist artist, Duration length, - MyArtistImage image) - : super(title, artist, length, image); + const RankedSong( + this.ranking, + String title, + Artist artist, + Duration length, + MyArtistImage image, + ) : super(title, artist, length, image); } diff --git a/boring_to_beautiful/step_05/lib/src/shared/extensions.dart b/boring_to_beautiful/step_05/lib/src/shared/extensions.dart index 8b7e41b988..fe65add57c 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/extensions.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/extensions.dart @@ -9,51 +9,36 @@ extension TypographyUtils on BuildContext { ThemeData get theme => Theme.of(this); TextTheme get textTheme => GoogleFonts.montserratTextTheme(theme.textTheme); ColorScheme get colors => theme.colorScheme; - TextStyle? get displayLarge => textTheme.displayLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displayMedium => textTheme.displayMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displaySmall => textTheme.displaySmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineLarge => textTheme.headlineLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineMedium => textTheme.headlineMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineSmall => textTheme.headlineSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleLarge => textTheme.titleLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleMedium => textTheme.titleMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleSmall => textTheme.titleSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelLarge => textTheme.labelLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelMedium => textTheme.labelMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelSmall => textTheme.labelSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyLarge => textTheme.bodyLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyMedium => textTheme.bodyMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodySmall => textTheme.bodySmall?.copyWith( - color: colors.onSurface, - ); + TextStyle? get displayLarge => + textTheme.displayLarge?.copyWith(color: colors.onSurface); + TextStyle? get displayMedium => + textTheme.displayMedium?.copyWith(color: colors.onSurface); + TextStyle? get displaySmall => + textTheme.displaySmall?.copyWith(color: colors.onSurface); + TextStyle? get headlineLarge => + textTheme.headlineLarge?.copyWith(color: colors.onSurface); + TextStyle? get headlineMedium => + textTheme.headlineMedium?.copyWith(color: colors.onSurface); + TextStyle? get headlineSmall => + textTheme.headlineSmall?.copyWith(color: colors.onSurface); + TextStyle? get titleLarge => + textTheme.titleLarge?.copyWith(color: colors.onSurface); + TextStyle? get titleMedium => + textTheme.titleMedium?.copyWith(color: colors.onSurface); + TextStyle? get titleSmall => + textTheme.titleSmall?.copyWith(color: colors.onSurface); + TextStyle? get labelLarge => + textTheme.labelLarge?.copyWith(color: colors.onSurface); + TextStyle? get labelMedium => + textTheme.labelMedium?.copyWith(color: colors.onSurface); + TextStyle? get labelSmall => + textTheme.labelSmall?.copyWith(color: colors.onSurface); + TextStyle? get bodyLarge => + textTheme.bodyLarge?.copyWith(color: colors.onSurface); + TextStyle? get bodyMedium => + textTheme.bodyMedium?.copyWith(color: colors.onSurface); + TextStyle? get bodySmall => + textTheme.bodySmall?.copyWith(color: colors.onSurface); } extension BreakpointUtils on BoxConstraints { @@ -65,17 +50,17 @@ extension BreakpointUtils on BoxConstraints { extension DurationString on String { /// Assumes a string (roughly) of the format '\d{1,2}:\d{2}' Duration toDuration() => switch (split(':')) { - [var minutes, var seconds] => Duration( - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - [var hours, var minutes, var seconds] => Duration( - hours: int.parse(hours.trim()), - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - _ => throw Exception('Invalid duration string: $this'), - }; + [var minutes, var seconds] => Duration( + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + [var hours, var minutes, var seconds] => Duration( + hours: int.parse(hours.trim()), + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + _ => throw Exception('Invalid duration string: $this'), + }; } extension HumanizedDuration on Duration { diff --git a/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_bloc.dart b/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_bloc.dart index 73c2f4c436..c6c871937b 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_bloc.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_bloc.dart @@ -41,9 +41,8 @@ class PlaybackBloc extends Bloc { } } - void _handlePlaybackProgress(Duration progress) => add( - PlaybackEvent.songProgress(progress), - ); + void _handlePlaybackProgress(Duration progress) => + add(PlaybackEvent.songProgress(progress)); void _togglePlayPause(TogglePlayPause event, Emitter emit) { state.isPlaying ? _pausePlayback() : _resumePlayback(); @@ -52,8 +51,10 @@ class PlaybackBloc extends Bloc { void _pausePlayback() => _currentlyPlayingSubscription!.cancel(); - void _resumePlayback() => _currentlyPlayingSubscription = - _startPlayingStream().listen(_handlePlaybackProgress); + void _resumePlayback() => + _currentlyPlayingSubscription = _startPlayingStream().listen( + _handlePlaybackProgress, + ); void _changeSong(ChangeSong event, Emitter emit) { emit( @@ -69,19 +70,15 @@ class PlaybackBloc extends Bloc { } void _songProgress(SongProgress event, Emitter emit) => emit( - state.copyWith( - songWithProgress: state.songWithProgress!.copyWith( - progress: state.songWithProgress!.progress + event.duration, - ), - ), - ); + state.copyWith( + songWithProgress: state.songWithProgress!.copyWith( + progress: state.songWithProgress!.progress + event.duration, + ), + ), + ); void _setVolume(SetVolume event, Emitter emit) => emit( - state.copyWith( - volume: event.value, - isMuted: false, - previousVolume: null, - ), - ); + state.copyWith(volume: event.value, isMuted: false, previousVolume: null), + ); void _toggleMute(ToggleMute event, Emitter emit) { if (state.isMuted) { @@ -94,11 +91,7 @@ class PlaybackBloc extends Bloc { ); } else { emit( - state.copyWith( - isMuted: true, - volume: 0, - previousVolume: state.volume, - ), + state.copyWith(isMuted: true, volume: 0, previousVolume: state.volume), ); } } diff --git a/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_bloc.freezed.dart b/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_bloc.freezed.dart index 8a422cd449..54e870ab6f 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_bloc.freezed.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/playback/bloc/playback_bloc.freezed.dart @@ -12,7 +12,8 @@ part of 'playback_bloc.dart'; T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models', +); /// @nodoc mixin _$PlaybackEvent { @@ -24,8 +25,7 @@ mixin _$PlaybackEvent { required TResult Function() toggleMute, required TResult Function(double percent) moveToInSong, required TResult Function(Duration duration) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? togglePlayPause, @@ -34,8 +34,7 @@ mixin _$PlaybackEvent { TResult? Function()? toggleMute, TResult? Function(double percent)? moveToInSong, TResult? Function(Duration duration)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ TResult Function()? togglePlayPause, @@ -45,8 +44,7 @@ mixin _$PlaybackEvent { TResult Function(double percent)? moveToInSong, TResult Function(Duration duration)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult map({ required TResult Function(TogglePlayPause value) togglePlayPause, @@ -55,8 +53,7 @@ mixin _$PlaybackEvent { required TResult Function(ToggleMute value) toggleMute, required TResult Function(MoveToInSong value) moveToInSong, required TResult Function(SongProgress value) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ TResult? Function(TogglePlayPause value)? togglePlayPause, @@ -65,8 +62,7 @@ mixin _$PlaybackEvent { TResult? Function(ToggleMute value)? toggleMute, TResult? Function(MoveToInSong value)? moveToInSong, TResult? Function(SongProgress value)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeMap({ TResult Function(TogglePlayPause value)? togglePlayPause, @@ -76,15 +72,15 @@ mixin _$PlaybackEvent { TResult Function(MoveToInSong value)? moveToInSong, TResult Function(SongProgress value)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; } /// @nodoc abstract class $PlaybackEventCopyWith<$Res> { factory $PlaybackEventCopyWith( - PlaybackEvent value, $Res Function(PlaybackEvent) then) = - _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; + PlaybackEvent value, + $Res Function(PlaybackEvent) then, + ) = _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; } /// @nodoc @@ -103,9 +99,10 @@ class _$PlaybackEventCopyWithImpl<$Res, $Val extends PlaybackEvent> /// @nodoc abstract class _$$TogglePlayPauseImplCopyWith<$Res> { - factory _$$TogglePlayPauseImplCopyWith(_$TogglePlayPauseImpl value, - $Res Function(_$TogglePlayPauseImpl) then) = - __$$TogglePlayPauseImplCopyWithImpl<$Res>; + factory _$$TogglePlayPauseImplCopyWith( + _$TogglePlayPauseImpl value, + $Res Function(_$TogglePlayPauseImpl) then, + ) = __$$TogglePlayPauseImplCopyWithImpl<$Res>; } /// @nodoc @@ -113,8 +110,9 @@ class __$$TogglePlayPauseImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$TogglePlayPauseImpl> implements _$$TogglePlayPauseImplCopyWith<$Res> { __$$TogglePlayPauseImplCopyWithImpl( - _$TogglePlayPauseImpl _value, $Res Function(_$TogglePlayPauseImpl) _then) - : super(_value, _then); + _$TogglePlayPauseImpl _value, + $Res Function(_$TogglePlayPauseImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -233,8 +231,9 @@ abstract class TogglePlayPause implements PlaybackEvent { /// @nodoc abstract class _$$ChangeSongImplCopyWith<$Res> { factory _$$ChangeSongImplCopyWith( - _$ChangeSongImpl value, $Res Function(_$ChangeSongImpl) then) = - __$$ChangeSongImplCopyWithImpl<$Res>; + _$ChangeSongImpl value, + $Res Function(_$ChangeSongImpl) then, + ) = __$$ChangeSongImplCopyWithImpl<$Res>; @useResult $Res call({Song song}); } @@ -244,22 +243,23 @@ class __$$ChangeSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ChangeSongImpl> implements _$$ChangeSongImplCopyWith<$Res> { __$$ChangeSongImplCopyWithImpl( - _$ChangeSongImpl _value, $Res Function(_$ChangeSongImpl) _then) - : super(_value, _then); + _$ChangeSongImpl _value, + $Res Function(_$ChangeSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? song = null, - }) { - return _then(_$ChangeSongImpl( - null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? song = null}) { + return _then( + _$ChangeSongImpl( + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -397,8 +397,9 @@ abstract class ChangeSong implements PlaybackEvent { /// @nodoc abstract class _$$SetVolumeImplCopyWith<$Res> { factory _$$SetVolumeImplCopyWith( - _$SetVolumeImpl value, $Res Function(_$SetVolumeImpl) then) = - __$$SetVolumeImplCopyWithImpl<$Res>; + _$SetVolumeImpl value, + $Res Function(_$SetVolumeImpl) then, + ) = __$$SetVolumeImplCopyWithImpl<$Res>; @useResult $Res call({double value}); } @@ -408,22 +409,23 @@ class __$$SetVolumeImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SetVolumeImpl> implements _$$SetVolumeImplCopyWith<$Res> { __$$SetVolumeImplCopyWithImpl( - _$SetVolumeImpl _value, $Res Function(_$SetVolumeImpl) _then) - : super(_value, _then); + _$SetVolumeImpl _value, + $Res Function(_$SetVolumeImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? value = null, - }) { - return _then(_$SetVolumeImpl( - null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? value = null}) { + return _then( + _$SetVolumeImpl( + null == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -561,8 +563,9 @@ abstract class SetVolume implements PlaybackEvent { /// @nodoc abstract class _$$ToggleMuteImplCopyWith<$Res> { factory _$$ToggleMuteImplCopyWith( - _$ToggleMuteImpl value, $Res Function(_$ToggleMuteImpl) then) = - __$$ToggleMuteImplCopyWithImpl<$Res>; + _$ToggleMuteImpl value, + $Res Function(_$ToggleMuteImpl) then, + ) = __$$ToggleMuteImplCopyWithImpl<$Res>; } /// @nodoc @@ -570,8 +573,9 @@ class __$$ToggleMuteImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ToggleMuteImpl> implements _$$ToggleMuteImplCopyWith<$Res> { __$$ToggleMuteImplCopyWithImpl( - _$ToggleMuteImpl _value, $Res Function(_$ToggleMuteImpl) _then) - : super(_value, _then); + _$ToggleMuteImpl _value, + $Res Function(_$ToggleMuteImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -690,8 +694,9 @@ abstract class ToggleMute implements PlaybackEvent { /// @nodoc abstract class _$$MoveToInSongImplCopyWith<$Res> { factory _$$MoveToInSongImplCopyWith( - _$MoveToInSongImpl value, $Res Function(_$MoveToInSongImpl) then) = - __$$MoveToInSongImplCopyWithImpl<$Res>; + _$MoveToInSongImpl value, + $Res Function(_$MoveToInSongImpl) then, + ) = __$$MoveToInSongImplCopyWithImpl<$Res>; @useResult $Res call({double percent}); } @@ -701,22 +706,23 @@ class __$$MoveToInSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$MoveToInSongImpl> implements _$$MoveToInSongImplCopyWith<$Res> { __$$MoveToInSongImplCopyWithImpl( - _$MoveToInSongImpl _value, $Res Function(_$MoveToInSongImpl) _then) - : super(_value, _then); + _$MoveToInSongImpl _value, + $Res Function(_$MoveToInSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? percent = null, - }) { - return _then(_$MoveToInSongImpl( - null == percent - ? _value.percent - : percent // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? percent = null}) { + return _then( + _$MoveToInSongImpl( + null == percent + ? _value.percent + : percent // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -854,8 +860,9 @@ abstract class MoveToInSong implements PlaybackEvent { /// @nodoc abstract class _$$SongProgressImplCopyWith<$Res> { factory _$$SongProgressImplCopyWith( - _$SongProgressImpl value, $Res Function(_$SongProgressImpl) then) = - __$$SongProgressImplCopyWithImpl<$Res>; + _$SongProgressImpl value, + $Res Function(_$SongProgressImpl) then, + ) = __$$SongProgressImplCopyWithImpl<$Res>; @useResult $Res call({Duration duration}); } @@ -865,22 +872,23 @@ class __$$SongProgressImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SongProgressImpl> implements _$$SongProgressImplCopyWith<$Res> { __$$SongProgressImplCopyWithImpl( - _$SongProgressImpl _value, $Res Function(_$SongProgressImpl) _then) - : super(_value, _then); + _$SongProgressImpl _value, + $Res Function(_$SongProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? duration = null, - }) { - return _then(_$SongProgressImpl( - null == duration - ? _value.duration - : duration // ignore: cast_nullable_to_non_nullable - as Duration, - )); + $Res call({Object? duration = null}) { + return _then( + _$SongProgressImpl( + null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as Duration, + ), + ); } } @@ -1037,15 +1045,17 @@ mixin _$PlaybackState { /// @nodoc abstract class $PlaybackStateCopyWith<$Res> { factory $PlaybackStateCopyWith( - PlaybackState value, $Res Function(PlaybackState) then) = - _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; + PlaybackState value, + $Res Function(PlaybackState) then, + ) = _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); $SongWithProgressCopyWith<$Res>? get songWithProgress; } @@ -1071,28 +1081,36 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_value.copyWith( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - ) as $Val); + return _then( + _value.copyWith( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ) + as $Val, + ); } /// Create a copy of PlaybackState @@ -1114,16 +1132,18 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> abstract class _$$PlaybackStateImplCopyWith<$Res> implements $PlaybackStateCopyWith<$Res> { factory _$$PlaybackStateImplCopyWith( - _$PlaybackStateImpl value, $Res Function(_$PlaybackStateImpl) then) = - __$$PlaybackStateImplCopyWithImpl<$Res>; + _$PlaybackStateImpl value, + $Res Function(_$PlaybackStateImpl) then, + ) = __$$PlaybackStateImplCopyWithImpl<$Res>; @override @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); @override $SongWithProgressCopyWith<$Res>? get songWithProgress; @@ -1134,8 +1154,9 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> extends _$PlaybackStateCopyWithImpl<$Res, _$PlaybackStateImpl> implements _$$PlaybackStateImplCopyWith<$Res> { __$$PlaybackStateImplCopyWithImpl( - _$PlaybackStateImpl _value, $Res Function(_$PlaybackStateImpl) _then) - : super(_value, _then); + _$PlaybackStateImpl _value, + $Res Function(_$PlaybackStateImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1148,40 +1169,48 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_$PlaybackStateImpl( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - )); + return _then( + _$PlaybackStateImpl( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ), + ); } } /// @nodoc class _$PlaybackStateImpl implements _PlaybackState { - const _$PlaybackStateImpl( - {this.volume = 0.5, - this.previousVolume, - this.isMuted = false, - this.isPlaying = false, - this.songWithProgress}); + const _$PlaybackStateImpl({ + this.volume = 0.5, + this.previousVolume, + this.isMuted = false, + this.isPlaying = false, + this.songWithProgress, + }); /// Legal values are between 0 and 1. @override @@ -1221,8 +1250,14 @@ class _$PlaybackStateImpl implements _PlaybackState { } @override - int get hashCode => Object.hash(runtimeType, volume, previousVolume, isMuted, - isPlaying, songWithProgress); + int get hashCode => Object.hash( + runtimeType, + volume, + previousVolume, + isMuted, + isPlaying, + songWithProgress, + ); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1234,12 +1269,13 @@ class _$PlaybackStateImpl implements _PlaybackState { } abstract class _PlaybackState implements PlaybackState { - const factory _PlaybackState( - {final double volume, - final double? previousVolume, - final bool isMuted, - final bool isPlaying, - final SongWithProgress? songWithProgress}) = _$PlaybackStateImpl; + const factory _PlaybackState({ + final double volume, + final double? previousVolume, + final bool isMuted, + final bool isPlaying, + final SongWithProgress? songWithProgress, + }) = _$PlaybackStateImpl; /// Legal values are between 0 and 1. @override @@ -1278,8 +1314,9 @@ mixin _$SongWithProgress { /// @nodoc abstract class $SongWithProgressCopyWith<$Res> { factory $SongWithProgressCopyWith( - SongWithProgress value, $Res Function(SongWithProgress) then) = - _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; + SongWithProgress value, + $Res Function(SongWithProgress) then, + ) = _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; @useResult $Res call({Duration progress, Song song}); } @@ -1298,29 +1335,32 @@ class _$SongWithProgressCopyWithImpl<$Res, $Val extends SongWithProgress> /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_value.copyWith( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - ) as $Val); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _value.copyWith( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ) + as $Val, + ); } } /// @nodoc abstract class _$$SongWithProgressImplCopyWith<$Res> implements $SongWithProgressCopyWith<$Res> { - factory _$$SongWithProgressImplCopyWith(_$SongWithProgressImpl value, - $Res Function(_$SongWithProgressImpl) then) = - __$$SongWithProgressImplCopyWithImpl<$Res>; + factory _$$SongWithProgressImplCopyWith( + _$SongWithProgressImpl value, + $Res Function(_$SongWithProgressImpl) then, + ) = __$$SongWithProgressImplCopyWithImpl<$Res>; @override @useResult $Res call({Duration progress, Song song}); @@ -1330,28 +1370,30 @@ abstract class _$$SongWithProgressImplCopyWith<$Res> class __$$SongWithProgressImplCopyWithImpl<$Res> extends _$SongWithProgressCopyWithImpl<$Res, _$SongWithProgressImpl> implements _$$SongWithProgressImplCopyWith<$Res> { - __$$SongWithProgressImplCopyWithImpl(_$SongWithProgressImpl _value, - $Res Function(_$SongWithProgressImpl) _then) - : super(_value, _then); + __$$SongWithProgressImplCopyWithImpl( + _$SongWithProgressImpl _value, + $Res Function(_$SongWithProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of SongWithProgress /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_$SongWithProgressImpl( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _$SongWithProgressImpl( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -1390,13 +1432,16 @@ class _$SongWithProgressImpl implements _SongWithProgress { @pragma('vm:prefer-inline') _$$SongWithProgressImplCopyWith<_$SongWithProgressImpl> get copyWith => __$$SongWithProgressImplCopyWithImpl<_$SongWithProgressImpl>( - this, _$identity); + this, + _$identity, + ); } abstract class _SongWithProgress implements SongWithProgress { - const factory _SongWithProgress( - {required final Duration progress, - required final Song song}) = _$SongWithProgressImpl; + const factory _SongWithProgress({ + required final Duration progress, + required final Song song, + }) = _$SongWithProgressImpl; @override Duration get progress; diff --git a/boring_to_beautiful/step_05/lib/src/shared/providers/artists.dart b/boring_to_beautiful/step_05/lib/src/shared/providers/artists.dart index d116ad9cdd..f9e4a8063e 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/providers/artists.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/providers/artists.dart @@ -11,162 +11,175 @@ class ArtistsProvider { static ArtistsProvider get shared => ArtistsProvider(); List get artists => const [ - Artist( - id: 'jmo', - name: 'Jessie Morrison', + Artist( + id: 'jmo', + name: 'Jessie Morrison', + image: MyArtistImage( + image: 'assets/images/artists/woman.jpeg', + sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', + sourceName: 'Daniel Monteiro', + ), + bio: + 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', + updates: [ + 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', + 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', + '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', + ], + events: [ + Event( + date: '1/20/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Mountain View, California', + link: 'Tickets', + ), + Event( + date: '1/22/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Austin, Texas', + link: 'Tickets', + ), + Event( + date: '1/23/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Houston, Texas', + link: 'Tickets', + ), + Event( + date: '2/8/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Los Angeles, California', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', + author: 'By Jacqueline Stewart', + blurb: + 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', image: MyArtistImage( - image: 'assets/images/artists/woman.jpeg', - sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', - sourceName: 'Daniel Monteiro', + image: 'assets/images/news/concert.jpeg', + sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', + sourceName: 'Anthony DELANOIX', ), - bio: - 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', - updates: [ - 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', - 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', - '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', - ], - events: [ - Event( - date: '1/20/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Mountain View, California', - link: 'Tickets'), - Event( - date: '1/22/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Austin, Texas', - link: 'Tickets'), - Event( - date: '1/23/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Houston, Texas', - link: 'Tickets'), - Event( - date: '2/8/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Los Angeles, California', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', - author: 'By Jacqueline Stewart', - blurb: - 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', - image: MyArtistImage( - image: 'assets/images/news/concert.jpeg', - sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', - sourceName: 'Anthony DELANOIX', - ), - ) - ], ), - Artist( - id: 'lb', - name: 'Lucas Bryant', + ], + ), + Artist( + id: 'lb', + name: 'Lucas Bryant', + image: MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + bio: + 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', + updates: [ + 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', + 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', + 'We\'re going all in this weekend! How are you doing, Vegas?!', + ], + events: [ + Event( + date: '5/16/22', + title: 'Back To My Hometown Tour', + location: 'Indianapolis, IN', + link: 'Tickets', + ), + Event( + date: '5/18/22', + title: 'Back To My Hometown Tour', + location: 'San Antonio, TX', + link: 'Tickets', + ), + Event( + date: '5/20/22', + title: 'Back To My Hometown Tour', + location: 'Phoenix, AZ', + link: 'Tickets', + ), + Event( + date: '5/23/22', + title: 'Back To My Hometown Tour', + location: 'San Diego, CA', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', + author: 'Lonnie Hall', + blurb: + 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', image: MyArtistImage( image: 'assets/images/albums/artist1-album2.jpg', sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', sourceName: 'Keagan Henman', ), - bio: - 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', - updates: [ - 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', - 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', - 'We\'re going all in this weekend! How are you doing, Vegas?!', - ], - events: [ - Event( - date: '5/16/22', - title: 'Back To My Hometown Tour', - location: 'Indianapolis, IN', - link: 'Tickets'), - Event( - date: '5/18/22', - title: 'Back To My Hometown Tour', - location: 'San Antonio, TX', - link: 'Tickets'), - Event( - date: '5/20/22', - title: 'Back To My Hometown Tour', - location: 'Phoenix, AZ', - link: 'Tickets'), - Event( - date: '5/23/22', - title: 'Back To My Hometown Tour', - location: 'San Diego, CA', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', - author: 'Lonnie Hall', - blurb: - 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', - image: MyArtistImage( - image: 'assets/images/albums/artist1-album2.jpg', - sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', - sourceName: 'Keagan Henman', - ), - ), - ], ), - Artist( - id: 'jonjames', - name: 'Jon James', + ], + ), + Artist( + id: 'jonjames', + name: 'Jon James', + image: MyArtistImage( + image: 'assets/images/artists/joe.jpg', + sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', + sourceName: 'Natalie Runnerstrom', + ), + bio: + 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', + updates: [ + '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', + '4 days until I get to share some of the favorite songs I\'ve ever written with you.', + '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', + ], + events: [ + Event( + date: '10/22/21', + title: 'Falling For You Tour', + location: 'Dallas, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/23/21', + title: 'Falling For You Tour', + location: 'Houston, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/26/21', + title: 'Falling For You Tour', + location: 'Phoenix, Arizona', + link: 'Ticketmaster', + ), + Event( + date: '10/27/21', + title: 'Falling For You Tour', + location: 'Los Angeles, California', + link: 'Ticketmaster', + ), + ], + news: [ + News( + title: + 'Jon James is excited for the release of his sixth album "Falling For You"', + author: 'Top Media Today', + blurb: + 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', image: MyArtistImage( - image: 'assets/images/artists/joe.jpg', - sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', - sourceName: 'Natalie Runnerstrom', + image: 'assets/images/news/recording_studio.jpg', + sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', + sourceName: 'Yohann LIBOT', ), - bio: - 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', - updates: [ - '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', - '4 days until I get to share some of the favorite songs I\'ve ever written with you.', - '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', - ], - events: [ - Event( - date: '10/22/21', - title: 'Falling For You Tour', - location: 'Dallas, Texas', - link: 'Ticketmaster'), - Event( - date: '10/23/21', - title: 'Falling For You Tour', - location: 'Houston, Texas', - link: 'Ticketmaster'), - Event( - date: '10/26/21', - title: 'Falling For You Tour', - location: 'Phoenix, Arizona', - link: 'Ticketmaster'), - Event( - date: '10/27/21', - title: 'Falling For You Tour', - location: 'Los Angeles, California', - link: 'Ticketmaster'), - ], - news: [ - News( - title: - 'Jon James is excited for the release of his sixth album "Falling For You"', - author: 'Top Media Today', - blurb: - 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', - image: MyArtistImage( - image: 'assets/images/news/recording_studio.jpg', - sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', - sourceName: 'Yohann LIBOT'), - ) - ], ), - ]; + ], + ), + ]; Artist? getArtist(String id) { return artists.firstWhereOrNull((artist) => artist.id == id); diff --git a/boring_to_beautiful/step_05/lib/src/shared/providers/playlists.dart b/boring_to_beautiful/step_05/lib/src/shared/providers/playlists.dart index e8bab994dd..f27f71b3ec 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/providers/playlists.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/providers/playlists.dart @@ -18,41 +18,50 @@ class PlaylistsProvider { static List images() { return [ const MyArtistImage( - image: 'assets/images/playlists/favorite.jpg', - sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/favorite.jpg', + sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/austin.jpg', - sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', - sourceName: 'Carlos Alfonso'), + image: 'assets/images/playlists/austin.jpg', + sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', + sourceName: 'Carlos Alfonso', + ), const MyArtistImage( - image: 'assets/images/playlists/reading.jpg', - sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', - sourceName: 'Alexandra Fuller'), + image: 'assets/images/playlists/reading.jpg', + sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', + sourceName: 'Alexandra Fuller', + ), const MyArtistImage( - image: 'assets/images/playlists/workout.jpg', - sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/workout.jpg', + sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/calm.jpg', - sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', - sourceName: 'Jared Rice'), + image: 'assets/images/playlists/calm.jpg', + sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', + sourceName: 'Jared Rice', + ), const MyArtistImage( - image: 'assets/images/playlists/coffee.jpg', - sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', - sourceName: 'Nathan Dumlao'), + image: 'assets/images/playlists/coffee.jpg', + sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', + sourceName: 'Nathan Dumlao', + ), const MyArtistImage( - image: 'assets/images/playlists/piano.jpg', - sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', - sourceName: 'Jordan Whitfield'), + image: 'assets/images/playlists/piano.jpg', + sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', + sourceName: 'Jordan Whitfield', + ), const MyArtistImage( - image: 'assets/images/playlists/studying.jpg', - sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', - sourceName: 'Humble Lamb'), + image: 'assets/images/playlists/studying.jpg', + sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', + sourceName: 'Humble Lamb', + ), const MyArtistImage( - image: 'assets/images/playlists/jazz.jpg', - sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', - sourceName: 'dimitri.photography'), + image: 'assets/images/playlists/jazz.jpg', + sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', + sourceName: 'dimitri.photography', + ), ]; } @@ -85,8 +94,10 @@ class PlaylistsProvider { ); } - static final List _randomPlaylists = - List.generate(10, (index) => randomLengthPlaylist()); + static final List _randomPlaylists = List.generate( + 10, + (index) => randomLengthPlaylist(), + ); } String randomId() { diff --git a/boring_to_beautiful/step_05/lib/src/shared/providers/songs.dart b/boring_to_beautiful/step_05/lib/src/shared/providers/songs.dart index ed018a83ff..f1205f2dcb 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/providers/songs.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/providers/songs.dart @@ -52,9 +52,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:35'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album2.jpg', - sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', - sourceName: 'Alexandru Acea'), + image: 'assets/images/albums/artist4-album2.jpg', + sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', + sourceName: 'Alexandru Acea', + ), ), RankedSong( 2, @@ -62,9 +63,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:52'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album1.jpg', - sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', - sourceName: 'Jr Korpa'), + image: 'assets/images/albums/artist4-album1.jpg', + sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', + sourceName: 'Jr Korpa', + ), ), RankedSong( 3, @@ -72,9 +74,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:39'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album3.jpg', - sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', - sourceName: 'Stormseeker'), + image: 'assets/images/albums/artist4-album3.jpg', + sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', + sourceName: 'Stormseeker', + ), ), RankedSong( 1, diff --git a/boring_to_beautiful/step_05/lib/src/shared/providers/theme.dart b/boring_to_beautiful/step_05/lib/src/shared/providers/theme.dart index f05527ff8f..5c2dd59042 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/providers/theme.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/providers/theme.dart @@ -28,12 +28,13 @@ class ThemeSettingChange extends Notification { } class ThemeProvider extends InheritedWidget { - const ThemeProvider( - {super.key, - required this.settings, - required this.lightDynamic, - required this.darkDynamic, - required super.child}); + const ThemeProvider({ + super.key, + required this.settings, + required this.lightDynamic, + required this.darkDynamic, + required super.child, + }); final ValueNotifier settings; final ColorScheme? lightDynamic; @@ -59,8 +60,9 @@ class ThemeProvider extends InheritedWidget { Color blend(Color targetColor) { return Color( - // ignore: deprecated_member_use - Blend.harmonize(targetColor.value, settings.value.sourceColor.value)); + // ignore: deprecated_member_use + Blend.harmonize(targetColor.value, settings.value.sourceColor.value), + ); } Color source(Color? target) { @@ -72,18 +74,18 @@ class ThemeProvider extends InheritedWidget { } ColorScheme colors(Brightness brightness, Color? targetColor) { - final dynamicPrimary = brightness == Brightness.light - ? lightDynamic?.primary - : darkDynamic?.primary; + final dynamicPrimary = + brightness == Brightness.light + ? lightDynamic?.primary + : darkDynamic?.primary; return ColorScheme.fromSeed( seedColor: dynamicPrimary ?? source(targetColor), brightness: brightness, ); } - ShapeBorder get shapeMedium => RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ); + ShapeBorder get shapeMedium => + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)); CardTheme cardTheme() { return CardTheme( @@ -113,21 +115,13 @@ class ThemeProvider extends InheritedWidget { labelColor: colors.secondary, unselectedLabelColor: colors.onSurfaceVariant, indicator: BoxDecoration( - border: Border( - bottom: BorderSide( - color: colors.secondary, - width: 2, - ), - ), + border: Border(bottom: BorderSide(color: colors.secondary, width: 2)), ), ); } BottomAppBarTheme bottomAppBarTheme(ColorScheme colors) { - return BottomAppBarTheme( - color: colors.surface, - elevation: 0, - ); + return BottomAppBarTheme(color: colors.surface, elevation: 0); } BottomNavigationBarThemeData bottomNavigationBarTheme(ColorScheme colors) { @@ -146,9 +140,7 @@ class ThemeProvider extends InheritedWidget { } DrawerThemeData drawerTheme(ColorScheme colors) { - return DrawerThemeData( - backgroundColor: colors.surface, - ); + return DrawerThemeData(backgroundColor: colors.surface); } ThemeData light([Color? targetColor]) { @@ -207,10 +199,7 @@ class ThemeProvider extends InheritedWidget { } class ThemeSettings { - ThemeSettings({ - required this.sourceColor, - required this.themeMode, - }); + ThemeSettings({required this.sourceColor, required this.themeMode}); final Color sourceColor; final ThemeMode themeMode; @@ -221,10 +210,7 @@ Color randomColor() { } // Custom Colors -const linkColor = CustomColor( - name: 'Link Color', - color: Color(0xFF00B0FF), -); +const linkColor = CustomColor(name: 'Link Color', color: Color(0xFF00B0FF)); class CustomColor { const CustomColor({ diff --git a/boring_to_beautiful/step_05/lib/src/shared/router.dart b/boring_to_beautiful/step_05/lib/src/shared/router.dart index 3efb7362fa..db82627246 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/router.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/router.dart @@ -20,11 +20,7 @@ final artistsProvider = ArtistsProvider(); final playlistsProvider = PlaylistsProvider(); const List destinations = [ - NavigationDestination( - label: 'Home', - icon: Icon(Icons.home), - route: '/', - ), + NavigationDestination(label: 'Home', icon: Icon(Icons.home), route: '/'), NavigationDestination( label: 'Playlists', icon: Icon(Icons.playlist_add_check), @@ -56,41 +52,46 @@ final appRouter = GoRouter( // HomeScreen GoRoute( path: '/', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 0, - child: HomeScreen(), - ), - ), + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 0, + child: HomeScreen(), + ), + ), ), // PlaylistHomeScreen GoRoute( path: '/playlists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 1, - child: PlaylistHomeScreen(), - ), - ), - routes: [ - GoRoute( - path: ':pid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 1, - child: PlaylistScreen( - playlist: playlistsProvider - .getPlaylist(state.pathParameters['pid']!)!, - ), + child: PlaylistHomeScreen(), ), ), + routes: [ + GoRoute( + path: ':pid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 1, + child: PlaylistScreen( + playlist: + playlistsProvider.getPlaylist( + state.pathParameters['pid']!, + )!, + ), + ), + ), ), ], ), @@ -98,28 +99,32 @@ final appRouter = GoRouter( // ArtistHomeScreen GoRoute( path: '/artists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 2, - child: ArtistsScreen(), - ), - ), - routes: [ - GoRoute( - path: ':aid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 2, - child: ArtistScreen( - artist: - artistsProvider.getArtist(state.pathParameters['aid']!)!, - ), + child: ArtistsScreen(), ), ), + routes: [ + GoRoute( + path: ':aid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 2, + child: ArtistScreen( + artist: + artistsProvider.getArtist( + state.pathParameters['aid']!, + )!, + ), + ), + ), // builder: (context, state) => ArtistScreen( // id: state.params['aid']!, // ), @@ -129,14 +134,15 @@ final appRouter = GoRouter( for (final route in destinations.skip(3)) GoRoute( path: route.route, - pageBuilder: (context, state) => MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: destinations.indexOf(route), - child: const SizedBox(), - ), - ), + pageBuilder: + (context, state) => MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: destinations.indexOf(route), + child: const SizedBox(), + ), + ), ), ], ); diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_image_card.dart b/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_image_card.dart index 07cab2b0d7..99f5be0837 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_image_card.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_image_card.dart @@ -36,20 +36,13 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), + child: Padding(padding: const EdgeInsets.all(20), child: child), ), ], ); } return Padding( - padding: const EdgeInsets.only( - left: 20, - bottom: 20, - top: 20, - ), + padding: const EdgeInsets.only(left: 20, bottom: 20, top: 20), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, @@ -65,11 +58,8 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), - ) + child: Padding(padding: const EdgeInsets.all(20), child: child), + ), ], ), ); diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_navigation.dart b/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_navigation.dart index 067ea7d17f..709068ea07 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_navigation.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/adaptive_navigation.dart @@ -30,12 +30,15 @@ class AdaptiveNavigation extends StatelessWidget { NavigationRail( extended: dimens.maxWidth >= 800, minExtendedWidth: 180, - destinations: destinations - .map((e) => NavigationRailDestination( - icon: e.icon, - label: Text(e.label), - )) - .toList(), + destinations: + destinations + .map( + (e) => NavigationRailDestination( + icon: e.icon, + label: Text(e.label), + ), + ) + .toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ), diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/article_content.dart b/boring_to_beautiful/step_05/lib/src/shared/views/article_content.dart index af243f015b..c5a0b5e62a 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/article_content.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/article_content.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class ArticleContent extends StatelessWidget { - const ArticleContent({ - super.key, - required this.child, - this.maxWidth = 960, - }); + const ArticleContent({super.key, required this.child, this.maxWidth = 960}); final double maxWidth; final Widget child; @@ -19,13 +15,8 @@ class ArticleContent extends StatelessWidget { return Container( alignment: Alignment.topCenter, child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: maxWidth, - ), - child: Padding( - padding: const EdgeInsets.all(15), - child: child, - ), + constraints: BoxConstraints(maxWidth: maxWidth), + child: Padding(padding: const EdgeInsets.all(15), child: child), ), ); } diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/bottom_bar.dart b/boring_to_beautiful/step_05/lib/src/shared/views/bottom_bar.dart index 06e085a9b6..bf15ad9bb0 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/bottom_bar.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/bottom_bar.dart @@ -26,16 +26,18 @@ class BottomBar extends StatelessWidget implements PreferredSizeWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => _BottomBar( - artist: state.songWithProgress?.song.artist, - isMuted: state.isMuted, - isPlaying: state.isPlaying, - preferredSize: preferredSize, - progress: state.songWithProgress?.progress, - song: state.songWithProgress?.song, - togglePlayPause: () => bloc.add(const PlaybackEvent.togglePlayPause()), - volume: state.volume, - ), + builder: + (context, state) => _BottomBar( + artist: state.songWithProgress?.song.artist, + isMuted: state.isMuted, + isPlaying: state.isPlaying, + preferredSize: preferredSize, + progress: state.songWithProgress?.progress, + song: state.songWithProgress?.song, + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), + volume: state.volume, + ), ); } } @@ -63,10 +65,12 @@ class _BottomBar extends StatelessWidget { @override Widget build(BuildContext context) => LayoutBuilder( - builder: (context, constraints) => constraints.isTablet - ? _buildDesktopBar(context, constraints) - : _buildMobileBar(context, constraints), - ); + builder: + (context, constraints) => + constraints.isTablet + ? _buildDesktopBar(context, constraints) + : _buildMobileBar(context, constraints), + ); Widget _buildDesktopBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -79,10 +83,7 @@ class _BottomBar extends StatelessWidget { Row( children: [ _AlbumArt(song: song), - _SongDetails( - artist: artist, - song: song, - ), + _SongDetails(artist: artist, song: song), ], ), Flexible( @@ -95,12 +96,7 @@ class _BottomBar extends StatelessWidget { isPlaying: isPlaying, togglePlayPause: togglePlayPause, ), - Center( - child: _ProgressBar( - progress: progress, - song: song, - ), - ), + Center(child: _ProgressBar(progress: progress, song: song)), ], ), ), @@ -114,17 +110,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _FullScreenPlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _FullScreenPlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -136,10 +133,10 @@ class _BottomBar extends StatelessWidget { } double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; Widget _buildMobileBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -152,17 +149,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _MobilePlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _MobilePlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -191,10 +189,7 @@ class _BottomBar extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - song?.title ?? '', - style: context.labelMedium, - ), + Text(song?.title ?? '', style: context.labelMedium), Text( song?.artist.name ?? '', style: context.labelSmall, @@ -220,10 +215,7 @@ class _BottomBar extends StatelessWidget { } class _ProgressBar extends StatelessWidget { - const _ProgressBar({ - required this.progress, - required this.song, - }); + const _ProgressBar({required this.progress, required this.song}); /// Current playback depth into user is into [song]. final Duration? progress; @@ -231,10 +223,10 @@ class _ProgressBar extends StatelessWidget { final Song? song; double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; @override Widget build(BuildContext context) { @@ -252,29 +244,32 @@ class _ProgressBar extends StatelessWidget { children: [ const SizedBox(width: 10), SizedBox( - child: progress != null - ? Text(progress!.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + progress != null + ? Text( + progress!.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), Expanded( child: Slider( value: songProgress.clamp(0, 1), divisions: 1000, onChanged: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); }, onChangeEnd: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); // Because dragging pauses auto playback, resume playing // once the user finishes dragging. - BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ); + BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()); }, activeColor: Theme.of(context).colorScheme.onTertiaryContainer, @@ -282,12 +277,15 @@ class _ProgressBar extends StatelessWidget { ), ), SizedBox( - child: song != null - ? Text(song!.length.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + song != null + ? Text( + song!.length.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), - const SizedBox(width: 10) + const SizedBox(width: 10), ], ), ); @@ -297,10 +295,7 @@ class _ProgressBar extends StatelessWidget { } class _VolumeBar extends StatelessWidget { - const _VolumeBar({ - required this.volume, - required this.isMuted, - }); + const _VolumeBar({required this.volume, required this.isMuted}); /// The percentage, between 0 and 1, at which to render the volume slider. final double volume; @@ -313,17 +308,16 @@ class _VolumeBar extends StatelessWidget { @override Widget build(BuildContext context) { return ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 200, - ), + constraints: const BoxConstraints(maxWidth: 200), child: Padding( padding: const EdgeInsets.all(8), child: Row( children: [ GestureDetector( - onTap: () => BlocProvider.of(context).add( - const PlaybackEvent.toggleMute(), - ), + onTap: + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.toggleMute()), child: Icon(!isMuted ? Icons.volume_mute : Icons.volume_off), ), Expanded( @@ -332,8 +326,10 @@ class _VolumeBar extends StatelessWidget { min: 0, max: 1, divisions: 100, - onChanged: (newValue) => BlocProvider.of(context) - .add(PlaybackEvent.setVolume(newValue)), + onChanged: + (newValue) => BlocProvider.of( + context, + ).add(PlaybackEvent.setVolume(newValue)), activeColor: Theme.of(context).colorScheme.onTertiaryContainer, inactiveColor: Theme.of(context).colorScheme.onSurface, ), @@ -356,49 +352,50 @@ class _PlaybackControls extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - double iconSize = 24; - double playIconSize = 32; - double innerPadding = 16; - double playPadding = 20; - if (constraints.maxWidth < 500) { - iconSize = 21; - playIconSize = 28; - innerPadding = 14; - playPadding = 17; - } - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( + return LayoutBuilder( + builder: (context, constraints) { + double iconSize = 24; + double playIconSize = 32; + double innerPadding = 16; + double playPadding = 20; + if (constraints.maxWidth < 500) { + iconSize = 21; + playIconSize = 28; + innerPadding = 14; + playPadding = 17; + } + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( padding: EdgeInsets.fromLTRB(0, 0, innerPadding, 0), - child: Icon(Icons.shuffle, size: iconSize)), - Icon(Icons.skip_previous, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), - child: GestureDetector( - onTap: togglePlayPause, - child: Icon( - isPlaying ? Icons.pause_circle : Icons.play_circle, - size: playIconSize, + child: Icon(Icons.shuffle, size: iconSize), + ), + Icon(Icons.skip_previous, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), + child: GestureDetector( + onTap: togglePlayPause, + child: Icon( + isPlaying ? Icons.pause_circle : Icons.play_circle, + size: playIconSize, + ), ), ), - ), - Icon(Icons.skip_next, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), - child: Icon(Icons.repeat, size: iconSize), - ), - ], - ); - }); + Icon(Icons.skip_next, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), + child: Icon(Icons.repeat, size: iconSize), + ), + ], + ); + }, + ); } } class _AlbumArt extends StatelessWidget { - const _AlbumArt({ - required this.song, - }); + const _AlbumArt({required this.song}); final Song? song; @@ -409,21 +406,17 @@ class _AlbumArt extends StatelessWidget { child: SizedBox( width: 70, height: 70, - child: song != null - ? Image.asset(song!.image.image) - : Container( - color: Colors.pink[100], - ), + child: + song != null + ? Image.asset(song!.image.image) + : Container(color: Colors.pink[100]), ), ); } } class _SongDetails extends StatelessWidget { - const _SongDetails({ - required this.artist, - required this.song, - }); + const _SongDetails({required this.artist, required this.song}); final Artist? artist; final Song? song; @@ -455,9 +448,7 @@ class _SongDetails extends StatelessWidget { } class _FullScreenPlayer extends StatefulWidget { - const _FullScreenPlayer({ - required this.onClose, - }); + const _FullScreenPlayer({required this.onClose}); final VoidCallback onClose; @@ -489,29 +480,33 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return MouseRegion( - onHover: (_) { - setState(() { - _showControls = true; - }); - hideControls(); + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return MouseRegion( + onHover: (_) { + setState(() { + _showControls = true; + }); + hideControls(); + }, + child: buildPlayer(context, state, dimens), + ); }, - child: buildPlayer(context, state, dimens), - ); - }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; final song = current?.song; @@ -519,26 +514,25 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { fit: StackFit.expand, children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - song!.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset(song!.image.image, fit: BoxFit.cover), ), ), - ), ), Positioned( top: 20, right: 20, child: IconButton( - color: song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const Icon(Icons.fullscreen_exit), onPressed: widget.onClose, ), @@ -569,8 +563,9 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { Text( song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 20, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 20, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -582,10 +577,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { right: 20, left: 20, bottom: dimens.biggest.height * 0.2, - child: _ProgressBar( - progress: current?.progress, - song: song, - ), + child: _ProgressBar(progress: current?.progress, song: song), ), Positioned( right: 20, @@ -598,8 +590,8 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), @@ -611,9 +603,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { } class _MobilePlayer extends StatelessWidget { - const _MobilePlayer({ - required this.onClose, - }); + const _MobilePlayer({required this.onClose}); final VoidCallback onClose; @@ -622,46 +612,52 @@ class _MobilePlayer extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return buildPlayer(context, state, dimens); - }, + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return buildPlayer(context, state, dimens); + }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; return Stack( children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - current.song.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset( + current.song.image.image, + fit: BoxFit.cover, + ), ), ), - ), ), Positioned( top: 20, left: 20, child: IconButton( - color: current?.song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + current?.song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const RotatedBox( quarterTurns: 1, child: Icon(Icons.chevron_right), @@ -676,10 +672,7 @@ class _MobilePlayer extends StatelessWidget { left: 0, right: 0, height: dimens.biggest.height * 0.5, - child: Image.asset( - current.song.image.image, - fit: BoxFit.contain, - ), + child: Image.asset(current.song.image.image, fit: BoxFit.contain), ), Positioned( left: 0, @@ -705,8 +698,9 @@ class _MobilePlayer extends StatelessWidget { Text( current.song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 12, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 12, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -718,15 +712,12 @@ class _MobilePlayer extends StatelessWidget { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), - _ProgressBar( - progress: current.progress, - song: current.song, - ), + _ProgressBar(progress: current.progress, song: current.song), ], ), ), diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/brightness_toggle.dart b/boring_to_beautiful/step_05/lib/src/shared/views/brightness_toggle.dart index 46dde4810f..5b5332392b 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/brightness_toggle.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/brightness_toggle.dart @@ -13,9 +13,10 @@ class BrightnessToggle extends StatelessWidget { Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; return IconButton( - icon: Theme.of(context).brightness == Brightness.light - ? const Icon(Icons.brightness_3) - : const Icon(Icons.brightness_7), + icon: + Theme.of(context).brightness == Brightness.light + ? const Icon(Icons.brightness_3) + : const Icon(Icons.brightness_7), onPressed: () { final themeProvider = ThemeProvider.of(context); final settings = themeProvider.settings.value; diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/center_row.dart b/boring_to_beautiful/step_05/lib/src/shared/views/center_row.dart index 36d428e3b8..c1f3effcc2 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/center_row.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/center_row.dart @@ -5,23 +5,12 @@ import 'package:flutter/material.dart'; class CenterRow extends StatelessWidget { - const CenterRow({ - super.key, - required this.child, - }); + const CenterRow({super.key, required this.child}); final Widget child; @override Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Center( - child: child, - ), - ), - ], - ); + return Row(children: [Expanded(child: Center(child: child))]); } } diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/clickable.dart b/boring_to_beautiful/step_05/lib/src/shared/views/clickable.dart index cd7ef46268..f192f0b135 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/clickable.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/clickable.dart @@ -14,10 +14,7 @@ class Clickable extends StatelessWidget { Widget build(BuildContext context) { return MouseRegion( cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: onTap, - child: child, - ), + child: GestureDetector(onTap: onTap, child: child), ); } } diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/events.dart b/boring_to_beautiful/step_05/lib/src/shared/views/events.dart index ed38465460..ab9140e56d 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/events.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/events.dart @@ -24,43 +24,18 @@ class Events extends StatelessWidget { child: DataTable( horizontalMargin: 5.0, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], rows: [ for (final event in artist.events) DataRow( cells: [ - DataCell( - Text(event.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(event.title)), - ]), - ), - DataCell( - Text(event.location), - ), + DataCell(Text(event.date)), + DataCell(Row(children: [Expanded(child: Text(event.title))])), + DataCell(Text(event.location)), DataCell( Clickable( child: Text( @@ -70,8 +45,9 @@ class Events extends StatelessWidget { decoration: TextDecoration.underline, ), ), - onTap: () => - launchUrl(Uri.parse('https://docs.flutter.dev')), + onTap: + () => + launchUrl(Uri.parse('https://docs.flutter.dev')), ), ), ], diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/hover_toggle.dart b/boring_to_beautiful/step_05/lib/src/shared/views/hover_toggle.dart index ec98c2863c..649cfcab63 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/hover_toggle.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/hover_toggle.dart @@ -31,9 +31,10 @@ class _HoverToggleState extends State with MaterialStateMixin { cursor: isHovered ? SystemMouseCursors.click : MouseCursor.defer, onEnter: (_) => setMaterialState(WidgetState.hovered, true), onExit: (_) => setMaterialState(WidgetState.hovered, false), - child: widget.mode == HoverMode.replace - ? _buildReplaceableChildren() - : _buildChildrenStack(), + child: + widget.mode == HoverMode.replace + ? _buildReplaceableChildren() + : _buildChildrenStack(), ), ); } @@ -41,12 +42,7 @@ class _HoverToggleState extends State with MaterialStateMixin { Widget _buildChildrenStack() { Widget child = isHovered ? Opacity(opacity: 0.2, child: widget.child) : widget.child; - return Stack( - children: [ - child, - if (isHovered) widget.hoverChild, - ], - ); + return Stack(children: [child, if (isHovered) widget.hoverChild]); } Widget _buildReplaceableChildren() => diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/hoverable_song_play_button.dart b/boring_to_beautiful/step_05/lib/src/shared/views/hoverable_song_play_button.dart index 512f3d1d3c..dd588e3dbe 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/hoverable_song_play_button.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/hoverable_song_play_button.dart @@ -29,9 +29,10 @@ class HoverableSongPlayButton extends StatelessWidget { hoverChild: Center( child: GestureDetector( child: const Icon(Icons.play_arrow), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ), ), mode: hoverMode, diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/image_card.dart b/boring_to_beautiful/step_05/lib/src/shared/views/image_card.dart index 0af9f75f33..6e7f6cd42d 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/image_card.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/image_card.dart @@ -7,13 +7,14 @@ import '../../shared/extensions.dart'; import 'outlined_card.dart'; class ImageCard extends StatelessWidget { - const ImageCard( - {super.key, - required this.title, - required this.details, - required this.image, - this.subtitle, - this.clickable = false}); + const ImageCard({ + super.key, + required this.title, + required this.details, + required this.image, + this.subtitle, + this.clickable = false, + }); final String title; final String? subtitle; @@ -28,54 +29,51 @@ class ImageCard extends StatelessWidget { clickable: clickable, child: Padding( padding: const EdgeInsets.all(8.0), - child: LayoutBuilder(builder: (context, constraints) { - return Row( - children: [ - if (constraints.maxWidth > 600) - SizedBox( - width: 170, - height: 170, - child: Image.asset( - image, - fit: BoxFit.cover, + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + if (constraints.maxWidth > 600) + SizedBox( + width: 170, + height: 170, + child: Image.asset(image, fit: BoxFit.cover), ), - ), - Expanded( - child: Padding( - padding: padding, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 5), - child: Text( - title, - style: context.titleLarge! - .copyWith(fontWeight: FontWeight.bold), - ), - ), - if (subtitle != null) + Expanded( + child: Padding( + padding: padding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Padding( - padding: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only(bottom: 5), child: Text( - subtitle!, - style: context.labelMedium, + title, + style: context.titleLarge!.copyWith( + fontWeight: FontWeight.bold, + ), ), ), - Text( - details, - style: context.labelMedium?.copyWith( - fontSize: 16, - height: 1.25, + if (subtitle != null) + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text(subtitle!, style: context.labelMedium), + ), + Text( + details, + style: context.labelMedium?.copyWith( + fontSize: 16, + height: 1.25, + ), ), - ), - ], + ], + ), ), ), - ), - ], - ); - }), + ], + ); + }, + ), ), ); } diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/image_tile.dart b/boring_to_beautiful/step_05/lib/src/shared/views/image_tile.dart index 4f2bbebb96..dd99152af5 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/image_tile.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/image_tile.dart @@ -21,19 +21,17 @@ class ImageTile extends StatelessWidget { @override Widget build(BuildContext context) { return OutlinedCard( - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Expanded( - child: Image.asset(image, fit: BoxFit.cover), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [Expanded(child: Image.asset(image, fit: BoxFit.cover))], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), child: Text( title, @@ -43,20 +41,25 @@ class ImageTile extends StatelessWidget { ), overflow: TextOverflow.ellipsis, maxLines: 1, - )), - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text( - subtitle, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center, + ), ), - ), - ], - ) - ]), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 10, + ), + child: Text( + subtitle, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ], + ), + ], + ), ); } } diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/step_05/lib/src/shared/views/outlined_card.dart index 0d886e2c54..ff49275dc9 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/outlined_card.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/outlined_card.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class OutlinedCard extends StatefulWidget { - const OutlinedCard({ - super.key, - required this.child, - this.clickable = true, - }); + const OutlinedCard({super.key, required this.child, this.clickable = true}); final Widget child; final bool clickable; @@ -22,9 +18,10 @@ class _OutlinedCardState extends State { @override Widget build(BuildContext context) { return MouseRegion( - cursor: widget.clickable - ? SystemMouseCursors.click - : SystemMouseCursors.basic, + cursor: + widget.clickable + ? SystemMouseCursors.click + : SystemMouseCursors.basic, child: Container( decoration: BoxDecoration( border: Border.all( diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/play_pause_listener.dart b/boring_to_beautiful/step_05/lib/src/shared/views/play_pause_listener.dart index 52fad00863..6b4fc66709 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/play_pause_listener.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/play_pause_listener.dart @@ -16,10 +16,7 @@ import '../playback/bloc/bloc.dart'; /// shortcuts. By sitting below that machinery, this installs a global Spacebar /// listener which toggles Playback, as is customary in music-playing apps. class PlayPauseListener extends StatelessWidget { - const PlayPauseListener({ - super.key, - required this.child, - }); + const PlayPauseListener({super.key, required this.child}); final Widget child; @@ -28,9 +25,7 @@ class PlayPauseListener extends StatelessWidget { // Immediately catch any [_PlayPauseIntent] events released by the inner // [Shortcuts] widget. return Actions( - actions: >{ - _PlayPauseIntent: _PlayPauseAction(), - }, + actions: >{_PlayPauseIntent: _PlayPauseAction()}, child: Shortcuts( // Register a shortcut for Spacebar presses that release a // [_PlayPauseIntent] up the tree to the nearest [Actions] widget. @@ -38,9 +33,9 @@ class PlayPauseListener extends StatelessWidget { const SingleActivator(LogicalKeyboardKey.space): _PlayPauseIntent( // Create a closure which sends a [TogglePlayPause] event to the // [PlaybackBloc]. - () => BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ), + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()), ), }, child: child, diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/root_layout.dart b/boring_to_beautiful/step_05/lib/src/shared/views/root_layout.dart index 878b57d729..ff6270248c 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/root_layout.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/root_layout.dart @@ -29,36 +29,37 @@ class RootLayout extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => LayoutBuilder(builder: (context, dimens) { - void onSelected(int index) { - final destination = router.destinations[index]; - go.GoRouter.of(context).go(destination.route); - } + builder: + (context, state) => LayoutBuilder( + builder: (context, dimens) { + void onSelected(int index) { + final destination = router.destinations[index]; + go.GoRouter.of(context).go(destination.route); + } - final current = state.songWithProgress; - return AdaptiveNavigation( - key: _navigationRailKey, - destinations: router.destinations - .map((e) => NavigationDestination( - icon: e.icon, - label: e.label, - )) - .toList(), - selectedIndex: currentIndex, - onDestinationSelected: onSelected, - child: Column( - children: [ - Expanded( - child: _Switcher( - key: _switcherKey, - child: child, + final current = state.songWithProgress; + return AdaptiveNavigation( + key: _navigationRailKey, + destinations: + router.destinations + .map( + (e) => NavigationDestination( + icon: e.icon, + label: e.label, + ), + ) + .toList(), + selectedIndex: currentIndex, + onDestinationSelected: onSelected, + child: Column( + children: [ + Expanded(child: _Switcher(key: _switcherKey, child: child)), + if (current != null) const BottomBar(), + ], ), - ), - if (current != null) const BottomBar(), - ], + ); + }, ), - ); - }), ); } } @@ -66,21 +67,18 @@ class RootLayout extends StatelessWidget { class _Switcher extends StatelessWidget { final Widget child; - const _Switcher({ - required this.child, - super.key, - }); + const _Switcher({required this.child, super.key}); @override Widget build(BuildContext context) { return UniversalPlatform.isDesktop ? child : AnimatedSwitcher( - key: key, - duration: const Duration(milliseconds: 200), - switchInCurve: Curves.easeInOut, - switchOutCurve: Curves.easeInOut, - child: child, - ); + key: key, + duration: const Duration(milliseconds: 200), + switchInCurve: Curves.easeInOut, + switchOutCurve: Curves.easeInOut, + child: child, + ); } } diff --git a/boring_to_beautiful/step_05/lib/src/shared/views/sidebar.dart b/boring_to_beautiful/step_05/lib/src/shared/views/sidebar.dart index 78c19b4d22..8815223b22 100644 --- a/boring_to_beautiful/step_05/lib/src/shared/views/sidebar.dart +++ b/boring_to_beautiful/step_05/lib/src/shared/views/sidebar.dart @@ -26,10 +26,7 @@ class SideBar extends StatelessWidget { title: const Text('Home'), onTap: () => GoRouter.of(context).go('/'), ), - const ListTile( - leading: Icon(Icons.search), - title: Text('Search'), - ), + const ListTile(leading: Icon(Icons.search), title: Text('Search')), ListTile( leading: const Icon(Icons.person), title: const Text('Artists'), @@ -64,10 +61,7 @@ class PlaylistNav extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(left: 16, top: 16), - child: Text( - 'Playlists', - style: context.titleMedium, - ), + child: Text('Playlists', style: context.titleMedium), ), Expanded( child: ListView( @@ -114,10 +108,9 @@ class _PlaylistNavItemState extends State<_PlaylistNavItem> { @override void initState() { super.initState(); - _focusNode = FocusNode(debugLabel: widget.title) - ..addListener(() { - setState(() => _isSelected = _focusNode.hasPrimaryFocus); - }); + _focusNode = FocusNode(debugLabel: widget.title)..addListener(() { + setState(() => _isSelected = _focusNode.hasPrimaryFocus); + }); } @override diff --git a/boring_to_beautiful/step_05/macos/Podfile b/boring_to_beautiful/step_05/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/boring_to_beautiful/step_05/macos/Podfile +++ b/boring_to_beautiful/step_05/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_05/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_05/macos/Runner.xcodeproj/project.pbxproj index 79604e1785..63e08baa02 100644 --- a/boring_to_beautiful/step_05/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_05/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */; }; - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */; }; + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */, + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */, + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 143267097A016AD19836D89A /* Pods */ = { + isa = PBXGroup; + children = ( + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */, + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */, + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */, + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */, + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */, + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A67056D7D61CD22438BA6931 /* Pods */, + 143267097A016AD19836D89A /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - A67056D7D61CD22438BA6931 /* Pods */ = { - isa = PBXGroup; - children = ( - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */, - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */, - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */, - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */, - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */, - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */, - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */, + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */, + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */, + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */, + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */, + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -361,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */ = { + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -378,7 +378,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */ = { + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +393,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */ = { + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index b9ba5fa149..888bfbb4c7 100644 --- a/boring_to_beautiful/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_05/pubspec.yaml b/boring_to_beautiful/step_05/pubspec.yaml index abe835e2e6..b02c951374 100644 --- a/boring_to_beautiful/step_05/pubspec.yaml +++ b/boring_to_beautiful/step_05/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,14 +13,14 @@ dependencies: adaptive_components: ^0.0.10 adaptive_navigation: ^0.0.10 animations: ^2.0.11 - collection: ^1.19.0 + collection: ^1.19.1 cupertino_icons: ^1.0.8 desktop_window: ^0.4.2 dynamic_color: ^1.7.0 english_words: ^4.0.0 flutter_bloc: ^9.0.0 freezed_annotation: ^2.4.4 - go_router: ^14.7.2 + go_router: ^14.8.0 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/step_06/android/.gitignore b/boring_to_beautiful/step_06/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/boring_to_beautiful/step_06/android/.gitignore +++ b/boring_to_beautiful/step_06/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/boring_to_beautiful/step_06/android/app/build.gradle b/boring_to_beautiful/step_06/android/app/build.gradle deleted file mode 100644 index 59485b6bb8..0000000000 --- a/boring_to_beautiful/step_06/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.myartist" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.myartist" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/boring_to_beautiful/step_06/android/app/build.gradle.kts b/boring_to_beautiful/step_06/android/app/build.gradle.kts new file mode 100644 index 0000000000..b2dbe0393c --- /dev/null +++ b/boring_to_beautiful/step_06/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.myartist" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.myartist" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/boring_to_beautiful/step_06/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt b/boring_to_beautiful/step_06/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt index 1e328c8556..b724a01056 100644 --- a/boring_to_beautiful/step_06/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt +++ b/boring_to_beautiful/step_06/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.myartist import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/boring_to_beautiful/step_06/android/build.gradle b/boring_to_beautiful/step_06/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/boring_to_beautiful/step_06/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/boring_to_beautiful/step_06/android/build.gradle.kts b/boring_to_beautiful/step_06/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/boring_to_beautiful/step_06/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/boring_to_beautiful/step_06/android/gradle.properties b/boring_to_beautiful/step_06/android/gradle.properties index 2597170821..f018a61817 100644 --- a/boring_to_beautiful/step_06/android/gradle.properties +++ b/boring_to_beautiful/step_06/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/boring_to_beautiful/step_06/android/gradle/wrapper/gradle-wrapper.properties b/boring_to_beautiful/step_06/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/boring_to_beautiful/step_06/android/gradle/wrapper/gradle-wrapper.properties +++ b/boring_to_beautiful/step_06/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/boring_to_beautiful/step_06/android/settings.gradle b/boring_to_beautiful/step_06/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/boring_to_beautiful/step_06/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/boring_to_beautiful/step_06/android/settings.gradle.kts b/boring_to_beautiful/step_06/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/boring_to_beautiful/step_06/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/boring_to_beautiful/step_06/ios/Podfile b/boring_to_beautiful/step_06/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/boring_to_beautiful/step_06/ios/Podfile +++ b/boring_to_beautiful/step_06/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_06/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_06/ios/Runner.xcodeproj/project.pbxproj index f7d849e7aa..b4912290dd 100644 --- a/boring_to_beautiful/step_06/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_06/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */; }; - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */; }; + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,15 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +60,19 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 85CFC060D2B515FA7FCB18AC /* Frameworks */ = { + 6171884CE7EC0B228274CDFE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */, + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */, + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 54241974C43F645BC41820B3 /* Pods */ = { + 4CD80B4456D2B04197B640AC /* Pods */ = { isa = PBXGroup; children = ( - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */, - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */, - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */, - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */, - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */, - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */, + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */, + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */, + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */, + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */, + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */, + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 54241974C43F645BC41820B3 /* Pods */, - DA6AE8ED33598C40BFC9FCAD /* Frameworks */, + 4CD80B4456D2B04197B640AC /* Pods */, + C4E673F63230E3A6805B11E9 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - DA6AE8ED33598C40BFC9FCAD /* Frameworks */ = { + C4E673F63230E3A6805B11E9 /* Frameworks */ = { isa = PBXGroup; children = ( - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */, - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */, + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */, + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */, + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 85CFC060D2B515FA7FCB18AC /* Frameworks */, + 6171884CE7EC0B228274CDFE /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */, + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */, + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,43 +270,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -323,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */ = { + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,7 +340,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */ = { + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/boring_to_beautiful/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_bio.dart b/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_bio.dart index 227b8e91f9..8b614421db 100644 --- a/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_bio.dart +++ b/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_bio.dart @@ -18,9 +18,7 @@ class ArtistBio extends StatelessWidget { artist.bio, style: context.bodyLarge!.copyWith( fontSize: 16, - color: context.colors.onSurface.withAlpha( - 222, - ), + color: context.colors.onSurface.withAlpha(222), ), ); } diff --git a/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_card.dart b/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_card.dart index a63967f51d..1a56376a87 100644 --- a/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_card.dart +++ b/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_card.dart @@ -11,10 +11,7 @@ import '../../../shared/views/outlined_card.dart'; import '../../../shared/views/views.dart'; class ArtistCard extends StatelessWidget { - const ArtistCard({ - super.key, - required this.artist, - }); + const ArtistCard({super.key, required this.artist}); final Artist artist; @@ -24,65 +21,66 @@ class ArtistCard extends StatelessWidget { return OutlinedCard( child: LayoutBuilder( - builder: (context, dimens) => Row( - children: [ - SizedBox( - width: dimens.maxWidth * 0.4, - child: Image.asset( - artist.image.image, - fit: BoxFit.cover, - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - artist.name, - style: context.titleMedium, - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - const SizedBox(height: 10), - Text( - artist.bio, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 3, - ), - ]), - ), - if (dimens.maxHeight > 100) - Row( - children: [ - HoverableSongPlayButton( - size: const Size(50, 50), - song: nowPlaying, - child: Icon(Icons.play_circle, - color: context.colors.tertiary), + builder: + (context, dimens) => Row( + children: [ + SizedBox( + width: dimens.maxWidth * 0.4, + child: Image.asset(artist.image.image, fit: BoxFit.cover), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + artist.name, + style: context.titleMedium, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + const SizedBox(height: 10), + Text( + artist.bio, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 3, + ), + ], ), - Text( - nowPlaying.title, - maxLines: 1, - overflow: TextOverflow.clip, - style: context.labelMedium, + ), + if (dimens.maxHeight > 100) + Row( + children: [ + HoverableSongPlayButton( + size: const Size(50, 50), + song: nowPlaying, + child: Icon( + Icons.play_circle, + color: context.colors.tertiary, + ), + ), + Text( + nowPlaying.title, + maxLines: 1, + overflow: TextOverflow.clip, + style: context.labelMedium, + ), + ], ), - ], - ), - ], + ], + ), + ), ), - ), + ], ), - ], - ), ), ); } diff --git a/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_events.dart b/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_events.dart index 8b064759c6..58b61b37df 100644 --- a/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_events.dart +++ b/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_events.dart @@ -70,53 +70,32 @@ class ArtistEvents extends StatelessWidget { ); }, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], - rowBuilder: (item, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - Text(item.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(item.title)), - ]), - ), - DataCell( - Text(item.location), - ), - DataCell( - Clickable( - child: Text( - item.link, - style: TextStyle( - color: linkColor.value(theme), - decoration: TextDecoration.underline, + rowBuilder: + (item, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell(Text(item.date)), + DataCell(Row(children: [Expanded(child: Text(item.title))])), + DataCell(Text(item.location)), + DataCell( + Clickable( + child: Text( + item.link, + style: TextStyle( + color: linkColor.value(theme), + decoration: TextDecoration.underline, + ), + ), + onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ), ), - ), - onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ], ), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_ranked_songs.dart b/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_ranked_songs.dart index e484ecb3d7..3d1f4e2cf1 100644 --- a/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_ranked_songs.dart +++ b/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_ranked_songs.dart @@ -27,52 +27,42 @@ class ArtistRankedSongs extends StatelessWidget { title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), trailing: Text(song.ranking.toString()), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ); }, columns: const [ - DataColumn( - label: Text( - 'Ranking', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Title', - ), - ), - DataColumn( - label: Text( - 'Length', - ), - ), + DataColumn(label: Text('Ranking'), numeric: true), + DataColumn(label: Text('Title')), + DataColumn(label: Text('Length')), ], - rowBuilder: (song, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - HoverableSongPlayButton( - song: song, - child: Center( - child: Text(song.ranking.toString()), - ), + rowBuilder: + (song, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + HoverableSongPlayButton( + song: song, + child: Center(child: Text(song.ranking.toString())), + ), + ), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(song.image.image), + ), + const SizedBox(width: 5.0), + Expanded(child: Text(song.title)), + ], + ), + ), + DataCell(Text(song.length.toHumanizedString())), + ], ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(song.image.image), - ), - const SizedBox(width: 5.0), - Expanded(child: Text(song.title)), - ]), - ), - DataCell( - Text(song.length.toHumanizedString()), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_updates.dart b/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_updates.dart index e5b8bb5fe9..a0fabf7330 100644 --- a/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_updates.dart +++ b/boring_to_beautiful/step_06/lib/src/features/artists/view/artist_updates.dart @@ -30,7 +30,7 @@ class ArtistUpdates extends StatelessWidget { child: Text(update), ), ), - ) + ), ], ); } diff --git a/boring_to_beautiful/step_06/lib/src/features/artists/view/artists_screen.dart b/boring_to_beautiful/step_06/lib/src/features/artists/view/artists_screen.dart index 8afe759807..225d74847b 100644 --- a/boring_to_beautiful/step_06/lib/src/features/artists/view/artists_screen.dart +++ b/boring_to_beautiful/step_06/lib/src/features/artists/view/artists_screen.dart @@ -17,33 +17,33 @@ class ArtistsScreen extends StatelessWidget { Widget build(BuildContext context) { final artistsProvider = ArtistsProvider(); final artists = artistsProvider.artists; - return LayoutBuilder(builder: (context, constraints) { - return Scaffold( - primary: false, - appBar: AppBar( - title: const Text('ARTISTS'), - toolbarHeight: kToolbarHeight * 2, - ), - body: GridView.builder( - padding: const EdgeInsets.all(15), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), - childAspectRatio: 2.5, - mainAxisSpacing: 10, - crossAxisSpacing: 10, + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + primary: false, + appBar: AppBar( + title: const Text('ARTISTS'), + toolbarHeight: kToolbarHeight * 2, ), - itemCount: artists.length, - itemBuilder: (context, index) { - final artist = artists[index]; - return GestureDetector( - child: ArtistCard( - artist: artist, - ), - onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), - ); - }, - ), - ); - }); + body: GridView.builder( + padding: const EdgeInsets.all(15), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), + childAspectRatio: 2.5, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + ), + itemCount: artists.length, + itemBuilder: (context, index) { + final artist = artists[index]; + return GestureDetector( + child: ArtistCard(artist: artist), + onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), + ); + }, + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_06/lib/src/features/home/view/home_artists.dart b/boring_to_beautiful/step_06/lib/src/features/home/view/home_artists.dart index beb2c0ece4..b5a3a33ecd 100644 --- a/boring_to_beautiful/step_06/lib/src/features/home/view/home_artists.dart +++ b/boring_to_beautiful/step_06/lib/src/features/home/view/home_artists.dart @@ -22,27 +22,25 @@ class HomeArtists extends StatelessWidget { Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(15), - child: constraints.isMobile - ? Column( - children: [ - for (final artist in artists) buildTile(context, artist), - ], - ) - : Row(children: [ - for (final artist in artists) - Flexible( - flex: 1, - child: buildTile(context, artist), - ), - ]), + child: + constraints.isMobile + ? Column( + children: [ + for (final artist in artists) buildTile(context, artist), + ], + ) + : Row( + children: [ + for (final artist in artists) + Flexible(flex: 1, child: buildTile(context, artist)), + ], + ), ); } Widget buildTile(BuildContext context, Artist artist) { return ListTile( - leading: CircleAvatar( - backgroundImage: AssetImage(artist.image.image), - ), + leading: CircleAvatar(backgroundImage: AssetImage(artist.image.image)), title: Text( artist.updates.first, maxLines: 2, diff --git a/boring_to_beautiful/step_06/lib/src/features/home/view/home_recent.dart b/boring_to_beautiful/step_06/lib/src/features/home/view/home_recent.dart index c77500a663..8ba86d117d 100644 --- a/boring_to_beautiful/step_06/lib/src/features/home/view/home_recent.dart +++ b/boring_to_beautiful/step_06/lib/src/features/home/view/home_recent.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/outlined_card.dart'; class HomeRecent extends StatelessWidget { - const HomeRecent( - {super.key, required this.playlists, this.axis = Axis.horizontal}); + const HomeRecent({ + super.key, + required this.playlists, + this.axis = Axis.horizontal, + }); final List playlists; final Axis axis; @@ -43,8 +46,10 @@ class HomeRecent extends StatelessWidget { Row( children: [ Expanded( - child: Image.asset(playlist.cover.image, - fit: BoxFit.cover), + child: Image.asset( + playlist.cover.image, + fit: BoxFit.cover, + ), ), ], ), @@ -79,10 +84,7 @@ class HomeRecent extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ - ClippedImage( - playlist.cover.image, - height: 200, - ), + ClippedImage(playlist.cover.image, height: 200), Expanded( child: Center( child: Padding( @@ -104,23 +106,24 @@ class HomeRecent extends StatelessWidget { return Column( children: [ Padding( - padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), - child: Text( - playlist.title, - style: context.titleSmall!.copyWith( - fontWeight: FontWeight.bold, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - textAlign: TextAlign.center, - )), + padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), + child: Text( + playlist.title, + style: context.titleSmall!.copyWith(fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, + textAlign: TextAlign.center, + ), + ), Padding( padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text(playlist.description, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center), + child: Text( + playlist.description, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), ), ], ); diff --git a/boring_to_beautiful/step_06/lib/src/features/home/view/home_screen.dart b/boring_to_beautiful/step_06/lib/src/features/home/view/home_screen.dart index a763bbd45a..c142c1e4c2 100644 --- a/boring_to_beautiful/step_06/lib/src/features/home/view/home_screen.dart +++ b/boring_to_beautiful/step_06/lib/src/features/home/view/home_screen.dart @@ -49,33 +49,31 @@ class _HomeScreenState extends State { ), ), body: LayoutBuilder( - builder: (context, constraints) => TabBarView( - children: [ - SingleChildScrollView( - child: Column( - children: [ - const HomeHighlight(), - HomeArtists( - artists: artists, - constraints: constraints, + builder: + (context, constraints) => TabBarView( + children: [ + SingleChildScrollView( + child: Column( + children: [ + const HomeHighlight(), + HomeArtists( + artists: artists, + constraints: constraints, + ), + ], ), - ], - ), - ), - HomeRecent( - playlists: playlists, - axis: Axis.vertical, - ), - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), - PlaylistSongs( - playlist: newReleases, - constraints: constraints, + ), + HomeRecent(playlists: playlists, axis: Axis.vertical), + PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), + PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), + ], ), - ], - ), ), ), ); @@ -109,10 +107,11 @@ class _HomeScreenState extends State { children: [ const HomeHighlight(), LayoutBuilder( - builder: (context, constraints) => HomeArtists( - artists: artists, - constraints: constraints, - ), + builder: + (context, constraints) => HomeArtists( + artists: artists, + constraints: constraints, + ), ), ], ), @@ -132,9 +131,7 @@ class _HomeScreenState extends State { style: context.headlineSmall, ), ), - HomeRecent( - playlists: playlists, - ), + HomeRecent(playlists: playlists), ], ), ), @@ -152,19 +149,21 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.only(left: 8, bottom: 8), + padding: const EdgeInsets.only( + left: 8, + bottom: 8, + ), child: Text( 'Top Songs Today', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), ), ], ), @@ -177,19 +176,21 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.only(left: 8, bottom: 8), + padding: const EdgeInsets.only( + left: 8, + bottom: 8, + ), child: Text( 'New Releases', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: newReleases, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), ), ], ), diff --git a/boring_to_beautiful/step_06/lib/src/features/playlists/view/playlist_home_screen.dart b/boring_to_beautiful/step_06/lib/src/features/playlists/view/playlist_home_screen.dart index a80d767930..978608ccad 100644 --- a/boring_to_beautiful/step_06/lib/src/features/playlists/view/playlist_home_screen.dart +++ b/boring_to_beautiful/step_06/lib/src/features/playlists/view/playlist_home_screen.dart @@ -44,8 +44,10 @@ class PlaylistHomeScreen extends StatelessWidget { title: playlist.title, subtitle: playlist.description, ), - onTap: () => - GoRouter.of(context).go('/playlists/${playlist.id}'), + onTap: + () => GoRouter.of( + context, + ).go('/playlists/${playlist.id}'), ); }, ), diff --git a/boring_to_beautiful/step_06/lib/src/features/playlists/view/playlist_screen.dart b/boring_to_beautiful/step_06/lib/src/features/playlists/view/playlist_screen.dart index 5dc2f0744f..c41f500a92 100644 --- a/boring_to_beautiful/step_06/lib/src/features/playlists/view/playlist_screen.dart +++ b/boring_to_beautiful/step_06/lib/src/features/playlists/view/playlist_screen.dart @@ -20,114 +20,116 @@ class PlaylistScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - final colors = Theme.of(context).colorScheme; - final double headerHeight = constraints.isMobile - ? max(constraints.biggest.height * 0.5, 450) - : max(constraints.biggest.height * 0.25, 250); - if (constraints.isMobile) { - return Scaffold( - appBar: AppBar( - leading: BackButton( - onPressed: () => GoRouter.of(context).go('/playlists'), - ), - title: Text(playlist.title), - actions: [ - IconButton( - icon: const Icon(Icons.play_circle_fill), - onPressed: () {}, - ), - IconButton( - onPressed: () {}, - icon: const Icon(Icons.shuffle), - ), - ], - ), - body: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, - ), - ), - ); - } - return Scaffold( - body: CustomScrollView( - slivers: [ - SliverAppBar( + return LayoutBuilder( + builder: (context, constraints) { + final colors = Theme.of(context).colorScheme; + final double headerHeight = + constraints.isMobile + ? max(constraints.biggest.height * 0.5, 450) + : max(constraints.biggest.height * 0.25, 250); + if (constraints.isMobile) { + return Scaffold( + appBar: AppBar( leading: BackButton( onPressed: () => GoRouter.of(context).go('/playlists'), ), - expandedHeight: headerHeight, - pinned: false, - flexibleSpace: FlexibleSpaceBar( - background: AdaptiveImageCard( - axis: constraints.isMobile ? Axis.vertical : Axis.horizontal, - constraints: - constraints.copyWith(maxHeight: headerHeight).normalize(), - image: playlist.cover.image, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'PLAYLIST', - style: context.titleSmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.title, - style: context.displaySmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.description, - style: context.bodyLarge!.copyWith( - color: colors.onSurface.withAlpha(204), + title: Text(playlist.title), + actions: [ + IconButton( + icon: const Icon(Icons.play_circle_fill), + onPressed: () {}, + ), + IconButton(onPressed: () {}, icon: const Icon(Icons.shuffle)), + ], + ), + body: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), + ), + ); + } + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + leading: BackButton( + onPressed: () => GoRouter.of(context).go('/playlists'), + ), + expandedHeight: headerHeight, + pinned: false, + flexibleSpace: FlexibleSpaceBar( + background: AdaptiveImageCard( + axis: + constraints.isMobile ? Axis.vertical : Axis.horizontal, + constraints: + constraints + .copyWith(maxHeight: headerHeight) + .normalize(), + image: playlist.cover.image, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'PLAYLIST', + style: context.titleSmall!.copyWith( + color: colors.onSurface, + ), ), - ), - const SizedBox(height: 8), - Row( - children: [ - IconButton( - icon: Icon( - Icons.play_circle_fill, - color: colors.tertiary, - ), - onPressed: () {}, + Text( + playlist.title, + style: context.displaySmall!.copyWith( + color: colors.onSurface, ), - TextButton.icon( - onPressed: () {}, - icon: Icon( - Icons.shuffle, - color: colors.tertiary, - ), - label: Text( - 'Shuffle', - style: context.bodySmall!.copyWith( + ), + Text( + playlist.description, + style: context.bodyLarge!.copyWith( + color: colors.onSurface.withAlpha(204), + ), + ), + const SizedBox(height: 8), + Row( + children: [ + IconButton( + icon: Icon( + Icons.play_circle_fill, color: colors.tertiary, ), + onPressed: () {}, ), - ), - ], - ), - ], + TextButton.icon( + onPressed: () {}, + icon: Icon(Icons.shuffle, color: colors.tertiary), + label: Text( + 'Shuffle', + style: context.bodySmall!.copyWith( + color: colors.tertiary, + ), + ), + ), + ], + ), + ], + ), ), ), ), - ), - SliverToBoxAdapter( - child: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, + SliverToBoxAdapter( + child: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), ), ), - ), - ], - ), - ); - }); + ], + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_06/lib/src/features/playlists/view/playlist_songs.dart b/boring_to_beautiful/step_06/lib/src/features/playlists/view/playlist_songs.dart index e944336540..1d5a2e9879 100644 --- a/boring_to_beautiful/step_06/lib/src/features/playlists/view/playlist_songs.dart +++ b/boring_to_beautiful/step_06/lib/src/features/playlists/view/playlist_songs.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/views.dart'; class PlaylistSongs extends StatelessWidget { - const PlaylistSongs( - {super.key, required this.playlist, required this.constraints}); + const PlaylistSongs({ + super.key, + required this.playlist, + required this.constraints, + }); final Playlist playlist; final BoxConstraints constraints; @@ -25,14 +28,9 @@ class PlaylistSongs extends StatelessWidget { breakpoint: 450, columns: const [ DataColumn( - label: Padding( - padding: EdgeInsets.only(left: 20), - child: Text('#'), - ), - ), - DataColumn( - label: Text('Title'), + label: Padding(padding: EdgeInsets.only(left: 20), child: Text('#')), ), + DataColumn(label: Text('Title')), DataColumn( label: Padding( padding: EdgeInsets.only(right: 10), @@ -40,38 +38,40 @@ class PlaylistSongs extends StatelessWidget { ), ), ], - rowBuilder: (context, index) => DataRow.byIndex( - index: index, - cells: [ - DataCell( - // Add HoverableSongPlayButton - Center( - child: Text( - (index + 1).toString(), - textAlign: TextAlign.center, + rowBuilder: + (context, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + // Add HoverableSongPlayButton + Center( + child: Text( + (index + 1).toString(), + textAlign: TextAlign.center, + ), + ), ), - ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(playlist.songs[index].image.image), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(playlist.songs[index].image.image), + ), + const SizedBox(width: 10), + Expanded(child: Text(playlist.songs[index].title)), + ], + ), ), - const SizedBox(width: 10), - Expanded(child: Text(playlist.songs[index].title)), - ]), - ), - DataCell( - Text(playlist.songs[index].length.toHumanizedString()), + DataCell(Text(playlist.songs[index].length.toHumanizedString())), + ], ), - ], - ), itemBuilder: (song, index) { return ListTile( - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), leading: ClippedImage(song.image.image), title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), diff --git a/boring_to_beautiful/step_06/lib/src/shared/app.dart b/boring_to_beautiful/step_06/lib/src/shared/app.dart index 3910d8f276..ed27418bd4 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/app.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/app.dart @@ -19,45 +19,46 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - final settings = ValueNotifier(ThemeSettings( - sourceColor: Colors.pink, - themeMode: ThemeMode.system, - )); + final settings = ValueNotifier( + ThemeSettings(sourceColor: Colors.pink, themeMode: ThemeMode.system), + ); @override Widget build(BuildContext context) { return BlocProvider( create: (context) => PlaybackBloc(), child: DynamicColorBuilder( - builder: (lightDynamic, darkDynamic) => ThemeProvider( - lightDynamic: lightDynamic, - darkDynamic: darkDynamic, - settings: settings, - child: NotificationListener( - onNotification: (notification) { - settings.value = notification.settings; - return true; - }, - child: ValueListenableBuilder( - valueListenable: settings, - builder: (context, value, _) { - final theme = ThemeProvider.of(context); - return MaterialApp.router( - debugShowCheckedModeBanner: false, - title: 'Flutter Demo', - theme: theme.light(settings.value.sourceColor), - darkTheme: theme.dark(settings.value.sourceColor), - themeMode: theme.themeMode(), - routeInformationParser: appRouter.routeInformationParser, - routeInformationProvider: - appRouter.routeInformationProvider, - routerDelegate: appRouter.routerDelegate, - builder: (context, child) { - return PlayPauseListener(child: child!); - }, - ); + builder: + (lightDynamic, darkDynamic) => ThemeProvider( + lightDynamic: lightDynamic, + darkDynamic: darkDynamic, + settings: settings, + child: NotificationListener( + onNotification: (notification) { + settings.value = notification.settings; + return true; }, + child: ValueListenableBuilder( + valueListenable: settings, + builder: (context, value, _) { + final theme = ThemeProvider.of(context); + return MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + theme: theme.light(settings.value.sourceColor), + darkTheme: theme.dark(settings.value.sourceColor), + themeMode: theme.themeMode(), + routeInformationParser: appRouter.routeInformationParser, + routeInformationProvider: + appRouter.routeInformationProvider, + routerDelegate: appRouter.routerDelegate, + builder: (context, child) { + return PlayPauseListener(child: child!); + }, + ); + }, + ), ), - )), + ), ), ); } diff --git a/boring_to_beautiful/step_06/lib/src/shared/classes/image.dart b/boring_to_beautiful/step_06/lib/src/shared/classes/image.dart index a1ef427c1d..00a6472b4a 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/classes/image.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/classes/image.dart @@ -3,10 +3,11 @@ // found in the LICENSE file. class MyArtistImage { - const MyArtistImage( - {required this.image, - required this.sourceName, - required this.sourceLink}); + const MyArtistImage({ + required this.image, + required this.sourceName, + required this.sourceLink, + }); final String image; final String sourceName; diff --git a/boring_to_beautiful/step_06/lib/src/shared/classes/playlist.dart b/boring_to_beautiful/step_06/lib/src/shared/classes/playlist.dart index 59899dc619..5f0225059d 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/classes/playlist.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/classes/playlist.dart @@ -17,8 +17,9 @@ class Playlist { this.description = '', required this.songs, this.cover = const MyArtistImage( - image: 'assets/images/record.jpeg', - sourceName: 'Adobe Stock Images', - sourceLink: ''), + image: 'assets/images/record.jpeg', + sourceName: 'Adobe Stock Images', + sourceLink: '', + ), }); } diff --git a/boring_to_beautiful/step_06/lib/src/shared/classes/ranked_song.dart b/boring_to_beautiful/step_06/lib/src/shared/classes/ranked_song.dart index 5908268c8c..2362bfae64 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/classes/ranked_song.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/classes/ranked_song.dart @@ -7,7 +7,11 @@ import './classes.dart'; class RankedSong extends Song { final int ranking; - const RankedSong(this.ranking, String title, Artist artist, Duration length, - MyArtistImage image) - : super(title, artist, length, image); + const RankedSong( + this.ranking, + String title, + Artist artist, + Duration length, + MyArtistImage image, + ) : super(title, artist, length, image); } diff --git a/boring_to_beautiful/step_06/lib/src/shared/extensions.dart b/boring_to_beautiful/step_06/lib/src/shared/extensions.dart index 8b7e41b988..fe65add57c 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/extensions.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/extensions.dart @@ -9,51 +9,36 @@ extension TypographyUtils on BuildContext { ThemeData get theme => Theme.of(this); TextTheme get textTheme => GoogleFonts.montserratTextTheme(theme.textTheme); ColorScheme get colors => theme.colorScheme; - TextStyle? get displayLarge => textTheme.displayLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displayMedium => textTheme.displayMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displaySmall => textTheme.displaySmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineLarge => textTheme.headlineLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineMedium => textTheme.headlineMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineSmall => textTheme.headlineSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleLarge => textTheme.titleLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleMedium => textTheme.titleMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleSmall => textTheme.titleSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelLarge => textTheme.labelLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelMedium => textTheme.labelMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelSmall => textTheme.labelSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyLarge => textTheme.bodyLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyMedium => textTheme.bodyMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodySmall => textTheme.bodySmall?.copyWith( - color: colors.onSurface, - ); + TextStyle? get displayLarge => + textTheme.displayLarge?.copyWith(color: colors.onSurface); + TextStyle? get displayMedium => + textTheme.displayMedium?.copyWith(color: colors.onSurface); + TextStyle? get displaySmall => + textTheme.displaySmall?.copyWith(color: colors.onSurface); + TextStyle? get headlineLarge => + textTheme.headlineLarge?.copyWith(color: colors.onSurface); + TextStyle? get headlineMedium => + textTheme.headlineMedium?.copyWith(color: colors.onSurface); + TextStyle? get headlineSmall => + textTheme.headlineSmall?.copyWith(color: colors.onSurface); + TextStyle? get titleLarge => + textTheme.titleLarge?.copyWith(color: colors.onSurface); + TextStyle? get titleMedium => + textTheme.titleMedium?.copyWith(color: colors.onSurface); + TextStyle? get titleSmall => + textTheme.titleSmall?.copyWith(color: colors.onSurface); + TextStyle? get labelLarge => + textTheme.labelLarge?.copyWith(color: colors.onSurface); + TextStyle? get labelMedium => + textTheme.labelMedium?.copyWith(color: colors.onSurface); + TextStyle? get labelSmall => + textTheme.labelSmall?.copyWith(color: colors.onSurface); + TextStyle? get bodyLarge => + textTheme.bodyLarge?.copyWith(color: colors.onSurface); + TextStyle? get bodyMedium => + textTheme.bodyMedium?.copyWith(color: colors.onSurface); + TextStyle? get bodySmall => + textTheme.bodySmall?.copyWith(color: colors.onSurface); } extension BreakpointUtils on BoxConstraints { @@ -65,17 +50,17 @@ extension BreakpointUtils on BoxConstraints { extension DurationString on String { /// Assumes a string (roughly) of the format '\d{1,2}:\d{2}' Duration toDuration() => switch (split(':')) { - [var minutes, var seconds] => Duration( - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - [var hours, var minutes, var seconds] => Duration( - hours: int.parse(hours.trim()), - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - _ => throw Exception('Invalid duration string: $this'), - }; + [var minutes, var seconds] => Duration( + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + [var hours, var minutes, var seconds] => Duration( + hours: int.parse(hours.trim()), + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + _ => throw Exception('Invalid duration string: $this'), + }; } extension HumanizedDuration on Duration { diff --git a/boring_to_beautiful/step_06/lib/src/shared/playback/bloc/playback_bloc.dart b/boring_to_beautiful/step_06/lib/src/shared/playback/bloc/playback_bloc.dart index 73c2f4c436..c6c871937b 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/playback/bloc/playback_bloc.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/playback/bloc/playback_bloc.dart @@ -41,9 +41,8 @@ class PlaybackBloc extends Bloc { } } - void _handlePlaybackProgress(Duration progress) => add( - PlaybackEvent.songProgress(progress), - ); + void _handlePlaybackProgress(Duration progress) => + add(PlaybackEvent.songProgress(progress)); void _togglePlayPause(TogglePlayPause event, Emitter emit) { state.isPlaying ? _pausePlayback() : _resumePlayback(); @@ -52,8 +51,10 @@ class PlaybackBloc extends Bloc { void _pausePlayback() => _currentlyPlayingSubscription!.cancel(); - void _resumePlayback() => _currentlyPlayingSubscription = - _startPlayingStream().listen(_handlePlaybackProgress); + void _resumePlayback() => + _currentlyPlayingSubscription = _startPlayingStream().listen( + _handlePlaybackProgress, + ); void _changeSong(ChangeSong event, Emitter emit) { emit( @@ -69,19 +70,15 @@ class PlaybackBloc extends Bloc { } void _songProgress(SongProgress event, Emitter emit) => emit( - state.copyWith( - songWithProgress: state.songWithProgress!.copyWith( - progress: state.songWithProgress!.progress + event.duration, - ), - ), - ); + state.copyWith( + songWithProgress: state.songWithProgress!.copyWith( + progress: state.songWithProgress!.progress + event.duration, + ), + ), + ); void _setVolume(SetVolume event, Emitter emit) => emit( - state.copyWith( - volume: event.value, - isMuted: false, - previousVolume: null, - ), - ); + state.copyWith(volume: event.value, isMuted: false, previousVolume: null), + ); void _toggleMute(ToggleMute event, Emitter emit) { if (state.isMuted) { @@ -94,11 +91,7 @@ class PlaybackBloc extends Bloc { ); } else { emit( - state.copyWith( - isMuted: true, - volume: 0, - previousVolume: state.volume, - ), + state.copyWith(isMuted: true, volume: 0, previousVolume: state.volume), ); } } diff --git a/boring_to_beautiful/step_06/lib/src/shared/playback/bloc/playback_bloc.freezed.dart b/boring_to_beautiful/step_06/lib/src/shared/playback/bloc/playback_bloc.freezed.dart index 8a422cd449..54e870ab6f 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/playback/bloc/playback_bloc.freezed.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/playback/bloc/playback_bloc.freezed.dart @@ -12,7 +12,8 @@ part of 'playback_bloc.dart'; T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models', +); /// @nodoc mixin _$PlaybackEvent { @@ -24,8 +25,7 @@ mixin _$PlaybackEvent { required TResult Function() toggleMute, required TResult Function(double percent) moveToInSong, required TResult Function(Duration duration) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? togglePlayPause, @@ -34,8 +34,7 @@ mixin _$PlaybackEvent { TResult? Function()? toggleMute, TResult? Function(double percent)? moveToInSong, TResult? Function(Duration duration)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ TResult Function()? togglePlayPause, @@ -45,8 +44,7 @@ mixin _$PlaybackEvent { TResult Function(double percent)? moveToInSong, TResult Function(Duration duration)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult map({ required TResult Function(TogglePlayPause value) togglePlayPause, @@ -55,8 +53,7 @@ mixin _$PlaybackEvent { required TResult Function(ToggleMute value) toggleMute, required TResult Function(MoveToInSong value) moveToInSong, required TResult Function(SongProgress value) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ TResult? Function(TogglePlayPause value)? togglePlayPause, @@ -65,8 +62,7 @@ mixin _$PlaybackEvent { TResult? Function(ToggleMute value)? toggleMute, TResult? Function(MoveToInSong value)? moveToInSong, TResult? Function(SongProgress value)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeMap({ TResult Function(TogglePlayPause value)? togglePlayPause, @@ -76,15 +72,15 @@ mixin _$PlaybackEvent { TResult Function(MoveToInSong value)? moveToInSong, TResult Function(SongProgress value)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; } /// @nodoc abstract class $PlaybackEventCopyWith<$Res> { factory $PlaybackEventCopyWith( - PlaybackEvent value, $Res Function(PlaybackEvent) then) = - _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; + PlaybackEvent value, + $Res Function(PlaybackEvent) then, + ) = _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; } /// @nodoc @@ -103,9 +99,10 @@ class _$PlaybackEventCopyWithImpl<$Res, $Val extends PlaybackEvent> /// @nodoc abstract class _$$TogglePlayPauseImplCopyWith<$Res> { - factory _$$TogglePlayPauseImplCopyWith(_$TogglePlayPauseImpl value, - $Res Function(_$TogglePlayPauseImpl) then) = - __$$TogglePlayPauseImplCopyWithImpl<$Res>; + factory _$$TogglePlayPauseImplCopyWith( + _$TogglePlayPauseImpl value, + $Res Function(_$TogglePlayPauseImpl) then, + ) = __$$TogglePlayPauseImplCopyWithImpl<$Res>; } /// @nodoc @@ -113,8 +110,9 @@ class __$$TogglePlayPauseImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$TogglePlayPauseImpl> implements _$$TogglePlayPauseImplCopyWith<$Res> { __$$TogglePlayPauseImplCopyWithImpl( - _$TogglePlayPauseImpl _value, $Res Function(_$TogglePlayPauseImpl) _then) - : super(_value, _then); + _$TogglePlayPauseImpl _value, + $Res Function(_$TogglePlayPauseImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -233,8 +231,9 @@ abstract class TogglePlayPause implements PlaybackEvent { /// @nodoc abstract class _$$ChangeSongImplCopyWith<$Res> { factory _$$ChangeSongImplCopyWith( - _$ChangeSongImpl value, $Res Function(_$ChangeSongImpl) then) = - __$$ChangeSongImplCopyWithImpl<$Res>; + _$ChangeSongImpl value, + $Res Function(_$ChangeSongImpl) then, + ) = __$$ChangeSongImplCopyWithImpl<$Res>; @useResult $Res call({Song song}); } @@ -244,22 +243,23 @@ class __$$ChangeSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ChangeSongImpl> implements _$$ChangeSongImplCopyWith<$Res> { __$$ChangeSongImplCopyWithImpl( - _$ChangeSongImpl _value, $Res Function(_$ChangeSongImpl) _then) - : super(_value, _then); + _$ChangeSongImpl _value, + $Res Function(_$ChangeSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? song = null, - }) { - return _then(_$ChangeSongImpl( - null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? song = null}) { + return _then( + _$ChangeSongImpl( + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -397,8 +397,9 @@ abstract class ChangeSong implements PlaybackEvent { /// @nodoc abstract class _$$SetVolumeImplCopyWith<$Res> { factory _$$SetVolumeImplCopyWith( - _$SetVolumeImpl value, $Res Function(_$SetVolumeImpl) then) = - __$$SetVolumeImplCopyWithImpl<$Res>; + _$SetVolumeImpl value, + $Res Function(_$SetVolumeImpl) then, + ) = __$$SetVolumeImplCopyWithImpl<$Res>; @useResult $Res call({double value}); } @@ -408,22 +409,23 @@ class __$$SetVolumeImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SetVolumeImpl> implements _$$SetVolumeImplCopyWith<$Res> { __$$SetVolumeImplCopyWithImpl( - _$SetVolumeImpl _value, $Res Function(_$SetVolumeImpl) _then) - : super(_value, _then); + _$SetVolumeImpl _value, + $Res Function(_$SetVolumeImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? value = null, - }) { - return _then(_$SetVolumeImpl( - null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? value = null}) { + return _then( + _$SetVolumeImpl( + null == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -561,8 +563,9 @@ abstract class SetVolume implements PlaybackEvent { /// @nodoc abstract class _$$ToggleMuteImplCopyWith<$Res> { factory _$$ToggleMuteImplCopyWith( - _$ToggleMuteImpl value, $Res Function(_$ToggleMuteImpl) then) = - __$$ToggleMuteImplCopyWithImpl<$Res>; + _$ToggleMuteImpl value, + $Res Function(_$ToggleMuteImpl) then, + ) = __$$ToggleMuteImplCopyWithImpl<$Res>; } /// @nodoc @@ -570,8 +573,9 @@ class __$$ToggleMuteImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ToggleMuteImpl> implements _$$ToggleMuteImplCopyWith<$Res> { __$$ToggleMuteImplCopyWithImpl( - _$ToggleMuteImpl _value, $Res Function(_$ToggleMuteImpl) _then) - : super(_value, _then); + _$ToggleMuteImpl _value, + $Res Function(_$ToggleMuteImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -690,8 +694,9 @@ abstract class ToggleMute implements PlaybackEvent { /// @nodoc abstract class _$$MoveToInSongImplCopyWith<$Res> { factory _$$MoveToInSongImplCopyWith( - _$MoveToInSongImpl value, $Res Function(_$MoveToInSongImpl) then) = - __$$MoveToInSongImplCopyWithImpl<$Res>; + _$MoveToInSongImpl value, + $Res Function(_$MoveToInSongImpl) then, + ) = __$$MoveToInSongImplCopyWithImpl<$Res>; @useResult $Res call({double percent}); } @@ -701,22 +706,23 @@ class __$$MoveToInSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$MoveToInSongImpl> implements _$$MoveToInSongImplCopyWith<$Res> { __$$MoveToInSongImplCopyWithImpl( - _$MoveToInSongImpl _value, $Res Function(_$MoveToInSongImpl) _then) - : super(_value, _then); + _$MoveToInSongImpl _value, + $Res Function(_$MoveToInSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? percent = null, - }) { - return _then(_$MoveToInSongImpl( - null == percent - ? _value.percent - : percent // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? percent = null}) { + return _then( + _$MoveToInSongImpl( + null == percent + ? _value.percent + : percent // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -854,8 +860,9 @@ abstract class MoveToInSong implements PlaybackEvent { /// @nodoc abstract class _$$SongProgressImplCopyWith<$Res> { factory _$$SongProgressImplCopyWith( - _$SongProgressImpl value, $Res Function(_$SongProgressImpl) then) = - __$$SongProgressImplCopyWithImpl<$Res>; + _$SongProgressImpl value, + $Res Function(_$SongProgressImpl) then, + ) = __$$SongProgressImplCopyWithImpl<$Res>; @useResult $Res call({Duration duration}); } @@ -865,22 +872,23 @@ class __$$SongProgressImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SongProgressImpl> implements _$$SongProgressImplCopyWith<$Res> { __$$SongProgressImplCopyWithImpl( - _$SongProgressImpl _value, $Res Function(_$SongProgressImpl) _then) - : super(_value, _then); + _$SongProgressImpl _value, + $Res Function(_$SongProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? duration = null, - }) { - return _then(_$SongProgressImpl( - null == duration - ? _value.duration - : duration // ignore: cast_nullable_to_non_nullable - as Duration, - )); + $Res call({Object? duration = null}) { + return _then( + _$SongProgressImpl( + null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as Duration, + ), + ); } } @@ -1037,15 +1045,17 @@ mixin _$PlaybackState { /// @nodoc abstract class $PlaybackStateCopyWith<$Res> { factory $PlaybackStateCopyWith( - PlaybackState value, $Res Function(PlaybackState) then) = - _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; + PlaybackState value, + $Res Function(PlaybackState) then, + ) = _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); $SongWithProgressCopyWith<$Res>? get songWithProgress; } @@ -1071,28 +1081,36 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_value.copyWith( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - ) as $Val); + return _then( + _value.copyWith( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ) + as $Val, + ); } /// Create a copy of PlaybackState @@ -1114,16 +1132,18 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> abstract class _$$PlaybackStateImplCopyWith<$Res> implements $PlaybackStateCopyWith<$Res> { factory _$$PlaybackStateImplCopyWith( - _$PlaybackStateImpl value, $Res Function(_$PlaybackStateImpl) then) = - __$$PlaybackStateImplCopyWithImpl<$Res>; + _$PlaybackStateImpl value, + $Res Function(_$PlaybackStateImpl) then, + ) = __$$PlaybackStateImplCopyWithImpl<$Res>; @override @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); @override $SongWithProgressCopyWith<$Res>? get songWithProgress; @@ -1134,8 +1154,9 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> extends _$PlaybackStateCopyWithImpl<$Res, _$PlaybackStateImpl> implements _$$PlaybackStateImplCopyWith<$Res> { __$$PlaybackStateImplCopyWithImpl( - _$PlaybackStateImpl _value, $Res Function(_$PlaybackStateImpl) _then) - : super(_value, _then); + _$PlaybackStateImpl _value, + $Res Function(_$PlaybackStateImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1148,40 +1169,48 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_$PlaybackStateImpl( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - )); + return _then( + _$PlaybackStateImpl( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ), + ); } } /// @nodoc class _$PlaybackStateImpl implements _PlaybackState { - const _$PlaybackStateImpl( - {this.volume = 0.5, - this.previousVolume, - this.isMuted = false, - this.isPlaying = false, - this.songWithProgress}); + const _$PlaybackStateImpl({ + this.volume = 0.5, + this.previousVolume, + this.isMuted = false, + this.isPlaying = false, + this.songWithProgress, + }); /// Legal values are between 0 and 1. @override @@ -1221,8 +1250,14 @@ class _$PlaybackStateImpl implements _PlaybackState { } @override - int get hashCode => Object.hash(runtimeType, volume, previousVolume, isMuted, - isPlaying, songWithProgress); + int get hashCode => Object.hash( + runtimeType, + volume, + previousVolume, + isMuted, + isPlaying, + songWithProgress, + ); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1234,12 +1269,13 @@ class _$PlaybackStateImpl implements _PlaybackState { } abstract class _PlaybackState implements PlaybackState { - const factory _PlaybackState( - {final double volume, - final double? previousVolume, - final bool isMuted, - final bool isPlaying, - final SongWithProgress? songWithProgress}) = _$PlaybackStateImpl; + const factory _PlaybackState({ + final double volume, + final double? previousVolume, + final bool isMuted, + final bool isPlaying, + final SongWithProgress? songWithProgress, + }) = _$PlaybackStateImpl; /// Legal values are between 0 and 1. @override @@ -1278,8 +1314,9 @@ mixin _$SongWithProgress { /// @nodoc abstract class $SongWithProgressCopyWith<$Res> { factory $SongWithProgressCopyWith( - SongWithProgress value, $Res Function(SongWithProgress) then) = - _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; + SongWithProgress value, + $Res Function(SongWithProgress) then, + ) = _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; @useResult $Res call({Duration progress, Song song}); } @@ -1298,29 +1335,32 @@ class _$SongWithProgressCopyWithImpl<$Res, $Val extends SongWithProgress> /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_value.copyWith( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - ) as $Val); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _value.copyWith( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ) + as $Val, + ); } } /// @nodoc abstract class _$$SongWithProgressImplCopyWith<$Res> implements $SongWithProgressCopyWith<$Res> { - factory _$$SongWithProgressImplCopyWith(_$SongWithProgressImpl value, - $Res Function(_$SongWithProgressImpl) then) = - __$$SongWithProgressImplCopyWithImpl<$Res>; + factory _$$SongWithProgressImplCopyWith( + _$SongWithProgressImpl value, + $Res Function(_$SongWithProgressImpl) then, + ) = __$$SongWithProgressImplCopyWithImpl<$Res>; @override @useResult $Res call({Duration progress, Song song}); @@ -1330,28 +1370,30 @@ abstract class _$$SongWithProgressImplCopyWith<$Res> class __$$SongWithProgressImplCopyWithImpl<$Res> extends _$SongWithProgressCopyWithImpl<$Res, _$SongWithProgressImpl> implements _$$SongWithProgressImplCopyWith<$Res> { - __$$SongWithProgressImplCopyWithImpl(_$SongWithProgressImpl _value, - $Res Function(_$SongWithProgressImpl) _then) - : super(_value, _then); + __$$SongWithProgressImplCopyWithImpl( + _$SongWithProgressImpl _value, + $Res Function(_$SongWithProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of SongWithProgress /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_$SongWithProgressImpl( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _$SongWithProgressImpl( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -1390,13 +1432,16 @@ class _$SongWithProgressImpl implements _SongWithProgress { @pragma('vm:prefer-inline') _$$SongWithProgressImplCopyWith<_$SongWithProgressImpl> get copyWith => __$$SongWithProgressImplCopyWithImpl<_$SongWithProgressImpl>( - this, _$identity); + this, + _$identity, + ); } abstract class _SongWithProgress implements SongWithProgress { - const factory _SongWithProgress( - {required final Duration progress, - required final Song song}) = _$SongWithProgressImpl; + const factory _SongWithProgress({ + required final Duration progress, + required final Song song, + }) = _$SongWithProgressImpl; @override Duration get progress; diff --git a/boring_to_beautiful/step_06/lib/src/shared/providers/artists.dart b/boring_to_beautiful/step_06/lib/src/shared/providers/artists.dart index d116ad9cdd..f9e4a8063e 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/providers/artists.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/providers/artists.dart @@ -11,162 +11,175 @@ class ArtistsProvider { static ArtistsProvider get shared => ArtistsProvider(); List get artists => const [ - Artist( - id: 'jmo', - name: 'Jessie Morrison', + Artist( + id: 'jmo', + name: 'Jessie Morrison', + image: MyArtistImage( + image: 'assets/images/artists/woman.jpeg', + sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', + sourceName: 'Daniel Monteiro', + ), + bio: + 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', + updates: [ + 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', + 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', + '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', + ], + events: [ + Event( + date: '1/20/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Mountain View, California', + link: 'Tickets', + ), + Event( + date: '1/22/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Austin, Texas', + link: 'Tickets', + ), + Event( + date: '1/23/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Houston, Texas', + link: 'Tickets', + ), + Event( + date: '2/8/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Los Angeles, California', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', + author: 'By Jacqueline Stewart', + blurb: + 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', image: MyArtistImage( - image: 'assets/images/artists/woman.jpeg', - sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', - sourceName: 'Daniel Monteiro', + image: 'assets/images/news/concert.jpeg', + sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', + sourceName: 'Anthony DELANOIX', ), - bio: - 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', - updates: [ - 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', - 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', - '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', - ], - events: [ - Event( - date: '1/20/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Mountain View, California', - link: 'Tickets'), - Event( - date: '1/22/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Austin, Texas', - link: 'Tickets'), - Event( - date: '1/23/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Houston, Texas', - link: 'Tickets'), - Event( - date: '2/8/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Los Angeles, California', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', - author: 'By Jacqueline Stewart', - blurb: - 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', - image: MyArtistImage( - image: 'assets/images/news/concert.jpeg', - sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', - sourceName: 'Anthony DELANOIX', - ), - ) - ], ), - Artist( - id: 'lb', - name: 'Lucas Bryant', + ], + ), + Artist( + id: 'lb', + name: 'Lucas Bryant', + image: MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + bio: + 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', + updates: [ + 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', + 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', + 'We\'re going all in this weekend! How are you doing, Vegas?!', + ], + events: [ + Event( + date: '5/16/22', + title: 'Back To My Hometown Tour', + location: 'Indianapolis, IN', + link: 'Tickets', + ), + Event( + date: '5/18/22', + title: 'Back To My Hometown Tour', + location: 'San Antonio, TX', + link: 'Tickets', + ), + Event( + date: '5/20/22', + title: 'Back To My Hometown Tour', + location: 'Phoenix, AZ', + link: 'Tickets', + ), + Event( + date: '5/23/22', + title: 'Back To My Hometown Tour', + location: 'San Diego, CA', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', + author: 'Lonnie Hall', + blurb: + 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', image: MyArtistImage( image: 'assets/images/albums/artist1-album2.jpg', sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', sourceName: 'Keagan Henman', ), - bio: - 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', - updates: [ - 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', - 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', - 'We\'re going all in this weekend! How are you doing, Vegas?!', - ], - events: [ - Event( - date: '5/16/22', - title: 'Back To My Hometown Tour', - location: 'Indianapolis, IN', - link: 'Tickets'), - Event( - date: '5/18/22', - title: 'Back To My Hometown Tour', - location: 'San Antonio, TX', - link: 'Tickets'), - Event( - date: '5/20/22', - title: 'Back To My Hometown Tour', - location: 'Phoenix, AZ', - link: 'Tickets'), - Event( - date: '5/23/22', - title: 'Back To My Hometown Tour', - location: 'San Diego, CA', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', - author: 'Lonnie Hall', - blurb: - 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', - image: MyArtistImage( - image: 'assets/images/albums/artist1-album2.jpg', - sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', - sourceName: 'Keagan Henman', - ), - ), - ], ), - Artist( - id: 'jonjames', - name: 'Jon James', + ], + ), + Artist( + id: 'jonjames', + name: 'Jon James', + image: MyArtistImage( + image: 'assets/images/artists/joe.jpg', + sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', + sourceName: 'Natalie Runnerstrom', + ), + bio: + 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', + updates: [ + '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', + '4 days until I get to share some of the favorite songs I\'ve ever written with you.', + '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', + ], + events: [ + Event( + date: '10/22/21', + title: 'Falling For You Tour', + location: 'Dallas, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/23/21', + title: 'Falling For You Tour', + location: 'Houston, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/26/21', + title: 'Falling For You Tour', + location: 'Phoenix, Arizona', + link: 'Ticketmaster', + ), + Event( + date: '10/27/21', + title: 'Falling For You Tour', + location: 'Los Angeles, California', + link: 'Ticketmaster', + ), + ], + news: [ + News( + title: + 'Jon James is excited for the release of his sixth album "Falling For You"', + author: 'Top Media Today', + blurb: + 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', image: MyArtistImage( - image: 'assets/images/artists/joe.jpg', - sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', - sourceName: 'Natalie Runnerstrom', + image: 'assets/images/news/recording_studio.jpg', + sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', + sourceName: 'Yohann LIBOT', ), - bio: - 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', - updates: [ - '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', - '4 days until I get to share some of the favorite songs I\'ve ever written with you.', - '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', - ], - events: [ - Event( - date: '10/22/21', - title: 'Falling For You Tour', - location: 'Dallas, Texas', - link: 'Ticketmaster'), - Event( - date: '10/23/21', - title: 'Falling For You Tour', - location: 'Houston, Texas', - link: 'Ticketmaster'), - Event( - date: '10/26/21', - title: 'Falling For You Tour', - location: 'Phoenix, Arizona', - link: 'Ticketmaster'), - Event( - date: '10/27/21', - title: 'Falling For You Tour', - location: 'Los Angeles, California', - link: 'Ticketmaster'), - ], - news: [ - News( - title: - 'Jon James is excited for the release of his sixth album "Falling For You"', - author: 'Top Media Today', - blurb: - 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', - image: MyArtistImage( - image: 'assets/images/news/recording_studio.jpg', - sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', - sourceName: 'Yohann LIBOT'), - ) - ], ), - ]; + ], + ), + ]; Artist? getArtist(String id) { return artists.firstWhereOrNull((artist) => artist.id == id); diff --git a/boring_to_beautiful/step_06/lib/src/shared/providers/playlists.dart b/boring_to_beautiful/step_06/lib/src/shared/providers/playlists.dart index e8bab994dd..f27f71b3ec 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/providers/playlists.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/providers/playlists.dart @@ -18,41 +18,50 @@ class PlaylistsProvider { static List images() { return [ const MyArtistImage( - image: 'assets/images/playlists/favorite.jpg', - sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/favorite.jpg', + sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/austin.jpg', - sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', - sourceName: 'Carlos Alfonso'), + image: 'assets/images/playlists/austin.jpg', + sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', + sourceName: 'Carlos Alfonso', + ), const MyArtistImage( - image: 'assets/images/playlists/reading.jpg', - sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', - sourceName: 'Alexandra Fuller'), + image: 'assets/images/playlists/reading.jpg', + sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', + sourceName: 'Alexandra Fuller', + ), const MyArtistImage( - image: 'assets/images/playlists/workout.jpg', - sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/workout.jpg', + sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/calm.jpg', - sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', - sourceName: 'Jared Rice'), + image: 'assets/images/playlists/calm.jpg', + sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', + sourceName: 'Jared Rice', + ), const MyArtistImage( - image: 'assets/images/playlists/coffee.jpg', - sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', - sourceName: 'Nathan Dumlao'), + image: 'assets/images/playlists/coffee.jpg', + sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', + sourceName: 'Nathan Dumlao', + ), const MyArtistImage( - image: 'assets/images/playlists/piano.jpg', - sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', - sourceName: 'Jordan Whitfield'), + image: 'assets/images/playlists/piano.jpg', + sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', + sourceName: 'Jordan Whitfield', + ), const MyArtistImage( - image: 'assets/images/playlists/studying.jpg', - sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', - sourceName: 'Humble Lamb'), + image: 'assets/images/playlists/studying.jpg', + sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', + sourceName: 'Humble Lamb', + ), const MyArtistImage( - image: 'assets/images/playlists/jazz.jpg', - sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', - sourceName: 'dimitri.photography'), + image: 'assets/images/playlists/jazz.jpg', + sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', + sourceName: 'dimitri.photography', + ), ]; } @@ -85,8 +94,10 @@ class PlaylistsProvider { ); } - static final List _randomPlaylists = - List.generate(10, (index) => randomLengthPlaylist()); + static final List _randomPlaylists = List.generate( + 10, + (index) => randomLengthPlaylist(), + ); } String randomId() { diff --git a/boring_to_beautiful/step_06/lib/src/shared/providers/songs.dart b/boring_to_beautiful/step_06/lib/src/shared/providers/songs.dart index ed018a83ff..f1205f2dcb 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/providers/songs.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/providers/songs.dart @@ -52,9 +52,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:35'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album2.jpg', - sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', - sourceName: 'Alexandru Acea'), + image: 'assets/images/albums/artist4-album2.jpg', + sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', + sourceName: 'Alexandru Acea', + ), ), RankedSong( 2, @@ -62,9 +63,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:52'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album1.jpg', - sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', - sourceName: 'Jr Korpa'), + image: 'assets/images/albums/artist4-album1.jpg', + sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', + sourceName: 'Jr Korpa', + ), ), RankedSong( 3, @@ -72,9 +74,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:39'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album3.jpg', - sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', - sourceName: 'Stormseeker'), + image: 'assets/images/albums/artist4-album3.jpg', + sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', + sourceName: 'Stormseeker', + ), ), RankedSong( 1, diff --git a/boring_to_beautiful/step_06/lib/src/shared/providers/theme.dart b/boring_to_beautiful/step_06/lib/src/shared/providers/theme.dart index f05527ff8f..5c2dd59042 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/providers/theme.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/providers/theme.dart @@ -28,12 +28,13 @@ class ThemeSettingChange extends Notification { } class ThemeProvider extends InheritedWidget { - const ThemeProvider( - {super.key, - required this.settings, - required this.lightDynamic, - required this.darkDynamic, - required super.child}); + const ThemeProvider({ + super.key, + required this.settings, + required this.lightDynamic, + required this.darkDynamic, + required super.child, + }); final ValueNotifier settings; final ColorScheme? lightDynamic; @@ -59,8 +60,9 @@ class ThemeProvider extends InheritedWidget { Color blend(Color targetColor) { return Color( - // ignore: deprecated_member_use - Blend.harmonize(targetColor.value, settings.value.sourceColor.value)); + // ignore: deprecated_member_use + Blend.harmonize(targetColor.value, settings.value.sourceColor.value), + ); } Color source(Color? target) { @@ -72,18 +74,18 @@ class ThemeProvider extends InheritedWidget { } ColorScheme colors(Brightness brightness, Color? targetColor) { - final dynamicPrimary = brightness == Brightness.light - ? lightDynamic?.primary - : darkDynamic?.primary; + final dynamicPrimary = + brightness == Brightness.light + ? lightDynamic?.primary + : darkDynamic?.primary; return ColorScheme.fromSeed( seedColor: dynamicPrimary ?? source(targetColor), brightness: brightness, ); } - ShapeBorder get shapeMedium => RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ); + ShapeBorder get shapeMedium => + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)); CardTheme cardTheme() { return CardTheme( @@ -113,21 +115,13 @@ class ThemeProvider extends InheritedWidget { labelColor: colors.secondary, unselectedLabelColor: colors.onSurfaceVariant, indicator: BoxDecoration( - border: Border( - bottom: BorderSide( - color: colors.secondary, - width: 2, - ), - ), + border: Border(bottom: BorderSide(color: colors.secondary, width: 2)), ), ); } BottomAppBarTheme bottomAppBarTheme(ColorScheme colors) { - return BottomAppBarTheme( - color: colors.surface, - elevation: 0, - ); + return BottomAppBarTheme(color: colors.surface, elevation: 0); } BottomNavigationBarThemeData bottomNavigationBarTheme(ColorScheme colors) { @@ -146,9 +140,7 @@ class ThemeProvider extends InheritedWidget { } DrawerThemeData drawerTheme(ColorScheme colors) { - return DrawerThemeData( - backgroundColor: colors.surface, - ); + return DrawerThemeData(backgroundColor: colors.surface); } ThemeData light([Color? targetColor]) { @@ -207,10 +199,7 @@ class ThemeProvider extends InheritedWidget { } class ThemeSettings { - ThemeSettings({ - required this.sourceColor, - required this.themeMode, - }); + ThemeSettings({required this.sourceColor, required this.themeMode}); final Color sourceColor; final ThemeMode themeMode; @@ -221,10 +210,7 @@ Color randomColor() { } // Custom Colors -const linkColor = CustomColor( - name: 'Link Color', - color: Color(0xFF00B0FF), -); +const linkColor = CustomColor(name: 'Link Color', color: Color(0xFF00B0FF)); class CustomColor { const CustomColor({ diff --git a/boring_to_beautiful/step_06/lib/src/shared/router.dart b/boring_to_beautiful/step_06/lib/src/shared/router.dart index 3efb7362fa..db82627246 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/router.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/router.dart @@ -20,11 +20,7 @@ final artistsProvider = ArtistsProvider(); final playlistsProvider = PlaylistsProvider(); const List destinations = [ - NavigationDestination( - label: 'Home', - icon: Icon(Icons.home), - route: '/', - ), + NavigationDestination(label: 'Home', icon: Icon(Icons.home), route: '/'), NavigationDestination( label: 'Playlists', icon: Icon(Icons.playlist_add_check), @@ -56,41 +52,46 @@ final appRouter = GoRouter( // HomeScreen GoRoute( path: '/', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 0, - child: HomeScreen(), - ), - ), + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 0, + child: HomeScreen(), + ), + ), ), // PlaylistHomeScreen GoRoute( path: '/playlists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 1, - child: PlaylistHomeScreen(), - ), - ), - routes: [ - GoRoute( - path: ':pid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 1, - child: PlaylistScreen( - playlist: playlistsProvider - .getPlaylist(state.pathParameters['pid']!)!, - ), + child: PlaylistHomeScreen(), ), ), + routes: [ + GoRoute( + path: ':pid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 1, + child: PlaylistScreen( + playlist: + playlistsProvider.getPlaylist( + state.pathParameters['pid']!, + )!, + ), + ), + ), ), ], ), @@ -98,28 +99,32 @@ final appRouter = GoRouter( // ArtistHomeScreen GoRoute( path: '/artists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 2, - child: ArtistsScreen(), - ), - ), - routes: [ - GoRoute( - path: ':aid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 2, - child: ArtistScreen( - artist: - artistsProvider.getArtist(state.pathParameters['aid']!)!, - ), + child: ArtistsScreen(), ), ), + routes: [ + GoRoute( + path: ':aid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 2, + child: ArtistScreen( + artist: + artistsProvider.getArtist( + state.pathParameters['aid']!, + )!, + ), + ), + ), // builder: (context, state) => ArtistScreen( // id: state.params['aid']!, // ), @@ -129,14 +134,15 @@ final appRouter = GoRouter( for (final route in destinations.skip(3)) GoRoute( path: route.route, - pageBuilder: (context, state) => MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: destinations.indexOf(route), - child: const SizedBox(), - ), - ), + pageBuilder: + (context, state) => MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: destinations.indexOf(route), + child: const SizedBox(), + ), + ), ), ], ); diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/adaptive_image_card.dart b/boring_to_beautiful/step_06/lib/src/shared/views/adaptive_image_card.dart index 07cab2b0d7..99f5be0837 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/adaptive_image_card.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/adaptive_image_card.dart @@ -36,20 +36,13 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), + child: Padding(padding: const EdgeInsets.all(20), child: child), ), ], ); } return Padding( - padding: const EdgeInsets.only( - left: 20, - bottom: 20, - top: 20, - ), + padding: const EdgeInsets.only(left: 20, bottom: 20, top: 20), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, @@ -65,11 +58,8 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), - ) + child: Padding(padding: const EdgeInsets.all(20), child: child), + ), ], ), ); diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/adaptive_navigation.dart b/boring_to_beautiful/step_06/lib/src/shared/views/adaptive_navigation.dart index 067ea7d17f..709068ea07 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/adaptive_navigation.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/adaptive_navigation.dart @@ -30,12 +30,15 @@ class AdaptiveNavigation extends StatelessWidget { NavigationRail( extended: dimens.maxWidth >= 800, minExtendedWidth: 180, - destinations: destinations - .map((e) => NavigationRailDestination( - icon: e.icon, - label: Text(e.label), - )) - .toList(), + destinations: + destinations + .map( + (e) => NavigationRailDestination( + icon: e.icon, + label: Text(e.label), + ), + ) + .toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ), diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/article_content.dart b/boring_to_beautiful/step_06/lib/src/shared/views/article_content.dart index af243f015b..c5a0b5e62a 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/article_content.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/article_content.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class ArticleContent extends StatelessWidget { - const ArticleContent({ - super.key, - required this.child, - this.maxWidth = 960, - }); + const ArticleContent({super.key, required this.child, this.maxWidth = 960}); final double maxWidth; final Widget child; @@ -19,13 +15,8 @@ class ArticleContent extends StatelessWidget { return Container( alignment: Alignment.topCenter, child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: maxWidth, - ), - child: Padding( - padding: const EdgeInsets.all(15), - child: child, - ), + constraints: BoxConstraints(maxWidth: maxWidth), + child: Padding(padding: const EdgeInsets.all(15), child: child), ), ); } diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/bottom_bar.dart b/boring_to_beautiful/step_06/lib/src/shared/views/bottom_bar.dart index 06e085a9b6..bf15ad9bb0 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/bottom_bar.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/bottom_bar.dart @@ -26,16 +26,18 @@ class BottomBar extends StatelessWidget implements PreferredSizeWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => _BottomBar( - artist: state.songWithProgress?.song.artist, - isMuted: state.isMuted, - isPlaying: state.isPlaying, - preferredSize: preferredSize, - progress: state.songWithProgress?.progress, - song: state.songWithProgress?.song, - togglePlayPause: () => bloc.add(const PlaybackEvent.togglePlayPause()), - volume: state.volume, - ), + builder: + (context, state) => _BottomBar( + artist: state.songWithProgress?.song.artist, + isMuted: state.isMuted, + isPlaying: state.isPlaying, + preferredSize: preferredSize, + progress: state.songWithProgress?.progress, + song: state.songWithProgress?.song, + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), + volume: state.volume, + ), ); } } @@ -63,10 +65,12 @@ class _BottomBar extends StatelessWidget { @override Widget build(BuildContext context) => LayoutBuilder( - builder: (context, constraints) => constraints.isTablet - ? _buildDesktopBar(context, constraints) - : _buildMobileBar(context, constraints), - ); + builder: + (context, constraints) => + constraints.isTablet + ? _buildDesktopBar(context, constraints) + : _buildMobileBar(context, constraints), + ); Widget _buildDesktopBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -79,10 +83,7 @@ class _BottomBar extends StatelessWidget { Row( children: [ _AlbumArt(song: song), - _SongDetails( - artist: artist, - song: song, - ), + _SongDetails(artist: artist, song: song), ], ), Flexible( @@ -95,12 +96,7 @@ class _BottomBar extends StatelessWidget { isPlaying: isPlaying, togglePlayPause: togglePlayPause, ), - Center( - child: _ProgressBar( - progress: progress, - song: song, - ), - ), + Center(child: _ProgressBar(progress: progress, song: song)), ], ), ), @@ -114,17 +110,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _FullScreenPlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _FullScreenPlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -136,10 +133,10 @@ class _BottomBar extends StatelessWidget { } double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; Widget _buildMobileBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -152,17 +149,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _MobilePlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _MobilePlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -191,10 +189,7 @@ class _BottomBar extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - song?.title ?? '', - style: context.labelMedium, - ), + Text(song?.title ?? '', style: context.labelMedium), Text( song?.artist.name ?? '', style: context.labelSmall, @@ -220,10 +215,7 @@ class _BottomBar extends StatelessWidget { } class _ProgressBar extends StatelessWidget { - const _ProgressBar({ - required this.progress, - required this.song, - }); + const _ProgressBar({required this.progress, required this.song}); /// Current playback depth into user is into [song]. final Duration? progress; @@ -231,10 +223,10 @@ class _ProgressBar extends StatelessWidget { final Song? song; double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; @override Widget build(BuildContext context) { @@ -252,29 +244,32 @@ class _ProgressBar extends StatelessWidget { children: [ const SizedBox(width: 10), SizedBox( - child: progress != null - ? Text(progress!.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + progress != null + ? Text( + progress!.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), Expanded( child: Slider( value: songProgress.clamp(0, 1), divisions: 1000, onChanged: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); }, onChangeEnd: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); // Because dragging pauses auto playback, resume playing // once the user finishes dragging. - BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ); + BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()); }, activeColor: Theme.of(context).colorScheme.onTertiaryContainer, @@ -282,12 +277,15 @@ class _ProgressBar extends StatelessWidget { ), ), SizedBox( - child: song != null - ? Text(song!.length.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + song != null + ? Text( + song!.length.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), - const SizedBox(width: 10) + const SizedBox(width: 10), ], ), ); @@ -297,10 +295,7 @@ class _ProgressBar extends StatelessWidget { } class _VolumeBar extends StatelessWidget { - const _VolumeBar({ - required this.volume, - required this.isMuted, - }); + const _VolumeBar({required this.volume, required this.isMuted}); /// The percentage, between 0 and 1, at which to render the volume slider. final double volume; @@ -313,17 +308,16 @@ class _VolumeBar extends StatelessWidget { @override Widget build(BuildContext context) { return ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 200, - ), + constraints: const BoxConstraints(maxWidth: 200), child: Padding( padding: const EdgeInsets.all(8), child: Row( children: [ GestureDetector( - onTap: () => BlocProvider.of(context).add( - const PlaybackEvent.toggleMute(), - ), + onTap: + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.toggleMute()), child: Icon(!isMuted ? Icons.volume_mute : Icons.volume_off), ), Expanded( @@ -332,8 +326,10 @@ class _VolumeBar extends StatelessWidget { min: 0, max: 1, divisions: 100, - onChanged: (newValue) => BlocProvider.of(context) - .add(PlaybackEvent.setVolume(newValue)), + onChanged: + (newValue) => BlocProvider.of( + context, + ).add(PlaybackEvent.setVolume(newValue)), activeColor: Theme.of(context).colorScheme.onTertiaryContainer, inactiveColor: Theme.of(context).colorScheme.onSurface, ), @@ -356,49 +352,50 @@ class _PlaybackControls extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - double iconSize = 24; - double playIconSize = 32; - double innerPadding = 16; - double playPadding = 20; - if (constraints.maxWidth < 500) { - iconSize = 21; - playIconSize = 28; - innerPadding = 14; - playPadding = 17; - } - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( + return LayoutBuilder( + builder: (context, constraints) { + double iconSize = 24; + double playIconSize = 32; + double innerPadding = 16; + double playPadding = 20; + if (constraints.maxWidth < 500) { + iconSize = 21; + playIconSize = 28; + innerPadding = 14; + playPadding = 17; + } + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( padding: EdgeInsets.fromLTRB(0, 0, innerPadding, 0), - child: Icon(Icons.shuffle, size: iconSize)), - Icon(Icons.skip_previous, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), - child: GestureDetector( - onTap: togglePlayPause, - child: Icon( - isPlaying ? Icons.pause_circle : Icons.play_circle, - size: playIconSize, + child: Icon(Icons.shuffle, size: iconSize), + ), + Icon(Icons.skip_previous, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), + child: GestureDetector( + onTap: togglePlayPause, + child: Icon( + isPlaying ? Icons.pause_circle : Icons.play_circle, + size: playIconSize, + ), ), ), - ), - Icon(Icons.skip_next, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), - child: Icon(Icons.repeat, size: iconSize), - ), - ], - ); - }); + Icon(Icons.skip_next, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), + child: Icon(Icons.repeat, size: iconSize), + ), + ], + ); + }, + ); } } class _AlbumArt extends StatelessWidget { - const _AlbumArt({ - required this.song, - }); + const _AlbumArt({required this.song}); final Song? song; @@ -409,21 +406,17 @@ class _AlbumArt extends StatelessWidget { child: SizedBox( width: 70, height: 70, - child: song != null - ? Image.asset(song!.image.image) - : Container( - color: Colors.pink[100], - ), + child: + song != null + ? Image.asset(song!.image.image) + : Container(color: Colors.pink[100]), ), ); } } class _SongDetails extends StatelessWidget { - const _SongDetails({ - required this.artist, - required this.song, - }); + const _SongDetails({required this.artist, required this.song}); final Artist? artist; final Song? song; @@ -455,9 +448,7 @@ class _SongDetails extends StatelessWidget { } class _FullScreenPlayer extends StatefulWidget { - const _FullScreenPlayer({ - required this.onClose, - }); + const _FullScreenPlayer({required this.onClose}); final VoidCallback onClose; @@ -489,29 +480,33 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return MouseRegion( - onHover: (_) { - setState(() { - _showControls = true; - }); - hideControls(); + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return MouseRegion( + onHover: (_) { + setState(() { + _showControls = true; + }); + hideControls(); + }, + child: buildPlayer(context, state, dimens), + ); }, - child: buildPlayer(context, state, dimens), - ); - }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; final song = current?.song; @@ -519,26 +514,25 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { fit: StackFit.expand, children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - song!.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset(song!.image.image, fit: BoxFit.cover), ), ), - ), ), Positioned( top: 20, right: 20, child: IconButton( - color: song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const Icon(Icons.fullscreen_exit), onPressed: widget.onClose, ), @@ -569,8 +563,9 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { Text( song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 20, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 20, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -582,10 +577,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { right: 20, left: 20, bottom: dimens.biggest.height * 0.2, - child: _ProgressBar( - progress: current?.progress, - song: song, - ), + child: _ProgressBar(progress: current?.progress, song: song), ), Positioned( right: 20, @@ -598,8 +590,8 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), @@ -611,9 +603,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { } class _MobilePlayer extends StatelessWidget { - const _MobilePlayer({ - required this.onClose, - }); + const _MobilePlayer({required this.onClose}); final VoidCallback onClose; @@ -622,46 +612,52 @@ class _MobilePlayer extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return buildPlayer(context, state, dimens); - }, + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return buildPlayer(context, state, dimens); + }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; return Stack( children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - current.song.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset( + current.song.image.image, + fit: BoxFit.cover, + ), ), ), - ), ), Positioned( top: 20, left: 20, child: IconButton( - color: current?.song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + current?.song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const RotatedBox( quarterTurns: 1, child: Icon(Icons.chevron_right), @@ -676,10 +672,7 @@ class _MobilePlayer extends StatelessWidget { left: 0, right: 0, height: dimens.biggest.height * 0.5, - child: Image.asset( - current.song.image.image, - fit: BoxFit.contain, - ), + child: Image.asset(current.song.image.image, fit: BoxFit.contain), ), Positioned( left: 0, @@ -705,8 +698,9 @@ class _MobilePlayer extends StatelessWidget { Text( current.song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 12, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 12, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -718,15 +712,12 @@ class _MobilePlayer extends StatelessWidget { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), - _ProgressBar( - progress: current.progress, - song: current.song, - ), + _ProgressBar(progress: current.progress, song: current.song), ], ), ), diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/brightness_toggle.dart b/boring_to_beautiful/step_06/lib/src/shared/views/brightness_toggle.dart index 46dde4810f..5b5332392b 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/brightness_toggle.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/brightness_toggle.dart @@ -13,9 +13,10 @@ class BrightnessToggle extends StatelessWidget { Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; return IconButton( - icon: Theme.of(context).brightness == Brightness.light - ? const Icon(Icons.brightness_3) - : const Icon(Icons.brightness_7), + icon: + Theme.of(context).brightness == Brightness.light + ? const Icon(Icons.brightness_3) + : const Icon(Icons.brightness_7), onPressed: () { final themeProvider = ThemeProvider.of(context); final settings = themeProvider.settings.value; diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/center_row.dart b/boring_to_beautiful/step_06/lib/src/shared/views/center_row.dart index 36d428e3b8..c1f3effcc2 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/center_row.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/center_row.dart @@ -5,23 +5,12 @@ import 'package:flutter/material.dart'; class CenterRow extends StatelessWidget { - const CenterRow({ - super.key, - required this.child, - }); + const CenterRow({super.key, required this.child}); final Widget child; @override Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Center( - child: child, - ), - ), - ], - ); + return Row(children: [Expanded(child: Center(child: child))]); } } diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/clickable.dart b/boring_to_beautiful/step_06/lib/src/shared/views/clickable.dart index cd7ef46268..f192f0b135 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/clickable.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/clickable.dart @@ -14,10 +14,7 @@ class Clickable extends StatelessWidget { Widget build(BuildContext context) { return MouseRegion( cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: onTap, - child: child, - ), + child: GestureDetector(onTap: onTap, child: child), ); } } diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/events.dart b/boring_to_beautiful/step_06/lib/src/shared/views/events.dart index ed38465460..ab9140e56d 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/events.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/events.dart @@ -24,43 +24,18 @@ class Events extends StatelessWidget { child: DataTable( horizontalMargin: 5.0, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], rows: [ for (final event in artist.events) DataRow( cells: [ - DataCell( - Text(event.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(event.title)), - ]), - ), - DataCell( - Text(event.location), - ), + DataCell(Text(event.date)), + DataCell(Row(children: [Expanded(child: Text(event.title))])), + DataCell(Text(event.location)), DataCell( Clickable( child: Text( @@ -70,8 +45,9 @@ class Events extends StatelessWidget { decoration: TextDecoration.underline, ), ), - onTap: () => - launchUrl(Uri.parse('https://docs.flutter.dev')), + onTap: + () => + launchUrl(Uri.parse('https://docs.flutter.dev')), ), ), ], diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/hover_toggle.dart b/boring_to_beautiful/step_06/lib/src/shared/views/hover_toggle.dart index ec98c2863c..649cfcab63 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/hover_toggle.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/hover_toggle.dart @@ -31,9 +31,10 @@ class _HoverToggleState extends State with MaterialStateMixin { cursor: isHovered ? SystemMouseCursors.click : MouseCursor.defer, onEnter: (_) => setMaterialState(WidgetState.hovered, true), onExit: (_) => setMaterialState(WidgetState.hovered, false), - child: widget.mode == HoverMode.replace - ? _buildReplaceableChildren() - : _buildChildrenStack(), + child: + widget.mode == HoverMode.replace + ? _buildReplaceableChildren() + : _buildChildrenStack(), ), ); } @@ -41,12 +42,7 @@ class _HoverToggleState extends State with MaterialStateMixin { Widget _buildChildrenStack() { Widget child = isHovered ? Opacity(opacity: 0.2, child: widget.child) : widget.child; - return Stack( - children: [ - child, - if (isHovered) widget.hoverChild, - ], - ); + return Stack(children: [child, if (isHovered) widget.hoverChild]); } Widget _buildReplaceableChildren() => diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/hoverable_song_play_button.dart b/boring_to_beautiful/step_06/lib/src/shared/views/hoverable_song_play_button.dart index 512f3d1d3c..dd588e3dbe 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/hoverable_song_play_button.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/hoverable_song_play_button.dart @@ -29,9 +29,10 @@ class HoverableSongPlayButton extends StatelessWidget { hoverChild: Center( child: GestureDetector( child: const Icon(Icons.play_arrow), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ), ), mode: hoverMode, diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/image_card.dart b/boring_to_beautiful/step_06/lib/src/shared/views/image_card.dart index 0af9f75f33..6e7f6cd42d 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/image_card.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/image_card.dart @@ -7,13 +7,14 @@ import '../../shared/extensions.dart'; import 'outlined_card.dart'; class ImageCard extends StatelessWidget { - const ImageCard( - {super.key, - required this.title, - required this.details, - required this.image, - this.subtitle, - this.clickable = false}); + const ImageCard({ + super.key, + required this.title, + required this.details, + required this.image, + this.subtitle, + this.clickable = false, + }); final String title; final String? subtitle; @@ -28,54 +29,51 @@ class ImageCard extends StatelessWidget { clickable: clickable, child: Padding( padding: const EdgeInsets.all(8.0), - child: LayoutBuilder(builder: (context, constraints) { - return Row( - children: [ - if (constraints.maxWidth > 600) - SizedBox( - width: 170, - height: 170, - child: Image.asset( - image, - fit: BoxFit.cover, + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + if (constraints.maxWidth > 600) + SizedBox( + width: 170, + height: 170, + child: Image.asset(image, fit: BoxFit.cover), ), - ), - Expanded( - child: Padding( - padding: padding, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 5), - child: Text( - title, - style: context.titleLarge! - .copyWith(fontWeight: FontWeight.bold), - ), - ), - if (subtitle != null) + Expanded( + child: Padding( + padding: padding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Padding( - padding: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only(bottom: 5), child: Text( - subtitle!, - style: context.labelMedium, + title, + style: context.titleLarge!.copyWith( + fontWeight: FontWeight.bold, + ), ), ), - Text( - details, - style: context.labelMedium?.copyWith( - fontSize: 16, - height: 1.25, + if (subtitle != null) + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text(subtitle!, style: context.labelMedium), + ), + Text( + details, + style: context.labelMedium?.copyWith( + fontSize: 16, + height: 1.25, + ), ), - ), - ], + ], + ), ), ), - ), - ], - ); - }), + ], + ); + }, + ), ), ); } diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/image_tile.dart b/boring_to_beautiful/step_06/lib/src/shared/views/image_tile.dart index 4f2bbebb96..dd99152af5 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/image_tile.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/image_tile.dart @@ -21,19 +21,17 @@ class ImageTile extends StatelessWidget { @override Widget build(BuildContext context) { return OutlinedCard( - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Expanded( - child: Image.asset(image, fit: BoxFit.cover), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [Expanded(child: Image.asset(image, fit: BoxFit.cover))], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), child: Text( title, @@ -43,20 +41,25 @@ class ImageTile extends StatelessWidget { ), overflow: TextOverflow.ellipsis, maxLines: 1, - )), - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text( - subtitle, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center, + ), ), - ), - ], - ) - ]), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 10, + ), + child: Text( + subtitle, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ], + ), + ], + ), ); } } diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/step_06/lib/src/shared/views/outlined_card.dart index 0d886e2c54..ff49275dc9 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/outlined_card.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/outlined_card.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class OutlinedCard extends StatefulWidget { - const OutlinedCard({ - super.key, - required this.child, - this.clickable = true, - }); + const OutlinedCard({super.key, required this.child, this.clickable = true}); final Widget child; final bool clickable; @@ -22,9 +18,10 @@ class _OutlinedCardState extends State { @override Widget build(BuildContext context) { return MouseRegion( - cursor: widget.clickable - ? SystemMouseCursors.click - : SystemMouseCursors.basic, + cursor: + widget.clickable + ? SystemMouseCursors.click + : SystemMouseCursors.basic, child: Container( decoration: BoxDecoration( border: Border.all( diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/play_pause_listener.dart b/boring_to_beautiful/step_06/lib/src/shared/views/play_pause_listener.dart index 52fad00863..6b4fc66709 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/play_pause_listener.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/play_pause_listener.dart @@ -16,10 +16,7 @@ import '../playback/bloc/bloc.dart'; /// shortcuts. By sitting below that machinery, this installs a global Spacebar /// listener which toggles Playback, as is customary in music-playing apps. class PlayPauseListener extends StatelessWidget { - const PlayPauseListener({ - super.key, - required this.child, - }); + const PlayPauseListener({super.key, required this.child}); final Widget child; @@ -28,9 +25,7 @@ class PlayPauseListener extends StatelessWidget { // Immediately catch any [_PlayPauseIntent] events released by the inner // [Shortcuts] widget. return Actions( - actions: >{ - _PlayPauseIntent: _PlayPauseAction(), - }, + actions: >{_PlayPauseIntent: _PlayPauseAction()}, child: Shortcuts( // Register a shortcut for Spacebar presses that release a // [_PlayPauseIntent] up the tree to the nearest [Actions] widget. @@ -38,9 +33,9 @@ class PlayPauseListener extends StatelessWidget { const SingleActivator(LogicalKeyboardKey.space): _PlayPauseIntent( // Create a closure which sends a [TogglePlayPause] event to the // [PlaybackBloc]. - () => BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ), + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()), ), }, child: child, diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/root_layout.dart b/boring_to_beautiful/step_06/lib/src/shared/views/root_layout.dart index 878b57d729..ff6270248c 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/root_layout.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/root_layout.dart @@ -29,36 +29,37 @@ class RootLayout extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => LayoutBuilder(builder: (context, dimens) { - void onSelected(int index) { - final destination = router.destinations[index]; - go.GoRouter.of(context).go(destination.route); - } + builder: + (context, state) => LayoutBuilder( + builder: (context, dimens) { + void onSelected(int index) { + final destination = router.destinations[index]; + go.GoRouter.of(context).go(destination.route); + } - final current = state.songWithProgress; - return AdaptiveNavigation( - key: _navigationRailKey, - destinations: router.destinations - .map((e) => NavigationDestination( - icon: e.icon, - label: e.label, - )) - .toList(), - selectedIndex: currentIndex, - onDestinationSelected: onSelected, - child: Column( - children: [ - Expanded( - child: _Switcher( - key: _switcherKey, - child: child, + final current = state.songWithProgress; + return AdaptiveNavigation( + key: _navigationRailKey, + destinations: + router.destinations + .map( + (e) => NavigationDestination( + icon: e.icon, + label: e.label, + ), + ) + .toList(), + selectedIndex: currentIndex, + onDestinationSelected: onSelected, + child: Column( + children: [ + Expanded(child: _Switcher(key: _switcherKey, child: child)), + if (current != null) const BottomBar(), + ], ), - ), - if (current != null) const BottomBar(), - ], + ); + }, ), - ); - }), ); } } @@ -66,21 +67,18 @@ class RootLayout extends StatelessWidget { class _Switcher extends StatelessWidget { final Widget child; - const _Switcher({ - required this.child, - super.key, - }); + const _Switcher({required this.child, super.key}); @override Widget build(BuildContext context) { return UniversalPlatform.isDesktop ? child : AnimatedSwitcher( - key: key, - duration: const Duration(milliseconds: 200), - switchInCurve: Curves.easeInOut, - switchOutCurve: Curves.easeInOut, - child: child, - ); + key: key, + duration: const Duration(milliseconds: 200), + switchInCurve: Curves.easeInOut, + switchOutCurve: Curves.easeInOut, + child: child, + ); } } diff --git a/boring_to_beautiful/step_06/lib/src/shared/views/sidebar.dart b/boring_to_beautiful/step_06/lib/src/shared/views/sidebar.dart index 78c19b4d22..8815223b22 100644 --- a/boring_to_beautiful/step_06/lib/src/shared/views/sidebar.dart +++ b/boring_to_beautiful/step_06/lib/src/shared/views/sidebar.dart @@ -26,10 +26,7 @@ class SideBar extends StatelessWidget { title: const Text('Home'), onTap: () => GoRouter.of(context).go('/'), ), - const ListTile( - leading: Icon(Icons.search), - title: Text('Search'), - ), + const ListTile(leading: Icon(Icons.search), title: Text('Search')), ListTile( leading: const Icon(Icons.person), title: const Text('Artists'), @@ -64,10 +61,7 @@ class PlaylistNav extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(left: 16, top: 16), - child: Text( - 'Playlists', - style: context.titleMedium, - ), + child: Text('Playlists', style: context.titleMedium), ), Expanded( child: ListView( @@ -114,10 +108,9 @@ class _PlaylistNavItemState extends State<_PlaylistNavItem> { @override void initState() { super.initState(); - _focusNode = FocusNode(debugLabel: widget.title) - ..addListener(() { - setState(() => _isSelected = _focusNode.hasPrimaryFocus); - }); + _focusNode = FocusNode(debugLabel: widget.title)..addListener(() { + setState(() => _isSelected = _focusNode.hasPrimaryFocus); + }); } @override diff --git a/boring_to_beautiful/step_06/macos/Podfile b/boring_to_beautiful/step_06/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/boring_to_beautiful/step_06/macos/Podfile +++ b/boring_to_beautiful/step_06/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_06/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_06/macos/Runner.xcodeproj/project.pbxproj index 79604e1785..63e08baa02 100644 --- a/boring_to_beautiful/step_06/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_06/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */; }; - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */; }; + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */, + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */, + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 143267097A016AD19836D89A /* Pods */ = { + isa = PBXGroup; + children = ( + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */, + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */, + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */, + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */, + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */, + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A67056D7D61CD22438BA6931 /* Pods */, + 143267097A016AD19836D89A /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - A67056D7D61CD22438BA6931 /* Pods */ = { - isa = PBXGroup; - children = ( - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */, - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */, - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */, - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */, - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */, - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */, - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */, + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */, + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */, + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */, + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */, + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -361,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */ = { + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -378,7 +378,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */ = { + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +393,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */ = { + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index b9ba5fa149..888bfbb4c7 100644 --- a/boring_to_beautiful/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_06/pubspec.yaml b/boring_to_beautiful/step_06/pubspec.yaml index abe835e2e6..b02c951374 100644 --- a/boring_to_beautiful/step_06/pubspec.yaml +++ b/boring_to_beautiful/step_06/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,14 +13,14 @@ dependencies: adaptive_components: ^0.0.10 adaptive_navigation: ^0.0.10 animations: ^2.0.11 - collection: ^1.19.0 + collection: ^1.19.1 cupertino_icons: ^1.0.8 desktop_window: ^0.4.2 dynamic_color: ^1.7.0 english_words: ^4.0.0 flutter_bloc: ^9.0.0 freezed_annotation: ^2.4.4 - go_router: ^14.7.2 + go_router: ^14.8.0 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/boring_to_beautiful/step_07/android/.gitignore b/boring_to_beautiful/step_07/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/boring_to_beautiful/step_07/android/.gitignore +++ b/boring_to_beautiful/step_07/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/boring_to_beautiful/step_07/android/app/build.gradle b/boring_to_beautiful/step_07/android/app/build.gradle deleted file mode 100644 index 59485b6bb8..0000000000 --- a/boring_to_beautiful/step_07/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.myartist" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.myartist" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/boring_to_beautiful/step_07/android/app/build.gradle.kts b/boring_to_beautiful/step_07/android/app/build.gradle.kts new file mode 100644 index 0000000000..b2dbe0393c --- /dev/null +++ b/boring_to_beautiful/step_07/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.myartist" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.myartist" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/boring_to_beautiful/step_07/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt b/boring_to_beautiful/step_07/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt index 1e328c8556..b724a01056 100644 --- a/boring_to_beautiful/step_07/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt +++ b/boring_to_beautiful/step_07/android/app/src/main/kotlin/com/example/myartist/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.myartist import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/boring_to_beautiful/step_07/android/build.gradle b/boring_to_beautiful/step_07/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/boring_to_beautiful/step_07/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/boring_to_beautiful/step_07/android/build.gradle.kts b/boring_to_beautiful/step_07/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/boring_to_beautiful/step_07/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/boring_to_beautiful/step_07/android/gradle.properties b/boring_to_beautiful/step_07/android/gradle.properties index 2597170821..f018a61817 100644 --- a/boring_to_beautiful/step_07/android/gradle.properties +++ b/boring_to_beautiful/step_07/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/boring_to_beautiful/step_07/android/gradle/wrapper/gradle-wrapper.properties b/boring_to_beautiful/step_07/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/boring_to_beautiful/step_07/android/gradle/wrapper/gradle-wrapper.properties +++ b/boring_to_beautiful/step_07/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/boring_to_beautiful/step_07/android/settings.gradle b/boring_to_beautiful/step_07/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/boring_to_beautiful/step_07/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/boring_to_beautiful/step_07/android/settings.gradle.kts b/boring_to_beautiful/step_07/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/boring_to_beautiful/step_07/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/boring_to_beautiful/step_07/ios/Podfile b/boring_to_beautiful/step_07/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/boring_to_beautiful/step_07/ios/Podfile +++ b/boring_to_beautiful/step_07/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_07/ios/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_07/ios/Runner.xcodeproj/project.pbxproj index f7d849e7aa..b4912290dd 100644 --- a/boring_to_beautiful/step_07/ios/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_07/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */; }; - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */; }; + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,15 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +60,19 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 85CFC060D2B515FA7FCB18AC /* Frameworks */ = { + 6171884CE7EC0B228274CDFE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E32C72364816E18A2E7BFAC6 /* Pods_RunnerTests.framework in Frameworks */, + CE66C585C65B8ABC4D1FC82A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B35E100B54B874006252FBDC /* Pods_Runner.framework in Frameworks */, + 4FB7A27E398B325F5A51156E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 54241974C43F645BC41820B3 /* Pods */ = { + 4CD80B4456D2B04197B640AC /* Pods */ = { isa = PBXGroup; children = ( - AEEAEC682C0B6AEEEA7486B5 /* Pods-Runner.debug.xcconfig */, - 65E1BB3CD14F25F613897EAC /* Pods-Runner.release.xcconfig */, - FE857D7AD0762C340331BE70 /* Pods-Runner.profile.xcconfig */, - 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */, - 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */, - E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */, + C4DFDD8F1E4F3DBB42A23977 /* Pods-Runner.debug.xcconfig */, + 98AB309A8DCBDD9B5AF5AA98 /* Pods-Runner.release.xcconfig */, + CB52F1425FF6B08903D060C5 /* Pods-Runner.profile.xcconfig */, + 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */, + 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */, + 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 54241974C43F645BC41820B3 /* Pods */, - DA6AE8ED33598C40BFC9FCAD /* Frameworks */, + 4CD80B4456D2B04197B640AC /* Pods */, + C4E673F63230E3A6805B11E9 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - DA6AE8ED33598C40BFC9FCAD /* Frameworks */ = { + C4E673F63230E3A6805B11E9 /* Frameworks */ = { isa = PBXGroup; children = ( - 5AE9057122DB573F8CDB1A94 /* Pods_Runner.framework */, - A266B4A09F4A0FDD976C85C1 /* Pods_RunnerTests.framework */, + BF2C797287D2AC10F92ADFFB /* Pods_Runner.framework */, + E369B689ABB713C1E1C113E6 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */, + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 85CFC060D2B515FA7FCB18AC /* Frameworks */, + 6171884CE7EC0B228274CDFE /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */, + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */, + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,43 +270,43 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 144787548472CEE5316A5FA9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 512521FDDBB95DE3748D24E2 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -323,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A2F42D165CBEE3979E49A399 /* [CP] Embed Pods Frameworks */ = { + CD457A5E3AEFFAC81782BA87 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,7 +340,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - D2F67A09A01B034105E1F841 /* [CP] Check Pods Manifest.lock */ = { + DFA2F4694125F9A96305910E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2FBBA652A6E3873218CA0B7F /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 8F23CAF2090F93B2F617F6B9 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9D0CF2D7895951D74FF81C33 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 394B3B068C98E33032E180B1 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E13D9BBE7286CC854069B84D /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 7D0185A669455AC679C584D1 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/boring_to_beautiful/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/boring_to_beautiful/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_bio.dart b/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_bio.dart index 227b8e91f9..8b614421db 100644 --- a/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_bio.dart +++ b/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_bio.dart @@ -18,9 +18,7 @@ class ArtistBio extends StatelessWidget { artist.bio, style: context.bodyLarge!.copyWith( fontSize: 16, - color: context.colors.onSurface.withAlpha( - 222, - ), + color: context.colors.onSurface.withAlpha(222), ), ); } diff --git a/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_card.dart b/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_card.dart index a63967f51d..1a56376a87 100644 --- a/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_card.dart +++ b/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_card.dart @@ -11,10 +11,7 @@ import '../../../shared/views/outlined_card.dart'; import '../../../shared/views/views.dart'; class ArtistCard extends StatelessWidget { - const ArtistCard({ - super.key, - required this.artist, - }); + const ArtistCard({super.key, required this.artist}); final Artist artist; @@ -24,65 +21,66 @@ class ArtistCard extends StatelessWidget { return OutlinedCard( child: LayoutBuilder( - builder: (context, dimens) => Row( - children: [ - SizedBox( - width: dimens.maxWidth * 0.4, - child: Image.asset( - artist.image.image, - fit: BoxFit.cover, - ), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - artist.name, - style: context.titleMedium, - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - const SizedBox(height: 10), - Text( - artist.bio, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 3, - ), - ]), - ), - if (dimens.maxHeight > 100) - Row( - children: [ - HoverableSongPlayButton( - size: const Size(50, 50), - song: nowPlaying, - child: Icon(Icons.play_circle, - color: context.colors.tertiary), + builder: + (context, dimens) => Row( + children: [ + SizedBox( + width: dimens.maxWidth * 0.4, + child: Image.asset(artist.image.image, fit: BoxFit.cover), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 15, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + artist.name, + style: context.titleMedium, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + const SizedBox(height: 10), + Text( + artist.bio, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 3, + ), + ], ), - Text( - nowPlaying.title, - maxLines: 1, - overflow: TextOverflow.clip, - style: context.labelMedium, + ), + if (dimens.maxHeight > 100) + Row( + children: [ + HoverableSongPlayButton( + size: const Size(50, 50), + song: nowPlaying, + child: Icon( + Icons.play_circle, + color: context.colors.tertiary, + ), + ), + Text( + nowPlaying.title, + maxLines: 1, + overflow: TextOverflow.clip, + style: context.labelMedium, + ), + ], ), - ], - ), - ], + ], + ), + ), ), - ), + ], ), - ], - ), ), ); } diff --git a/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_events.dart b/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_events.dart index 8b064759c6..58b61b37df 100644 --- a/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_events.dart +++ b/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_events.dart @@ -70,53 +70,32 @@ class ArtistEvents extends StatelessWidget { ); }, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], - rowBuilder: (item, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - Text(item.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(item.title)), - ]), - ), - DataCell( - Text(item.location), - ), - DataCell( - Clickable( - child: Text( - item.link, - style: TextStyle( - color: linkColor.value(theme), - decoration: TextDecoration.underline, + rowBuilder: + (item, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell(Text(item.date)), + DataCell(Row(children: [Expanded(child: Text(item.title))])), + DataCell(Text(item.location)), + DataCell( + Clickable( + child: Text( + item.link, + style: TextStyle( + color: linkColor.value(theme), + decoration: TextDecoration.underline, + ), + ), + onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ), ), - ), - onTap: () => launchUrl(Uri.parse('https://docs.flutter.dev')), + ], ), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_ranked_songs.dart b/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_ranked_songs.dart index e484ecb3d7..3d1f4e2cf1 100644 --- a/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_ranked_songs.dart +++ b/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_ranked_songs.dart @@ -27,52 +27,42 @@ class ArtistRankedSongs extends StatelessWidget { title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), trailing: Text(song.ranking.toString()), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ); }, columns: const [ - DataColumn( - label: Text( - 'Ranking', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Title', - ), - ), - DataColumn( - label: Text( - 'Length', - ), - ), + DataColumn(label: Text('Ranking'), numeric: true), + DataColumn(label: Text('Title')), + DataColumn(label: Text('Length')), ], - rowBuilder: (song, index) => DataRow.byIndex(index: index, cells: [ - DataCell( - HoverableSongPlayButton( - song: song, - child: Center( - child: Text(song.ranking.toString()), - ), + rowBuilder: + (song, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + HoverableSongPlayButton( + song: song, + child: Center(child: Text(song.ranking.toString())), + ), + ), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(song.image.image), + ), + const SizedBox(width: 5.0), + Expanded(child: Text(song.title)), + ], + ), + ), + DataCell(Text(song.length.toHumanizedString())), + ], ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(song.image.image), - ), - const SizedBox(width: 5.0), - Expanded(child: Text(song.title)), - ]), - ), - DataCell( - Text(song.length.toHumanizedString()), - ), - ]), ); } } diff --git a/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_updates.dart b/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_updates.dart index e5b8bb5fe9..a0fabf7330 100644 --- a/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_updates.dart +++ b/boring_to_beautiful/step_07/lib/src/features/artists/view/artist_updates.dart @@ -30,7 +30,7 @@ class ArtistUpdates extends StatelessWidget { child: Text(update), ), ), - ) + ), ], ); } diff --git a/boring_to_beautiful/step_07/lib/src/features/artists/view/artists_screen.dart b/boring_to_beautiful/step_07/lib/src/features/artists/view/artists_screen.dart index 8afe759807..225d74847b 100644 --- a/boring_to_beautiful/step_07/lib/src/features/artists/view/artists_screen.dart +++ b/boring_to_beautiful/step_07/lib/src/features/artists/view/artists_screen.dart @@ -17,33 +17,33 @@ class ArtistsScreen extends StatelessWidget { Widget build(BuildContext context) { final artistsProvider = ArtistsProvider(); final artists = artistsProvider.artists; - return LayoutBuilder(builder: (context, constraints) { - return Scaffold( - primary: false, - appBar: AppBar( - title: const Text('ARTISTS'), - toolbarHeight: kToolbarHeight * 2, - ), - body: GridView.builder( - padding: const EdgeInsets.all(15), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), - childAspectRatio: 2.5, - mainAxisSpacing: 10, - crossAxisSpacing: 10, + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + primary: false, + appBar: AppBar( + title: const Text('ARTISTS'), + toolbarHeight: kToolbarHeight * 2, ), - itemCount: artists.length, - itemBuilder: (context, index) { - final artist = artists[index]; - return GestureDetector( - child: ArtistCard( - artist: artist, - ), - onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), - ); - }, - ), - ); - }); + body: GridView.builder( + padding: const EdgeInsets.all(15), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: max(1, (constraints.maxWidth ~/ 400).toInt()), + childAspectRatio: 2.5, + mainAxisSpacing: 10, + crossAxisSpacing: 10, + ), + itemCount: artists.length, + itemBuilder: (context, index) { + final artist = artists[index]; + return GestureDetector( + child: ArtistCard(artist: artist), + onTap: () => GoRouter.of(context).go('/artists/${artist.id}'), + ); + }, + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_07/lib/src/features/home/view/home_artists.dart b/boring_to_beautiful/step_07/lib/src/features/home/view/home_artists.dart index beb2c0ece4..b5a3a33ecd 100644 --- a/boring_to_beautiful/step_07/lib/src/features/home/view/home_artists.dart +++ b/boring_to_beautiful/step_07/lib/src/features/home/view/home_artists.dart @@ -22,27 +22,25 @@ class HomeArtists extends StatelessWidget { Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(15), - child: constraints.isMobile - ? Column( - children: [ - for (final artist in artists) buildTile(context, artist), - ], - ) - : Row(children: [ - for (final artist in artists) - Flexible( - flex: 1, - child: buildTile(context, artist), - ), - ]), + child: + constraints.isMobile + ? Column( + children: [ + for (final artist in artists) buildTile(context, artist), + ], + ) + : Row( + children: [ + for (final artist in artists) + Flexible(flex: 1, child: buildTile(context, artist)), + ], + ), ); } Widget buildTile(BuildContext context, Artist artist) { return ListTile( - leading: CircleAvatar( - backgroundImage: AssetImage(artist.image.image), - ), + leading: CircleAvatar(backgroundImage: AssetImage(artist.image.image)), title: Text( artist.updates.first, maxLines: 2, diff --git a/boring_to_beautiful/step_07/lib/src/features/home/view/home_recent.dart b/boring_to_beautiful/step_07/lib/src/features/home/view/home_recent.dart index c77500a663..8ba86d117d 100644 --- a/boring_to_beautiful/step_07/lib/src/features/home/view/home_recent.dart +++ b/boring_to_beautiful/step_07/lib/src/features/home/view/home_recent.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/outlined_card.dart'; class HomeRecent extends StatelessWidget { - const HomeRecent( - {super.key, required this.playlists, this.axis = Axis.horizontal}); + const HomeRecent({ + super.key, + required this.playlists, + this.axis = Axis.horizontal, + }); final List playlists; final Axis axis; @@ -43,8 +46,10 @@ class HomeRecent extends StatelessWidget { Row( children: [ Expanded( - child: Image.asset(playlist.cover.image, - fit: BoxFit.cover), + child: Image.asset( + playlist.cover.image, + fit: BoxFit.cover, + ), ), ], ), @@ -79,10 +84,7 @@ class HomeRecent extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.max, children: [ - ClippedImage( - playlist.cover.image, - height: 200, - ), + ClippedImage(playlist.cover.image, height: 200), Expanded( child: Center( child: Padding( @@ -104,23 +106,24 @@ class HomeRecent extends StatelessWidget { return Column( children: [ Padding( - padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), - child: Text( - playlist.title, - style: context.titleSmall!.copyWith( - fontWeight: FontWeight.bold, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - textAlign: TextAlign.center, - )), + padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), + child: Text( + playlist.title, + style: context.titleSmall!.copyWith(fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, + textAlign: TextAlign.center, + ), + ), Padding( padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text(playlist.description, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center), + child: Text( + playlist.description, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), ), ], ); diff --git a/boring_to_beautiful/step_07/lib/src/features/home/view/home_screen.dart b/boring_to_beautiful/step_07/lib/src/features/home/view/home_screen.dart index a763bbd45a..c142c1e4c2 100644 --- a/boring_to_beautiful/step_07/lib/src/features/home/view/home_screen.dart +++ b/boring_to_beautiful/step_07/lib/src/features/home/view/home_screen.dart @@ -49,33 +49,31 @@ class _HomeScreenState extends State { ), ), body: LayoutBuilder( - builder: (context, constraints) => TabBarView( - children: [ - SingleChildScrollView( - child: Column( - children: [ - const HomeHighlight(), - HomeArtists( - artists: artists, - constraints: constraints, + builder: + (context, constraints) => TabBarView( + children: [ + SingleChildScrollView( + child: Column( + children: [ + const HomeHighlight(), + HomeArtists( + artists: artists, + constraints: constraints, + ), + ], ), - ], - ), - ), - HomeRecent( - playlists: playlists, - axis: Axis.vertical, - ), - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), - PlaylistSongs( - playlist: newReleases, - constraints: constraints, + ), + HomeRecent(playlists: playlists, axis: Axis.vertical), + PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), + PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), + ], ), - ], - ), ), ), ); @@ -109,10 +107,11 @@ class _HomeScreenState extends State { children: [ const HomeHighlight(), LayoutBuilder( - builder: (context, constraints) => HomeArtists( - artists: artists, - constraints: constraints, - ), + builder: + (context, constraints) => HomeArtists( + artists: artists, + constraints: constraints, + ), ), ], ), @@ -132,9 +131,7 @@ class _HomeScreenState extends State { style: context.headlineSmall, ), ), - HomeRecent( - playlists: playlists, - ), + HomeRecent(playlists: playlists), ], ), ), @@ -152,19 +149,21 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.only(left: 8, bottom: 8), + padding: const EdgeInsets.only( + left: 8, + bottom: 8, + ), child: Text( 'Top Songs Today', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: topSongs, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: topSongs, + constraints: constraints, + ), ), ], ), @@ -177,19 +176,21 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: - const EdgeInsets.only(left: 8, bottom: 8), + padding: const EdgeInsets.only( + left: 8, + bottom: 8, + ), child: Text( 'New Releases', style: context.titleLarge, ), ), LayoutBuilder( - builder: (context, constraints) => - PlaylistSongs( - playlist: newReleases, - constraints: constraints, - ), + builder: + (context, constraints) => PlaylistSongs( + playlist: newReleases, + constraints: constraints, + ), ), ], ), diff --git a/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_home_screen.dart b/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_home_screen.dart index a80d767930..978608ccad 100644 --- a/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_home_screen.dart +++ b/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_home_screen.dart @@ -44,8 +44,10 @@ class PlaylistHomeScreen extends StatelessWidget { title: playlist.title, subtitle: playlist.description, ), - onTap: () => - GoRouter.of(context).go('/playlists/${playlist.id}'), + onTap: + () => GoRouter.of( + context, + ).go('/playlists/${playlist.id}'), ); }, ), diff --git a/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_screen.dart b/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_screen.dart index 5dc2f0744f..c41f500a92 100644 --- a/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_screen.dart +++ b/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_screen.dart @@ -20,114 +20,116 @@ class PlaylistScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - final colors = Theme.of(context).colorScheme; - final double headerHeight = constraints.isMobile - ? max(constraints.biggest.height * 0.5, 450) - : max(constraints.biggest.height * 0.25, 250); - if (constraints.isMobile) { - return Scaffold( - appBar: AppBar( - leading: BackButton( - onPressed: () => GoRouter.of(context).go('/playlists'), - ), - title: Text(playlist.title), - actions: [ - IconButton( - icon: const Icon(Icons.play_circle_fill), - onPressed: () {}, - ), - IconButton( - onPressed: () {}, - icon: const Icon(Icons.shuffle), - ), - ], - ), - body: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, - ), - ), - ); - } - return Scaffold( - body: CustomScrollView( - slivers: [ - SliverAppBar( + return LayoutBuilder( + builder: (context, constraints) { + final colors = Theme.of(context).colorScheme; + final double headerHeight = + constraints.isMobile + ? max(constraints.biggest.height * 0.5, 450) + : max(constraints.biggest.height * 0.25, 250); + if (constraints.isMobile) { + return Scaffold( + appBar: AppBar( leading: BackButton( onPressed: () => GoRouter.of(context).go('/playlists'), ), - expandedHeight: headerHeight, - pinned: false, - flexibleSpace: FlexibleSpaceBar( - background: AdaptiveImageCard( - axis: constraints.isMobile ? Axis.vertical : Axis.horizontal, - constraints: - constraints.copyWith(maxHeight: headerHeight).normalize(), - image: playlist.cover.image, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'PLAYLIST', - style: context.titleSmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.title, - style: context.displaySmall! - .copyWith(color: colors.onSurface), - ), - Text( - playlist.description, - style: context.bodyLarge!.copyWith( - color: colors.onSurface.withAlpha(204), + title: Text(playlist.title), + actions: [ + IconButton( + icon: const Icon(Icons.play_circle_fill), + onPressed: () {}, + ), + IconButton(onPressed: () {}, icon: const Icon(Icons.shuffle)), + ], + ), + body: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), + ), + ); + } + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + leading: BackButton( + onPressed: () => GoRouter.of(context).go('/playlists'), + ), + expandedHeight: headerHeight, + pinned: false, + flexibleSpace: FlexibleSpaceBar( + background: AdaptiveImageCard( + axis: + constraints.isMobile ? Axis.vertical : Axis.horizontal, + constraints: + constraints + .copyWith(maxHeight: headerHeight) + .normalize(), + image: playlist.cover.image, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'PLAYLIST', + style: context.titleSmall!.copyWith( + color: colors.onSurface, + ), ), - ), - const SizedBox(height: 8), - Row( - children: [ - IconButton( - icon: Icon( - Icons.play_circle_fill, - color: colors.tertiary, - ), - onPressed: () {}, + Text( + playlist.title, + style: context.displaySmall!.copyWith( + color: colors.onSurface, ), - TextButton.icon( - onPressed: () {}, - icon: Icon( - Icons.shuffle, - color: colors.tertiary, - ), - label: Text( - 'Shuffle', - style: context.bodySmall!.copyWith( + ), + Text( + playlist.description, + style: context.bodyLarge!.copyWith( + color: colors.onSurface.withAlpha(204), + ), + ), + const SizedBox(height: 8), + Row( + children: [ + IconButton( + icon: Icon( + Icons.play_circle_fill, color: colors.tertiary, ), + onPressed: () {}, ), - ), - ], - ), - ], + TextButton.icon( + onPressed: () {}, + icon: Icon(Icons.shuffle, color: colors.tertiary), + label: Text( + 'Shuffle', + style: context.bodySmall!.copyWith( + color: colors.tertiary, + ), + ), + ), + ], + ), + ], + ), ), ), ), - ), - SliverToBoxAdapter( - child: ArticleContent( - child: PlaylistSongs( - playlist: playlist, - constraints: constraints, + SliverToBoxAdapter( + child: ArticleContent( + child: PlaylistSongs( + playlist: playlist, + constraints: constraints, + ), ), ), - ), - ], - ), - ); - }); + ], + ), + ); + }, + ); } } diff --git a/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_songs.dart b/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_songs.dart index e944336540..1d5a2e9879 100644 --- a/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_songs.dart +++ b/boring_to_beautiful/step_07/lib/src/features/playlists/view/playlist_songs.dart @@ -12,8 +12,11 @@ import '../../../shared/views/image_clipper.dart'; import '../../../shared/views/views.dart'; class PlaylistSongs extends StatelessWidget { - const PlaylistSongs( - {super.key, required this.playlist, required this.constraints}); + const PlaylistSongs({ + super.key, + required this.playlist, + required this.constraints, + }); final Playlist playlist; final BoxConstraints constraints; @@ -25,14 +28,9 @@ class PlaylistSongs extends StatelessWidget { breakpoint: 450, columns: const [ DataColumn( - label: Padding( - padding: EdgeInsets.only(left: 20), - child: Text('#'), - ), - ), - DataColumn( - label: Text('Title'), + label: Padding(padding: EdgeInsets.only(left: 20), child: Text('#')), ), + DataColumn(label: Text('Title')), DataColumn( label: Padding( padding: EdgeInsets.only(right: 10), @@ -40,38 +38,40 @@ class PlaylistSongs extends StatelessWidget { ), ), ], - rowBuilder: (context, index) => DataRow.byIndex( - index: index, - cells: [ - DataCell( - // Add HoverableSongPlayButton - Center( - child: Text( - (index + 1).toString(), - textAlign: TextAlign.center, + rowBuilder: + (context, index) => DataRow.byIndex( + index: index, + cells: [ + DataCell( + // Add HoverableSongPlayButton + Center( + child: Text( + (index + 1).toString(), + textAlign: TextAlign.center, + ), + ), ), - ), - ), - DataCell( - Row(children: [ - Padding( - padding: const EdgeInsets.all(2), - child: ClippedImage(playlist.songs[index].image.image), + DataCell( + Row( + children: [ + Padding( + padding: const EdgeInsets.all(2), + child: ClippedImage(playlist.songs[index].image.image), + ), + const SizedBox(width: 10), + Expanded(child: Text(playlist.songs[index].title)), + ], + ), ), - const SizedBox(width: 10), - Expanded(child: Text(playlist.songs[index].title)), - ]), - ), - DataCell( - Text(playlist.songs[index].length.toHumanizedString()), + DataCell(Text(playlist.songs[index].length.toHumanizedString())), + ], ), - ], - ), itemBuilder: (song, index) { return ListTile( - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), leading: ClippedImage(song.image.image), title: Text(song.title), subtitle: Text(song.length.toHumanizedString()), diff --git a/boring_to_beautiful/step_07/lib/src/shared/app.dart b/boring_to_beautiful/step_07/lib/src/shared/app.dart index 3910d8f276..ed27418bd4 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/app.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/app.dart @@ -19,45 +19,46 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - final settings = ValueNotifier(ThemeSettings( - sourceColor: Colors.pink, - themeMode: ThemeMode.system, - )); + final settings = ValueNotifier( + ThemeSettings(sourceColor: Colors.pink, themeMode: ThemeMode.system), + ); @override Widget build(BuildContext context) { return BlocProvider( create: (context) => PlaybackBloc(), child: DynamicColorBuilder( - builder: (lightDynamic, darkDynamic) => ThemeProvider( - lightDynamic: lightDynamic, - darkDynamic: darkDynamic, - settings: settings, - child: NotificationListener( - onNotification: (notification) { - settings.value = notification.settings; - return true; - }, - child: ValueListenableBuilder( - valueListenable: settings, - builder: (context, value, _) { - final theme = ThemeProvider.of(context); - return MaterialApp.router( - debugShowCheckedModeBanner: false, - title: 'Flutter Demo', - theme: theme.light(settings.value.sourceColor), - darkTheme: theme.dark(settings.value.sourceColor), - themeMode: theme.themeMode(), - routeInformationParser: appRouter.routeInformationParser, - routeInformationProvider: - appRouter.routeInformationProvider, - routerDelegate: appRouter.routerDelegate, - builder: (context, child) { - return PlayPauseListener(child: child!); - }, - ); + builder: + (lightDynamic, darkDynamic) => ThemeProvider( + lightDynamic: lightDynamic, + darkDynamic: darkDynamic, + settings: settings, + child: NotificationListener( + onNotification: (notification) { + settings.value = notification.settings; + return true; }, + child: ValueListenableBuilder( + valueListenable: settings, + builder: (context, value, _) { + final theme = ThemeProvider.of(context); + return MaterialApp.router( + debugShowCheckedModeBanner: false, + title: 'Flutter Demo', + theme: theme.light(settings.value.sourceColor), + darkTheme: theme.dark(settings.value.sourceColor), + themeMode: theme.themeMode(), + routeInformationParser: appRouter.routeInformationParser, + routeInformationProvider: + appRouter.routeInformationProvider, + routerDelegate: appRouter.routerDelegate, + builder: (context, child) { + return PlayPauseListener(child: child!); + }, + ); + }, + ), ), - )), + ), ), ); } diff --git a/boring_to_beautiful/step_07/lib/src/shared/classes/image.dart b/boring_to_beautiful/step_07/lib/src/shared/classes/image.dart index a1ef427c1d..00a6472b4a 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/classes/image.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/classes/image.dart @@ -3,10 +3,11 @@ // found in the LICENSE file. class MyArtistImage { - const MyArtistImage( - {required this.image, - required this.sourceName, - required this.sourceLink}); + const MyArtistImage({ + required this.image, + required this.sourceName, + required this.sourceLink, + }); final String image; final String sourceName; diff --git a/boring_to_beautiful/step_07/lib/src/shared/classes/playlist.dart b/boring_to_beautiful/step_07/lib/src/shared/classes/playlist.dart index 59899dc619..5f0225059d 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/classes/playlist.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/classes/playlist.dart @@ -17,8 +17,9 @@ class Playlist { this.description = '', required this.songs, this.cover = const MyArtistImage( - image: 'assets/images/record.jpeg', - sourceName: 'Adobe Stock Images', - sourceLink: ''), + image: 'assets/images/record.jpeg', + sourceName: 'Adobe Stock Images', + sourceLink: '', + ), }); } diff --git a/boring_to_beautiful/step_07/lib/src/shared/classes/ranked_song.dart b/boring_to_beautiful/step_07/lib/src/shared/classes/ranked_song.dart index 5908268c8c..2362bfae64 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/classes/ranked_song.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/classes/ranked_song.dart @@ -7,7 +7,11 @@ import './classes.dart'; class RankedSong extends Song { final int ranking; - const RankedSong(this.ranking, String title, Artist artist, Duration length, - MyArtistImage image) - : super(title, artist, length, image); + const RankedSong( + this.ranking, + String title, + Artist artist, + Duration length, + MyArtistImage image, + ) : super(title, artist, length, image); } diff --git a/boring_to_beautiful/step_07/lib/src/shared/extensions.dart b/boring_to_beautiful/step_07/lib/src/shared/extensions.dart index 8b7e41b988..fe65add57c 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/extensions.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/extensions.dart @@ -9,51 +9,36 @@ extension TypographyUtils on BuildContext { ThemeData get theme => Theme.of(this); TextTheme get textTheme => GoogleFonts.montserratTextTheme(theme.textTheme); ColorScheme get colors => theme.colorScheme; - TextStyle? get displayLarge => textTheme.displayLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displayMedium => textTheme.displayMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get displaySmall => textTheme.displaySmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineLarge => textTheme.headlineLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineMedium => textTheme.headlineMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get headlineSmall => textTheme.headlineSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleLarge => textTheme.titleLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleMedium => textTheme.titleMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get titleSmall => textTheme.titleSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelLarge => textTheme.labelLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelMedium => textTheme.labelMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get labelSmall => textTheme.labelSmall?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyLarge => textTheme.bodyLarge?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodyMedium => textTheme.bodyMedium?.copyWith( - color: colors.onSurface, - ); - TextStyle? get bodySmall => textTheme.bodySmall?.copyWith( - color: colors.onSurface, - ); + TextStyle? get displayLarge => + textTheme.displayLarge?.copyWith(color: colors.onSurface); + TextStyle? get displayMedium => + textTheme.displayMedium?.copyWith(color: colors.onSurface); + TextStyle? get displaySmall => + textTheme.displaySmall?.copyWith(color: colors.onSurface); + TextStyle? get headlineLarge => + textTheme.headlineLarge?.copyWith(color: colors.onSurface); + TextStyle? get headlineMedium => + textTheme.headlineMedium?.copyWith(color: colors.onSurface); + TextStyle? get headlineSmall => + textTheme.headlineSmall?.copyWith(color: colors.onSurface); + TextStyle? get titleLarge => + textTheme.titleLarge?.copyWith(color: colors.onSurface); + TextStyle? get titleMedium => + textTheme.titleMedium?.copyWith(color: colors.onSurface); + TextStyle? get titleSmall => + textTheme.titleSmall?.copyWith(color: colors.onSurface); + TextStyle? get labelLarge => + textTheme.labelLarge?.copyWith(color: colors.onSurface); + TextStyle? get labelMedium => + textTheme.labelMedium?.copyWith(color: colors.onSurface); + TextStyle? get labelSmall => + textTheme.labelSmall?.copyWith(color: colors.onSurface); + TextStyle? get bodyLarge => + textTheme.bodyLarge?.copyWith(color: colors.onSurface); + TextStyle? get bodyMedium => + textTheme.bodyMedium?.copyWith(color: colors.onSurface); + TextStyle? get bodySmall => + textTheme.bodySmall?.copyWith(color: colors.onSurface); } extension BreakpointUtils on BoxConstraints { @@ -65,17 +50,17 @@ extension BreakpointUtils on BoxConstraints { extension DurationString on String { /// Assumes a string (roughly) of the format '\d{1,2}:\d{2}' Duration toDuration() => switch (split(':')) { - [var minutes, var seconds] => Duration( - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - [var hours, var minutes, var seconds] => Duration( - hours: int.parse(hours.trim()), - minutes: int.parse(minutes.trim()), - seconds: int.parse(seconds.trim()), - ), - _ => throw Exception('Invalid duration string: $this'), - }; + [var minutes, var seconds] => Duration( + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + [var hours, var minutes, var seconds] => Duration( + hours: int.parse(hours.trim()), + minutes: int.parse(minutes.trim()), + seconds: int.parse(seconds.trim()), + ), + _ => throw Exception('Invalid duration string: $this'), + }; } extension HumanizedDuration on Duration { diff --git a/boring_to_beautiful/step_07/lib/src/shared/playback/bloc/playback_bloc.dart b/boring_to_beautiful/step_07/lib/src/shared/playback/bloc/playback_bloc.dart index 73c2f4c436..c6c871937b 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/playback/bloc/playback_bloc.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/playback/bloc/playback_bloc.dart @@ -41,9 +41,8 @@ class PlaybackBloc extends Bloc { } } - void _handlePlaybackProgress(Duration progress) => add( - PlaybackEvent.songProgress(progress), - ); + void _handlePlaybackProgress(Duration progress) => + add(PlaybackEvent.songProgress(progress)); void _togglePlayPause(TogglePlayPause event, Emitter emit) { state.isPlaying ? _pausePlayback() : _resumePlayback(); @@ -52,8 +51,10 @@ class PlaybackBloc extends Bloc { void _pausePlayback() => _currentlyPlayingSubscription!.cancel(); - void _resumePlayback() => _currentlyPlayingSubscription = - _startPlayingStream().listen(_handlePlaybackProgress); + void _resumePlayback() => + _currentlyPlayingSubscription = _startPlayingStream().listen( + _handlePlaybackProgress, + ); void _changeSong(ChangeSong event, Emitter emit) { emit( @@ -69,19 +70,15 @@ class PlaybackBloc extends Bloc { } void _songProgress(SongProgress event, Emitter emit) => emit( - state.copyWith( - songWithProgress: state.songWithProgress!.copyWith( - progress: state.songWithProgress!.progress + event.duration, - ), - ), - ); + state.copyWith( + songWithProgress: state.songWithProgress!.copyWith( + progress: state.songWithProgress!.progress + event.duration, + ), + ), + ); void _setVolume(SetVolume event, Emitter emit) => emit( - state.copyWith( - volume: event.value, - isMuted: false, - previousVolume: null, - ), - ); + state.copyWith(volume: event.value, isMuted: false, previousVolume: null), + ); void _toggleMute(ToggleMute event, Emitter emit) { if (state.isMuted) { @@ -94,11 +91,7 @@ class PlaybackBloc extends Bloc { ); } else { emit( - state.copyWith( - isMuted: true, - volume: 0, - previousVolume: state.volume, - ), + state.copyWith(isMuted: true, volume: 0, previousVolume: state.volume), ); } } diff --git a/boring_to_beautiful/step_07/lib/src/shared/playback/bloc/playback_bloc.freezed.dart b/boring_to_beautiful/step_07/lib/src/shared/playback/bloc/playback_bloc.freezed.dart index 8a422cd449..54e870ab6f 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/playback/bloc/playback_bloc.freezed.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/playback/bloc/playback_bloc.freezed.dart @@ -12,7 +12,8 @@ part of 'playback_bloc.dart'; T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models', +); /// @nodoc mixin _$PlaybackEvent { @@ -24,8 +25,7 @@ mixin _$PlaybackEvent { required TResult Function() toggleMute, required TResult Function(double percent) moveToInSong, required TResult Function(Duration duration) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? togglePlayPause, @@ -34,8 +34,7 @@ mixin _$PlaybackEvent { TResult? Function()? toggleMute, TResult? Function(double percent)? moveToInSong, TResult? Function(Duration duration)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ TResult Function()? togglePlayPause, @@ -45,8 +44,7 @@ mixin _$PlaybackEvent { TResult Function(double percent)? moveToInSong, TResult Function(Duration duration)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult map({ required TResult Function(TogglePlayPause value) togglePlayPause, @@ -55,8 +53,7 @@ mixin _$PlaybackEvent { required TResult Function(ToggleMute value) toggleMute, required TResult Function(MoveToInSong value) moveToInSong, required TResult Function(SongProgress value) songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ TResult? Function(TogglePlayPause value)? togglePlayPause, @@ -65,8 +62,7 @@ mixin _$PlaybackEvent { TResult? Function(ToggleMute value)? toggleMute, TResult? Function(MoveToInSong value)? moveToInSong, TResult? Function(SongProgress value)? songProgress, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeMap({ TResult Function(TogglePlayPause value)? togglePlayPause, @@ -76,15 +72,15 @@ mixin _$PlaybackEvent { TResult Function(MoveToInSong value)? moveToInSong, TResult Function(SongProgress value)? songProgress, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; } /// @nodoc abstract class $PlaybackEventCopyWith<$Res> { factory $PlaybackEventCopyWith( - PlaybackEvent value, $Res Function(PlaybackEvent) then) = - _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; + PlaybackEvent value, + $Res Function(PlaybackEvent) then, + ) = _$PlaybackEventCopyWithImpl<$Res, PlaybackEvent>; } /// @nodoc @@ -103,9 +99,10 @@ class _$PlaybackEventCopyWithImpl<$Res, $Val extends PlaybackEvent> /// @nodoc abstract class _$$TogglePlayPauseImplCopyWith<$Res> { - factory _$$TogglePlayPauseImplCopyWith(_$TogglePlayPauseImpl value, - $Res Function(_$TogglePlayPauseImpl) then) = - __$$TogglePlayPauseImplCopyWithImpl<$Res>; + factory _$$TogglePlayPauseImplCopyWith( + _$TogglePlayPauseImpl value, + $Res Function(_$TogglePlayPauseImpl) then, + ) = __$$TogglePlayPauseImplCopyWithImpl<$Res>; } /// @nodoc @@ -113,8 +110,9 @@ class __$$TogglePlayPauseImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$TogglePlayPauseImpl> implements _$$TogglePlayPauseImplCopyWith<$Res> { __$$TogglePlayPauseImplCopyWithImpl( - _$TogglePlayPauseImpl _value, $Res Function(_$TogglePlayPauseImpl) _then) - : super(_value, _then); + _$TogglePlayPauseImpl _value, + $Res Function(_$TogglePlayPauseImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -233,8 +231,9 @@ abstract class TogglePlayPause implements PlaybackEvent { /// @nodoc abstract class _$$ChangeSongImplCopyWith<$Res> { factory _$$ChangeSongImplCopyWith( - _$ChangeSongImpl value, $Res Function(_$ChangeSongImpl) then) = - __$$ChangeSongImplCopyWithImpl<$Res>; + _$ChangeSongImpl value, + $Res Function(_$ChangeSongImpl) then, + ) = __$$ChangeSongImplCopyWithImpl<$Res>; @useResult $Res call({Song song}); } @@ -244,22 +243,23 @@ class __$$ChangeSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ChangeSongImpl> implements _$$ChangeSongImplCopyWith<$Res> { __$$ChangeSongImplCopyWithImpl( - _$ChangeSongImpl _value, $Res Function(_$ChangeSongImpl) _then) - : super(_value, _then); + _$ChangeSongImpl _value, + $Res Function(_$ChangeSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? song = null, - }) { - return _then(_$ChangeSongImpl( - null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? song = null}) { + return _then( + _$ChangeSongImpl( + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -397,8 +397,9 @@ abstract class ChangeSong implements PlaybackEvent { /// @nodoc abstract class _$$SetVolumeImplCopyWith<$Res> { factory _$$SetVolumeImplCopyWith( - _$SetVolumeImpl value, $Res Function(_$SetVolumeImpl) then) = - __$$SetVolumeImplCopyWithImpl<$Res>; + _$SetVolumeImpl value, + $Res Function(_$SetVolumeImpl) then, + ) = __$$SetVolumeImplCopyWithImpl<$Res>; @useResult $Res call({double value}); } @@ -408,22 +409,23 @@ class __$$SetVolumeImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SetVolumeImpl> implements _$$SetVolumeImplCopyWith<$Res> { __$$SetVolumeImplCopyWithImpl( - _$SetVolumeImpl _value, $Res Function(_$SetVolumeImpl) _then) - : super(_value, _then); + _$SetVolumeImpl _value, + $Res Function(_$SetVolumeImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? value = null, - }) { - return _then(_$SetVolumeImpl( - null == value - ? _value.value - : value // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? value = null}) { + return _then( + _$SetVolumeImpl( + null == value + ? _value.value + : value // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -561,8 +563,9 @@ abstract class SetVolume implements PlaybackEvent { /// @nodoc abstract class _$$ToggleMuteImplCopyWith<$Res> { factory _$$ToggleMuteImplCopyWith( - _$ToggleMuteImpl value, $Res Function(_$ToggleMuteImpl) then) = - __$$ToggleMuteImplCopyWithImpl<$Res>; + _$ToggleMuteImpl value, + $Res Function(_$ToggleMuteImpl) then, + ) = __$$ToggleMuteImplCopyWithImpl<$Res>; } /// @nodoc @@ -570,8 +573,9 @@ class __$$ToggleMuteImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$ToggleMuteImpl> implements _$$ToggleMuteImplCopyWith<$Res> { __$$ToggleMuteImplCopyWithImpl( - _$ToggleMuteImpl _value, $Res Function(_$ToggleMuteImpl) _then) - : super(_value, _then); + _$ToggleMuteImpl _value, + $Res Function(_$ToggleMuteImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @@ -690,8 +694,9 @@ abstract class ToggleMute implements PlaybackEvent { /// @nodoc abstract class _$$MoveToInSongImplCopyWith<$Res> { factory _$$MoveToInSongImplCopyWith( - _$MoveToInSongImpl value, $Res Function(_$MoveToInSongImpl) then) = - __$$MoveToInSongImplCopyWithImpl<$Res>; + _$MoveToInSongImpl value, + $Res Function(_$MoveToInSongImpl) then, + ) = __$$MoveToInSongImplCopyWithImpl<$Res>; @useResult $Res call({double percent}); } @@ -701,22 +706,23 @@ class __$$MoveToInSongImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$MoveToInSongImpl> implements _$$MoveToInSongImplCopyWith<$Res> { __$$MoveToInSongImplCopyWithImpl( - _$MoveToInSongImpl _value, $Res Function(_$MoveToInSongImpl) _then) - : super(_value, _then); + _$MoveToInSongImpl _value, + $Res Function(_$MoveToInSongImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? percent = null, - }) { - return _then(_$MoveToInSongImpl( - null == percent - ? _value.percent - : percent // ignore: cast_nullable_to_non_nullable - as double, - )); + $Res call({Object? percent = null}) { + return _then( + _$MoveToInSongImpl( + null == percent + ? _value.percent + : percent // ignore: cast_nullable_to_non_nullable + as double, + ), + ); } } @@ -854,8 +860,9 @@ abstract class MoveToInSong implements PlaybackEvent { /// @nodoc abstract class _$$SongProgressImplCopyWith<$Res> { factory _$$SongProgressImplCopyWith( - _$SongProgressImpl value, $Res Function(_$SongProgressImpl) then) = - __$$SongProgressImplCopyWithImpl<$Res>; + _$SongProgressImpl value, + $Res Function(_$SongProgressImpl) then, + ) = __$$SongProgressImplCopyWithImpl<$Res>; @useResult $Res call({Duration duration}); } @@ -865,22 +872,23 @@ class __$$SongProgressImplCopyWithImpl<$Res> extends _$PlaybackEventCopyWithImpl<$Res, _$SongProgressImpl> implements _$$SongProgressImplCopyWith<$Res> { __$$SongProgressImplCopyWithImpl( - _$SongProgressImpl _value, $Res Function(_$SongProgressImpl) _then) - : super(_value, _then); + _$SongProgressImpl _value, + $Res Function(_$SongProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackEvent /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? duration = null, - }) { - return _then(_$SongProgressImpl( - null == duration - ? _value.duration - : duration // ignore: cast_nullable_to_non_nullable - as Duration, - )); + $Res call({Object? duration = null}) { + return _then( + _$SongProgressImpl( + null == duration + ? _value.duration + : duration // ignore: cast_nullable_to_non_nullable + as Duration, + ), + ); } } @@ -1037,15 +1045,17 @@ mixin _$PlaybackState { /// @nodoc abstract class $PlaybackStateCopyWith<$Res> { factory $PlaybackStateCopyWith( - PlaybackState value, $Res Function(PlaybackState) then) = - _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; + PlaybackState value, + $Res Function(PlaybackState) then, + ) = _$PlaybackStateCopyWithImpl<$Res, PlaybackState>; @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); $SongWithProgressCopyWith<$Res>? get songWithProgress; } @@ -1071,28 +1081,36 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_value.copyWith( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - ) as $Val); + return _then( + _value.copyWith( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ) + as $Val, + ); } /// Create a copy of PlaybackState @@ -1114,16 +1132,18 @@ class _$PlaybackStateCopyWithImpl<$Res, $Val extends PlaybackState> abstract class _$$PlaybackStateImplCopyWith<$Res> implements $PlaybackStateCopyWith<$Res> { factory _$$PlaybackStateImplCopyWith( - _$PlaybackStateImpl value, $Res Function(_$PlaybackStateImpl) then) = - __$$PlaybackStateImplCopyWithImpl<$Res>; + _$PlaybackStateImpl value, + $Res Function(_$PlaybackStateImpl) then, + ) = __$$PlaybackStateImplCopyWithImpl<$Res>; @override @useResult - $Res call( - {double volume, - double? previousVolume, - bool isMuted, - bool isPlaying, - SongWithProgress? songWithProgress}); + $Res call({ + double volume, + double? previousVolume, + bool isMuted, + bool isPlaying, + SongWithProgress? songWithProgress, + }); @override $SongWithProgressCopyWith<$Res>? get songWithProgress; @@ -1134,8 +1154,9 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> extends _$PlaybackStateCopyWithImpl<$Res, _$PlaybackStateImpl> implements _$$PlaybackStateImplCopyWith<$Res> { __$$PlaybackStateImplCopyWithImpl( - _$PlaybackStateImpl _value, $Res Function(_$PlaybackStateImpl) _then) - : super(_value, _then); + _$PlaybackStateImpl _value, + $Res Function(_$PlaybackStateImpl) _then, + ) : super(_value, _then); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1148,40 +1169,48 @@ class __$$PlaybackStateImplCopyWithImpl<$Res> Object? isPlaying = null, Object? songWithProgress = freezed, }) { - return _then(_$PlaybackStateImpl( - volume: null == volume - ? _value.volume - : volume // ignore: cast_nullable_to_non_nullable - as double, - previousVolume: freezed == previousVolume - ? _value.previousVolume - : previousVolume // ignore: cast_nullable_to_non_nullable - as double?, - isMuted: null == isMuted - ? _value.isMuted - : isMuted // ignore: cast_nullable_to_non_nullable - as bool, - isPlaying: null == isPlaying - ? _value.isPlaying - : isPlaying // ignore: cast_nullable_to_non_nullable - as bool, - songWithProgress: freezed == songWithProgress - ? _value.songWithProgress - : songWithProgress // ignore: cast_nullable_to_non_nullable - as SongWithProgress?, - )); + return _then( + _$PlaybackStateImpl( + volume: + null == volume + ? _value.volume + : volume // ignore: cast_nullable_to_non_nullable + as double, + previousVolume: + freezed == previousVolume + ? _value.previousVolume + : previousVolume // ignore: cast_nullable_to_non_nullable + as double?, + isMuted: + null == isMuted + ? _value.isMuted + : isMuted // ignore: cast_nullable_to_non_nullable + as bool, + isPlaying: + null == isPlaying + ? _value.isPlaying + : isPlaying // ignore: cast_nullable_to_non_nullable + as bool, + songWithProgress: + freezed == songWithProgress + ? _value.songWithProgress + : songWithProgress // ignore: cast_nullable_to_non_nullable + as SongWithProgress?, + ), + ); } } /// @nodoc class _$PlaybackStateImpl implements _PlaybackState { - const _$PlaybackStateImpl( - {this.volume = 0.5, - this.previousVolume, - this.isMuted = false, - this.isPlaying = false, - this.songWithProgress}); + const _$PlaybackStateImpl({ + this.volume = 0.5, + this.previousVolume, + this.isMuted = false, + this.isPlaying = false, + this.songWithProgress, + }); /// Legal values are between 0 and 1. @override @@ -1221,8 +1250,14 @@ class _$PlaybackStateImpl implements _PlaybackState { } @override - int get hashCode => Object.hash(runtimeType, volume, previousVolume, isMuted, - isPlaying, songWithProgress); + int get hashCode => Object.hash( + runtimeType, + volume, + previousVolume, + isMuted, + isPlaying, + songWithProgress, + ); /// Create a copy of PlaybackState /// with the given fields replaced by the non-null parameter values. @@ -1234,12 +1269,13 @@ class _$PlaybackStateImpl implements _PlaybackState { } abstract class _PlaybackState implements PlaybackState { - const factory _PlaybackState( - {final double volume, - final double? previousVolume, - final bool isMuted, - final bool isPlaying, - final SongWithProgress? songWithProgress}) = _$PlaybackStateImpl; + const factory _PlaybackState({ + final double volume, + final double? previousVolume, + final bool isMuted, + final bool isPlaying, + final SongWithProgress? songWithProgress, + }) = _$PlaybackStateImpl; /// Legal values are between 0 and 1. @override @@ -1278,8 +1314,9 @@ mixin _$SongWithProgress { /// @nodoc abstract class $SongWithProgressCopyWith<$Res> { factory $SongWithProgressCopyWith( - SongWithProgress value, $Res Function(SongWithProgress) then) = - _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; + SongWithProgress value, + $Res Function(SongWithProgress) then, + ) = _$SongWithProgressCopyWithImpl<$Res, SongWithProgress>; @useResult $Res call({Duration progress, Song song}); } @@ -1298,29 +1335,32 @@ class _$SongWithProgressCopyWithImpl<$Res, $Val extends SongWithProgress> /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_value.copyWith( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - ) as $Val); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _value.copyWith( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ) + as $Val, + ); } } /// @nodoc abstract class _$$SongWithProgressImplCopyWith<$Res> implements $SongWithProgressCopyWith<$Res> { - factory _$$SongWithProgressImplCopyWith(_$SongWithProgressImpl value, - $Res Function(_$SongWithProgressImpl) then) = - __$$SongWithProgressImplCopyWithImpl<$Res>; + factory _$$SongWithProgressImplCopyWith( + _$SongWithProgressImpl value, + $Res Function(_$SongWithProgressImpl) then, + ) = __$$SongWithProgressImplCopyWithImpl<$Res>; @override @useResult $Res call({Duration progress, Song song}); @@ -1330,28 +1370,30 @@ abstract class _$$SongWithProgressImplCopyWith<$Res> class __$$SongWithProgressImplCopyWithImpl<$Res> extends _$SongWithProgressCopyWithImpl<$Res, _$SongWithProgressImpl> implements _$$SongWithProgressImplCopyWith<$Res> { - __$$SongWithProgressImplCopyWithImpl(_$SongWithProgressImpl _value, - $Res Function(_$SongWithProgressImpl) _then) - : super(_value, _then); + __$$SongWithProgressImplCopyWithImpl( + _$SongWithProgressImpl _value, + $Res Function(_$SongWithProgressImpl) _then, + ) : super(_value, _then); /// Create a copy of SongWithProgress /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? progress = null, - Object? song = null, - }) { - return _then(_$SongWithProgressImpl( - progress: null == progress - ? _value.progress - : progress // ignore: cast_nullable_to_non_nullable - as Duration, - song: null == song - ? _value.song - : song // ignore: cast_nullable_to_non_nullable - as Song, - )); + $Res call({Object? progress = null, Object? song = null}) { + return _then( + _$SongWithProgressImpl( + progress: + null == progress + ? _value.progress + : progress // ignore: cast_nullable_to_non_nullable + as Duration, + song: + null == song + ? _value.song + : song // ignore: cast_nullable_to_non_nullable + as Song, + ), + ); } } @@ -1390,13 +1432,16 @@ class _$SongWithProgressImpl implements _SongWithProgress { @pragma('vm:prefer-inline') _$$SongWithProgressImplCopyWith<_$SongWithProgressImpl> get copyWith => __$$SongWithProgressImplCopyWithImpl<_$SongWithProgressImpl>( - this, _$identity); + this, + _$identity, + ); } abstract class _SongWithProgress implements SongWithProgress { - const factory _SongWithProgress( - {required final Duration progress, - required final Song song}) = _$SongWithProgressImpl; + const factory _SongWithProgress({ + required final Duration progress, + required final Song song, + }) = _$SongWithProgressImpl; @override Duration get progress; diff --git a/boring_to_beautiful/step_07/lib/src/shared/providers/artists.dart b/boring_to_beautiful/step_07/lib/src/shared/providers/artists.dart index d116ad9cdd..f9e4a8063e 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/providers/artists.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/providers/artists.dart @@ -11,162 +11,175 @@ class ArtistsProvider { static ArtistsProvider get shared => ArtistsProvider(); List get artists => const [ - Artist( - id: 'jmo', - name: 'Jessie Morrison', + Artist( + id: 'jmo', + name: 'Jessie Morrison', + image: MyArtistImage( + image: 'assets/images/artists/woman.jpeg', + sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', + sourceName: 'Daniel Monteiro', + ), + bio: + 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', + updates: [ + 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', + 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', + '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', + ], + events: [ + Event( + date: '1/20/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Mountain View, California', + link: 'Tickets', + ), + Event( + date: '1/22/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Austin, Texas', + link: 'Tickets', + ), + Event( + date: '1/23/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Houston, Texas', + link: 'Tickets', + ), + Event( + date: '2/8/22', + title: 'Jessie Morrison: No More Heartbreak Tour', + location: 'Los Angeles, California', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', + author: 'By Jacqueline Stewart', + blurb: + 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', image: MyArtistImage( - image: 'assets/images/artists/woman.jpeg', - sourceLink: 'https://unsplash.com/photos/w8wpFqiMpW8', - sourceName: 'Daniel Monteiro', + image: 'assets/images/news/concert.jpeg', + sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', + sourceName: 'Anthony DELANOIX', ), - bio: - 'Jessie "JMo" Morrison is an American singer, actress, and dancer. The following year she won over America\'s hearts first appearing in the 2004 movie Unexpected Engagement. Soon after she released her debut album, Hopeful Romantics.', - updates: [ - 'So happy that everyone is loving the new music! It\'s been my pride and joy to work on and I\'m thrilled that you finally get to hear it!', - 'Happy Valentine\'s Day y\'all!!! I love each and every one of you 💋😘', - '#HappyGalentinesDay!!! Chocolates. Ice Cream. Your favorite rom-com. Let\'s goo!!! 💕✨', - ], - events: [ - Event( - date: '1/20/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Mountain View, California', - link: 'Tickets'), - Event( - date: '1/22/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Austin, Texas', - link: 'Tickets'), - Event( - date: '1/23/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Houston, Texas', - link: 'Tickets'), - Event( - date: '2/8/22', - title: 'Jessie Morrison: No More Heartbreak Tour', - location: 'Los Angeles, California', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Jessie Morrison a 26-stop cross country tour for the first time in 6 years.', - author: 'By Jacqueline Stewart', - blurb: - 'Our favorite triple-threat Jessie Morrison is back, this time with a 26 stop tour across the country. She\'ll kick things off in Mountain View on January 20th, 2022 in Mountain View California with more stops being announced over the next few weeks...', - image: MyArtistImage( - image: 'assets/images/news/concert.jpeg', - sourceLink: 'https://unsplash.com/photos/hzgs56Ze49s', - sourceName: 'Anthony DELANOIX', - ), - ) - ], ), - Artist( - id: 'lb', - name: 'Lucas Bryant', + ], + ), + Artist( + id: 'lb', + name: 'Lucas Bryant', + image: MyArtistImage( + image: 'assets/images/albums/artist1-album2.jpg', + sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', + sourceName: 'Keagan Henman', + ), + bio: + 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', + updates: [ + 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', + 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', + 'We\'re going all in this weekend! How are you doing, Vegas?!', + ], + events: [ + Event( + date: '5/16/22', + title: 'Back To My Hometown Tour', + location: 'Indianapolis, IN', + link: 'Tickets', + ), + Event( + date: '5/18/22', + title: 'Back To My Hometown Tour', + location: 'San Antonio, TX', + link: 'Tickets', + ), + Event( + date: '5/20/22', + title: 'Back To My Hometown Tour', + location: 'Phoenix, AZ', + link: 'Tickets', + ), + Event( + date: '5/23/22', + title: 'Back To My Hometown Tour', + location: 'San Diego, CA', + link: 'Tickets', + ), + ], + news: [ + News( + title: + 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', + author: 'Lonnie Hall', + blurb: + 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', image: MyArtistImage( image: 'assets/images/albums/artist1-album2.jpg', sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', sourceName: 'Keagan Henman', ), - bio: - 'Lucas Bryant is an American country music singer and songwriter. He moved to Nashville at the age of 18 to pursue his country music career. With 34 awards to his name, he currently holds the record for most awards in country music.', - updates: [ - 'Who\'s ready to party this weekend?! See you tomorrow, Nashville! #LBlive', - 'Can\'t wait to get back on stage after so long. What songs do you want to hear?', - 'We\'re going all in this weekend! How are you doing, Vegas?!', - ], - events: [ - Event( - date: '5/16/22', - title: 'Back To My Hometown Tour', - location: 'Indianapolis, IN', - link: 'Tickets'), - Event( - date: '5/18/22', - title: 'Back To My Hometown Tour', - location: 'San Antonio, TX', - link: 'Tickets'), - Event( - date: '5/20/22', - title: 'Back To My Hometown Tour', - location: 'Phoenix, AZ', - link: 'Tickets'), - Event( - date: '5/23/22', - title: 'Back To My Hometown Tour', - location: 'San Diego, CA', - link: 'Tickets'), - ], - news: [ - News( - title: - 'Country Music Favorites Lucas Bryant, Mariam Lubbock, Michelle Delaney and Jackson Murray Join Forces For The Biggest Performance in Country History.', - author: 'Lonnie Hall', - blurb: - 'Calling all country music fans! Fasten your seat belts because the 2022 Best of Country Awards is expecting a huge performance from some of our favorite artists. Country music legends Mariam Lubbock and Jackson Murray will be joined by Lucas Bryant and Michelle Delaney for a performance we\'ll never forget.', - image: MyArtistImage( - image: 'assets/images/albums/artist1-album2.jpg', - sourceLink: 'https://unsplash.com/photos/6etHcucBiRg', - sourceName: 'Keagan Henman', - ), - ), - ], ), - Artist( - id: 'jonjames', - name: 'Jon James', + ], + ), + Artist( + id: 'jonjames', + name: 'Jon James', + image: MyArtistImage( + image: 'assets/images/artists/joe.jpg', + sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', + sourceName: 'Natalie Runnerstrom', + ), + bio: + 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', + updates: [ + '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', + '4 days until I get to share some of the favorite songs I\'ve ever written with you.', + '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', + ], + events: [ + Event( + date: '10/22/21', + title: 'Falling For You Tour', + location: 'Dallas, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/23/21', + title: 'Falling For You Tour', + location: 'Houston, Texas', + link: 'Ticketmaster', + ), + Event( + date: '10/26/21', + title: 'Falling For You Tour', + location: 'Phoenix, Arizona', + link: 'Ticketmaster', + ), + Event( + date: '10/27/21', + title: 'Falling For You Tour', + location: 'Los Angeles, California', + link: 'Ticketmaster', + ), + ], + news: [ + News( + title: + 'Jon James is excited for the release of his sixth album "Falling For You"', + author: 'Top Media Today', + blurb: + 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', image: MyArtistImage( - image: 'assets/images/artists/joe.jpg', - sourceLink: 'https://unsplash.com/photos/k7UKO-tT5QU', - sourceName: 'Natalie Runnerstrom', + image: 'assets/images/news/recording_studio.jpg', + sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', + sourceName: 'Yohann LIBOT', ), - bio: - 'Jon James is an American singer and songwriter. He\'s best known for his number one single "Never Going Back" which stayed atop the charts for 10 weeks.', - updates: [ - '3. MORE. DAYS. Who\'s ready for #FallingForYou?! Tune in tomorrow to see the full track list!', - '4 days until I get to share some of the favorite songs I\'ve ever written with you.', - '#FallingForYou dropping in 5 days! Send me your favorite music video concepts 🎥 😎', - ], - events: [ - Event( - date: '10/22/21', - title: 'Falling For You Tour', - location: 'Dallas, Texas', - link: 'Ticketmaster'), - Event( - date: '10/23/21', - title: 'Falling For You Tour', - location: 'Houston, Texas', - link: 'Ticketmaster'), - Event( - date: '10/26/21', - title: 'Falling For You Tour', - location: 'Phoenix, Arizona', - link: 'Ticketmaster'), - Event( - date: '10/27/21', - title: 'Falling For You Tour', - location: 'Los Angeles, California', - link: 'Ticketmaster'), - ], - news: [ - News( - title: - 'Jon James is excited for the release of his sixth album "Falling For You"', - author: 'Top Media Today', - blurb: - 'Jon James will be dropping his new album "Falling For You" on Friday to much fan excitement. The 6-time Grammy winning artist has spent the last year writing and recording for this album that\'s been dubbed "his best work yet."', - image: MyArtistImage( - image: 'assets/images/news/recording_studio.jpg', - sourceLink: 'https://unsplash.com/photos/CbOGmLA46JI', - sourceName: 'Yohann LIBOT'), - ) - ], ), - ]; + ], + ), + ]; Artist? getArtist(String id) { return artists.firstWhereOrNull((artist) => artist.id == id); diff --git a/boring_to_beautiful/step_07/lib/src/shared/providers/playlists.dart b/boring_to_beautiful/step_07/lib/src/shared/providers/playlists.dart index e8bab994dd..f27f71b3ec 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/providers/playlists.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/providers/playlists.dart @@ -18,41 +18,50 @@ class PlaylistsProvider { static List images() { return [ const MyArtistImage( - image: 'assets/images/playlists/favorite.jpg', - sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/favorite.jpg', + sourceLink: 'https://unsplash.com/photos/60GsdOMRFGc', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/austin.jpg', - sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', - sourceName: 'Carlos Alfonso'), + image: 'assets/images/playlists/austin.jpg', + sourceLink: 'https://unsplash.com/photos/AlBgcDfDG_s', + sourceName: 'Carlos Alfonso', + ), const MyArtistImage( - image: 'assets/images/playlists/reading.jpg', - sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', - sourceName: 'Alexandra Fuller'), + image: 'assets/images/playlists/reading.jpg', + sourceLink: 'https://unsplash.com/photos/wkgv7I2VTzM', + sourceName: 'Alexandra Fuller', + ), const MyArtistImage( - image: 'assets/images/playlists/workout.jpg', - sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', - sourceName: 'Karsten Winegeart'), + image: 'assets/images/playlists/workout.jpg', + sourceLink: 'https://unsplash.com/photos/CnEEF5eJemQ', + sourceName: 'Karsten Winegeart', + ), const MyArtistImage( - image: 'assets/images/playlists/calm.jpg', - sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', - sourceName: 'Jared Rice'), + image: 'assets/images/playlists/calm.jpg', + sourceLink: 'https://unsplash.com/photos/NTyBbu66_SI', + sourceName: 'Jared Rice', + ), const MyArtistImage( - image: 'assets/images/playlists/coffee.jpg', - sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', - sourceName: 'Nathan Dumlao'), + image: 'assets/images/playlists/coffee.jpg', + sourceLink: 'https://unsplash.com/photos/XOhI_kW_TaM', + sourceName: 'Nathan Dumlao', + ), const MyArtistImage( - image: 'assets/images/playlists/piano.jpg', - sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', - sourceName: 'Jordan Whitfield'), + image: 'assets/images/playlists/piano.jpg', + sourceLink: 'https://unsplash.com/photos/BhfE1IgcsA8', + sourceName: 'Jordan Whitfield', + ), const MyArtistImage( - image: 'assets/images/playlists/studying.jpg', - sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', - sourceName: 'Humble Lamb'), + image: 'assets/images/playlists/studying.jpg', + sourceLink: 'https://unsplash.com/photos/-moT-Deiw1M', + sourceName: 'Humble Lamb', + ), const MyArtistImage( - image: 'assets/images/playlists/jazz.jpg', - sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', - sourceName: 'dimitri.photography'), + image: 'assets/images/playlists/jazz.jpg', + sourceLink: 'https://unsplash.com/photos/BY_KyTwTKq4', + sourceName: 'dimitri.photography', + ), ]; } @@ -85,8 +94,10 @@ class PlaylistsProvider { ); } - static final List _randomPlaylists = - List.generate(10, (index) => randomLengthPlaylist()); + static final List _randomPlaylists = List.generate( + 10, + (index) => randomLengthPlaylist(), + ); } String randomId() { diff --git a/boring_to_beautiful/step_07/lib/src/shared/providers/songs.dart b/boring_to_beautiful/step_07/lib/src/shared/providers/songs.dart index ed018a83ff..f1205f2dcb 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/providers/songs.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/providers/songs.dart @@ -52,9 +52,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:35'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album2.jpg', - sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', - sourceName: 'Alexandru Acea'), + image: 'assets/images/albums/artist4-album2.jpg', + sourceLink: 'https://unsplash.com/photos/RQgKM1h2agA', + sourceName: 'Alexandru Acea', + ), ), RankedSong( 2, @@ -62,9 +63,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:52'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album1.jpg', - sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', - sourceName: 'Jr Korpa'), + image: 'assets/images/albums/artist4-album1.jpg', + sourceLink: 'https://unsplash.com/photos/ZWDg7v2FPWE', + sourceName: 'Jr Korpa', + ), ), RankedSong( 3, @@ -72,9 +74,10 @@ final _songs = [ ArtistsProvider.shared.getArtist('jonjames')!, '3:39'.toDuration(), const MyArtistImage( - image: 'assets/images/albums/artist4-album3.jpg', - sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', - sourceName: 'Stormseeker'), + image: 'assets/images/albums/artist4-album3.jpg', + sourceLink: 'https://unsplash.com/photos/rX12B5uX7QM', + sourceName: 'Stormseeker', + ), ), RankedSong( 1, diff --git a/boring_to_beautiful/step_07/lib/src/shared/providers/theme.dart b/boring_to_beautiful/step_07/lib/src/shared/providers/theme.dart index 542d19b0fe..20f4a55e06 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/providers/theme.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/providers/theme.dart @@ -28,12 +28,13 @@ class ThemeSettingChange extends Notification { } class ThemeProvider extends InheritedWidget { - const ThemeProvider( - {super.key, - required this.settings, - required this.lightDynamic, - required this.darkDynamic, - required super.child}); + const ThemeProvider({ + super.key, + required this.settings, + required this.lightDynamic, + required this.darkDynamic, + required super.child, + }); final ValueNotifier settings; final ColorScheme? lightDynamic; @@ -59,8 +60,9 @@ class ThemeProvider extends InheritedWidget { Color blend(Color targetColor) { return Color( - // ignore: deprecated_member_use - Blend.harmonize(targetColor.value, settings.value.sourceColor.value)); + // ignore: deprecated_member_use + Blend.harmonize(targetColor.value, settings.value.sourceColor.value), + ); } Color source(Color? target) { @@ -72,18 +74,18 @@ class ThemeProvider extends InheritedWidget { } ColorScheme colors(Brightness brightness, Color? targetColor) { - final dynamicPrimary = brightness == Brightness.light - ? lightDynamic?.primary - : darkDynamic?.primary; + final dynamicPrimary = + brightness == Brightness.light + ? lightDynamic?.primary + : darkDynamic?.primary; return ColorScheme.fromSeed( seedColor: dynamicPrimary ?? source(targetColor), brightness: brightness, ); } - ShapeBorder get shapeMedium => RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ); + ShapeBorder get shapeMedium => + RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)); CardTheme cardTheme() { return CardTheme( @@ -113,21 +115,13 @@ class ThemeProvider extends InheritedWidget { labelColor: colors.secondary, unselectedLabelColor: colors.onSurfaceVariant, indicator: BoxDecoration( - border: Border( - bottom: BorderSide( - color: colors.secondary, - width: 2, - ), - ), + border: Border(bottom: BorderSide(color: colors.secondary, width: 2)), ), ); } BottomAppBarTheme bottomAppBarTheme(ColorScheme colors) { - return BottomAppBarTheme( - color: colors.surface, - elevation: 0, - ); + return BottomAppBarTheme(color: colors.surface, elevation: 0); } BottomNavigationBarThemeData bottomNavigationBarTheme(ColorScheme colors) { @@ -146,9 +140,7 @@ class ThemeProvider extends InheritedWidget { } DrawerThemeData drawerTheme(ColorScheme colors) { - return DrawerThemeData( - backgroundColor: colors.surface, - ); + return DrawerThemeData(backgroundColor: colors.surface); } ThemeData light([Color? targetColor]) { @@ -207,10 +199,7 @@ class ThemeProvider extends InheritedWidget { } class ThemeSettings { - ThemeSettings({ - required this.sourceColor, - required this.themeMode, - }); + ThemeSettings({required this.sourceColor, required this.themeMode}); final Color sourceColor; final ThemeMode themeMode; @@ -221,10 +210,7 @@ Color randomColor() { } // Custom Colors -const linkColor = CustomColor( - name: 'Link Color', - color: Color(0xFF00B0FF), -); +const linkColor = CustomColor(name: 'Link Color', color: Color(0xFF00B0FF)); class CustomColor { const CustomColor({ diff --git a/boring_to_beautiful/step_07/lib/src/shared/router.dart b/boring_to_beautiful/step_07/lib/src/shared/router.dart index 3efb7362fa..db82627246 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/router.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/router.dart @@ -20,11 +20,7 @@ final artistsProvider = ArtistsProvider(); final playlistsProvider = PlaylistsProvider(); const List destinations = [ - NavigationDestination( - label: 'Home', - icon: Icon(Icons.home), - route: '/', - ), + NavigationDestination(label: 'Home', icon: Icon(Icons.home), route: '/'), NavigationDestination( label: 'Playlists', icon: Icon(Icons.playlist_add_check), @@ -56,41 +52,46 @@ final appRouter = GoRouter( // HomeScreen GoRoute( path: '/', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 0, - child: HomeScreen(), - ), - ), + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 0, + child: HomeScreen(), + ), + ), ), // PlaylistHomeScreen GoRoute( path: '/playlists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 1, - child: PlaylistHomeScreen(), - ), - ), - routes: [ - GoRoute( - path: ':pid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 1, - child: PlaylistScreen( - playlist: playlistsProvider - .getPlaylist(state.pathParameters['pid']!)!, - ), + child: PlaylistHomeScreen(), ), ), + routes: [ + GoRoute( + path: ':pid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 1, + child: PlaylistScreen( + playlist: + playlistsProvider.getPlaylist( + state.pathParameters['pid']!, + )!, + ), + ), + ), ), ], ), @@ -98,28 +99,32 @@ final appRouter = GoRouter( // ArtistHomeScreen GoRoute( path: '/artists', - pageBuilder: (context, state) => const MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: 2, - child: ArtistsScreen(), - ), - ), - routes: [ - GoRoute( - path: ':aid', - pageBuilder: (context, state) => MaterialPage( - key: state.pageKey, + pageBuilder: + (context, state) => const MaterialPage( + key: _pageKey, child: RootLayout( key: _scaffoldKey, currentIndex: 2, - child: ArtistScreen( - artist: - artistsProvider.getArtist(state.pathParameters['aid']!)!, - ), + child: ArtistsScreen(), ), ), + routes: [ + GoRoute( + path: ':aid', + pageBuilder: + (context, state) => MaterialPage( + key: state.pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: 2, + child: ArtistScreen( + artist: + artistsProvider.getArtist( + state.pathParameters['aid']!, + )!, + ), + ), + ), // builder: (context, state) => ArtistScreen( // id: state.params['aid']!, // ), @@ -129,14 +134,15 @@ final appRouter = GoRouter( for (final route in destinations.skip(3)) GoRoute( path: route.route, - pageBuilder: (context, state) => MaterialPage( - key: _pageKey, - child: RootLayout( - key: _scaffoldKey, - currentIndex: destinations.indexOf(route), - child: const SizedBox(), - ), - ), + pageBuilder: + (context, state) => MaterialPage( + key: _pageKey, + child: RootLayout( + key: _scaffoldKey, + currentIndex: destinations.indexOf(route), + child: const SizedBox(), + ), + ), ), ], ); diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/adaptive_image_card.dart b/boring_to_beautiful/step_07/lib/src/shared/views/adaptive_image_card.dart index 07cab2b0d7..99f5be0837 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/adaptive_image_card.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/adaptive_image_card.dart @@ -36,20 +36,13 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), + child: Padding(padding: const EdgeInsets.all(20), child: child), ), ], ); } return Padding( - padding: const EdgeInsets.only( - left: 20, - bottom: 20, - top: 20, - ), + padding: const EdgeInsets.only(left: 20, bottom: 20, top: 20), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, @@ -65,11 +58,8 @@ class AdaptiveImageCard extends StatelessWidget { ), ), Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: child, - ), - ) + child: Padding(padding: const EdgeInsets.all(20), child: child), + ), ], ), ); diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/adaptive_navigation.dart b/boring_to_beautiful/step_07/lib/src/shared/views/adaptive_navigation.dart index 067ea7d17f..709068ea07 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/adaptive_navigation.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/adaptive_navigation.dart @@ -30,12 +30,15 @@ class AdaptiveNavigation extends StatelessWidget { NavigationRail( extended: dimens.maxWidth >= 800, minExtendedWidth: 180, - destinations: destinations - .map((e) => NavigationRailDestination( - icon: e.icon, - label: Text(e.label), - )) - .toList(), + destinations: + destinations + .map( + (e) => NavigationRailDestination( + icon: e.icon, + label: Text(e.label), + ), + ) + .toList(), selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, ), diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/article_content.dart b/boring_to_beautiful/step_07/lib/src/shared/views/article_content.dart index af243f015b..c5a0b5e62a 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/article_content.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/article_content.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class ArticleContent extends StatelessWidget { - const ArticleContent({ - super.key, - required this.child, - this.maxWidth = 960, - }); + const ArticleContent({super.key, required this.child, this.maxWidth = 960}); final double maxWidth; final Widget child; @@ -19,13 +15,8 @@ class ArticleContent extends StatelessWidget { return Container( alignment: Alignment.topCenter, child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: maxWidth, - ), - child: Padding( - padding: const EdgeInsets.all(15), - child: child, - ), + constraints: BoxConstraints(maxWidth: maxWidth), + child: Padding(padding: const EdgeInsets.all(15), child: child), ), ); } diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/bottom_bar.dart b/boring_to_beautiful/step_07/lib/src/shared/views/bottom_bar.dart index 06e085a9b6..bf15ad9bb0 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/bottom_bar.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/bottom_bar.dart @@ -26,16 +26,18 @@ class BottomBar extends StatelessWidget implements PreferredSizeWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => _BottomBar( - artist: state.songWithProgress?.song.artist, - isMuted: state.isMuted, - isPlaying: state.isPlaying, - preferredSize: preferredSize, - progress: state.songWithProgress?.progress, - song: state.songWithProgress?.song, - togglePlayPause: () => bloc.add(const PlaybackEvent.togglePlayPause()), - volume: state.volume, - ), + builder: + (context, state) => _BottomBar( + artist: state.songWithProgress?.song.artist, + isMuted: state.isMuted, + isPlaying: state.isPlaying, + preferredSize: preferredSize, + progress: state.songWithProgress?.progress, + song: state.songWithProgress?.song, + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), + volume: state.volume, + ), ); } } @@ -63,10 +65,12 @@ class _BottomBar extends StatelessWidget { @override Widget build(BuildContext context) => LayoutBuilder( - builder: (context, constraints) => constraints.isTablet - ? _buildDesktopBar(context, constraints) - : _buildMobileBar(context, constraints), - ); + builder: + (context, constraints) => + constraints.isTablet + ? _buildDesktopBar(context, constraints) + : _buildMobileBar(context, constraints), + ); Widget _buildDesktopBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -79,10 +83,7 @@ class _BottomBar extends StatelessWidget { Row( children: [ _AlbumArt(song: song), - _SongDetails( - artist: artist, - song: song, - ), + _SongDetails(artist: artist, song: song), ], ), Flexible( @@ -95,12 +96,7 @@ class _BottomBar extends StatelessWidget { isPlaying: isPlaying, togglePlayPause: togglePlayPause, ), - Center( - child: _ProgressBar( - progress: progress, - song: song, - ), - ), + Center(child: _ProgressBar(progress: progress, song: song)), ], ), ), @@ -114,17 +110,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _FullScreenPlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _FullScreenPlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -136,10 +133,10 @@ class _BottomBar extends StatelessWidget { } double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; Widget _buildMobileBar(BuildContext context, BoxConstraints constraints) { return ColoredBox( @@ -152,17 +149,18 @@ class _BottomBar extends StatelessWidget { final overlay = Overlay.of(context); OverlayEntry? entry; entry = OverlayEntry( - builder: (context) => Stack( - children: [ - Positioned( - child: _MobilePlayer( - onClose: () { - entry?.remove(); - }, - ), + builder: + (context) => Stack( + children: [ + Positioned( + child: _MobilePlayer( + onClose: () { + entry?.remove(); + }, + ), + ), + ], ), - ], - ), ); overlay.insert(entry); }, @@ -191,10 +189,7 @@ class _BottomBar extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - song?.title ?? '', - style: context.labelMedium, - ), + Text(song?.title ?? '', style: context.labelMedium), Text( song?.artist.name ?? '', style: context.labelSmall, @@ -220,10 +215,7 @@ class _BottomBar extends StatelessWidget { } class _ProgressBar extends StatelessWidget { - const _ProgressBar({ - required this.progress, - required this.song, - }); + const _ProgressBar({required this.progress, required this.song}); /// Current playback depth into user is into [song]. final Duration? progress; @@ -231,10 +223,10 @@ class _ProgressBar extends StatelessWidget { final Song? song; double get songProgress => switch ((progress, song)) { - (Duration progress, Song song) => - progress.inMilliseconds / song.length.inMilliseconds, - _ => 0, - }; + (Duration progress, Song song) => + progress.inMilliseconds / song.length.inMilliseconds, + _ => 0, + }; @override Widget build(BuildContext context) { @@ -252,29 +244,32 @@ class _ProgressBar extends StatelessWidget { children: [ const SizedBox(width: 10), SizedBox( - child: progress != null - ? Text(progress!.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + progress != null + ? Text( + progress!.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), Expanded( child: Slider( value: songProgress.clamp(0, 1), divisions: 1000, onChanged: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); }, onChangeEnd: (percent) { - BlocProvider.of(context).add( - PlaybackEvent.moveToInSong(percent), - ); + BlocProvider.of( + context, + ).add(PlaybackEvent.moveToInSong(percent)); // Because dragging pauses auto playback, resume playing // once the user finishes dragging. - BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ); + BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()); }, activeColor: Theme.of(context).colorScheme.onTertiaryContainer, @@ -282,12 +277,15 @@ class _ProgressBar extends StatelessWidget { ), ), SizedBox( - child: song != null - ? Text(song!.length.toHumanizedString(), - style: Theme.of(context).textTheme.bodySmall) - : const Text('-'), + child: + song != null + ? Text( + song!.length.toHumanizedString(), + style: Theme.of(context).textTheme.bodySmall, + ) + : const Text('-'), ), - const SizedBox(width: 10) + const SizedBox(width: 10), ], ), ); @@ -297,10 +295,7 @@ class _ProgressBar extends StatelessWidget { } class _VolumeBar extends StatelessWidget { - const _VolumeBar({ - required this.volume, - required this.isMuted, - }); + const _VolumeBar({required this.volume, required this.isMuted}); /// The percentage, between 0 and 1, at which to render the volume slider. final double volume; @@ -313,17 +308,16 @@ class _VolumeBar extends StatelessWidget { @override Widget build(BuildContext context) { return ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 200, - ), + constraints: const BoxConstraints(maxWidth: 200), child: Padding( padding: const EdgeInsets.all(8), child: Row( children: [ GestureDetector( - onTap: () => BlocProvider.of(context).add( - const PlaybackEvent.toggleMute(), - ), + onTap: + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.toggleMute()), child: Icon(!isMuted ? Icons.volume_mute : Icons.volume_off), ), Expanded( @@ -332,8 +326,10 @@ class _VolumeBar extends StatelessWidget { min: 0, max: 1, divisions: 100, - onChanged: (newValue) => BlocProvider.of(context) - .add(PlaybackEvent.setVolume(newValue)), + onChanged: + (newValue) => BlocProvider.of( + context, + ).add(PlaybackEvent.setVolume(newValue)), activeColor: Theme.of(context).colorScheme.onTertiaryContainer, inactiveColor: Theme.of(context).colorScheme.onSurface, ), @@ -356,49 +352,50 @@ class _PlaybackControls extends StatelessWidget { @override Widget build(BuildContext context) { - return LayoutBuilder(builder: (context, constraints) { - double iconSize = 24; - double playIconSize = 32; - double innerPadding = 16; - double playPadding = 20; - if (constraints.maxWidth < 500) { - iconSize = 21; - playIconSize = 28; - innerPadding = 14; - playPadding = 17; - } - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( + return LayoutBuilder( + builder: (context, constraints) { + double iconSize = 24; + double playIconSize = 32; + double innerPadding = 16; + double playPadding = 20; + if (constraints.maxWidth < 500) { + iconSize = 21; + playIconSize = 28; + innerPadding = 14; + playPadding = 17; + } + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( padding: EdgeInsets.fromLTRB(0, 0, innerPadding, 0), - child: Icon(Icons.shuffle, size: iconSize)), - Icon(Icons.skip_previous, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), - child: GestureDetector( - onTap: togglePlayPause, - child: Icon( - isPlaying ? Icons.pause_circle : Icons.play_circle, - size: playIconSize, + child: Icon(Icons.shuffle, size: iconSize), + ), + Icon(Icons.skip_previous, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(playPadding, 0, innerPadding, 0), + child: GestureDetector( + onTap: togglePlayPause, + child: Icon( + isPlaying ? Icons.pause_circle : Icons.play_circle, + size: playIconSize, + ), ), ), - ), - Icon(Icons.skip_next, size: iconSize), - Padding( - padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), - child: Icon(Icons.repeat, size: iconSize), - ), - ], - ); - }); + Icon(Icons.skip_next, size: iconSize), + Padding( + padding: EdgeInsets.fromLTRB(innerPadding, 0, 0, 0), + child: Icon(Icons.repeat, size: iconSize), + ), + ], + ); + }, + ); } } class _AlbumArt extends StatelessWidget { - const _AlbumArt({ - required this.song, - }); + const _AlbumArt({required this.song}); final Song? song; @@ -409,21 +406,17 @@ class _AlbumArt extends StatelessWidget { child: SizedBox( width: 70, height: 70, - child: song != null - ? Image.asset(song!.image.image) - : Container( - color: Colors.pink[100], - ), + child: + song != null + ? Image.asset(song!.image.image) + : Container(color: Colors.pink[100]), ), ); } } class _SongDetails extends StatelessWidget { - const _SongDetails({ - required this.artist, - required this.song, - }); + const _SongDetails({required this.artist, required this.song}); final Artist? artist; final Song? song; @@ -455,9 +448,7 @@ class _SongDetails extends StatelessWidget { } class _FullScreenPlayer extends StatefulWidget { - const _FullScreenPlayer({ - required this.onClose, - }); + const _FullScreenPlayer({required this.onClose}); final VoidCallback onClose; @@ -489,29 +480,33 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return MouseRegion( - onHover: (_) { - setState(() { - _showControls = true; - }); - hideControls(); + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return MouseRegion( + onHover: (_) { + setState(() { + _showControls = true; + }); + hideControls(); + }, + child: buildPlayer(context, state, dimens), + ); }, - child: buildPlayer(context, state, dimens), - ); - }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; final song = current?.song; @@ -519,26 +514,25 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { fit: StackFit.expand, children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - song!.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset(song!.image.image, fit: BoxFit.cover), ), ), - ), ), Positioned( top: 20, right: 20, child: IconButton( - color: song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const Icon(Icons.fullscreen_exit), onPressed: widget.onClose, ), @@ -569,8 +563,9 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { Text( song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 20, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 20, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -582,10 +577,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { right: 20, left: 20, bottom: dimens.biggest.height * 0.2, - child: _ProgressBar( - progress: current?.progress, - song: song, - ), + child: _ProgressBar(progress: current?.progress, song: song), ), Positioned( right: 20, @@ -598,8 +590,8 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), @@ -611,9 +603,7 @@ class _FullScreenPlayerState extends State<_FullScreenPlayer> { } class _MobilePlayer extends StatelessWidget { - const _MobilePlayer({ - required this.onClose, - }); + const _MobilePlayer({required this.onClose}); final VoidCallback onClose; @@ -622,46 +612,52 @@ class _MobilePlayer extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => Theme( - data: ThemeProvider.of(context).dark(), - child: Scaffold( - body: LayoutBuilder( - builder: (context, dimens) { - return buildPlayer(context, state, dimens); - }, + builder: + (context, state) => Theme( + data: ThemeProvider.of(context).dark(), + child: Scaffold( + body: LayoutBuilder( + builder: (context, dimens) { + return buildPlayer(context, state, dimens); + }, + ), + ), ), - ), - ), ); } Widget buildPlayer( - BuildContext context, PlaybackState state, BoxConstraints dimens) { + BuildContext context, + PlaybackState state, + BoxConstraints dimens, + ) { final bloc = BlocProvider.of(context); final current = state.songWithProgress; return Stack( children: [ Positioned.fill( - child: current == null - ? const Center(child: Text('No song selected')) - : Container( - color: context.colors.shadow, - child: Opacity( - opacity: 0.3, - child: Image.asset( - current.song.image.image, - fit: BoxFit.cover, + child: + current == null + ? const Center(child: Text('No song selected')) + : Container( + color: context.colors.shadow, + child: Opacity( + opacity: 0.3, + child: Image.asset( + current.song.image.image, + fit: BoxFit.cover, + ), ), ), - ), ), Positioned( top: 20, left: 20, child: IconButton( - color: current?.song != null - ? context.colors.onSurface - : context.colors.onSurface, + color: + current?.song != null + ? context.colors.onSurface + : context.colors.onSurface, icon: const RotatedBox( quarterTurns: 1, child: Icon(Icons.chevron_right), @@ -676,10 +672,7 @@ class _MobilePlayer extends StatelessWidget { left: 0, right: 0, height: dimens.biggest.height * 0.5, - child: Image.asset( - current.song.image.image, - fit: BoxFit.contain, - ), + child: Image.asset(current.song.image.image, fit: BoxFit.contain), ), Positioned( left: 0, @@ -705,8 +698,9 @@ class _MobilePlayer extends StatelessWidget { Text( current.song.artist.name, style: context.labelSmall!.copyWith( - fontSize: 12, - color: context.colors.onSurface.withAlpha(204)), + fontSize: 12, + color: context.colors.onSurface.withAlpha(204), + ), overflow: TextOverflow.clip, ), ], @@ -718,15 +712,12 @@ class _MobilePlayer extends StatelessWidget { scale: 1.5, child: _PlaybackControls( isPlaying: state.isPlaying, - togglePlayPause: () => - bloc.add(const PlaybackEvent.togglePlayPause()), + togglePlayPause: + () => bloc.add(const PlaybackEvent.togglePlayPause()), ), ), ), - _ProgressBar( - progress: current.progress, - song: current.song, - ), + _ProgressBar(progress: current.progress, song: current.song), ], ), ), diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/brightness_toggle.dart b/boring_to_beautiful/step_07/lib/src/shared/views/brightness_toggle.dart index 46dde4810f..5b5332392b 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/brightness_toggle.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/brightness_toggle.dart @@ -13,9 +13,10 @@ class BrightnessToggle extends StatelessWidget { Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; return IconButton( - icon: Theme.of(context).brightness == Brightness.light - ? const Icon(Icons.brightness_3) - : const Icon(Icons.brightness_7), + icon: + Theme.of(context).brightness == Brightness.light + ? const Icon(Icons.brightness_3) + : const Icon(Icons.brightness_7), onPressed: () { final themeProvider = ThemeProvider.of(context); final settings = themeProvider.settings.value; diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/center_row.dart b/boring_to_beautiful/step_07/lib/src/shared/views/center_row.dart index 36d428e3b8..c1f3effcc2 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/center_row.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/center_row.dart @@ -5,23 +5,12 @@ import 'package:flutter/material.dart'; class CenterRow extends StatelessWidget { - const CenterRow({ - super.key, - required this.child, - }); + const CenterRow({super.key, required this.child}); final Widget child; @override Widget build(BuildContext context) { - return Row( - children: [ - Expanded( - child: Center( - child: child, - ), - ), - ], - ); + return Row(children: [Expanded(child: Center(child: child))]); } } diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/clickable.dart b/boring_to_beautiful/step_07/lib/src/shared/views/clickable.dart index cd7ef46268..f192f0b135 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/clickable.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/clickable.dart @@ -14,10 +14,7 @@ class Clickable extends StatelessWidget { Widget build(BuildContext context) { return MouseRegion( cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: onTap, - child: child, - ), + child: GestureDetector(onTap: onTap, child: child), ); } } diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/events.dart b/boring_to_beautiful/step_07/lib/src/shared/views/events.dart index ed38465460..ab9140e56d 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/events.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/events.dart @@ -24,43 +24,18 @@ class Events extends StatelessWidget { child: DataTable( horizontalMargin: 5.0, columns: const [ - DataColumn( - label: Text( - 'Date', - ), - numeric: true, - ), - DataColumn( - label: Text( - 'Event', - ), - ), - DataColumn( - label: Text( - 'Location', - ), - ), - DataColumn( - label: Text( - 'More info', - ), - ), + DataColumn(label: Text('Date'), numeric: true), + DataColumn(label: Text('Event')), + DataColumn(label: Text('Location')), + DataColumn(label: Text('More info')), ], rows: [ for (final event in artist.events) DataRow( cells: [ - DataCell( - Text(event.date), - ), - DataCell( - Row(children: [ - Expanded(child: Text(event.title)), - ]), - ), - DataCell( - Text(event.location), - ), + DataCell(Text(event.date)), + DataCell(Row(children: [Expanded(child: Text(event.title))])), + DataCell(Text(event.location)), DataCell( Clickable( child: Text( @@ -70,8 +45,9 @@ class Events extends StatelessWidget { decoration: TextDecoration.underline, ), ), - onTap: () => - launchUrl(Uri.parse('https://docs.flutter.dev')), + onTap: + () => + launchUrl(Uri.parse('https://docs.flutter.dev')), ), ), ], diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/hover_toggle.dart b/boring_to_beautiful/step_07/lib/src/shared/views/hover_toggle.dart index ec98c2863c..649cfcab63 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/hover_toggle.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/hover_toggle.dart @@ -31,9 +31,10 @@ class _HoverToggleState extends State with MaterialStateMixin { cursor: isHovered ? SystemMouseCursors.click : MouseCursor.defer, onEnter: (_) => setMaterialState(WidgetState.hovered, true), onExit: (_) => setMaterialState(WidgetState.hovered, false), - child: widget.mode == HoverMode.replace - ? _buildReplaceableChildren() - : _buildChildrenStack(), + child: + widget.mode == HoverMode.replace + ? _buildReplaceableChildren() + : _buildChildrenStack(), ), ); } @@ -41,12 +42,7 @@ class _HoverToggleState extends State with MaterialStateMixin { Widget _buildChildrenStack() { Widget child = isHovered ? Opacity(opacity: 0.2, child: widget.child) : widget.child; - return Stack( - children: [ - child, - if (isHovered) widget.hoverChild, - ], - ); + return Stack(children: [child, if (isHovered) widget.hoverChild]); } Widget _buildReplaceableChildren() => diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/hoverable_song_play_button.dart b/boring_to_beautiful/step_07/lib/src/shared/views/hoverable_song_play_button.dart index 512f3d1d3c..dd588e3dbe 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/hoverable_song_play_button.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/hoverable_song_play_button.dart @@ -29,9 +29,10 @@ class HoverableSongPlayButton extends StatelessWidget { hoverChild: Center( child: GestureDetector( child: const Icon(Icons.play_arrow), - onTap: () => BlocProvider.of(context).add( - PlaybackEvent.changeSong(song), - ), + onTap: + () => BlocProvider.of( + context, + ).add(PlaybackEvent.changeSong(song)), ), ), mode: hoverMode, diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/image_card.dart b/boring_to_beautiful/step_07/lib/src/shared/views/image_card.dart index 0af9f75f33..6e7f6cd42d 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/image_card.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/image_card.dart @@ -7,13 +7,14 @@ import '../../shared/extensions.dart'; import 'outlined_card.dart'; class ImageCard extends StatelessWidget { - const ImageCard( - {super.key, - required this.title, - required this.details, - required this.image, - this.subtitle, - this.clickable = false}); + const ImageCard({ + super.key, + required this.title, + required this.details, + required this.image, + this.subtitle, + this.clickable = false, + }); final String title; final String? subtitle; @@ -28,54 +29,51 @@ class ImageCard extends StatelessWidget { clickable: clickable, child: Padding( padding: const EdgeInsets.all(8.0), - child: LayoutBuilder(builder: (context, constraints) { - return Row( - children: [ - if (constraints.maxWidth > 600) - SizedBox( - width: 170, - height: 170, - child: Image.asset( - image, - fit: BoxFit.cover, + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + if (constraints.maxWidth > 600) + SizedBox( + width: 170, + height: 170, + child: Image.asset(image, fit: BoxFit.cover), ), - ), - Expanded( - child: Padding( - padding: padding, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 5), - child: Text( - title, - style: context.titleLarge! - .copyWith(fontWeight: FontWeight.bold), - ), - ), - if (subtitle != null) + Expanded( + child: Padding( + padding: padding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Padding( - padding: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only(bottom: 5), child: Text( - subtitle!, - style: context.labelMedium, + title, + style: context.titleLarge!.copyWith( + fontWeight: FontWeight.bold, + ), ), ), - Text( - details, - style: context.labelMedium?.copyWith( - fontSize: 16, - height: 1.25, + if (subtitle != null) + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Text(subtitle!, style: context.labelMedium), + ), + Text( + details, + style: context.labelMedium?.copyWith( + fontSize: 16, + height: 1.25, + ), ), - ), - ], + ], + ), ), ), - ), - ], - ); - }), + ], + ); + }, + ), ), ); } diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/image_tile.dart b/boring_to_beautiful/step_07/lib/src/shared/views/image_tile.dart index 4f2bbebb96..dd99152af5 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/image_tile.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/image_tile.dart @@ -21,19 +21,17 @@ class ImageTile extends StatelessWidget { @override Widget build(BuildContext context) { return OutlinedCard( - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Expanded( - child: Image.asset(image, fit: BoxFit.cover), - ), - ], - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [Expanded(child: Image.asset(image, fit: BoxFit.cover))], + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( padding: const EdgeInsets.fromLTRB(10, 5, 10, 5), child: Text( title, @@ -43,20 +41,25 @@ class ImageTile extends StatelessWidget { ), overflow: TextOverflow.ellipsis, maxLines: 1, - )), - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Text( - subtitle, - overflow: TextOverflow.ellipsis, - style: context.labelSmall, - maxLines: 2, - textAlign: TextAlign.center, + ), ), - ), - ], - ) - ]), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 10, + ), + child: Text( + subtitle, + overflow: TextOverflow.ellipsis, + style: context.labelSmall, + maxLines: 2, + textAlign: TextAlign.center, + ), + ), + ], + ), + ], + ), ); } } diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/outlined_card.dart b/boring_to_beautiful/step_07/lib/src/shared/views/outlined_card.dart index 0d886e2c54..ff49275dc9 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/outlined_card.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/outlined_card.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; class OutlinedCard extends StatefulWidget { - const OutlinedCard({ - super.key, - required this.child, - this.clickable = true, - }); + const OutlinedCard({super.key, required this.child, this.clickable = true}); final Widget child; final bool clickable; @@ -22,9 +18,10 @@ class _OutlinedCardState extends State { @override Widget build(BuildContext context) { return MouseRegion( - cursor: widget.clickable - ? SystemMouseCursors.click - : SystemMouseCursors.basic, + cursor: + widget.clickable + ? SystemMouseCursors.click + : SystemMouseCursors.basic, child: Container( decoration: BoxDecoration( border: Border.all( diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/play_pause_listener.dart b/boring_to_beautiful/step_07/lib/src/shared/views/play_pause_listener.dart index 52fad00863..6b4fc66709 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/play_pause_listener.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/play_pause_listener.dart @@ -16,10 +16,7 @@ import '../playback/bloc/bloc.dart'; /// shortcuts. By sitting below that machinery, this installs a global Spacebar /// listener which toggles Playback, as is customary in music-playing apps. class PlayPauseListener extends StatelessWidget { - const PlayPauseListener({ - super.key, - required this.child, - }); + const PlayPauseListener({super.key, required this.child}); final Widget child; @@ -28,9 +25,7 @@ class PlayPauseListener extends StatelessWidget { // Immediately catch any [_PlayPauseIntent] events released by the inner // [Shortcuts] widget. return Actions( - actions: >{ - _PlayPauseIntent: _PlayPauseAction(), - }, + actions: >{_PlayPauseIntent: _PlayPauseAction()}, child: Shortcuts( // Register a shortcut for Spacebar presses that release a // [_PlayPauseIntent] up the tree to the nearest [Actions] widget. @@ -38,9 +33,9 @@ class PlayPauseListener extends StatelessWidget { const SingleActivator(LogicalKeyboardKey.space): _PlayPauseIntent( // Create a closure which sends a [TogglePlayPause] event to the // [PlaybackBloc]. - () => BlocProvider.of(context).add( - const PlaybackEvent.togglePlayPause(), - ), + () => BlocProvider.of( + context, + ).add(const PlaybackEvent.togglePlayPause()), ), }, child: child, diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/root_layout.dart b/boring_to_beautiful/step_07/lib/src/shared/views/root_layout.dart index 878b57d729..ff6270248c 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/root_layout.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/root_layout.dart @@ -29,36 +29,37 @@ class RootLayout extends StatelessWidget { final bloc = BlocProvider.of(context); return BlocBuilder( bloc: bloc, - builder: (context, state) => LayoutBuilder(builder: (context, dimens) { - void onSelected(int index) { - final destination = router.destinations[index]; - go.GoRouter.of(context).go(destination.route); - } + builder: + (context, state) => LayoutBuilder( + builder: (context, dimens) { + void onSelected(int index) { + final destination = router.destinations[index]; + go.GoRouter.of(context).go(destination.route); + } - final current = state.songWithProgress; - return AdaptiveNavigation( - key: _navigationRailKey, - destinations: router.destinations - .map((e) => NavigationDestination( - icon: e.icon, - label: e.label, - )) - .toList(), - selectedIndex: currentIndex, - onDestinationSelected: onSelected, - child: Column( - children: [ - Expanded( - child: _Switcher( - key: _switcherKey, - child: child, + final current = state.songWithProgress; + return AdaptiveNavigation( + key: _navigationRailKey, + destinations: + router.destinations + .map( + (e) => NavigationDestination( + icon: e.icon, + label: e.label, + ), + ) + .toList(), + selectedIndex: currentIndex, + onDestinationSelected: onSelected, + child: Column( + children: [ + Expanded(child: _Switcher(key: _switcherKey, child: child)), + if (current != null) const BottomBar(), + ], ), - ), - if (current != null) const BottomBar(), - ], + ); + }, ), - ); - }), ); } } @@ -66,21 +67,18 @@ class RootLayout extends StatelessWidget { class _Switcher extends StatelessWidget { final Widget child; - const _Switcher({ - required this.child, - super.key, - }); + const _Switcher({required this.child, super.key}); @override Widget build(BuildContext context) { return UniversalPlatform.isDesktop ? child : AnimatedSwitcher( - key: key, - duration: const Duration(milliseconds: 200), - switchInCurve: Curves.easeInOut, - switchOutCurve: Curves.easeInOut, - child: child, - ); + key: key, + duration: const Duration(milliseconds: 200), + switchInCurve: Curves.easeInOut, + switchOutCurve: Curves.easeInOut, + child: child, + ); } } diff --git a/boring_to_beautiful/step_07/lib/src/shared/views/sidebar.dart b/boring_to_beautiful/step_07/lib/src/shared/views/sidebar.dart index 78c19b4d22..8815223b22 100644 --- a/boring_to_beautiful/step_07/lib/src/shared/views/sidebar.dart +++ b/boring_to_beautiful/step_07/lib/src/shared/views/sidebar.dart @@ -26,10 +26,7 @@ class SideBar extends StatelessWidget { title: const Text('Home'), onTap: () => GoRouter.of(context).go('/'), ), - const ListTile( - leading: Icon(Icons.search), - title: Text('Search'), - ), + const ListTile(leading: Icon(Icons.search), title: Text('Search')), ListTile( leading: const Icon(Icons.person), title: const Text('Artists'), @@ -64,10 +61,7 @@ class PlaylistNav extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(left: 16, top: 16), - child: Text( - 'Playlists', - style: context.titleMedium, - ), + child: Text('Playlists', style: context.titleMedium), ), Expanded( child: ListView( @@ -114,10 +108,9 @@ class _PlaylistNavItemState extends State<_PlaylistNavItem> { @override void initState() { super.initState(); - _focusNode = FocusNode(debugLabel: widget.title) - ..addListener(() { - setState(() => _isSelected = _focusNode.hasPrimaryFocus); - }); + _focusNode = FocusNode(debugLabel: widget.title)..addListener(() { + setState(() => _isSelected = _focusNode.hasPrimaryFocus); + }); } @override diff --git a/boring_to_beautiful/step_07/macos/Podfile b/boring_to_beautiful/step_07/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/boring_to_beautiful/step_07/macos/Podfile +++ b/boring_to_beautiful/step_07/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/boring_to_beautiful/step_07/macos/Runner.xcodeproj/project.pbxproj b/boring_to_beautiful/step_07/macos/Runner.xcodeproj/project.pbxproj index 79604e1785..63e08baa02 100644 --- a/boring_to_beautiful/step_07/macos/Runner.xcodeproj/project.pbxproj +++ b/boring_to_beautiful/step_07/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */; }; - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */; }; + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0748160F2B3800356C0F935A /* Pods_RunnerTests.framework in Frameworks */, + 698509907DDEA9FD2474675B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 196230624484301AC0DD1F75 /* Pods_Runner.framework in Frameworks */, + 1D98BC1A27933D80D7359D2E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 143267097A016AD19836D89A /* Pods */ = { + isa = PBXGroup; + children = ( + D631C861CD795067CE348179 /* Pods-Runner.debug.xcconfig */, + EF68756E059304CF7F10E5EC /* Pods-Runner.release.xcconfig */, + 344587A8BC8B7892A9774E02 /* Pods-Runner.profile.xcconfig */, + DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */, + D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */, + FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A67056D7D61CD22438BA6931 /* Pods */, + 143267097A016AD19836D89A /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - A67056D7D61CD22438BA6931 /* Pods */ = { - isa = PBXGroup; - children = ( - C163001BCF100FD82C9FF66B /* Pods-Runner.debug.xcconfig */, - 180EAADEAF2FEB449BF22233 /* Pods-Runner.release.xcconfig */, - 7C109230F82ECE43F2B77DBE /* Pods-Runner.profile.xcconfig */, - 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */, - 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */, - 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 3E746E2C34E010C6DAB073C5 /* Pods_Runner.framework */, - 73B00D79A12A8E4F0CF71CFC /* Pods_RunnerTests.framework */, + 489A5055E59E3231F8D7DB33 /* Pods_Runner.framework */, + 5A6A0DEC5A81A004C76F746A /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */, + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */, + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */, + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -361,7 +361,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 3E23F1E64975BEFF094C56C2 /* [CP] Embed Pods Frameworks */ = { + 8E9B1FFD2C87F9F69DE6B63F /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -378,7 +378,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 5D396D6CB9A63D9FF1A24E65 /* [CP] Check Pods Manifest.lock */ = { + 90A5BDEC3DF6B574A91B6206 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,14 +393,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - B1A8743C19FA29141F6F0D0D /* [CP] Check Pods Manifest.lock */ = { + F5C9BD6152A5B447C3A69F71 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 03CC73B22898690FDAA94346 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = DB515354E358738200CDF7D0 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7CDFC68978C3FC117339791E /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = D076D4F8632A5BB85C35E869 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 91F123BD7AB7F3FEC6722867 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = FFD4344998AF5F671A21DA16 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/boring_to_beautiful/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/boring_to_beautiful/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index b9ba5fa149..888bfbb4c7 100644 --- a/boring_to_beautiful/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/boring_to_beautiful/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/boring_to_beautiful/step_07/pubspec.yaml b/boring_to_beautiful/step_07/pubspec.yaml index abe835e2e6..b02c951374 100644 --- a/boring_to_beautiful/step_07/pubspec.yaml +++ b/boring_to_beautiful/step_07/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,14 +13,14 @@ dependencies: adaptive_components: ^0.0.10 adaptive_navigation: ^0.0.10 animations: ^2.0.11 - collection: ^1.19.0 + collection: ^1.19.1 cupertino_icons: ^1.0.8 desktop_window: ^0.4.2 dynamic_color: ^1.7.0 english_words: ^4.0.0 flutter_bloc: ^9.0.0 freezed_annotation: ^2.4.4 - go_router: ^14.7.2 + go_router: ^14.8.0 material_color_utilities: any universal_platform: ^1.1.0 url_launcher: ^6.3.1 diff --git a/brick_breaker/codelab_rebuild.yaml b/brick_breaker/codelab_rebuild.yaml index a2e165e1b1..ceaa479bc7 100644 --- a/brick_breaker/codelab_rebuild.yaml +++ b/brick_breaker/codelab_rebuild.yaml @@ -22,7 +22,7 @@ steps: version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flame: ^1.18.0 @@ -128,31 +128,31 @@ steps: // found in the LICENSE file. import 'dart:async'; - + import 'package:flame/components.dart'; import 'package:flame/game.dart'; - + import 'components/components.dart'; import 'config.dart'; - + class BrickBreaker extends FlameGame { BrickBreaker() - : super( - camera: CameraComponent.withFixedResolution( - width: gameWidth, - height: gameHeight, - ), - ); - + : super( + camera: CameraComponent.withFixedResolution( + width: gameWidth, + height: gameHeight, + ), + ); + double get width => size.x; double get height => size.y; - + @override FutureOr onLoad() async { super.onLoad(); - + camera.viewfinder.anchor = Anchor.topLeft; - + world.add(PlayArea()); } } @@ -183,18 +183,15 @@ steps: // found in the LICENSE file. import 'dart:async'; - + import 'package:flame/components.dart'; import 'package:flutter/material.dart'; - + import '../brick_breaker.dart'; - + class PlayArea extends RectangleComponent with HasGameReference { - PlayArea() - : super( - paint: Paint()..color = const Color(0xfff2e8cf), - ); - + PlayArea() : super(paint: Paint()..color = const Color(0xfff2e8cf)); + @override FutureOr onLoad() async { super.onLoad(); @@ -226,24 +223,30 @@ steps: import 'package:flame/components.dart'; import 'package:flame/game.dart'; @@ -19,6 +20,7 @@ class BrickBreaker extends FlameGame { - ), - ); + ), + ); + final rand = math.Random(); double get width => size.x; double get height => size.y; - @@ -29,5 +31,14 @@ class BrickBreaker extends FlameGame { + @@ -29,5 +31,20 @@ class BrickBreaker extends FlameGame { camera.viewfinder.anchor = Anchor.topLeft; world.add(PlayArea()); + - + world.add(Ball( + + world.add( + + Ball( + radius: ballRadius, + position: size / 2, - + velocity: Vector2((rand.nextDouble() - 0.5) * width, height * 0.2) - + .normalized() - + ..scale(height / 4))); + + velocity: + + Vector2( + + (rand.nextDouble() - 0.5) * width, + + height * 0.2, + + ).normalized() + + ..scale(height / 4), + + ), + + ); + + debugMode = true; } @@ -275,7 +278,7 @@ steps: // Copyright 2023 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flame/components.dart'; import 'package:flutter/material.dart'; @@ -285,11 +288,13 @@ steps: required super.position, required double radius, }) : super( - radius: radius, - anchor: Anchor.center, - paint: Paint() - ..color = const Color(0xff1e6091) - ..style = PaintingStyle.fill); + radius: radius, + anchor: Anchor.center, + paint: + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill, + ); final Vector2 velocity; @@ -322,8 +327,8 @@ steps: -class BrickBreaker extends FlameGame { +class BrickBreaker extends FlameGame with HasCollisionDetection { BrickBreaker() - : super( - camera: CameraComponent.withFixedResolution( + : super( + camera: CameraComponent.withFixedResolution( - name: Patch lib/src/components/ball.dart path: brick_breaker/lib/src/components/ball.dart patch-u: | @@ -346,24 +351,24 @@ steps: Ball({ required this.velocity, required super.position, - @@ -15,7 +20,8 @@ class Ball extends CircleComponent { - anchor: Anchor.center, - paint: Paint() - ..color = const Color(0xff1e6091) - - ..style = PaintingStyle.fill); - + ..style = PaintingStyle.fill, - + children: [CircleHitbox()]); + @@ -17,6 +22,7 @@ class Ball extends CircleComponent { + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill, + + children: [CircleHitbox()], + ); final Vector2 velocity; - - @@ -24,4 +30,23 @@ class Ball extends CircleComponent { + @@ -26,4 +32,25 @@ class Ball extends CircleComponent { super.update(dt); position += velocity * dt; } + + @override + void onCollisionStart( - + Set intersectionPoints, PositionComponent other) { + + Set intersectionPoints, + + PositionComponent other, + + ) { + super.onCollisionStart(intersectionPoints, other); + if (other is PlayArea) { + if (intersectionPoints.first.y <= 0) { @@ -385,7 +390,7 @@ steps: patch-u: | --- b/brick_breaker/step_06/lib/src/components/play_area.dart +++ a/brick_breaker/step_06/lib/src/components/play_area.dart - @@ -4,6 +4,7 @@ + @@ -4,13 +4,18 @@ import 'dart:async'; @@ -393,14 +398,18 @@ steps: import 'package:flame/components.dart'; import 'package:flutter/material.dart'; - @@ -13,6 +14,7 @@ class PlayArea extends RectangleComponent with HasGameReference { - PlayArea() - : super( - paint: Paint()..color = const Color(0xfff2e8cf), - + children: [RectangleHitbox()], - ); + import '../brick_breaker.dart'; + + class PlayArea extends RectangleComponent with HasGameReference { + - PlayArea() : super(paint: Paint()..color = const Color(0xfff2e8cf)); + + PlayArea() + + : super( + + paint: Paint()..color = const Color(0xfff2e8cf), + + children: [RectangleHitbox()], + + ); @override + FutureOr onLoad() async { - name: Copy step_06 copydir: from: brick_breaker @@ -433,23 +442,28 @@ steps: +class BrickBreaker extends FlameGame + with HasCollisionDetection, KeyboardEvents { BrickBreaker() - : super( - camera: CameraComponent.withFixedResolution( - @@ -39,6 +43,24 @@ class BrickBreaker extends FlameGame with HasCollisionDetection { - .normalized() - ..scale(height / 4))); + : super( + camera: CameraComponent.withFixedResolution( + @@ -45,6 +49,29 @@ class BrickBreaker extends FlameGame with HasCollisionDetection { + ), + ); - + world.add(Bat( + + world.add( + + Bat( + size: Vector2(batWidth, batHeight), + cornerRadius: const Radius.circular(ballRadius / 2), - + position: Vector2(width / 2, height * 0.95))); + + position: Vector2(width / 2, height * 0.95), + + ), + + ); + debugMode = true; } + + @override + KeyEventResult onKeyEvent( - + KeyEvent event, Set keysPressed) { + + KeyEvent event, + + Set keysPressed, + + ) { + super.onKeyEvent(event, keysPressed); + switch (event.logicalKey) { + case LogicalKeyboardKey.arrowLeft: @@ -489,18 +503,17 @@ steps: import 'play_area.dart'; class Ball extends CircleComponent - @@ -43,8 +45,14 @@ class Ball extends CircleComponent + @@ -47,8 +49,13 @@ class Ball extends CircleComponent } else if (intersectionPoints.first.x >= game.width) { velocity.x = -velocity.x; } else if (intersectionPoints.first.y >= game.height) { - removeFromParent(); - + add(RemoveEffect( - + delay: 0.35, - + )); + + add(RemoveEffect(delay: 0.35)); } + } else if (other is Bat) { + velocity.y = -velocity.y; - + velocity.x = velocity.x + + + velocity.x = + + velocity.x + + (position.x - other.position.x) / other.size.x * game.width * 0.3; } else { debugPrint('collision with $other'); @@ -528,48 +541,46 @@ steps: import 'package:flame/effects.dart'; import 'package:flame/events.dart'; import 'package:flutter/material.dart'; - + import '../brick_breaker.dart'; - + class Bat extends PositionComponent with DragCallbacks, HasGameReference { Bat({ required this.cornerRadius, required super.position, required super.size, - }) : super( - anchor: Anchor.center, - children: [RectangleHitbox()], - ); - + }) : super(anchor: Anchor.center, children: [RectangleHitbox()]); + final Radius cornerRadius; - - final _paint = Paint() - ..color = const Color(0xff1e6091) - ..style = PaintingStyle.fill; - + + final _paint = + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill; + @override void render(Canvas canvas) { super.render(canvas); canvas.drawRRect( - RRect.fromRectAndRadius( - Offset.zero & size.toSize(), - cornerRadius, - ), - _paint); + RRect.fromRectAndRadius(Offset.zero & size.toSize(), cornerRadius), + _paint, + ); } - + @override void onDragUpdate(DragUpdateEvent event) { super.onDragUpdate(event); position.x = (position.x + event.localDelta.x).clamp(0, game.width); } - + void moveBy(double dx) { - add(MoveToEffect( - Vector2((position.x + dx).clamp(0, game.width), position.y), - EffectController(duration: 0.1), - )); + add( + MoveToEffect( + Vector2((position.x + dx).clamp(0, game.width), position.y), + EffectController(duration: 0.1), + ), + ); } } - name: Copy step_07 @@ -588,17 +599,17 @@ steps: patch-u: | --- b/brick_breaker/step_08/lib/src/brick_breaker.dart +++ a/brick_breaker/step_08/lib/src/brick_breaker.dart - @@ -37,6 +37,7 @@ class BrickBreaker extends FlameGame - world.add(PlayArea()); + @@ -38,6 +38,7 @@ class BrickBreaker extends FlameGame - world.add(Ball( + world.add( + Ball( + difficultyModifier: difficultyModifier, radius: ballRadius, position: size / 2, - velocity: Vector2((rand.nextDouble() - 0.5) * width, height * 0.2) - @@ -48,6 +49,18 @@ class BrickBreaker extends FlameGame - cornerRadius: const Radius.circular(ballRadius / 2), - position: Vector2(width / 2, height * 0.95))); + velocity: + @@ -57,6 +58,18 @@ class BrickBreaker extends FlameGame + ), + ); + await world.addAll([ + for (var i = 0; i < brickColors.length; i++) @@ -668,19 +679,19 @@ steps: required double radius, + required this.difficultyModifier, }) : super( - radius: radius, - anchor: Anchor.center, - @@ -26,6 +28,7 @@ class Ball extends CircleComponent - children: [CircleHitbox()]); + radius: radius, + anchor: Anchor.center, + @@ -28,6 +30,7 @@ class Ball extends CircleComponent + ); final Vector2 velocity; + final double difficultyModifier; @override void update(double dt) { - @@ -53,8 +56,17 @@ class Ball extends CircleComponent - velocity.y = -velocity.y; - velocity.x = velocity.x + + @@ -56,8 +59,17 @@ class Ball extends CircleComponent + velocity.x = + velocity.x + (position.x - other.position.x) / other.size.x * game.width * 0.3; - } else { - debugPrint('collision with $other'); @@ -715,7 +726,7 @@ steps: // Copyright 2023 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flame/collisions.dart'; import 'package:flame/components.dart'; import 'package:flutter/material.dart'; @@ -728,18 +739,21 @@ steps: class Brick extends RectangleComponent with CollisionCallbacks, HasGameReference { Brick({required super.position, required Color color}) - : super( - size: Vector2(brickWidth, brickHeight), - anchor: Anchor.center, - paint: Paint() - ..color = color - ..style = PaintingStyle.fill, - children: [RectangleHitbox()], - ); + : super( + size: Vector2(brickWidth, brickHeight), + anchor: Anchor.center, + paint: + Paint() + ..color = color + ..style = PaintingStyle.fill, + children: [RectangleHitbox()], + ); @override void onCollisionStart( - Set intersectionPoints, PositionComponent other) { + Set intersectionPoints, + PositionComponent other, + ) { super.onCollisionStart(intersectionPoints, other); removeFromParent(); @@ -795,8 +809,8 @@ steps: - with HasCollisionDetection, KeyboardEvents { + with HasCollisionDetection, KeyboardEvents, TapDetector { BrickBreaker() - : super( - camera: CameraComponent.withFixedResolution( + : super( + camera: CameraComponent.withFixedResolution( @@ -28,6 +30,22 @@ class BrickBreaker extends FlameGame double get width => size.x; double get height => size.y; @@ -836,19 +850,19 @@ steps: + + playState = PlayState.playing; + - world.add(Ball( + world.add( + Ball( difficultyModifier: difficultyModifier, - radius: ballRadius, - @@ -49,7 +79,7 @@ class BrickBreaker extends FlameGame - cornerRadius: const Radius.circular(ballRadius / 2), - position: Vector2(width / 2, height * 0.95))); + @@ -58,7 +88,7 @@ class BrickBreaker extends FlameGame + ), + ); - await world.addAll([ + world.addAll([ for (var i = 0; i < brickColors.length; i++) for (var j = 1; j <= 5; j++) Brick( - @@ -60,8 +90,12 @@ class BrickBreaker extends FlameGame + @@ -69,8 +99,12 @@ class BrickBreaker extends FlameGame color: brickColors[i], ), ]); @@ -862,7 +876,7 @@ steps: } @override - @@ -73,7 +107,13 @@ class BrickBreaker extends FlameGame + @@ -84,7 +118,13 @@ class BrickBreaker extends FlameGame world.children.query().first.moveBy(-batStep); case LogicalKeyboardKey.arrowRight: world.children.query().first.moveBy(batStep); @@ -881,16 +895,19 @@ steps: patch-u: | --- b/brick_breaker/step_09/lib/src/components/ball.dart +++ a/brick_breaker/step_09/lib/src/components/ball.dart - @@ -49,8 +49,10 @@ class Ball extends CircleComponent + @@ -52,7 +52,14 @@ class Ball extends CircleComponent + } else if (intersectionPoints.first.x >= game.width) { velocity.x = -velocity.x; } else if (intersectionPoints.first.y >= game.height) { - add(RemoveEffect( - - delay: 0.35, - - )); + - add(RemoveEffect(delay: 0.35)); + + add( + + RemoveEffect( + delay: 0.35, + onComplete: () { + game.playState = PlayState.gameOver; - + })); + + }, + + ), + + ); } } else if (other is Bat) { velocity.y = -velocity.y; @@ -899,7 +916,7 @@ steps: patch-u: | --- b/brick_breaker/step_09/lib/src/components/brick.dart +++ a/brick_breaker/step_09/lib/src/components/brick.dart - @@ -30,6 +30,7 @@ class Brick extends RectangleComponent + @@ -33,6 +33,7 @@ class Brick extends RectangleComponent removeFromParent(); if (game.world.children.query().length == 1) { @@ -919,13 +936,13 @@ steps: import 'package:flame/game.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; - + import '../brick_breaker.dart'; import '../config.dart'; - + class GameApp extends StatelessWidget { const GameApp({super.key}); - + @override Widget build(BuildContext context) { return MaterialApp( @@ -942,10 +959,7 @@ steps: gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, - colors: [ - Color(0xffa9d6e5), - Color(0xfff2e8cf), - ], + colors: [Color(0xffa9d6e5), Color(0xfff2e8cf)], ), ), child: SafeArea( @@ -959,21 +973,24 @@ steps: child: GameWidget.controlled( gameFactory: BrickBreaker.new, overlayBuilderMap: { - PlayState.welcome.name: (context, game) => Center( + PlayState.welcome.name: + (context, game) => Center( child: Text( 'TAP TO PLAY', style: Theme.of(context).textTheme.headlineLarge, ), ), - PlayState.gameOver.name: (context, game) => Center( + PlayState.gameOver.name: + (context, game) => Center( child: Text( 'G A M E O V E R', style: Theme.of(context).textTheme.headlineLarge, ), ), - PlayState.won.name: (context, game) => Center( + PlayState.won.name: + (context, game) => Center( child: Text( 'Y O U W O N ! ! !', style: @@ -1046,8 +1063,8 @@ steps: --- b/brick_breaker/step_10/lib/src/brick_breaker.dart +++ a/brick_breaker/step_10/lib/src/brick_breaker.dart @@ -26,6 +26,7 @@ class BrickBreaker extends FlameGame - ), - ); + ), + ); + final ValueNotifier score = ValueNotifier(0); final rand = math.Random(); @@ -1059,15 +1076,15 @@ steps: playState = PlayState.playing; + score.value = 0; - world.add(Ball( - difficultyModifier: difficultyModifier, + world.add( + Ball( - name: Patch lib/src/components/brick.dart path: brick_breaker/lib/src/components/brick.dart patch-u: | --- b/brick_breaker/step_10/lib/src/components/brick.dart +++ a/brick_breaker/step_10/lib/src/components/brick.dart - @@ -28,6 +28,7 @@ class Brick extends RectangleComponent - Set intersectionPoints, PositionComponent other) { + @@ -31,6 +31,7 @@ class Brick extends RectangleComponent + ) { super.onCollisionStart(intersectionPoints, other); removeFromParent(); + game.score.value++; @@ -1106,7 +1123,7 @@ steps: @override Widget build(BuildContext context) { return MaterialApp( - @@ -38,37 +53,38 @@ class GameApp extends StatelessWidget { + @@ -35,40 +50,38 @@ class GameApp extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(16), child: Center( @@ -1117,21 +1134,24 @@ steps: - child: GameWidget.controlled( - gameFactory: BrickBreaker.new, - overlayBuilderMap: { - - PlayState.welcome.name: (context, game) => Center( + - PlayState.welcome.name: + - (context, game) => Center( - child: Text( - 'TAP TO PLAY', - style: - Theme.of(context).textTheme.headlineLarge, - ), - ), - - PlayState.gameOver.name: (context, game) => Center( + - PlayState.gameOver.name: + - (context, game) => Center( - child: Text( - 'G A M E O V E R', - style: - Theme.of(context).textTheme.headlineLarge, - ), - ), - - PlayState.won.name: (context, game) => Center( + - PlayState.won.name: + - (context, game) => Center( - child: Text( - 'Y O U W O N ! ! !', - style: @@ -1150,18 +1170,18 @@ steps: + child: GameWidget( + game: game, + overlayBuilderMap: { - + PlayState.welcome.name: (context, game) => - + const OverlayScreen( + + PlayState.welcome.name: + + (context, game) => const OverlayScreen( + title: 'TAP TO PLAY', + subtitle: 'Use arrow keys or swipe', + ), - + PlayState.gameOver.name: (context, game) => - + const OverlayScreen( + + PlayState.gameOver.name: + + (context, game) => const OverlayScreen( + title: 'G A M E O V E R', + subtitle: 'Tap to Play Again', + ), - + PlayState.won.name: (context, game) => - + const OverlayScreen( + + PlayState.won.name: + + (context, game) => const OverlayScreen( + title: 'Y O U W O N ! ! !', + subtitle: 'Tap to Play Again', + ), @@ -1184,17 +1204,13 @@ steps: import 'package:flutter/material.dart'; import 'package:flutter_animate/flutter_animate.dart'; - + class OverlayScreen extends StatelessWidget { - const OverlayScreen({ - super.key, - required this.title, - required this.subtitle, - }); - + const OverlayScreen({super.key, required this.title, required this.subtitle}); + final String title; final String subtitle; - + @override Widget build(BuildContext context) { return Container( @@ -1207,10 +1223,7 @@ steps: style: Theme.of(context).textTheme.headlineLarge, ).animate().slideY(duration: 750.ms, begin: -3, end: 0), const SizedBox(height: 16), - Text( - subtitle, - style: Theme.of(context).textTheme.headlineSmall, - ) + Text(subtitle, style: Theme.of(context).textTheme.headlineSmall) .animate(onPlay: (controller) => controller.repeat()) .fadeIn(duration: 1.seconds) .then() @@ -1228,15 +1241,12 @@ steps: // found in the LICENSE file. import 'package:flutter/material.dart'; - + class ScoreCard extends StatelessWidget { - const ScoreCard({ - super.key, - required this.score, - }); - + const ScoreCard({super.key, required this.score}); + final ValueNotifier score; - + @override Widget build(BuildContext context) { return ValueListenableBuilder( diff --git a/brick_breaker/step_03/android/.gitignore b/brick_breaker/step_03/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/brick_breaker/step_03/android/.gitignore +++ b/brick_breaker/step_03/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/brick_breaker/step_03/android/app/build.gradle b/brick_breaker/step_03/android/app/build.gradle deleted file mode 100644 index e40a92adc6..0000000000 --- a/brick_breaker/step_03/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.brick_breaker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.brick_breaker" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/brick_breaker/step_03/android/app/build.gradle.kts b/brick_breaker/step_03/android/app/build.gradle.kts new file mode 100644 index 0000000000..7e9af99b0c --- /dev/null +++ b/brick_breaker/step_03/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.brick_breaker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.brick_breaker" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/brick_breaker/step_03/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt b/brick_breaker/step_03/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt index 7f4414ee4a..74a09e998d 100644 --- a/brick_breaker/step_03/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt +++ b/brick_breaker/step_03/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.brick_breaker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/brick_breaker/step_03/android/build.gradle b/brick_breaker/step_03/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/brick_breaker/step_03/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/brick_breaker/step_03/android/build.gradle.kts b/brick_breaker/step_03/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/brick_breaker/step_03/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/brick_breaker/step_03/android/gradle.properties b/brick_breaker/step_03/android/gradle.properties index 2597170821..f018a61817 100644 --- a/brick_breaker/step_03/android/gradle.properties +++ b/brick_breaker/step_03/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/brick_breaker/step_03/android/gradle/wrapper/gradle-wrapper.properties b/brick_breaker/step_03/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/brick_breaker/step_03/android/gradle/wrapper/gradle-wrapper.properties +++ b/brick_breaker/step_03/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/brick_breaker/step_03/android/settings.gradle b/brick_breaker/step_03/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/brick_breaker/step_03/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/brick_breaker/step_03/android/settings.gradle.kts b/brick_breaker/step_03/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/brick_breaker/step_03/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/brick_breaker/step_03/ios/Podfile b/brick_breaker/step_03/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/brick_breaker/step_03/ios/Podfile +++ b/brick_breaker/step_03/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_03/ios/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_03/ios/Runner.xcodeproj/project.pbxproj index 2c8eb0d1ee..22d628f8d2 100644 --- a/brick_breaker/step_03/ios/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_03/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */; }; - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,18 +42,19 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -62,17 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 57F2B001C6B8537EED910C2C /* Frameworks */ = { + 66D6895CCE5335A18DDF778C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */, + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,25 +80,20 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */, + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2C2660F80BF13E0A2BBD65B2 /* Pods */ = { + 01B380CF0810E6F09E7E5BF5 /* Frameworks */ = { isa = PBXGroup; children = ( - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */, - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */, - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */, - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */, - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */, - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */, + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */, + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */, ); - name = Pods; - path = Pods; + name = Frameworks; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -109,15 +104,6 @@ path = RunnerTests; sourceTree = ""; }; - 5F1D389A7374ECFA4223DC84 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */, - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -136,8 +122,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 2C2660F80BF13E0A2BBD65B2 /* Pods */, - 5F1D389A7374ECFA4223DC84 /* Frameworks */, + 9F241F0D05D8D7289BFC5B2A /* Pods */, + 01B380CF0810E6F09E7E5BF5 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +151,20 @@ path = Runner; sourceTree = ""; }; + 9F241F0D05D8D7289BFC5B2A /* Pods */ = { + isa = PBXGroup; + children = ( + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */, + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */, + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */, + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */, + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */, + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */, + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 57F2B001C6B8537EED910C2C /* Frameworks */, + 66D6895CCE5335A18DDF778C /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */, + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */, + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */ = { + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,14 +285,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */ = { + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +325,42 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/brick_breaker/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/brick_breaker/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_03/macos/Podfile b/brick_breaker/step_03/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/brick_breaker/step_03/macos/Podfile +++ b/brick_breaker/step_03/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_03/macos/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_03/macos/Runner.xcodeproj/project.pbxproj index 40114f2ccc..842f876fb0 100644 --- a/brick_breaker/step_03/macos/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_03/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32125D87D9AB716E4032EAC /* Pods_Runner.framework */; }; + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */; }; + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */, + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */, + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 5BF2D3DD257D8F196721A865 /* Pods */, + 34AF9719A2D3204F77BC17D5 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 5BF2D3DD257D8F196721A865 /* Pods */ = { + 34AF9719A2D3204F77BC17D5 /* Pods */ = { isa = PBXGroup; children = ( - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */, - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */, - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */, - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */, - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */, - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */, + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */, + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */, + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */, + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */, + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */, + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */, - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */, + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */, + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */, + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */, + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */, + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,29 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */ = { + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -367,7 +345,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */ = { + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -422,6 +400,28 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/brick_breaker/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7d5c483de3..bbc7e1a860 100644 --- a/brick_breaker/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_03/pubspec.yaml b/brick_breaker/step_03/pubspec.yaml index 2ca72ae8ec..5887daad08 100644 --- a/brick_breaker/step_03/pubspec.yaml +++ b/brick_breaker/step_03/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flame: ^1.18.0 diff --git a/brick_breaker/step_04/android/.gitignore b/brick_breaker/step_04/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/brick_breaker/step_04/android/.gitignore +++ b/brick_breaker/step_04/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/brick_breaker/step_04/android/app/build.gradle b/brick_breaker/step_04/android/app/build.gradle deleted file mode 100644 index e40a92adc6..0000000000 --- a/brick_breaker/step_04/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.brick_breaker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.brick_breaker" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/brick_breaker/step_04/android/app/build.gradle.kts b/brick_breaker/step_04/android/app/build.gradle.kts new file mode 100644 index 0000000000..7e9af99b0c --- /dev/null +++ b/brick_breaker/step_04/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.brick_breaker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.brick_breaker" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/brick_breaker/step_04/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt b/brick_breaker/step_04/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt index 7f4414ee4a..74a09e998d 100644 --- a/brick_breaker/step_04/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt +++ b/brick_breaker/step_04/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.brick_breaker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/brick_breaker/step_04/android/build.gradle b/brick_breaker/step_04/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/brick_breaker/step_04/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/brick_breaker/step_04/android/build.gradle.kts b/brick_breaker/step_04/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/brick_breaker/step_04/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/brick_breaker/step_04/android/gradle.properties b/brick_breaker/step_04/android/gradle.properties index 2597170821..f018a61817 100644 --- a/brick_breaker/step_04/android/gradle.properties +++ b/brick_breaker/step_04/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/brick_breaker/step_04/android/gradle/wrapper/gradle-wrapper.properties b/brick_breaker/step_04/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/brick_breaker/step_04/android/gradle/wrapper/gradle-wrapper.properties +++ b/brick_breaker/step_04/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/brick_breaker/step_04/android/settings.gradle b/brick_breaker/step_04/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/brick_breaker/step_04/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/brick_breaker/step_04/android/settings.gradle.kts b/brick_breaker/step_04/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/brick_breaker/step_04/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/brick_breaker/step_04/ios/Podfile b/brick_breaker/step_04/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/brick_breaker/step_04/ios/Podfile +++ b/brick_breaker/step_04/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_04/ios/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_04/ios/Runner.xcodeproj/project.pbxproj index 2c8eb0d1ee..22d628f8d2 100644 --- a/brick_breaker/step_04/ios/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_04/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */; }; - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,18 +42,19 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -62,17 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 57F2B001C6B8537EED910C2C /* Frameworks */ = { + 66D6895CCE5335A18DDF778C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */, + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,25 +80,20 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */, + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2C2660F80BF13E0A2BBD65B2 /* Pods */ = { + 01B380CF0810E6F09E7E5BF5 /* Frameworks */ = { isa = PBXGroup; children = ( - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */, - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */, - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */, - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */, - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */, - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */, + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */, + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */, ); - name = Pods; - path = Pods; + name = Frameworks; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -109,15 +104,6 @@ path = RunnerTests; sourceTree = ""; }; - 5F1D389A7374ECFA4223DC84 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */, - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -136,8 +122,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 2C2660F80BF13E0A2BBD65B2 /* Pods */, - 5F1D389A7374ECFA4223DC84 /* Frameworks */, + 9F241F0D05D8D7289BFC5B2A /* Pods */, + 01B380CF0810E6F09E7E5BF5 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +151,20 @@ path = Runner; sourceTree = ""; }; + 9F241F0D05D8D7289BFC5B2A /* Pods */ = { + isa = PBXGroup; + children = ( + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */, + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */, + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */, + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */, + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */, + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */, + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 57F2B001C6B8537EED910C2C /* Frameworks */, + 66D6895CCE5335A18DDF778C /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */, + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */, + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */ = { + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,14 +285,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */ = { + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +325,42 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/brick_breaker/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/brick_breaker/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_04/lib/src/brick_breaker.dart b/brick_breaker/step_04/lib/src/brick_breaker.dart index 0bf8c9a69c..7cba5da5f9 100644 --- a/brick_breaker/step_04/lib/src/brick_breaker.dart +++ b/brick_breaker/step_04/lib/src/brick_breaker.dart @@ -12,12 +12,12 @@ import 'config.dart'; class BrickBreaker extends FlameGame { BrickBreaker() - : super( - camera: CameraComponent.withFixedResolution( - width: gameWidth, - height: gameHeight, - ), - ); + : super( + camera: CameraComponent.withFixedResolution( + width: gameWidth, + height: gameHeight, + ), + ); double get width => size.x; double get height => size.y; diff --git a/brick_breaker/step_04/lib/src/components/play_area.dart b/brick_breaker/step_04/lib/src/components/play_area.dart index 588f734bb9..100886fb63 100644 --- a/brick_breaker/step_04/lib/src/components/play_area.dart +++ b/brick_breaker/step_04/lib/src/components/play_area.dart @@ -10,10 +10,7 @@ import 'package:flutter/material.dart'; import '../brick_breaker.dart'; class PlayArea extends RectangleComponent with HasGameReference { - PlayArea() - : super( - paint: Paint()..color = const Color(0xfff2e8cf), - ); + PlayArea() : super(paint: Paint()..color = const Color(0xfff2e8cf)); @override FutureOr onLoad() async { diff --git a/brick_breaker/step_04/macos/Podfile b/brick_breaker/step_04/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/brick_breaker/step_04/macos/Podfile +++ b/brick_breaker/step_04/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_04/macos/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_04/macos/Runner.xcodeproj/project.pbxproj index 40114f2ccc..842f876fb0 100644 --- a/brick_breaker/step_04/macos/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_04/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32125D87D9AB716E4032EAC /* Pods_Runner.framework */; }; + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */; }; + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */, + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */, + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 5BF2D3DD257D8F196721A865 /* Pods */, + 34AF9719A2D3204F77BC17D5 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 5BF2D3DD257D8F196721A865 /* Pods */ = { + 34AF9719A2D3204F77BC17D5 /* Pods */ = { isa = PBXGroup; children = ( - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */, - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */, - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */, - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */, - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */, - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */, + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */, + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */, + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */, + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */, + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */, + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */, - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */, + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */, + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */, + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */, + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */, + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,29 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */ = { + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -367,7 +345,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */ = { + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -422,6 +400,28 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/brick_breaker/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7d5c483de3..bbc7e1a860 100644 --- a/brick_breaker/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_04/pubspec.yaml b/brick_breaker/step_04/pubspec.yaml index 2ca72ae8ec..5887daad08 100644 --- a/brick_breaker/step_04/pubspec.yaml +++ b/brick_breaker/step_04/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flame: ^1.18.0 diff --git a/brick_breaker/step_05/android/.gitignore b/brick_breaker/step_05/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/brick_breaker/step_05/android/.gitignore +++ b/brick_breaker/step_05/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/brick_breaker/step_05/android/app/build.gradle b/brick_breaker/step_05/android/app/build.gradle deleted file mode 100644 index e40a92adc6..0000000000 --- a/brick_breaker/step_05/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.brick_breaker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.brick_breaker" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/brick_breaker/step_05/android/app/build.gradle.kts b/brick_breaker/step_05/android/app/build.gradle.kts new file mode 100644 index 0000000000..7e9af99b0c --- /dev/null +++ b/brick_breaker/step_05/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.brick_breaker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.brick_breaker" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/brick_breaker/step_05/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt b/brick_breaker/step_05/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt index 7f4414ee4a..74a09e998d 100644 --- a/brick_breaker/step_05/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt +++ b/brick_breaker/step_05/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.brick_breaker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/brick_breaker/step_05/android/build.gradle b/brick_breaker/step_05/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/brick_breaker/step_05/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/brick_breaker/step_05/android/build.gradle.kts b/brick_breaker/step_05/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/brick_breaker/step_05/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/brick_breaker/step_05/android/gradle.properties b/brick_breaker/step_05/android/gradle.properties index 2597170821..f018a61817 100644 --- a/brick_breaker/step_05/android/gradle.properties +++ b/brick_breaker/step_05/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/brick_breaker/step_05/android/gradle/wrapper/gradle-wrapper.properties b/brick_breaker/step_05/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/brick_breaker/step_05/android/gradle/wrapper/gradle-wrapper.properties +++ b/brick_breaker/step_05/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/brick_breaker/step_05/android/settings.gradle b/brick_breaker/step_05/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/brick_breaker/step_05/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/brick_breaker/step_05/android/settings.gradle.kts b/brick_breaker/step_05/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/brick_breaker/step_05/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/brick_breaker/step_05/ios/Podfile b/brick_breaker/step_05/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/brick_breaker/step_05/ios/Podfile +++ b/brick_breaker/step_05/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_05/ios/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_05/ios/Runner.xcodeproj/project.pbxproj index 2c8eb0d1ee..22d628f8d2 100644 --- a/brick_breaker/step_05/ios/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_05/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */; }; - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,18 +42,19 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -62,17 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 57F2B001C6B8537EED910C2C /* Frameworks */ = { + 66D6895CCE5335A18DDF778C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */, + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,25 +80,20 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */, + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2C2660F80BF13E0A2BBD65B2 /* Pods */ = { + 01B380CF0810E6F09E7E5BF5 /* Frameworks */ = { isa = PBXGroup; children = ( - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */, - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */, - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */, - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */, - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */, - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */, + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */, + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */, ); - name = Pods; - path = Pods; + name = Frameworks; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -109,15 +104,6 @@ path = RunnerTests; sourceTree = ""; }; - 5F1D389A7374ECFA4223DC84 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */, - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -136,8 +122,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 2C2660F80BF13E0A2BBD65B2 /* Pods */, - 5F1D389A7374ECFA4223DC84 /* Frameworks */, + 9F241F0D05D8D7289BFC5B2A /* Pods */, + 01B380CF0810E6F09E7E5BF5 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +151,20 @@ path = Runner; sourceTree = ""; }; + 9F241F0D05D8D7289BFC5B2A /* Pods */ = { + isa = PBXGroup; + children = ( + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */, + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */, + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */, + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */, + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */, + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */, + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 57F2B001C6B8537EED910C2C /* Frameworks */, + 66D6895CCE5335A18DDF778C /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */, + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */, + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */ = { + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,14 +285,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */ = { + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +325,42 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/brick_breaker/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/brick_breaker/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_05/lib/src/brick_breaker.dart b/brick_breaker/step_05/lib/src/brick_breaker.dart index 088af89366..262aeb8d00 100644 --- a/brick_breaker/step_05/lib/src/brick_breaker.dart +++ b/brick_breaker/step_05/lib/src/brick_breaker.dart @@ -13,12 +13,12 @@ import 'config.dart'; class BrickBreaker extends FlameGame { BrickBreaker() - : super( - camera: CameraComponent.withFixedResolution( - width: gameWidth, - height: gameHeight, - ), - ); + : super( + camera: CameraComponent.withFixedResolution( + width: gameWidth, + height: gameHeight, + ), + ); final rand = math.Random(); double get width => size.x; @@ -32,12 +32,18 @@ class BrickBreaker extends FlameGame { world.add(PlayArea()); - world.add(Ball( + world.add( + Ball( radius: ballRadius, position: size / 2, - velocity: Vector2((rand.nextDouble() - 0.5) * width, height * 0.2) - .normalized() - ..scale(height / 4))); + velocity: + Vector2( + (rand.nextDouble() - 0.5) * width, + height * 0.2, + ).normalized() + ..scale(height / 4), + ), + ); debugMode = true; } diff --git a/brick_breaker/step_05/lib/src/components/ball.dart b/brick_breaker/step_05/lib/src/components/ball.dart index e226d9482d..16048749d9 100644 --- a/brick_breaker/step_05/lib/src/components/ball.dart +++ b/brick_breaker/step_05/lib/src/components/ball.dart @@ -11,11 +11,13 @@ class Ball extends CircleComponent { required super.position, required double radius, }) : super( - radius: radius, - anchor: Anchor.center, - paint: Paint() - ..color = const Color(0xff1e6091) - ..style = PaintingStyle.fill); + radius: radius, + anchor: Anchor.center, + paint: + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill, + ); final Vector2 velocity; diff --git a/brick_breaker/step_05/lib/src/components/play_area.dart b/brick_breaker/step_05/lib/src/components/play_area.dart index 588f734bb9..100886fb63 100644 --- a/brick_breaker/step_05/lib/src/components/play_area.dart +++ b/brick_breaker/step_05/lib/src/components/play_area.dart @@ -10,10 +10,7 @@ import 'package:flutter/material.dart'; import '../brick_breaker.dart'; class PlayArea extends RectangleComponent with HasGameReference { - PlayArea() - : super( - paint: Paint()..color = const Color(0xfff2e8cf), - ); + PlayArea() : super(paint: Paint()..color = const Color(0xfff2e8cf)); @override FutureOr onLoad() async { diff --git a/brick_breaker/step_05/macos/Podfile b/brick_breaker/step_05/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/brick_breaker/step_05/macos/Podfile +++ b/brick_breaker/step_05/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_05/macos/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_05/macos/Runner.xcodeproj/project.pbxproj index 40114f2ccc..842f876fb0 100644 --- a/brick_breaker/step_05/macos/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_05/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32125D87D9AB716E4032EAC /* Pods_Runner.framework */; }; + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */; }; + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */, + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */, + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 5BF2D3DD257D8F196721A865 /* Pods */, + 34AF9719A2D3204F77BC17D5 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 5BF2D3DD257D8F196721A865 /* Pods */ = { + 34AF9719A2D3204F77BC17D5 /* Pods */ = { isa = PBXGroup; children = ( - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */, - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */, - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */, - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */, - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */, - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */, + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */, + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */, + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */, + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */, + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */, + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */, - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */, + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */, + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */, + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */, + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */, + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,29 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */ = { + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -367,7 +345,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */ = { + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -422,6 +400,28 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/brick_breaker/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7d5c483de3..bbc7e1a860 100644 --- a/brick_breaker/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_05/pubspec.yaml b/brick_breaker/step_05/pubspec.yaml index 2ca72ae8ec..5887daad08 100644 --- a/brick_breaker/step_05/pubspec.yaml +++ b/brick_breaker/step_05/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flame: ^1.18.0 diff --git a/brick_breaker/step_06/android/.gitignore b/brick_breaker/step_06/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/brick_breaker/step_06/android/.gitignore +++ b/brick_breaker/step_06/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/brick_breaker/step_06/android/app/build.gradle b/brick_breaker/step_06/android/app/build.gradle deleted file mode 100644 index e40a92adc6..0000000000 --- a/brick_breaker/step_06/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.brick_breaker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.brick_breaker" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/brick_breaker/step_06/android/app/build.gradle.kts b/brick_breaker/step_06/android/app/build.gradle.kts new file mode 100644 index 0000000000..7e9af99b0c --- /dev/null +++ b/brick_breaker/step_06/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.brick_breaker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.brick_breaker" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/brick_breaker/step_06/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt b/brick_breaker/step_06/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt index 7f4414ee4a..74a09e998d 100644 --- a/brick_breaker/step_06/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt +++ b/brick_breaker/step_06/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.brick_breaker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/brick_breaker/step_06/android/build.gradle b/brick_breaker/step_06/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/brick_breaker/step_06/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/brick_breaker/step_06/android/build.gradle.kts b/brick_breaker/step_06/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/brick_breaker/step_06/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/brick_breaker/step_06/android/gradle.properties b/brick_breaker/step_06/android/gradle.properties index 2597170821..f018a61817 100644 --- a/brick_breaker/step_06/android/gradle.properties +++ b/brick_breaker/step_06/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/brick_breaker/step_06/android/gradle/wrapper/gradle-wrapper.properties b/brick_breaker/step_06/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/brick_breaker/step_06/android/gradle/wrapper/gradle-wrapper.properties +++ b/brick_breaker/step_06/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/brick_breaker/step_06/android/settings.gradle b/brick_breaker/step_06/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/brick_breaker/step_06/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/brick_breaker/step_06/android/settings.gradle.kts b/brick_breaker/step_06/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/brick_breaker/step_06/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/brick_breaker/step_06/ios/Podfile b/brick_breaker/step_06/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/brick_breaker/step_06/ios/Podfile +++ b/brick_breaker/step_06/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_06/ios/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_06/ios/Runner.xcodeproj/project.pbxproj index 2c8eb0d1ee..22d628f8d2 100644 --- a/brick_breaker/step_06/ios/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_06/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */; }; - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,18 +42,19 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -62,17 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 57F2B001C6B8537EED910C2C /* Frameworks */ = { + 66D6895CCE5335A18DDF778C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */, + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,25 +80,20 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */, + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2C2660F80BF13E0A2BBD65B2 /* Pods */ = { + 01B380CF0810E6F09E7E5BF5 /* Frameworks */ = { isa = PBXGroup; children = ( - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */, - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */, - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */, - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */, - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */, - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */, + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */, + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */, ); - name = Pods; - path = Pods; + name = Frameworks; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -109,15 +104,6 @@ path = RunnerTests; sourceTree = ""; }; - 5F1D389A7374ECFA4223DC84 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */, - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -136,8 +122,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 2C2660F80BF13E0A2BBD65B2 /* Pods */, - 5F1D389A7374ECFA4223DC84 /* Frameworks */, + 9F241F0D05D8D7289BFC5B2A /* Pods */, + 01B380CF0810E6F09E7E5BF5 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +151,20 @@ path = Runner; sourceTree = ""; }; + 9F241F0D05D8D7289BFC5B2A /* Pods */ = { + isa = PBXGroup; + children = ( + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */, + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */, + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */, + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */, + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */, + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */, + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 57F2B001C6B8537EED910C2C /* Frameworks */, + 66D6895CCE5335A18DDF778C /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */, + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */, + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */ = { + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,14 +285,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */ = { + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +325,42 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/brick_breaker/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/brick_breaker/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_06/lib/src/brick_breaker.dart b/brick_breaker/step_06/lib/src/brick_breaker.dart index 0f3ceea39d..a2284c17a0 100644 --- a/brick_breaker/step_06/lib/src/brick_breaker.dart +++ b/brick_breaker/step_06/lib/src/brick_breaker.dart @@ -13,12 +13,12 @@ import 'config.dart'; class BrickBreaker extends FlameGame with HasCollisionDetection { BrickBreaker() - : super( - camera: CameraComponent.withFixedResolution( - width: gameWidth, - height: gameHeight, - ), - ); + : super( + camera: CameraComponent.withFixedResolution( + width: gameWidth, + height: gameHeight, + ), + ); final rand = math.Random(); double get width => size.x; @@ -32,12 +32,18 @@ class BrickBreaker extends FlameGame with HasCollisionDetection { world.add(PlayArea()); - world.add(Ball( + world.add( + Ball( radius: ballRadius, position: size / 2, - velocity: Vector2((rand.nextDouble() - 0.5) * width, height * 0.2) - .normalized() - ..scale(height / 4))); + velocity: + Vector2( + (rand.nextDouble() - 0.5) * width, + height * 0.2, + ).normalized() + ..scale(height / 4), + ), + ); debugMode = true; } diff --git a/brick_breaker/step_06/lib/src/components/ball.dart b/brick_breaker/step_06/lib/src/components/ball.dart index 95176a17be..22b4350eb4 100644 --- a/brick_breaker/step_06/lib/src/components/ball.dart +++ b/brick_breaker/step_06/lib/src/components/ball.dart @@ -16,12 +16,14 @@ class Ball extends CircleComponent required super.position, required double radius, }) : super( - radius: radius, - anchor: Anchor.center, - paint: Paint() - ..color = const Color(0xff1e6091) - ..style = PaintingStyle.fill, - children: [CircleHitbox()]); + radius: radius, + anchor: Anchor.center, + paint: + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill, + children: [CircleHitbox()], + ); final Vector2 velocity; @@ -33,7 +35,9 @@ class Ball extends CircleComponent @override void onCollisionStart( - Set intersectionPoints, PositionComponent other) { + Set intersectionPoints, + PositionComponent other, + ) { super.onCollisionStart(intersectionPoints, other); if (other is PlayArea) { if (intersectionPoints.first.y <= 0) { diff --git a/brick_breaker/step_06/lib/src/components/play_area.dart b/brick_breaker/step_06/lib/src/components/play_area.dart index 4ed959326a..0bb34f59be 100644 --- a/brick_breaker/step_06/lib/src/components/play_area.dart +++ b/brick_breaker/step_06/lib/src/components/play_area.dart @@ -12,10 +12,10 @@ import '../brick_breaker.dart'; class PlayArea extends RectangleComponent with HasGameReference { PlayArea() - : super( - paint: Paint()..color = const Color(0xfff2e8cf), - children: [RectangleHitbox()], - ); + : super( + paint: Paint()..color = const Color(0xfff2e8cf), + children: [RectangleHitbox()], + ); @override FutureOr onLoad() async { diff --git a/brick_breaker/step_06/macos/Podfile b/brick_breaker/step_06/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/brick_breaker/step_06/macos/Podfile +++ b/brick_breaker/step_06/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_06/macos/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_06/macos/Runner.xcodeproj/project.pbxproj index 40114f2ccc..842f876fb0 100644 --- a/brick_breaker/step_06/macos/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_06/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32125D87D9AB716E4032EAC /* Pods_Runner.framework */; }; + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */; }; + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */, + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */, + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 5BF2D3DD257D8F196721A865 /* Pods */, + 34AF9719A2D3204F77BC17D5 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 5BF2D3DD257D8F196721A865 /* Pods */ = { + 34AF9719A2D3204F77BC17D5 /* Pods */ = { isa = PBXGroup; children = ( - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */, - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */, - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */, - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */, - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */, - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */, + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */, + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */, + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */, + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */, + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */, + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */, - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */, + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */, + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */, + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */, + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */, + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,29 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */ = { + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -367,7 +345,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */ = { + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -422,6 +400,28 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/brick_breaker/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7d5c483de3..bbc7e1a860 100644 --- a/brick_breaker/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_06/pubspec.yaml b/brick_breaker/step_06/pubspec.yaml index 2ca72ae8ec..5887daad08 100644 --- a/brick_breaker/step_06/pubspec.yaml +++ b/brick_breaker/step_06/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flame: ^1.18.0 diff --git a/brick_breaker/step_07/android/.gitignore b/brick_breaker/step_07/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/brick_breaker/step_07/android/.gitignore +++ b/brick_breaker/step_07/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/brick_breaker/step_07/android/app/build.gradle b/brick_breaker/step_07/android/app/build.gradle deleted file mode 100644 index e40a92adc6..0000000000 --- a/brick_breaker/step_07/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.brick_breaker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.brick_breaker" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/brick_breaker/step_07/android/app/build.gradle.kts b/brick_breaker/step_07/android/app/build.gradle.kts new file mode 100644 index 0000000000..7e9af99b0c --- /dev/null +++ b/brick_breaker/step_07/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.brick_breaker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.brick_breaker" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/brick_breaker/step_07/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt b/brick_breaker/step_07/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt index 7f4414ee4a..74a09e998d 100644 --- a/brick_breaker/step_07/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt +++ b/brick_breaker/step_07/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.brick_breaker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/brick_breaker/step_07/android/build.gradle b/brick_breaker/step_07/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/brick_breaker/step_07/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/brick_breaker/step_07/android/build.gradle.kts b/brick_breaker/step_07/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/brick_breaker/step_07/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/brick_breaker/step_07/android/gradle.properties b/brick_breaker/step_07/android/gradle.properties index 2597170821..f018a61817 100644 --- a/brick_breaker/step_07/android/gradle.properties +++ b/brick_breaker/step_07/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/brick_breaker/step_07/android/gradle/wrapper/gradle-wrapper.properties b/brick_breaker/step_07/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/brick_breaker/step_07/android/gradle/wrapper/gradle-wrapper.properties +++ b/brick_breaker/step_07/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/brick_breaker/step_07/android/settings.gradle b/brick_breaker/step_07/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/brick_breaker/step_07/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/brick_breaker/step_07/android/settings.gradle.kts b/brick_breaker/step_07/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/brick_breaker/step_07/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/brick_breaker/step_07/ios/Podfile b/brick_breaker/step_07/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/brick_breaker/step_07/ios/Podfile +++ b/brick_breaker/step_07/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_07/ios/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_07/ios/Runner.xcodeproj/project.pbxproj index 2c8eb0d1ee..22d628f8d2 100644 --- a/brick_breaker/step_07/ios/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_07/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */; }; - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,18 +42,19 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -62,17 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 57F2B001C6B8537EED910C2C /* Frameworks */ = { + 66D6895CCE5335A18DDF778C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */, + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,25 +80,20 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */, + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2C2660F80BF13E0A2BBD65B2 /* Pods */ = { + 01B380CF0810E6F09E7E5BF5 /* Frameworks */ = { isa = PBXGroup; children = ( - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */, - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */, - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */, - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */, - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */, - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */, + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */, + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */, ); - name = Pods; - path = Pods; + name = Frameworks; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -109,15 +104,6 @@ path = RunnerTests; sourceTree = ""; }; - 5F1D389A7374ECFA4223DC84 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */, - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -136,8 +122,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 2C2660F80BF13E0A2BBD65B2 /* Pods */, - 5F1D389A7374ECFA4223DC84 /* Frameworks */, + 9F241F0D05D8D7289BFC5B2A /* Pods */, + 01B380CF0810E6F09E7E5BF5 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +151,20 @@ path = Runner; sourceTree = ""; }; + 9F241F0D05D8D7289BFC5B2A /* Pods */ = { + isa = PBXGroup; + children = ( + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */, + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */, + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */, + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */, + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */, + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */, + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 57F2B001C6B8537EED910C2C /* Frameworks */, + 66D6895CCE5335A18DDF778C /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */, + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */, + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */ = { + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,14 +285,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */ = { + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +325,42 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/brick_breaker/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/brick_breaker/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_07/lib/src/brick_breaker.dart b/brick_breaker/step_07/lib/src/brick_breaker.dart index f1fed8adf4..d5de2e292f 100644 --- a/brick_breaker/step_07/lib/src/brick_breaker.dart +++ b/brick_breaker/step_07/lib/src/brick_breaker.dart @@ -17,12 +17,12 @@ import 'config.dart'; class BrickBreaker extends FlameGame with HasCollisionDetection, KeyboardEvents { BrickBreaker() - : super( - camera: CameraComponent.withFixedResolution( - width: gameWidth, - height: gameHeight, - ), - ); + : super( + camera: CameraComponent.withFixedResolution( + width: gameWidth, + height: gameHeight, + ), + ); final rand = math.Random(); double get width => size.x; @@ -36,24 +36,35 @@ class BrickBreaker extends FlameGame world.add(PlayArea()); - world.add(Ball( + world.add( + Ball( radius: ballRadius, position: size / 2, - velocity: Vector2((rand.nextDouble() - 0.5) * width, height * 0.2) - .normalized() - ..scale(height / 4))); + velocity: + Vector2( + (rand.nextDouble() - 0.5) * width, + height * 0.2, + ).normalized() + ..scale(height / 4), + ), + ); - world.add(Bat( + world.add( + Bat( size: Vector2(batWidth, batHeight), cornerRadius: const Radius.circular(ballRadius / 2), - position: Vector2(width / 2, height * 0.95))); + position: Vector2(width / 2, height * 0.95), + ), + ); debugMode = true; } @override KeyEventResult onKeyEvent( - KeyEvent event, Set keysPressed) { + KeyEvent event, + Set keysPressed, + ) { super.onKeyEvent(event, keysPressed); switch (event.logicalKey) { case LogicalKeyboardKey.arrowLeft: diff --git a/brick_breaker/step_07/lib/src/components/ball.dart b/brick_breaker/step_07/lib/src/components/ball.dart index 000be1abe8..3947ceb14c 100644 --- a/brick_breaker/step_07/lib/src/components/ball.dart +++ b/brick_breaker/step_07/lib/src/components/ball.dart @@ -18,12 +18,14 @@ class Ball extends CircleComponent required super.position, required double radius, }) : super( - radius: radius, - anchor: Anchor.center, - paint: Paint() - ..color = const Color(0xff1e6091) - ..style = PaintingStyle.fill, - children: [CircleHitbox()]); + radius: radius, + anchor: Anchor.center, + paint: + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill, + children: [CircleHitbox()], + ); final Vector2 velocity; @@ -35,7 +37,9 @@ class Ball extends CircleComponent @override void onCollisionStart( - Set intersectionPoints, PositionComponent other) { + Set intersectionPoints, + PositionComponent other, + ) { super.onCollisionStart(intersectionPoints, other); if (other is PlayArea) { if (intersectionPoints.first.y <= 0) { @@ -45,13 +49,12 @@ class Ball extends CircleComponent } else if (intersectionPoints.first.x >= game.width) { velocity.x = -velocity.x; } else if (intersectionPoints.first.y >= game.height) { - add(RemoveEffect( - delay: 0.35, - )); + add(RemoveEffect(delay: 0.35)); } } else if (other is Bat) { velocity.y = -velocity.y; - velocity.x = velocity.x + + velocity.x = + velocity.x + (position.x - other.position.x) / other.size.x * game.width * 0.3; } else { debugPrint('collision with $other'); diff --git a/brick_breaker/step_07/lib/src/components/bat.dart b/brick_breaker/step_07/lib/src/components/bat.dart index e6ea8aeec8..cee72c6480 100644 --- a/brick_breaker/step_07/lib/src/components/bat.dart +++ b/brick_breaker/step_07/lib/src/components/bat.dart @@ -16,26 +16,22 @@ class Bat extends PositionComponent required this.cornerRadius, required super.position, required super.size, - }) : super( - anchor: Anchor.center, - children: [RectangleHitbox()], - ); + }) : super(anchor: Anchor.center, children: [RectangleHitbox()]); final Radius cornerRadius; - final _paint = Paint() - ..color = const Color(0xff1e6091) - ..style = PaintingStyle.fill; + final _paint = + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill; @override void render(Canvas canvas) { super.render(canvas); canvas.drawRRect( - RRect.fromRectAndRadius( - Offset.zero & size.toSize(), - cornerRadius, - ), - _paint); + RRect.fromRectAndRadius(Offset.zero & size.toSize(), cornerRadius), + _paint, + ); } @override @@ -45,9 +41,11 @@ class Bat extends PositionComponent } void moveBy(double dx) { - add(MoveToEffect( - Vector2((position.x + dx).clamp(0, game.width), position.y), - EffectController(duration: 0.1), - )); + add( + MoveToEffect( + Vector2((position.x + dx).clamp(0, game.width), position.y), + EffectController(duration: 0.1), + ), + ); } } diff --git a/brick_breaker/step_07/lib/src/components/play_area.dart b/brick_breaker/step_07/lib/src/components/play_area.dart index 4ed959326a..0bb34f59be 100644 --- a/brick_breaker/step_07/lib/src/components/play_area.dart +++ b/brick_breaker/step_07/lib/src/components/play_area.dart @@ -12,10 +12,10 @@ import '../brick_breaker.dart'; class PlayArea extends RectangleComponent with HasGameReference { PlayArea() - : super( - paint: Paint()..color = const Color(0xfff2e8cf), - children: [RectangleHitbox()], - ); + : super( + paint: Paint()..color = const Color(0xfff2e8cf), + children: [RectangleHitbox()], + ); @override FutureOr onLoad() async { diff --git a/brick_breaker/step_07/macos/Podfile b/brick_breaker/step_07/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/brick_breaker/step_07/macos/Podfile +++ b/brick_breaker/step_07/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_07/macos/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_07/macos/Runner.xcodeproj/project.pbxproj index 40114f2ccc..842f876fb0 100644 --- a/brick_breaker/step_07/macos/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_07/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32125D87D9AB716E4032EAC /* Pods_Runner.framework */; }; + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */; }; + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */, + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */, + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 5BF2D3DD257D8F196721A865 /* Pods */, + 34AF9719A2D3204F77BC17D5 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 5BF2D3DD257D8F196721A865 /* Pods */ = { + 34AF9719A2D3204F77BC17D5 /* Pods */ = { isa = PBXGroup; children = ( - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */, - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */, - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */, - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */, - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */, - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */, + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */, + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */, + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */, + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */, + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */, + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */, - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */, + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */, + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */, + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */, + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */, + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,29 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */ = { + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -367,7 +345,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */ = { + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -422,6 +400,28 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/brick_breaker/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7d5c483de3..bbc7e1a860 100644 --- a/brick_breaker/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_07/pubspec.yaml b/brick_breaker/step_07/pubspec.yaml index 2ca72ae8ec..5887daad08 100644 --- a/brick_breaker/step_07/pubspec.yaml +++ b/brick_breaker/step_07/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flame: ^1.18.0 diff --git a/brick_breaker/step_08/android/.gitignore b/brick_breaker/step_08/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/brick_breaker/step_08/android/.gitignore +++ b/brick_breaker/step_08/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/brick_breaker/step_08/android/app/build.gradle b/brick_breaker/step_08/android/app/build.gradle deleted file mode 100644 index e40a92adc6..0000000000 --- a/brick_breaker/step_08/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.brick_breaker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.brick_breaker" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/brick_breaker/step_08/android/app/build.gradle.kts b/brick_breaker/step_08/android/app/build.gradle.kts new file mode 100644 index 0000000000..7e9af99b0c --- /dev/null +++ b/brick_breaker/step_08/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.brick_breaker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.brick_breaker" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/brick_breaker/step_08/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt b/brick_breaker/step_08/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt index 7f4414ee4a..74a09e998d 100644 --- a/brick_breaker/step_08/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt +++ b/brick_breaker/step_08/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.brick_breaker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/brick_breaker/step_08/android/build.gradle b/brick_breaker/step_08/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/brick_breaker/step_08/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/brick_breaker/step_08/android/build.gradle.kts b/brick_breaker/step_08/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/brick_breaker/step_08/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/brick_breaker/step_08/android/gradle.properties b/brick_breaker/step_08/android/gradle.properties index 2597170821..f018a61817 100644 --- a/brick_breaker/step_08/android/gradle.properties +++ b/brick_breaker/step_08/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/brick_breaker/step_08/android/gradle/wrapper/gradle-wrapper.properties b/brick_breaker/step_08/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/brick_breaker/step_08/android/gradle/wrapper/gradle-wrapper.properties +++ b/brick_breaker/step_08/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/brick_breaker/step_08/android/settings.gradle b/brick_breaker/step_08/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/brick_breaker/step_08/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/brick_breaker/step_08/android/settings.gradle.kts b/brick_breaker/step_08/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/brick_breaker/step_08/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/brick_breaker/step_08/ios/Podfile b/brick_breaker/step_08/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/brick_breaker/step_08/ios/Podfile +++ b/brick_breaker/step_08/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_08/ios/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_08/ios/Runner.xcodeproj/project.pbxproj index 2c8eb0d1ee..22d628f8d2 100644 --- a/brick_breaker/step_08/ios/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_08/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */; }; - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,18 +42,19 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -62,17 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 57F2B001C6B8537EED910C2C /* Frameworks */ = { + 66D6895CCE5335A18DDF778C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */, + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,25 +80,20 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */, + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2C2660F80BF13E0A2BBD65B2 /* Pods */ = { + 01B380CF0810E6F09E7E5BF5 /* Frameworks */ = { isa = PBXGroup; children = ( - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */, - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */, - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */, - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */, - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */, - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */, + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */, + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */, ); - name = Pods; - path = Pods; + name = Frameworks; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -109,15 +104,6 @@ path = RunnerTests; sourceTree = ""; }; - 5F1D389A7374ECFA4223DC84 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */, - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -136,8 +122,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 2C2660F80BF13E0A2BBD65B2 /* Pods */, - 5F1D389A7374ECFA4223DC84 /* Frameworks */, + 9F241F0D05D8D7289BFC5B2A /* Pods */, + 01B380CF0810E6F09E7E5BF5 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +151,20 @@ path = Runner; sourceTree = ""; }; + 9F241F0D05D8D7289BFC5B2A /* Pods */ = { + isa = PBXGroup; + children = ( + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */, + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */, + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */, + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */, + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */, + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */, + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 57F2B001C6B8537EED910C2C /* Frameworks */, + 66D6895CCE5335A18DDF778C /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */, + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */, + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */ = { + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,14 +285,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */ = { + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +325,42 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/brick_breaker/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/brick_breaker/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_08/lib/src/brick_breaker.dart b/brick_breaker/step_08/lib/src/brick_breaker.dart index 014f3c83cb..9cf5beeb71 100644 --- a/brick_breaker/step_08/lib/src/brick_breaker.dart +++ b/brick_breaker/step_08/lib/src/brick_breaker.dart @@ -17,12 +17,12 @@ import 'config.dart'; class BrickBreaker extends FlameGame with HasCollisionDetection, KeyboardEvents { BrickBreaker() - : super( - camera: CameraComponent.withFixedResolution( - width: gameWidth, - height: gameHeight, - ), - ); + : super( + camera: CameraComponent.withFixedResolution( + width: gameWidth, + height: gameHeight, + ), + ); final rand = math.Random(); double get width => size.x; @@ -36,18 +36,27 @@ class BrickBreaker extends FlameGame world.add(PlayArea()); - world.add(Ball( + world.add( + Ball( difficultyModifier: difficultyModifier, radius: ballRadius, position: size / 2, - velocity: Vector2((rand.nextDouble() - 0.5) * width, height * 0.2) - .normalized() - ..scale(height / 4))); + velocity: + Vector2( + (rand.nextDouble() - 0.5) * width, + height * 0.2, + ).normalized() + ..scale(height / 4), + ), + ); - world.add(Bat( + world.add( + Bat( size: Vector2(batWidth, batHeight), cornerRadius: const Radius.circular(ballRadius / 2), - position: Vector2(width / 2, height * 0.95))); + position: Vector2(width / 2, height * 0.95), + ), + ); await world.addAll([ for (var i = 0; i < brickColors.length; i++) @@ -66,7 +75,9 @@ class BrickBreaker extends FlameGame @override KeyEventResult onKeyEvent( - KeyEvent event, Set keysPressed) { + KeyEvent event, + Set keysPressed, + ) { super.onKeyEvent(event, keysPressed); switch (event.logicalKey) { case LogicalKeyboardKey.arrowLeft: diff --git a/brick_breaker/step_08/lib/src/components/ball.dart b/brick_breaker/step_08/lib/src/components/ball.dart index 49b36b2d1d..e70d465839 100644 --- a/brick_breaker/step_08/lib/src/components/ball.dart +++ b/brick_breaker/step_08/lib/src/components/ball.dart @@ -20,12 +20,14 @@ class Ball extends CircleComponent required double radius, required this.difficultyModifier, }) : super( - radius: radius, - anchor: Anchor.center, - paint: Paint() - ..color = const Color(0xff1e6091) - ..style = PaintingStyle.fill, - children: [CircleHitbox()]); + radius: radius, + anchor: Anchor.center, + paint: + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill, + children: [CircleHitbox()], + ); final Vector2 velocity; final double difficultyModifier; @@ -38,7 +40,9 @@ class Ball extends CircleComponent @override void onCollisionStart( - Set intersectionPoints, PositionComponent other) { + Set intersectionPoints, + PositionComponent other, + ) { super.onCollisionStart(intersectionPoints, other); if (other is PlayArea) { if (intersectionPoints.first.y <= 0) { @@ -48,13 +52,12 @@ class Ball extends CircleComponent } else if (intersectionPoints.first.x >= game.width) { velocity.x = -velocity.x; } else if (intersectionPoints.first.y >= game.height) { - add(RemoveEffect( - delay: 0.35, - )); + add(RemoveEffect(delay: 0.35)); } } else if (other is Bat) { velocity.y = -velocity.y; - velocity.x = velocity.x + + velocity.x = + velocity.x + (position.x - other.position.x) / other.size.x * game.width * 0.3; } else if (other is Brick) { if (position.y < other.position.y - other.size.y / 2) { diff --git a/brick_breaker/step_08/lib/src/components/bat.dart b/brick_breaker/step_08/lib/src/components/bat.dart index e6ea8aeec8..cee72c6480 100644 --- a/brick_breaker/step_08/lib/src/components/bat.dart +++ b/brick_breaker/step_08/lib/src/components/bat.dart @@ -16,26 +16,22 @@ class Bat extends PositionComponent required this.cornerRadius, required super.position, required super.size, - }) : super( - anchor: Anchor.center, - children: [RectangleHitbox()], - ); + }) : super(anchor: Anchor.center, children: [RectangleHitbox()]); final Radius cornerRadius; - final _paint = Paint() - ..color = const Color(0xff1e6091) - ..style = PaintingStyle.fill; + final _paint = + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill; @override void render(Canvas canvas) { super.render(canvas); canvas.drawRRect( - RRect.fromRectAndRadius( - Offset.zero & size.toSize(), - cornerRadius, - ), - _paint); + RRect.fromRectAndRadius(Offset.zero & size.toSize(), cornerRadius), + _paint, + ); } @override @@ -45,9 +41,11 @@ class Bat extends PositionComponent } void moveBy(double dx) { - add(MoveToEffect( - Vector2((position.x + dx).clamp(0, game.width), position.y), - EffectController(duration: 0.1), - )); + add( + MoveToEffect( + Vector2((position.x + dx).clamp(0, game.width), position.y), + EffectController(duration: 0.1), + ), + ); } } diff --git a/brick_breaker/step_08/lib/src/components/brick.dart b/brick_breaker/step_08/lib/src/components/brick.dart index 6284c7d330..b624f23b37 100644 --- a/brick_breaker/step_08/lib/src/components/brick.dart +++ b/brick_breaker/step_08/lib/src/components/brick.dart @@ -14,18 +14,21 @@ import 'bat.dart'; class Brick extends RectangleComponent with CollisionCallbacks, HasGameReference { Brick({required super.position, required Color color}) - : super( - size: Vector2(brickWidth, brickHeight), - anchor: Anchor.center, - paint: Paint() - ..color = color - ..style = PaintingStyle.fill, - children: [RectangleHitbox()], - ); + : super( + size: Vector2(brickWidth, brickHeight), + anchor: Anchor.center, + paint: + Paint() + ..color = color + ..style = PaintingStyle.fill, + children: [RectangleHitbox()], + ); @override void onCollisionStart( - Set intersectionPoints, PositionComponent other) { + Set intersectionPoints, + PositionComponent other, + ) { super.onCollisionStart(intersectionPoints, other); removeFromParent(); diff --git a/brick_breaker/step_08/lib/src/components/play_area.dart b/brick_breaker/step_08/lib/src/components/play_area.dart index 4ed959326a..0bb34f59be 100644 --- a/brick_breaker/step_08/lib/src/components/play_area.dart +++ b/brick_breaker/step_08/lib/src/components/play_area.dart @@ -12,10 +12,10 @@ import '../brick_breaker.dart'; class PlayArea extends RectangleComponent with HasGameReference { PlayArea() - : super( - paint: Paint()..color = const Color(0xfff2e8cf), - children: [RectangleHitbox()], - ); + : super( + paint: Paint()..color = const Color(0xfff2e8cf), + children: [RectangleHitbox()], + ); @override FutureOr onLoad() async { diff --git a/brick_breaker/step_08/macos/Podfile b/brick_breaker/step_08/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/brick_breaker/step_08/macos/Podfile +++ b/brick_breaker/step_08/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_08/macos/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_08/macos/Runner.xcodeproj/project.pbxproj index 40114f2ccc..842f876fb0 100644 --- a/brick_breaker/step_08/macos/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_08/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32125D87D9AB716E4032EAC /* Pods_Runner.framework */; }; + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */; }; + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */, + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */, + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 5BF2D3DD257D8F196721A865 /* Pods */, + 34AF9719A2D3204F77BC17D5 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 5BF2D3DD257D8F196721A865 /* Pods */ = { + 34AF9719A2D3204F77BC17D5 /* Pods */ = { isa = PBXGroup; children = ( - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */, - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */, - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */, - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */, - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */, - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */, + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */, + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */, + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */, + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */, + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */, + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */, - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */, + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */, + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */, + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */, + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */, + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,29 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */ = { + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -367,7 +345,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */ = { + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -422,6 +400,28 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/brick_breaker/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7d5c483de3..bbc7e1a860 100644 --- a/brick_breaker/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_08/pubspec.yaml b/brick_breaker/step_08/pubspec.yaml index 2ca72ae8ec..5887daad08 100644 --- a/brick_breaker/step_08/pubspec.yaml +++ b/brick_breaker/step_08/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flame: ^1.18.0 diff --git a/brick_breaker/step_09/android/.gitignore b/brick_breaker/step_09/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/brick_breaker/step_09/android/.gitignore +++ b/brick_breaker/step_09/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/brick_breaker/step_09/android/app/build.gradle b/brick_breaker/step_09/android/app/build.gradle deleted file mode 100644 index e40a92adc6..0000000000 --- a/brick_breaker/step_09/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.brick_breaker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.brick_breaker" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/brick_breaker/step_09/android/app/build.gradle.kts b/brick_breaker/step_09/android/app/build.gradle.kts new file mode 100644 index 0000000000..7e9af99b0c --- /dev/null +++ b/brick_breaker/step_09/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.brick_breaker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.brick_breaker" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/brick_breaker/step_09/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt b/brick_breaker/step_09/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt index 7f4414ee4a..74a09e998d 100644 --- a/brick_breaker/step_09/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt +++ b/brick_breaker/step_09/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.brick_breaker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/brick_breaker/step_09/android/build.gradle b/brick_breaker/step_09/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/brick_breaker/step_09/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/brick_breaker/step_09/android/build.gradle.kts b/brick_breaker/step_09/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/brick_breaker/step_09/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/brick_breaker/step_09/android/gradle.properties b/brick_breaker/step_09/android/gradle.properties index 2597170821..f018a61817 100644 --- a/brick_breaker/step_09/android/gradle.properties +++ b/brick_breaker/step_09/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/brick_breaker/step_09/android/gradle/wrapper/gradle-wrapper.properties b/brick_breaker/step_09/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/brick_breaker/step_09/android/gradle/wrapper/gradle-wrapper.properties +++ b/brick_breaker/step_09/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/brick_breaker/step_09/android/settings.gradle b/brick_breaker/step_09/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/brick_breaker/step_09/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/brick_breaker/step_09/android/settings.gradle.kts b/brick_breaker/step_09/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/brick_breaker/step_09/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/brick_breaker/step_09/ios/Podfile b/brick_breaker/step_09/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/brick_breaker/step_09/ios/Podfile +++ b/brick_breaker/step_09/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_09/ios/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_09/ios/Runner.xcodeproj/project.pbxproj index 2c8eb0d1ee..22d628f8d2 100644 --- a/brick_breaker/step_09/ios/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_09/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */; }; - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,18 +42,19 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -62,17 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 57F2B001C6B8537EED910C2C /* Frameworks */ = { + 66D6895CCE5335A18DDF778C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */, + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,25 +80,20 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */, + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2C2660F80BF13E0A2BBD65B2 /* Pods */ = { + 01B380CF0810E6F09E7E5BF5 /* Frameworks */ = { isa = PBXGroup; children = ( - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */, - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */, - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */, - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */, - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */, - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */, + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */, + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */, ); - name = Pods; - path = Pods; + name = Frameworks; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -109,15 +104,6 @@ path = RunnerTests; sourceTree = ""; }; - 5F1D389A7374ECFA4223DC84 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */, - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -136,8 +122,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 2C2660F80BF13E0A2BBD65B2 /* Pods */, - 5F1D389A7374ECFA4223DC84 /* Frameworks */, + 9F241F0D05D8D7289BFC5B2A /* Pods */, + 01B380CF0810E6F09E7E5BF5 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +151,20 @@ path = Runner; sourceTree = ""; }; + 9F241F0D05D8D7289BFC5B2A /* Pods */ = { + isa = PBXGroup; + children = ( + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */, + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */, + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */, + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */, + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */, + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */, + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 57F2B001C6B8537EED910C2C /* Frameworks */, + 66D6895CCE5335A18DDF778C /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */, + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */, + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */ = { + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,14 +285,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */ = { + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +325,42 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/brick_breaker/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/brick_breaker/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_09/lib/src/brick_breaker.dart b/brick_breaker/step_09/lib/src/brick_breaker.dart index 6306538923..e7d1bbe67c 100644 --- a/brick_breaker/step_09/lib/src/brick_breaker.dart +++ b/brick_breaker/step_09/lib/src/brick_breaker.dart @@ -19,12 +19,12 @@ enum PlayState { welcome, playing, gameOver, won } class BrickBreaker extends FlameGame with HasCollisionDetection, KeyboardEvents, TapDetector { BrickBreaker() - : super( - camera: CameraComponent.withFixedResolution( - width: gameWidth, - height: gameHeight, - ), - ); + : super( + camera: CameraComponent.withFixedResolution( + width: gameWidth, + height: gameHeight, + ), + ); final rand = math.Random(); double get width => size.x; @@ -66,18 +66,27 @@ class BrickBreaker extends FlameGame playState = PlayState.playing; - world.add(Ball( + world.add( + Ball( difficultyModifier: difficultyModifier, radius: ballRadius, position: size / 2, - velocity: Vector2((rand.nextDouble() - 0.5) * width, height * 0.2) - .normalized() - ..scale(height / 4))); - - world.add(Bat( + velocity: + Vector2( + (rand.nextDouble() - 0.5) * width, + height * 0.2, + ).normalized() + ..scale(height / 4), + ), + ); + + world.add( + Bat( size: Vector2(batWidth, batHeight), cornerRadius: const Radius.circular(ballRadius / 2), - position: Vector2(width / 2, height * 0.95))); + position: Vector2(width / 2, height * 0.95), + ), + ); world.addAll([ for (var i = 0; i < brickColors.length; i++) @@ -100,7 +109,9 @@ class BrickBreaker extends FlameGame @override KeyEventResult onKeyEvent( - KeyEvent event, Set keysPressed) { + KeyEvent event, + Set keysPressed, + ) { super.onKeyEvent(event, keysPressed); switch (event.logicalKey) { case LogicalKeyboardKey.arrowLeft: diff --git a/brick_breaker/step_09/lib/src/components/ball.dart b/brick_breaker/step_09/lib/src/components/ball.dart index 8000ab0d88..b49fca22cd 100644 --- a/brick_breaker/step_09/lib/src/components/ball.dart +++ b/brick_breaker/step_09/lib/src/components/ball.dart @@ -20,12 +20,14 @@ class Ball extends CircleComponent required double radius, required this.difficultyModifier, }) : super( - radius: radius, - anchor: Anchor.center, - paint: Paint() - ..color = const Color(0xff1e6091) - ..style = PaintingStyle.fill, - children: [CircleHitbox()]); + radius: radius, + anchor: Anchor.center, + paint: + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill, + children: [CircleHitbox()], + ); final Vector2 velocity; final double difficultyModifier; @@ -38,7 +40,9 @@ class Ball extends CircleComponent @override void onCollisionStart( - Set intersectionPoints, PositionComponent other) { + Set intersectionPoints, + PositionComponent other, + ) { super.onCollisionStart(intersectionPoints, other); if (other is PlayArea) { if (intersectionPoints.first.y <= 0) { @@ -48,15 +52,19 @@ class Ball extends CircleComponent } else if (intersectionPoints.first.x >= game.width) { velocity.x = -velocity.x; } else if (intersectionPoints.first.y >= game.height) { - add(RemoveEffect( + add( + RemoveEffect( delay: 0.35, onComplete: () { game.playState = PlayState.gameOver; - })); + }, + ), + ); } } else if (other is Bat) { velocity.y = -velocity.y; - velocity.x = velocity.x + + velocity.x = + velocity.x + (position.x - other.position.x) / other.size.x * game.width * 0.3; } else if (other is Brick) { if (position.y < other.position.y - other.size.y / 2) { diff --git a/brick_breaker/step_09/lib/src/components/bat.dart b/brick_breaker/step_09/lib/src/components/bat.dart index e6ea8aeec8..cee72c6480 100644 --- a/brick_breaker/step_09/lib/src/components/bat.dart +++ b/brick_breaker/step_09/lib/src/components/bat.dart @@ -16,26 +16,22 @@ class Bat extends PositionComponent required this.cornerRadius, required super.position, required super.size, - }) : super( - anchor: Anchor.center, - children: [RectangleHitbox()], - ); + }) : super(anchor: Anchor.center, children: [RectangleHitbox()]); final Radius cornerRadius; - final _paint = Paint() - ..color = const Color(0xff1e6091) - ..style = PaintingStyle.fill; + final _paint = + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill; @override void render(Canvas canvas) { super.render(canvas); canvas.drawRRect( - RRect.fromRectAndRadius( - Offset.zero & size.toSize(), - cornerRadius, - ), - _paint); + RRect.fromRectAndRadius(Offset.zero & size.toSize(), cornerRadius), + _paint, + ); } @override @@ -45,9 +41,11 @@ class Bat extends PositionComponent } void moveBy(double dx) { - add(MoveToEffect( - Vector2((position.x + dx).clamp(0, game.width), position.y), - EffectController(duration: 0.1), - )); + add( + MoveToEffect( + Vector2((position.x + dx).clamp(0, game.width), position.y), + EffectController(duration: 0.1), + ), + ); } } diff --git a/brick_breaker/step_09/lib/src/components/brick.dart b/brick_breaker/step_09/lib/src/components/brick.dart index a7ed7dd12b..d98a17fff8 100644 --- a/brick_breaker/step_09/lib/src/components/brick.dart +++ b/brick_breaker/step_09/lib/src/components/brick.dart @@ -14,18 +14,21 @@ import 'bat.dart'; class Brick extends RectangleComponent with CollisionCallbacks, HasGameReference { Brick({required super.position, required Color color}) - : super( - size: Vector2(brickWidth, brickHeight), - anchor: Anchor.center, - paint: Paint() - ..color = color - ..style = PaintingStyle.fill, - children: [RectangleHitbox()], - ); + : super( + size: Vector2(brickWidth, brickHeight), + anchor: Anchor.center, + paint: + Paint() + ..color = color + ..style = PaintingStyle.fill, + children: [RectangleHitbox()], + ); @override void onCollisionStart( - Set intersectionPoints, PositionComponent other) { + Set intersectionPoints, + PositionComponent other, + ) { super.onCollisionStart(intersectionPoints, other); removeFromParent(); diff --git a/brick_breaker/step_09/lib/src/components/play_area.dart b/brick_breaker/step_09/lib/src/components/play_area.dart index 4ed959326a..0bb34f59be 100644 --- a/brick_breaker/step_09/lib/src/components/play_area.dart +++ b/brick_breaker/step_09/lib/src/components/play_area.dart @@ -12,10 +12,10 @@ import '../brick_breaker.dart'; class PlayArea extends RectangleComponent with HasGameReference { PlayArea() - : super( - paint: Paint()..color = const Color(0xfff2e8cf), - children: [RectangleHitbox()], - ); + : super( + paint: Paint()..color = const Color(0xfff2e8cf), + children: [RectangleHitbox()], + ); @override FutureOr onLoad() async { diff --git a/brick_breaker/step_09/lib/src/widgets/game_app.dart b/brick_breaker/step_09/lib/src/widgets/game_app.dart index dc9a58bde6..c2bc06326d 100644 --- a/brick_breaker/step_09/lib/src/widgets/game_app.dart +++ b/brick_breaker/step_09/lib/src/widgets/game_app.dart @@ -28,10 +28,7 @@ class GameApp extends StatelessWidget { gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, - colors: [ - Color(0xffa9d6e5), - Color(0xfff2e8cf), - ], + colors: [Color(0xffa9d6e5), Color(0xfff2e8cf)], ), ), child: SafeArea( @@ -45,21 +42,24 @@ class GameApp extends StatelessWidget { child: GameWidget.controlled( gameFactory: BrickBreaker.new, overlayBuilderMap: { - PlayState.welcome.name: (context, game) => Center( + PlayState.welcome.name: + (context, game) => Center( child: Text( 'TAP TO PLAY', style: Theme.of(context).textTheme.headlineLarge, ), ), - PlayState.gameOver.name: (context, game) => Center( + PlayState.gameOver.name: + (context, game) => Center( child: Text( 'G A M E O V E R', style: Theme.of(context).textTheme.headlineLarge, ), ), - PlayState.won.name: (context, game) => Center( + PlayState.won.name: + (context, game) => Center( child: Text( 'Y O U W O N ! ! !', style: diff --git a/brick_breaker/step_09/macos/Podfile b/brick_breaker/step_09/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/brick_breaker/step_09/macos/Podfile +++ b/brick_breaker/step_09/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_09/macos/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_09/macos/Runner.xcodeproj/project.pbxproj index 40114f2ccc..842f876fb0 100644 --- a/brick_breaker/step_09/macos/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_09/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32125D87D9AB716E4032EAC /* Pods_Runner.framework */; }; + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */; }; + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */, + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */, + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 5BF2D3DD257D8F196721A865 /* Pods */, + 34AF9719A2D3204F77BC17D5 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 5BF2D3DD257D8F196721A865 /* Pods */ = { + 34AF9719A2D3204F77BC17D5 /* Pods */ = { isa = PBXGroup; children = ( - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */, - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */, - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */, - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */, - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */, - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */, + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */, + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */, + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */, + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */, + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */, + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */, - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */, + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */, + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */, + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */, + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */, + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,29 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */ = { + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -367,7 +345,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */ = { + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -422,6 +400,28 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/brick_breaker/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7d5c483de3..bbc7e1a860 100644 --- a/brick_breaker/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_09/pubspec.yaml b/brick_breaker/step_09/pubspec.yaml index 2ca72ae8ec..5887daad08 100644 --- a/brick_breaker/step_09/pubspec.yaml +++ b/brick_breaker/step_09/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flame: ^1.18.0 diff --git a/brick_breaker/step_10/android/.gitignore b/brick_breaker/step_10/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/brick_breaker/step_10/android/.gitignore +++ b/brick_breaker/step_10/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/brick_breaker/step_10/android/app/build.gradle b/brick_breaker/step_10/android/app/build.gradle deleted file mode 100644 index e40a92adc6..0000000000 --- a/brick_breaker/step_10/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.brick_breaker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.brick_breaker" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/brick_breaker/step_10/android/app/build.gradle.kts b/brick_breaker/step_10/android/app/build.gradle.kts new file mode 100644 index 0000000000..7e9af99b0c --- /dev/null +++ b/brick_breaker/step_10/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.brick_breaker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.brick_breaker" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/brick_breaker/step_10/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt b/brick_breaker/step_10/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt index 7f4414ee4a..74a09e998d 100644 --- a/brick_breaker/step_10/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt +++ b/brick_breaker/step_10/android/app/src/main/kotlin/com/example/brick_breaker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.brick_breaker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/brick_breaker/step_10/android/build.gradle b/brick_breaker/step_10/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/brick_breaker/step_10/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/brick_breaker/step_10/android/build.gradle.kts b/brick_breaker/step_10/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/brick_breaker/step_10/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/brick_breaker/step_10/android/gradle.properties b/brick_breaker/step_10/android/gradle.properties index 2597170821..f018a61817 100644 --- a/brick_breaker/step_10/android/gradle.properties +++ b/brick_breaker/step_10/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/brick_breaker/step_10/android/gradle/wrapper/gradle-wrapper.properties b/brick_breaker/step_10/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/brick_breaker/step_10/android/gradle/wrapper/gradle-wrapper.properties +++ b/brick_breaker/step_10/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/brick_breaker/step_10/android/settings.gradle b/brick_breaker/step_10/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/brick_breaker/step_10/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/brick_breaker/step_10/android/settings.gradle.kts b/brick_breaker/step_10/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/brick_breaker/step_10/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/brick_breaker/step_10/ios/Podfile b/brick_breaker/step_10/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/brick_breaker/step_10/ios/Podfile +++ b/brick_breaker/step_10/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_10/ios/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_10/ios/Runner.xcodeproj/project.pbxproj index 2c8eb0d1ee..22d628f8d2 100644 --- a/brick_breaker/step_10/ios/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_10/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */; }; - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,18 +42,19 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -62,17 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 57F2B001C6B8537EED910C2C /* Frameworks */ = { + 66D6895CCE5335A18DDF778C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5797428BC5F8254D6240D69D /* Pods_RunnerTests.framework in Frameworks */, + B7D6419686787DD953D9E84E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,25 +80,20 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 46EDE259B1684EB3F0846CFA /* Pods_Runner.framework in Frameworks */, + 39FA1EDCDFF7D89308DAE981 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2C2660F80BF13E0A2BBD65B2 /* Pods */ = { + 01B380CF0810E6F09E7E5BF5 /* Frameworks */ = { isa = PBXGroup; children = ( - A8C8C6DA4054438CF3B3F65E /* Pods-Runner.debug.xcconfig */, - 6D97A22EEC6B00160D8734FE /* Pods-Runner.release.xcconfig */, - 681CD44677C0BC419025F327 /* Pods-Runner.profile.xcconfig */, - AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */, - B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */, - 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */, + AEE041CFA661D8660CAA6E8B /* Pods_Runner.framework */, + 40CD8B898804E91D1E9FD0B2 /* Pods_RunnerTests.framework */, ); - name = Pods; - path = Pods; + name = Frameworks; sourceTree = ""; }; 331C8082294A63A400263BE5 /* RunnerTests */ = { @@ -109,15 +104,6 @@ path = RunnerTests; sourceTree = ""; }; - 5F1D389A7374ECFA4223DC84 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7550E575FBF0D03761D3DAC4 /* Pods_Runner.framework */, - 40792410372CBA69A25538A9 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -136,8 +122,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 2C2660F80BF13E0A2BBD65B2 /* Pods */, - 5F1D389A7374ECFA4223DC84 /* Frameworks */, + 9F241F0D05D8D7289BFC5B2A /* Pods */, + 01B380CF0810E6F09E7E5BF5 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +151,20 @@ path = Runner; sourceTree = ""; }; + 9F241F0D05D8D7289BFC5B2A /* Pods */ = { + isa = PBXGroup; + children = ( + 653AB9F92A41E7068944739D /* Pods-Runner.debug.xcconfig */, + C7D43FAA843C896E77DC9F39 /* Pods-Runner.release.xcconfig */, + 2800D8AE5F9FEFDAF3128E6A /* Pods-Runner.profile.xcconfig */, + 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */, + 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */, + 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */, + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 57F2B001C6B8537EED910C2C /* Frameworks */, + 66D6895CCE5335A18DDF778C /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */, + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */, + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 2128BDA8A27753787AFEF495 /* [CP] Check Pods Manifest.lock */ = { + 111512E8C28E6AB229940F05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,14 +285,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 28CB2424499E29F24EB5C66D /* [CP] Embed Pods Frameworks */ = { + 2D860F7BC792494E2F874E82 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,42 +325,42 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 5B406F9052974259F24FBCDE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - EA26EBB7DBA803469E41A2B0 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AA844963ED65669104D75199 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 3A7D3B5D59950598B265DA0D /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B5787C29142E9784B1806D38 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 45D61DE6D503A20743D106F0 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FF161CF0B984A0EEA4FE349 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 2ECA983C7419EE0C5463DC7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/brick_breaker/step_10/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_10/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/brick_breaker/step_10/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_10/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_10/lib/src/brick_breaker.dart b/brick_breaker/step_10/lib/src/brick_breaker.dart index d3a87ffe54..e551cd0467 100644 --- a/brick_breaker/step_10/lib/src/brick_breaker.dart +++ b/brick_breaker/step_10/lib/src/brick_breaker.dart @@ -19,12 +19,12 @@ enum PlayState { welcome, playing, gameOver, won } class BrickBreaker extends FlameGame with HasCollisionDetection, KeyboardEvents, TapDetector { BrickBreaker() - : super( - camera: CameraComponent.withFixedResolution( - width: gameWidth, - height: gameHeight, - ), - ); + : super( + camera: CameraComponent.withFixedResolution( + width: gameWidth, + height: gameHeight, + ), + ); final ValueNotifier score = ValueNotifier(0); final rand = math.Random(); @@ -68,18 +68,27 @@ class BrickBreaker extends FlameGame playState = PlayState.playing; score.value = 0; - world.add(Ball( + world.add( + Ball( difficultyModifier: difficultyModifier, radius: ballRadius, position: size / 2, - velocity: Vector2((rand.nextDouble() - 0.5) * width, height * 0.2) - .normalized() - ..scale(height / 4))); - - world.add(Bat( + velocity: + Vector2( + (rand.nextDouble() - 0.5) * width, + height * 0.2, + ).normalized() + ..scale(height / 4), + ), + ); + + world.add( + Bat( size: Vector2(batWidth, batHeight), cornerRadius: const Radius.circular(ballRadius / 2), - position: Vector2(width / 2, height * 0.95))); + position: Vector2(width / 2, height * 0.95), + ), + ); world.addAll([ for (var i = 0; i < brickColors.length; i++) @@ -102,7 +111,9 @@ class BrickBreaker extends FlameGame @override KeyEventResult onKeyEvent( - KeyEvent event, Set keysPressed) { + KeyEvent event, + Set keysPressed, + ) { super.onKeyEvent(event, keysPressed); switch (event.logicalKey) { case LogicalKeyboardKey.arrowLeft: diff --git a/brick_breaker/step_10/lib/src/components/ball.dart b/brick_breaker/step_10/lib/src/components/ball.dart index 8000ab0d88..b49fca22cd 100644 --- a/brick_breaker/step_10/lib/src/components/ball.dart +++ b/brick_breaker/step_10/lib/src/components/ball.dart @@ -20,12 +20,14 @@ class Ball extends CircleComponent required double radius, required this.difficultyModifier, }) : super( - radius: radius, - anchor: Anchor.center, - paint: Paint() - ..color = const Color(0xff1e6091) - ..style = PaintingStyle.fill, - children: [CircleHitbox()]); + radius: radius, + anchor: Anchor.center, + paint: + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill, + children: [CircleHitbox()], + ); final Vector2 velocity; final double difficultyModifier; @@ -38,7 +40,9 @@ class Ball extends CircleComponent @override void onCollisionStart( - Set intersectionPoints, PositionComponent other) { + Set intersectionPoints, + PositionComponent other, + ) { super.onCollisionStart(intersectionPoints, other); if (other is PlayArea) { if (intersectionPoints.first.y <= 0) { @@ -48,15 +52,19 @@ class Ball extends CircleComponent } else if (intersectionPoints.first.x >= game.width) { velocity.x = -velocity.x; } else if (intersectionPoints.first.y >= game.height) { - add(RemoveEffect( + add( + RemoveEffect( delay: 0.35, onComplete: () { game.playState = PlayState.gameOver; - })); + }, + ), + ); } } else if (other is Bat) { velocity.y = -velocity.y; - velocity.x = velocity.x + + velocity.x = + velocity.x + (position.x - other.position.x) / other.size.x * game.width * 0.3; } else if (other is Brick) { if (position.y < other.position.y - other.size.y / 2) { diff --git a/brick_breaker/step_10/lib/src/components/bat.dart b/brick_breaker/step_10/lib/src/components/bat.dart index e6ea8aeec8..cee72c6480 100644 --- a/brick_breaker/step_10/lib/src/components/bat.dart +++ b/brick_breaker/step_10/lib/src/components/bat.dart @@ -16,26 +16,22 @@ class Bat extends PositionComponent required this.cornerRadius, required super.position, required super.size, - }) : super( - anchor: Anchor.center, - children: [RectangleHitbox()], - ); + }) : super(anchor: Anchor.center, children: [RectangleHitbox()]); final Radius cornerRadius; - final _paint = Paint() - ..color = const Color(0xff1e6091) - ..style = PaintingStyle.fill; + final _paint = + Paint() + ..color = const Color(0xff1e6091) + ..style = PaintingStyle.fill; @override void render(Canvas canvas) { super.render(canvas); canvas.drawRRect( - RRect.fromRectAndRadius( - Offset.zero & size.toSize(), - cornerRadius, - ), - _paint); + RRect.fromRectAndRadius(Offset.zero & size.toSize(), cornerRadius), + _paint, + ); } @override @@ -45,9 +41,11 @@ class Bat extends PositionComponent } void moveBy(double dx) { - add(MoveToEffect( - Vector2((position.x + dx).clamp(0, game.width), position.y), - EffectController(duration: 0.1), - )); + add( + MoveToEffect( + Vector2((position.x + dx).clamp(0, game.width), position.y), + EffectController(duration: 0.1), + ), + ); } } diff --git a/brick_breaker/step_10/lib/src/components/brick.dart b/brick_breaker/step_10/lib/src/components/brick.dart index 9efe2bd614..0833f2cbdb 100644 --- a/brick_breaker/step_10/lib/src/components/brick.dart +++ b/brick_breaker/step_10/lib/src/components/brick.dart @@ -14,18 +14,21 @@ import 'bat.dart'; class Brick extends RectangleComponent with CollisionCallbacks, HasGameReference { Brick({required super.position, required Color color}) - : super( - size: Vector2(brickWidth, brickHeight), - anchor: Anchor.center, - paint: Paint() - ..color = color - ..style = PaintingStyle.fill, - children: [RectangleHitbox()], - ); + : super( + size: Vector2(brickWidth, brickHeight), + anchor: Anchor.center, + paint: + Paint() + ..color = color + ..style = PaintingStyle.fill, + children: [RectangleHitbox()], + ); @override void onCollisionStart( - Set intersectionPoints, PositionComponent other) { + Set intersectionPoints, + PositionComponent other, + ) { super.onCollisionStart(intersectionPoints, other); removeFromParent(); game.score.value++; diff --git a/brick_breaker/step_10/lib/src/components/play_area.dart b/brick_breaker/step_10/lib/src/components/play_area.dart index 4ed959326a..0bb34f59be 100644 --- a/brick_breaker/step_10/lib/src/components/play_area.dart +++ b/brick_breaker/step_10/lib/src/components/play_area.dart @@ -12,10 +12,10 @@ import '../brick_breaker.dart'; class PlayArea extends RectangleComponent with HasGameReference { PlayArea() - : super( - paint: Paint()..color = const Color(0xfff2e8cf), - children: [RectangleHitbox()], - ); + : super( + paint: Paint()..color = const Color(0xfff2e8cf), + children: [RectangleHitbox()], + ); @override FutureOr onLoad() async { diff --git a/brick_breaker/step_10/lib/src/widgets/game_app.dart b/brick_breaker/step_10/lib/src/widgets/game_app.dart index 05baa65dec..7d77cdc3b4 100644 --- a/brick_breaker/step_10/lib/src/widgets/game_app.dart +++ b/brick_breaker/step_10/lib/src/widgets/game_app.dart @@ -43,10 +43,7 @@ class _GameAppState extends State { gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, - colors: [ - Color(0xffa9d6e5), - Color(0xfff2e8cf), - ], + colors: [Color(0xffa9d6e5), Color(0xfff2e8cf)], ), ), child: SafeArea( @@ -64,18 +61,18 @@ class _GameAppState extends State { child: GameWidget( game: game, overlayBuilderMap: { - PlayState.welcome.name: (context, game) => - const OverlayScreen( + PlayState.welcome.name: + (context, game) => const OverlayScreen( title: 'TAP TO PLAY', subtitle: 'Use arrow keys or swipe', ), - PlayState.gameOver.name: (context, game) => - const OverlayScreen( + PlayState.gameOver.name: + (context, game) => const OverlayScreen( title: 'G A M E O V E R', subtitle: 'Tap to Play Again', ), - PlayState.won.name: (context, game) => - const OverlayScreen( + PlayState.won.name: + (context, game) => const OverlayScreen( title: 'Y O U W O N ! ! !', subtitle: 'Tap to Play Again', ), diff --git a/brick_breaker/step_10/lib/src/widgets/overlay_screen.dart b/brick_breaker/step_10/lib/src/widgets/overlay_screen.dart index c01bd98707..0c3debc738 100644 --- a/brick_breaker/step_10/lib/src/widgets/overlay_screen.dart +++ b/brick_breaker/step_10/lib/src/widgets/overlay_screen.dart @@ -6,11 +6,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_animate/flutter_animate.dart'; class OverlayScreen extends StatelessWidget { - const OverlayScreen({ - super.key, - required this.title, - required this.subtitle, - }); + const OverlayScreen({super.key, required this.title, required this.subtitle}); final String title; final String subtitle; @@ -27,10 +23,7 @@ class OverlayScreen extends StatelessWidget { style: Theme.of(context).textTheme.headlineLarge, ).animate().slideY(duration: 750.ms, begin: -3, end: 0), const SizedBox(height: 16), - Text( - subtitle, - style: Theme.of(context).textTheme.headlineSmall, - ) + Text(subtitle, style: Theme.of(context).textTheme.headlineSmall) .animate(onPlay: (controller) => controller.repeat()) .fadeIn(duration: 1.seconds) .then() diff --git a/brick_breaker/step_10/lib/src/widgets/score_card.dart b/brick_breaker/step_10/lib/src/widgets/score_card.dart index 97183998b3..cd84853ea6 100644 --- a/brick_breaker/step_10/lib/src/widgets/score_card.dart +++ b/brick_breaker/step_10/lib/src/widgets/score_card.dart @@ -5,10 +5,7 @@ import 'package:flutter/material.dart'; class ScoreCard extends StatelessWidget { - const ScoreCard({ - super.key, - required this.score, - }); + const ScoreCard({super.key, required this.score}); final ValueNotifier score; diff --git a/brick_breaker/step_10/macos/Podfile b/brick_breaker/step_10/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/brick_breaker/step_10/macos/Podfile +++ b/brick_breaker/step_10/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/brick_breaker/step_10/macos/Runner.xcodeproj/project.pbxproj b/brick_breaker/step_10/macos/Runner.xcodeproj/project.pbxproj index 40114f2ccc..842f876fb0 100644 --- a/brick_breaker/step_10/macos/Runner.xcodeproj/project.pbxproj +++ b/brick_breaker/step_10/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32125D87D9AB716E4032EAC /* Pods_Runner.framework */; }; + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */; }; + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9A33208464070F2037910E11 /* Pods_RunnerTests.framework in Frameworks */, + 215F1954D53F3988FDDC14DA /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 292415EF540ABF53183CE6B2 /* Pods_Runner.framework in Frameworks */, + C41627A31BEAF63BA3FCD646 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 5BF2D3DD257D8F196721A865 /* Pods */, + 34AF9719A2D3204F77BC17D5 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 5BF2D3DD257D8F196721A865 /* Pods */ = { + 34AF9719A2D3204F77BC17D5 /* Pods */ = { isa = PBXGroup; children = ( - 09F1FBF8EDBB4B12A14E9A11 /* Pods-Runner.debug.xcconfig */, - 7142BE46FDCF547A1D0145E4 /* Pods-Runner.release.xcconfig */, - 56BF76FB16707F4EDD26E654 /* Pods-Runner.profile.xcconfig */, - A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */, - 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */, - 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */, + 691610D66843FCEC5E99A645 /* Pods-Runner.debug.xcconfig */, + 2766AA7629F1F2B766629845 /* Pods-Runner.release.xcconfig */, + D253DE42747AF0D92B2D3E47 /* Pods-Runner.profile.xcconfig */, + 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */, + 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */, + 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - E32125D87D9AB716E4032EAC /* Pods_Runner.framework */, - 8092E7B00A232AA44D73F162 /* Pods_RunnerTests.framework */, + 79AF180B00B3C09728CE7C0C /* Pods_Runner.framework */, + B68DFEE5136BAD98E573753B /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */, + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */, + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */, + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,29 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 14ED52A621E192122D03DF9C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 178C329924211189EBD4F9C2 /* [CP] Check Pods Manifest.lock */ = { + 151A6989622691F6FE792DC0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -367,7 +345,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 1C3E8B4149A8C6E277A3BB44 /* [CP] Embed Pods Frameworks */ = { + 2E692C9D055E1954F2F94F23 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -422,6 +400,28 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + D335459AF3E1CEA3FD97B2C9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A9587A4895BB75E1A2DFFD61 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 753B2C805A97D0EA2638BA7B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 092BB946FE8DA5145A13FDE6 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 802E86D9E62918822B73B662 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8408D8BB8235F89E728D481C /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D898CD30AAB8C7D811F9B7E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/brick_breaker/step_10/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/brick_breaker/step_10/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7d5c483de3..bbc7e1a860 100644 --- a/brick_breaker/step_10/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/brick_breaker/step_10/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/brick_breaker/step_10/pubspec.yaml b/brick_breaker/step_10/pubspec.yaml index 2ca72ae8ec..5887daad08 100644 --- a/brick_breaker/step_10/pubspec.yaml +++ b/brick_breaker/step_10/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flame: ^1.18.0 diff --git a/dart-patterns-and-records/codelab_rebuild.yaml b/dart-patterns-and-records/codelab_rebuild.yaml index def272a90e..a59cda0e3a 100644 --- a/dart-patterns-and-records/codelab_rebuild.yaml +++ b/dart-patterns-and-records/codelab_rebuild.yaml @@ -44,6 +44,9 @@ steps: } ] } + - name: Format lib/main.dart + path: patterns_codelab + dart: format lib/main.dart - name: Patch lib/main.dart path: patterns_codelab/lib/main.dart patch-u: | @@ -57,28 +60,6 @@ steps: import 'package:flutter/material.dart'; void main() { - - name: Replace pubspec.yaml - path: patterns_codelab/pubspec.yaml - replace-contents: | - name: patterns_codelab - description: "A new Flutter project." - publish_to: 'none' - version: 0.1.0 - - environment: - sdk: ^3.6.2 - - dependencies: - flutter: - sdk: flutter - - dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^4.0.0 - - flutter: - uses-material-design: true - name: Build web app path: patterns_codelab flutter: build web @@ -136,50 +117,37 @@ steps: // Copyright 2023 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import 'data.dart'; - + void main() { runApp(const DocumentApp()); } - + class DocumentApp extends StatelessWidget { const DocumentApp({super.key}); - + @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } - + class DocumentScreen extends StatelessWidget { final Document document; - - const DocumentScreen({ - required this.document, - super.key, - }); - + + const DocumentScreen({required this.document, super.key}); + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Title goes here'), - ), - body: const Column( - children: [ - Center( - child: Text('Body goes here'), - ), - ], - ), + appBar: AppBar(title: const Text('Title goes here')), + body: const Column(children: [Center(child: Text('Body goes here'))]), ); } } @@ -221,28 +189,24 @@ steps: patch-u: | --- b/dart-patterns-and-records/step_05/lib/main.dart +++ a/dart-patterns-and-records/step_05/lib/main.dart - @@ -34,14 +34,18 @@ class DocumentScreen extends StatelessWidget { + @@ -29,9 +29,15 @@ class DocumentScreen extends StatelessWidget { @override Widget build(BuildContext context) { + final metadataRecord = document.metadata; + return Scaffold( - appBar: AppBar( - - title: const Text('Title goes here'), - + title: Text(metadataRecord.$1), - ), - - body: const Column( + - appBar: AppBar(title: const Text('Title goes here')), + - body: const Column(children: [Center(child: Text('Body goes here'))]), + + appBar: AppBar(title: Text(metadataRecord.$1)), + body: Column( - children: [ - Center( - - child: Text('Body goes here'), - + child: Text( - + 'Last modified ${metadataRecord.modified}', - + ), - ), - ], - ), + + children: [ + + Center(child: Text('Last modified ${metadataRecord.modified}')), + + ], + + ), + ); + } + } - name: Build web app path: patterns_codelab flutter: build web @@ -262,7 +226,7 @@ steps: patch-u: | --- b/dart-patterns-and-records/step_06_a/lib/main.dart +++ a/dart-patterns-and-records/step_06_a/lib/main.dart - @@ -34,17 +34,17 @@ class DocumentScreen extends StatelessWidget { + @@ -29,15 +29,11 @@ class DocumentScreen extends StatelessWidget { @override Widget build(BuildContext context) { @@ -270,19 +234,17 @@ steps: + final (title, modified: modified) = document.metadata; return Scaffold( - appBar: AppBar( - - title: Text(metadataRecord.$1), - + title: Text(title), - ), - body: Column( - children: [ - Center( - child: Text( - - 'Last modified ${metadataRecord.modified}', - + 'Last modified $modified', - ), - ), - ], + - appBar: AppBar(title: Text(metadataRecord.$1)), + - body: Column( + - children: [ + - Center(child: Text('Last modified ${metadataRecord.modified}')), + - ], + - ), + + appBar: AppBar(title: Text(title)), + + body: Column(children: [Center(child: Text('Last modified $modified'))]), + ); + } + } - name: Build web app path: patterns_codelab flutter: build web @@ -302,7 +264,7 @@ steps: patch-u: | --- b/dart-patterns-and-records/step_06_b/lib/main.dart +++ a/dart-patterns-and-records/step_06_b/lib/main.dart - @@ -34,7 +34,7 @@ class DocumentScreen extends StatelessWidget { + @@ -29,7 +29,7 @@ class DocumentScreen extends StatelessWidget { @override Widget build(BuildContext context) { @@ -310,7 +272,7 @@ steps: + final (title, :modified) = document.metadata; return Scaffold( - appBar: AppBar( + appBar: AppBar(title: Text(title)), - name: Build web app path: patterns_codelab flutter: build web @@ -330,7 +292,7 @@ steps: patch-u: | --- b/dart-patterns-and-records/step_07_a/lib/data.dart +++ a/dart-patterns-and-records/step_07_a/lib/data.dart - @@ -9,10 +9,16 @@ class Document { + @@ -9,10 +9,17 @@ class Document { Document() : _json = jsonDecode(documentJson); (String, {DateTime modified}) get metadata { @@ -342,8 +304,9 @@ steps: + final metadataJson = _json['metadata']; + if (metadataJson is Map) { + final title = metadataJson['title'] as String; - + final localModified = - + DateTime.parse(metadataJson['modified'] as String); + + final localModified = DateTime.parse( + + metadataJson['modified'] as String, + + ); + return (title, modified: localModified); + } + } @@ -369,7 +332,7 @@ steps: patch-u: | --- b/dart-patterns-and-records/step_07_b/lib/data.dart +++ a/dart-patterns-and-records/step_07_b/lib/data.dart - @@ -9,16 +9,17 @@ class Document { + @@ -9,17 +9,13 @@ class Document { Document() : _json = jsonDecode(documentJson); (String, {DateTime modified}) get metadata { @@ -377,17 +340,14 @@ steps: - final metadataJson = _json['metadata']; - if (metadataJson is Map) { - final title = metadataJson['title'] as String; - - final localModified = - - DateTime.parse(metadataJson['modified'] as String); + - final localModified = DateTime.parse( + - metadataJson['modified'] as String, + - ); - return (title, modified: localModified); - } - + if (_json - + case { - + 'metadata': { - + 'title': String title, - + 'modified': String localModified, - + } - + }) { + + if (_json case { + + 'metadata': {'title': String title, 'modified': String localModified}, + + }) { + return (title, modified: DateTime.parse(localModified)); + } else { + throw const FormatException('Unexpected JSON'); @@ -414,7 +374,7 @@ steps: patch-u: | --- b/dart-patterns-and-records/step_08/lib/data.dart +++ a/dart-patterns-and-records/step_08/lib/data.dart - @@ -21,6 +21,14 @@ class Document { + @@ -17,6 +17,14 @@ class Document { throw const FormatException('Unexpected JSON'); } } @@ -429,7 +389,7 @@ steps: } const documentJson = ''' - @@ -46,3 +56,17 @@ const documentJson = ''' + @@ -42,3 +50,17 @@ const documentJson = ''' ] } '''; @@ -466,21 +426,17 @@ steps: patch-u: | --- b/dart-patterns-and-records/step_09/lib/main.dart +++ a/dart-patterns-and-records/step_09/lib/main.dart - @@ -35,6 +35,7 @@ class DocumentScreen extends StatelessWidget { + @@ -30,10 +30,47 @@ class DocumentScreen extends StatelessWidget { @override Widget build(BuildContext context) { final (title, :modified) = document.metadata; + final blocks = document.getBlocks(); return Scaffold( - appBar: AppBar( - @@ -42,9 +43,13 @@ class DocumentScreen extends StatelessWidget { - ), - body: Column( - children: [ - - Center( - - child: Text( - - 'Last modified $modified', + appBar: AppBar(title: Text(title)), + - body: Column(children: [Center(child: Text('Last modified $modified'))]), + + body: Column( + + children: [ + Text('Last modified: $modified'), + Expanded( + child: ListView.builder( @@ -488,21 +444,18 @@ steps: + itemBuilder: (context, index) { + return BlockWidget(block: blocks[index]); + }, - ), - ), - ], - @@ -52,3 +57,33 @@ class DocumentScreen extends StatelessWidget { - ); - } - } + + ), + + ), + + ], + + ), + + ); + + } + +} + +class BlockWidget extends StatelessWidget { + final Block block; + - + const BlockWidget({ - + required this.block, - + super.key, - + }); + + const BlockWidget({required this.block, super.key}); + + @override + Widget build(BuildContext context) { @@ -518,13 +471,10 @@ steps: + + return Container( + margin: const EdgeInsets.all(8), - + child: Text( - + block.text, - + style: textStyle, - + ), - + ); - + } - +} + + child: Text(block.text, style: textStyle), + ); + } + } - name: Build web app path: patterns_codelab flutter: build web @@ -544,7 +494,7 @@ steps: patch-u: | --- b/dart-patterns-and-records/step_10/lib/main.dart +++ a/dart-patterns-and-records/step_10/lib/main.dart - @@ -69,14 +69,11 @@ class BlockWidget extends StatelessWidget { + @@ -59,14 +59,11 @@ class BlockWidget extends StatelessWidget { @override Widget build(BuildContext context) { TextStyle? textStyle; @@ -559,7 +509,7 @@ steps: + textStyle = switch (block.type) { + 'h1' => Theme.of(context).textTheme.displayMedium, + 'p' || 'checkbox' => Theme.of(context).textTheme.bodyMedium, - + _ => Theme.of(context).textTheme.bodySmall + + _ => Theme.of(context).textTheme.bodySmall, + }; return Container( @@ -631,7 +581,7 @@ steps: Duration(inDays: final days, isNegative: true) => '${days.abs()} days ago', Duration(inDays: final days) => '$days days from now', }; - @@ -48,6 +51,7 @@ class DocumentScreen extends StatelessWidget { + @@ -43,13 +46,14 @@ class DocumentScreen extends StatelessWidget { @override Widget build(BuildContext context) { final (title, :modified) = document.metadata; @@ -639,8 +589,7 @@ steps: final blocks = document.getBlocks(); return Scaffold( - @@ -56,7 +60,7 @@ class DocumentScreen extends StatelessWidget { - ), + appBar: AppBar(title: Text(title)), body: Column( children: [ - Text('Last modified: $modified'), @@ -667,7 +616,7 @@ steps: patch-u: | --- b/dart-patterns-and-records/step_12/lib/data.dart +++ a/dart-patterns-and-records/step_12/lib/data.dart - @@ -55,16 +55,32 @@ const documentJson = ''' + @@ -51,16 +51,32 @@ const documentJson = ''' } '''; @@ -715,7 +664,7 @@ steps: patch-u: | --- b/dart-patterns-and-records/step_12/lib/main.dart +++ a/dart-patterns-and-records/step_12/lib/main.dart - @@ -85,19 +85,21 @@ class BlockWidget extends StatelessWidget { + @@ -75,16 +75,18 @@ class BlockWidget extends StatelessWidget { @override Widget build(BuildContext context) { @@ -723,27 +672,21 @@ steps: - textStyle = switch (block.type) { - 'h1' => Theme.of(context).textTheme.displayMedium, - 'p' || 'checkbox' => Theme.of(context).textTheme.bodyMedium, - - _ => Theme.of(context).textTheme.bodySmall + - _ => Theme.of(context).textTheme.bodySmall, - }; - return Container( margin: const EdgeInsets.all(8), - - child: Text( - - block.text, - - style: textStyle, - - ), + - child: Text(block.text, style: textStyle), + child: switch (block) { + HeaderBlock(:final text) => Text( - + text, - + style: Theme.of(context).textTheme.displayMedium, - + ), + + text, + + style: Theme.of(context).textTheme.displayMedium, + + ), + ParagraphBlock(:final text) => Text(text), + CheckboxBlock(:final text, :final isChecked) => Row( - + children: [ - + Checkbox(value: isChecked, onChanged: (_) {}), - + Text(text), - + ], - + ), + + children: [Checkbox(value: isChecked, onChanged: (_) {}), Text(text)], + + ), + }, ); } diff --git a/dart-patterns-and-records/step_03/android/.gitignore b/dart-patterns-and-records/step_03/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_03/android/.gitignore +++ b/dart-patterns-and-records/step_03/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_03/android/app/build.gradle b/dart-patterns-and-records/step_03/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_03/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_03/android/app/build.gradle.kts b/dart-patterns-and-records/step_03/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_03/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_03/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_03/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_03/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_03/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_03/android/build.gradle b/dart-patterns-and-records/step_03/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_03/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_03/android/build.gradle.kts b/dart-patterns-and-records/step_03/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_03/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_03/android/gradle.properties b/dart-patterns-and-records/step_03/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_03/android/gradle.properties +++ b/dart-patterns-and-records/step_03/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_03/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_03/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_03/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_03/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_03/android/settings.gradle b/dart-patterns-and-records/step_03/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_03/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_03/android/settings.gradle.kts b/dart-patterns-and-records/step_03/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_03/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_03/lib/main.dart b/dart-patterns-and-records/step_03/lib/main.dart index 728fc8e605..ed6086b220 100644 --- a/dart-patterns-and-records/step_03/lib/main.dart +++ b/dart-patterns-and-records/step_03/lib/main.dart @@ -14,11 +14,7 @@ class MainApp extends StatelessWidget { @override Widget build(BuildContext context) { return const MaterialApp( - home: Scaffold( - body: Center( - child: Text('Hello World!'), - ), - ), + home: Scaffold(body: Center(child: Text('Hello World!'))), ); } } diff --git a/dart-patterns-and-records/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_03/pubspec.yaml b/dart-patterns-and-records/step_03/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_03/pubspec.yaml +++ b/dart-patterns-and-records/step_03/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/dart-patterns-and-records/step_04/android/.gitignore b/dart-patterns-and-records/step_04/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_04/android/.gitignore +++ b/dart-patterns-and-records/step_04/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_04/android/app/build.gradle b/dart-patterns-and-records/step_04/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_04/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_04/android/app/build.gradle.kts b/dart-patterns-and-records/step_04/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_04/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_04/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_04/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_04/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_04/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_04/android/build.gradle b/dart-patterns-and-records/step_04/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_04/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_04/android/build.gradle.kts b/dart-patterns-and-records/step_04/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_04/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_04/android/gradle.properties b/dart-patterns-and-records/step_04/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_04/android/gradle.properties +++ b/dart-patterns-and-records/step_04/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_04/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_04/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_04/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_04/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_04/android/settings.gradle b/dart-patterns-and-records/step_04/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_04/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_04/android/settings.gradle.kts b/dart-patterns-and-records/step_04/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_04/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_04/lib/main.dart b/dart-patterns-and-records/step_04/lib/main.dart index 37af7b2f85..9d75aada1c 100644 --- a/dart-patterns-and-records/step_04/lib/main.dart +++ b/dart-patterns-and-records/step_04/lib/main.dart @@ -17,9 +17,7 @@ class DocumentApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } @@ -27,24 +25,13 @@ class DocumentApp extends StatelessWidget { class DocumentScreen extends StatelessWidget { final Document document; - const DocumentScreen({ - required this.document, - super.key, - }); + const DocumentScreen({required this.document, super.key}); @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Title goes here'), - ), - body: const Column( - children: [ - Center( - child: Text('Body goes here'), - ), - ], - ), + appBar: AppBar(title: const Text('Title goes here')), + body: const Column(children: [Center(child: Text('Body goes here'))]), ); } } diff --git a/dart-patterns-and-records/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_04/pubspec.yaml b/dart-patterns-and-records/step_04/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_04/pubspec.yaml +++ b/dart-patterns-and-records/step_04/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/dart-patterns-and-records/step_05/android/.gitignore b/dart-patterns-and-records/step_05/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_05/android/.gitignore +++ b/dart-patterns-and-records/step_05/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_05/android/app/build.gradle b/dart-patterns-and-records/step_05/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_05/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_05/android/app/build.gradle.kts b/dart-patterns-and-records/step_05/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_05/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_05/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_05/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_05/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_05/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_05/android/build.gradle b/dart-patterns-and-records/step_05/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_05/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_05/android/build.gradle.kts b/dart-patterns-and-records/step_05/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_05/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_05/android/gradle.properties b/dart-patterns-and-records/step_05/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_05/android/gradle.properties +++ b/dart-patterns-and-records/step_05/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_05/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_05/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_05/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_05/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_05/android/settings.gradle b/dart-patterns-and-records/step_05/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_05/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_05/android/settings.gradle.kts b/dart-patterns-and-records/step_05/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_05/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_05/lib/main.dart b/dart-patterns-and-records/step_05/lib/main.dart index db4ef74f63..c0338645b7 100644 --- a/dart-patterns-and-records/step_05/lib/main.dart +++ b/dart-patterns-and-records/step_05/lib/main.dart @@ -17,9 +17,7 @@ class DocumentApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } @@ -27,26 +25,17 @@ class DocumentApp extends StatelessWidget { class DocumentScreen extends StatelessWidget { final Document document; - const DocumentScreen({ - required this.document, - super.key, - }); + const DocumentScreen({required this.document, super.key}); @override Widget build(BuildContext context) { final metadataRecord = document.metadata; return Scaffold( - appBar: AppBar( - title: Text(metadataRecord.$1), - ), + appBar: AppBar(title: Text(metadataRecord.$1)), body: Column( children: [ - Center( - child: Text( - 'Last modified ${metadataRecord.modified}', - ), - ), + Center(child: Text('Last modified ${metadataRecord.modified}')), ], ), ); diff --git a/dart-patterns-and-records/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_05/pubspec.yaml b/dart-patterns-and-records/step_05/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_05/pubspec.yaml +++ b/dart-patterns-and-records/step_05/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/dart-patterns-and-records/step_06_a/android/.gitignore b/dart-patterns-and-records/step_06_a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_06_a/android/.gitignore +++ b/dart-patterns-and-records/step_06_a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_06_a/android/app/build.gradle b/dart-patterns-and-records/step_06_a/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_06_a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_06_a/android/app/build.gradle.kts b/dart-patterns-and-records/step_06_a/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_06_a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_06_a/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_06_a/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_06_a/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_06_a/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_06_a/android/build.gradle b/dart-patterns-and-records/step_06_a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_06_a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_06_a/android/build.gradle.kts b/dart-patterns-and-records/step_06_a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_06_a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_06_a/android/gradle.properties b/dart-patterns-and-records/step_06_a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_06_a/android/gradle.properties +++ b/dart-patterns-and-records/step_06_a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_06_a/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_06_a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_06_a/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_06_a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_06_a/android/settings.gradle b/dart-patterns-and-records/step_06_a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_06_a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_06_a/android/settings.gradle.kts b/dart-patterns-and-records/step_06_a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_06_a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_06_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_06_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_06_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_06_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_06_a/lib/main.dart b/dart-patterns-and-records/step_06_a/lib/main.dart index 5e8429d07d..d2005bf08a 100644 --- a/dart-patterns-and-records/step_06_a/lib/main.dart +++ b/dart-patterns-and-records/step_06_a/lib/main.dart @@ -17,9 +17,7 @@ class DocumentApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } @@ -27,28 +25,15 @@ class DocumentApp extends StatelessWidget { class DocumentScreen extends StatelessWidget { final Document document; - const DocumentScreen({ - required this.document, - super.key, - }); + const DocumentScreen({required this.document, super.key}); @override Widget build(BuildContext context) { final (title, modified: modified) = document.metadata; return Scaffold( - appBar: AppBar( - title: Text(title), - ), - body: Column( - children: [ - Center( - child: Text( - 'Last modified $modified', - ), - ), - ], - ), + appBar: AppBar(title: Text(title)), + body: Column(children: [Center(child: Text('Last modified $modified'))]), ); } } diff --git a/dart-patterns-and-records/step_06_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_06_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_06_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_06_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_06_a/pubspec.yaml b/dart-patterns-and-records/step_06_a/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_06_a/pubspec.yaml +++ b/dart-patterns-and-records/step_06_a/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/dart-patterns-and-records/step_06_b/android/.gitignore b/dart-patterns-and-records/step_06_b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_06_b/android/.gitignore +++ b/dart-patterns-and-records/step_06_b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_06_b/android/app/build.gradle b/dart-patterns-and-records/step_06_b/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_06_b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_06_b/android/app/build.gradle.kts b/dart-patterns-and-records/step_06_b/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_06_b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_06_b/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_06_b/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_06_b/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_06_b/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_06_b/android/build.gradle b/dart-patterns-and-records/step_06_b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_06_b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_06_b/android/build.gradle.kts b/dart-patterns-and-records/step_06_b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_06_b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_06_b/android/gradle.properties b/dart-patterns-and-records/step_06_b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_06_b/android/gradle.properties +++ b/dart-patterns-and-records/step_06_b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_06_b/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_06_b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_06_b/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_06_b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_06_b/android/settings.gradle b/dart-patterns-and-records/step_06_b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_06_b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_06_b/android/settings.gradle.kts b/dart-patterns-and-records/step_06_b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_06_b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_06_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_06_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_06_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_06_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_06_b/lib/main.dart b/dart-patterns-and-records/step_06_b/lib/main.dart index 93691593a8..cfa76ab634 100644 --- a/dart-patterns-and-records/step_06_b/lib/main.dart +++ b/dart-patterns-and-records/step_06_b/lib/main.dart @@ -17,9 +17,7 @@ class DocumentApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } @@ -27,28 +25,15 @@ class DocumentApp extends StatelessWidget { class DocumentScreen extends StatelessWidget { final Document document; - const DocumentScreen({ - required this.document, - super.key, - }); + const DocumentScreen({required this.document, super.key}); @override Widget build(BuildContext context) { final (title, :modified) = document.metadata; return Scaffold( - appBar: AppBar( - title: Text(title), - ), - body: Column( - children: [ - Center( - child: Text( - 'Last modified $modified', - ), - ), - ], - ), + appBar: AppBar(title: Text(title)), + body: Column(children: [Center(child: Text('Last modified $modified'))]), ); } } diff --git a/dart-patterns-and-records/step_06_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_06_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_06_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_06_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_06_b/pubspec.yaml b/dart-patterns-and-records/step_06_b/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_06_b/pubspec.yaml +++ b/dart-patterns-and-records/step_06_b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/dart-patterns-and-records/step_07_a/android/.gitignore b/dart-patterns-and-records/step_07_a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_07_a/android/.gitignore +++ b/dart-patterns-and-records/step_07_a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_07_a/android/app/build.gradle b/dart-patterns-and-records/step_07_a/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_07_a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_07_a/android/app/build.gradle.kts b/dart-patterns-and-records/step_07_a/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_07_a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_07_a/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_07_a/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_07_a/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_07_a/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_07_a/android/build.gradle b/dart-patterns-and-records/step_07_a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_07_a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_07_a/android/build.gradle.kts b/dart-patterns-and-records/step_07_a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_07_a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_07_a/android/gradle.properties b/dart-patterns-and-records/step_07_a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_07_a/android/gradle.properties +++ b/dart-patterns-and-records/step_07_a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_07_a/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_07_a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_07_a/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_07_a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_07_a/android/settings.gradle b/dart-patterns-and-records/step_07_a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_07_a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_07_a/android/settings.gradle.kts b/dart-patterns-and-records/step_07_a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_07_a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_07_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_07_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_07_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_07_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_07_a/lib/data.dart b/dart-patterns-and-records/step_07_a/lib/data.dart index 4ef388a4be..747a0d1de6 100644 --- a/dart-patterns-and-records/step_07_a/lib/data.dart +++ b/dart-patterns-and-records/step_07_a/lib/data.dart @@ -13,8 +13,9 @@ class Document { final metadataJson = _json['metadata']; if (metadataJson is Map) { final title = metadataJson['title'] as String; - final localModified = - DateTime.parse(metadataJson['modified'] as String); + final localModified = DateTime.parse( + metadataJson['modified'] as String, + ); return (title, modified: localModified); } } diff --git a/dart-patterns-and-records/step_07_a/lib/main.dart b/dart-patterns-and-records/step_07_a/lib/main.dart index 93691593a8..cfa76ab634 100644 --- a/dart-patterns-and-records/step_07_a/lib/main.dart +++ b/dart-patterns-and-records/step_07_a/lib/main.dart @@ -17,9 +17,7 @@ class DocumentApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } @@ -27,28 +25,15 @@ class DocumentApp extends StatelessWidget { class DocumentScreen extends StatelessWidget { final Document document; - const DocumentScreen({ - required this.document, - super.key, - }); + const DocumentScreen({required this.document, super.key}); @override Widget build(BuildContext context) { final (title, :modified) = document.metadata; return Scaffold( - appBar: AppBar( - title: Text(title), - ), - body: Column( - children: [ - Center( - child: Text( - 'Last modified $modified', - ), - ), - ], - ), + appBar: AppBar(title: Text(title)), + body: Column(children: [Center(child: Text('Last modified $modified'))]), ); } } diff --git a/dart-patterns-and-records/step_07_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_07_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_07_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_07_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_07_a/pubspec.yaml b/dart-patterns-and-records/step_07_a/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_07_a/pubspec.yaml +++ b/dart-patterns-and-records/step_07_a/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/dart-patterns-and-records/step_07_b/android/.gitignore b/dart-patterns-and-records/step_07_b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_07_b/android/.gitignore +++ b/dart-patterns-and-records/step_07_b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_07_b/android/app/build.gradle b/dart-patterns-and-records/step_07_b/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_07_b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_07_b/android/app/build.gradle.kts b/dart-patterns-and-records/step_07_b/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_07_b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_07_b/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_07_b/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_07_b/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_07_b/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_07_b/android/build.gradle b/dart-patterns-and-records/step_07_b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_07_b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_07_b/android/build.gradle.kts b/dart-patterns-and-records/step_07_b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_07_b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_07_b/android/gradle.properties b/dart-patterns-and-records/step_07_b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_07_b/android/gradle.properties +++ b/dart-patterns-and-records/step_07_b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_07_b/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_07_b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_07_b/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_07_b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_07_b/android/settings.gradle b/dart-patterns-and-records/step_07_b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_07_b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_07_b/android/settings.gradle.kts b/dart-patterns-and-records/step_07_b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_07_b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_07_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_07_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_07_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_07_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_07_b/lib/data.dart b/dart-patterns-and-records/step_07_b/lib/data.dart index 50a95384d8..094e2ce2c1 100644 --- a/dart-patterns-and-records/step_07_b/lib/data.dart +++ b/dart-patterns-and-records/step_07_b/lib/data.dart @@ -9,13 +9,9 @@ class Document { Document() : _json = jsonDecode(documentJson); (String, {DateTime modified}) get metadata { - if (_json - case { - 'metadata': { - 'title': String title, - 'modified': String localModified, - } - }) { + if (_json case { + 'metadata': {'title': String title, 'modified': String localModified}, + }) { return (title, modified: DateTime.parse(localModified)); } else { throw const FormatException('Unexpected JSON'); diff --git a/dart-patterns-and-records/step_07_b/lib/main.dart b/dart-patterns-and-records/step_07_b/lib/main.dart index 93691593a8..cfa76ab634 100644 --- a/dart-patterns-and-records/step_07_b/lib/main.dart +++ b/dart-patterns-and-records/step_07_b/lib/main.dart @@ -17,9 +17,7 @@ class DocumentApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } @@ -27,28 +25,15 @@ class DocumentApp extends StatelessWidget { class DocumentScreen extends StatelessWidget { final Document document; - const DocumentScreen({ - required this.document, - super.key, - }); + const DocumentScreen({required this.document, super.key}); @override Widget build(BuildContext context) { final (title, :modified) = document.metadata; return Scaffold( - appBar: AppBar( - title: Text(title), - ), - body: Column( - children: [ - Center( - child: Text( - 'Last modified $modified', - ), - ), - ], - ), + appBar: AppBar(title: Text(title)), + body: Column(children: [Center(child: Text('Last modified $modified'))]), ); } } diff --git a/dart-patterns-and-records/step_07_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_07_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_07_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_07_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_07_b/pubspec.yaml b/dart-patterns-and-records/step_07_b/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_07_b/pubspec.yaml +++ b/dart-patterns-and-records/step_07_b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/dart-patterns-and-records/step_08/android/.gitignore b/dart-patterns-and-records/step_08/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_08/android/.gitignore +++ b/dart-patterns-and-records/step_08/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_08/android/app/build.gradle b/dart-patterns-and-records/step_08/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_08/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_08/android/app/build.gradle.kts b/dart-patterns-and-records/step_08/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_08/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_08/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_08/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_08/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_08/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_08/android/build.gradle b/dart-patterns-and-records/step_08/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_08/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_08/android/build.gradle.kts b/dart-patterns-and-records/step_08/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_08/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_08/android/gradle.properties b/dart-patterns-and-records/step_08/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_08/android/gradle.properties +++ b/dart-patterns-and-records/step_08/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_08/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_08/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_08/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_08/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_08/android/settings.gradle b/dart-patterns-and-records/step_08/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_08/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_08/android/settings.gradle.kts b/dart-patterns-and-records/step_08/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_08/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_08/lib/data.dart b/dart-patterns-and-records/step_08/lib/data.dart index e18825beed..f4ddd1af46 100644 --- a/dart-patterns-and-records/step_08/lib/data.dart +++ b/dart-patterns-and-records/step_08/lib/data.dart @@ -9,13 +9,9 @@ class Document { Document() : _json = jsonDecode(documentJson); (String, {DateTime modified}) get metadata { - if (_json - case { - 'metadata': { - 'title': String title, - 'modified': String localModified, - } - }) { + if (_json case { + 'metadata': {'title': String title, 'modified': String localModified}, + }) { return (title, modified: DateTime.parse(localModified)); } else { throw const FormatException('Unexpected JSON'); diff --git a/dart-patterns-and-records/step_08/lib/main.dart b/dart-patterns-and-records/step_08/lib/main.dart index 93691593a8..cfa76ab634 100644 --- a/dart-patterns-and-records/step_08/lib/main.dart +++ b/dart-patterns-and-records/step_08/lib/main.dart @@ -17,9 +17,7 @@ class DocumentApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } @@ -27,28 +25,15 @@ class DocumentApp extends StatelessWidget { class DocumentScreen extends StatelessWidget { final Document document; - const DocumentScreen({ - required this.document, - super.key, - }); + const DocumentScreen({required this.document, super.key}); @override Widget build(BuildContext context) { final (title, :modified) = document.metadata; return Scaffold( - appBar: AppBar( - title: Text(title), - ), - body: Column( - children: [ - Center( - child: Text( - 'Last modified $modified', - ), - ), - ], - ), + appBar: AppBar(title: Text(title)), + body: Column(children: [Center(child: Text('Last modified $modified'))]), ); } } diff --git a/dart-patterns-and-records/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_08/pubspec.yaml b/dart-patterns-and-records/step_08/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_08/pubspec.yaml +++ b/dart-patterns-and-records/step_08/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/dart-patterns-and-records/step_09/android/.gitignore b/dart-patterns-and-records/step_09/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_09/android/.gitignore +++ b/dart-patterns-and-records/step_09/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_09/android/app/build.gradle b/dart-patterns-and-records/step_09/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_09/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_09/android/app/build.gradle.kts b/dart-patterns-and-records/step_09/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_09/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_09/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_09/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_09/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_09/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_09/android/build.gradle b/dart-patterns-and-records/step_09/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_09/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_09/android/build.gradle.kts b/dart-patterns-and-records/step_09/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_09/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_09/android/gradle.properties b/dart-patterns-and-records/step_09/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_09/android/gradle.properties +++ b/dart-patterns-and-records/step_09/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_09/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_09/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_09/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_09/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_09/android/settings.gradle b/dart-patterns-and-records/step_09/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_09/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_09/android/settings.gradle.kts b/dart-patterns-and-records/step_09/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_09/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_09/lib/data.dart b/dart-patterns-and-records/step_09/lib/data.dart index e18825beed..f4ddd1af46 100644 --- a/dart-patterns-and-records/step_09/lib/data.dart +++ b/dart-patterns-and-records/step_09/lib/data.dart @@ -9,13 +9,9 @@ class Document { Document() : _json = jsonDecode(documentJson); (String, {DateTime modified}) get metadata { - if (_json - case { - 'metadata': { - 'title': String title, - 'modified': String localModified, - } - }) { + if (_json case { + 'metadata': {'title': String title, 'modified': String localModified}, + }) { return (title, modified: DateTime.parse(localModified)); } else { throw const FormatException('Unexpected JSON'); diff --git a/dart-patterns-and-records/step_09/lib/main.dart b/dart-patterns-and-records/step_09/lib/main.dart index 687cf8de4c..77a76024e5 100644 --- a/dart-patterns-and-records/step_09/lib/main.dart +++ b/dart-patterns-and-records/step_09/lib/main.dart @@ -17,9 +17,7 @@ class DocumentApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } @@ -27,10 +25,7 @@ class DocumentApp extends StatelessWidget { class DocumentScreen extends StatelessWidget { final Document document; - const DocumentScreen({ - required this.document, - super.key, - }); + const DocumentScreen({required this.document, super.key}); @override Widget build(BuildContext context) { @@ -38,9 +33,7 @@ class DocumentScreen extends StatelessWidget { final blocks = document.getBlocks(); return Scaffold( - appBar: AppBar( - title: Text(title), - ), + appBar: AppBar(title: Text(title)), body: Column( children: [ Text('Last modified: $modified'), @@ -61,10 +54,7 @@ class DocumentScreen extends StatelessWidget { class BlockWidget extends StatelessWidget { final Block block; - const BlockWidget({ - required this.block, - super.key, - }); + const BlockWidget({required this.block, super.key}); @override Widget build(BuildContext context) { @@ -80,10 +70,7 @@ class BlockWidget extends StatelessWidget { return Container( margin: const EdgeInsets.all(8), - child: Text( - block.text, - style: textStyle, - ), + child: Text(block.text, style: textStyle), ); } } diff --git a/dart-patterns-and-records/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_09/pubspec.yaml b/dart-patterns-and-records/step_09/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_09/pubspec.yaml +++ b/dart-patterns-and-records/step_09/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/dart-patterns-and-records/step_10/android/.gitignore b/dart-patterns-and-records/step_10/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_10/android/.gitignore +++ b/dart-patterns-and-records/step_10/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_10/android/app/build.gradle b/dart-patterns-and-records/step_10/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_10/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_10/android/app/build.gradle.kts b/dart-patterns-and-records/step_10/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_10/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_10/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_10/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_10/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_10/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_10/android/build.gradle b/dart-patterns-and-records/step_10/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_10/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_10/android/build.gradle.kts b/dart-patterns-and-records/step_10/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_10/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_10/android/gradle.properties b/dart-patterns-and-records/step_10/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_10/android/gradle.properties +++ b/dart-patterns-and-records/step_10/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_10/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_10/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_10/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_10/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_10/android/settings.gradle b/dart-patterns-and-records/step_10/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_10/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_10/android/settings.gradle.kts b/dart-patterns-and-records/step_10/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_10/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_10/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_10/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_10/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_10/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_10/lib/data.dart b/dart-patterns-and-records/step_10/lib/data.dart index e18825beed..f4ddd1af46 100644 --- a/dart-patterns-and-records/step_10/lib/data.dart +++ b/dart-patterns-and-records/step_10/lib/data.dart @@ -9,13 +9,9 @@ class Document { Document() : _json = jsonDecode(documentJson); (String, {DateTime modified}) get metadata { - if (_json - case { - 'metadata': { - 'title': String title, - 'modified': String localModified, - } - }) { + if (_json case { + 'metadata': {'title': String title, 'modified': String localModified}, + }) { return (title, modified: DateTime.parse(localModified)); } else { throw const FormatException('Unexpected JSON'); diff --git a/dart-patterns-and-records/step_10/lib/main.dart b/dart-patterns-and-records/step_10/lib/main.dart index 97f773245f..9fd36bedd2 100644 --- a/dart-patterns-and-records/step_10/lib/main.dart +++ b/dart-patterns-and-records/step_10/lib/main.dart @@ -17,9 +17,7 @@ class DocumentApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } @@ -27,10 +25,7 @@ class DocumentApp extends StatelessWidget { class DocumentScreen extends StatelessWidget { final Document document; - const DocumentScreen({ - required this.document, - super.key, - }); + const DocumentScreen({required this.document, super.key}); @override Widget build(BuildContext context) { @@ -38,9 +33,7 @@ class DocumentScreen extends StatelessWidget { final blocks = document.getBlocks(); return Scaffold( - appBar: AppBar( - title: Text(title), - ), + appBar: AppBar(title: Text(title)), body: Column( children: [ Text('Last modified: $modified'), @@ -61,10 +54,7 @@ class DocumentScreen extends StatelessWidget { class BlockWidget extends StatelessWidget { final Block block; - const BlockWidget({ - required this.block, - super.key, - }); + const BlockWidget({required this.block, super.key}); @override Widget build(BuildContext context) { @@ -72,15 +62,12 @@ class BlockWidget extends StatelessWidget { textStyle = switch (block.type) { 'h1' => Theme.of(context).textTheme.displayMedium, 'p' || 'checkbox' => Theme.of(context).textTheme.bodyMedium, - _ => Theme.of(context).textTheme.bodySmall + _ => Theme.of(context).textTheme.bodySmall, }; return Container( margin: const EdgeInsets.all(8), - child: Text( - block.text, - style: textStyle, - ), + child: Text(block.text, style: textStyle), ); } } diff --git a/dart-patterns-and-records/step_10/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_10/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_10/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_10/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_10/pubspec.yaml b/dart-patterns-and-records/step_10/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_10/pubspec.yaml +++ b/dart-patterns-and-records/step_10/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/dart-patterns-and-records/step_11_a/android/.gitignore b/dart-patterns-and-records/step_11_a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_11_a/android/.gitignore +++ b/dart-patterns-and-records/step_11_a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_11_a/android/app/build.gradle b/dart-patterns-and-records/step_11_a/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_11_a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_11_a/android/app/build.gradle.kts b/dart-patterns-and-records/step_11_a/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_11_a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_11_a/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_11_a/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_11_a/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_11_a/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_11_a/android/build.gradle b/dart-patterns-and-records/step_11_a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_11_a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_11_a/android/build.gradle.kts b/dart-patterns-and-records/step_11_a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_11_a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_11_a/android/gradle.properties b/dart-patterns-and-records/step_11_a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_11_a/android/gradle.properties +++ b/dart-patterns-and-records/step_11_a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_11_a/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_11_a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_11_a/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_11_a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_11_a/android/settings.gradle b/dart-patterns-and-records/step_11_a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_11_a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_11_a/android/settings.gradle.kts b/dart-patterns-and-records/step_11_a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_11_a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_11_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_11_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_11_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_11_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_11_a/lib/data.dart b/dart-patterns-and-records/step_11_a/lib/data.dart index e18825beed..f4ddd1af46 100644 --- a/dart-patterns-and-records/step_11_a/lib/data.dart +++ b/dart-patterns-and-records/step_11_a/lib/data.dart @@ -9,13 +9,9 @@ class Document { Document() : _json = jsonDecode(documentJson); (String, {DateTime modified}) get metadata { - if (_json - case { - 'metadata': { - 'title': String title, - 'modified': String localModified, - } - }) { + if (_json case { + 'metadata': {'title': String title, 'modified': String localModified}, + }) { return (title, modified: DateTime.parse(localModified)); } else { throw const FormatException('Unexpected JSON'); diff --git a/dart-patterns-and-records/step_11_a/lib/main.dart b/dart-patterns-and-records/step_11_a/lib/main.dart index 702e0dd1f8..908826d30c 100644 --- a/dart-patterns-and-records/step_11_a/lib/main.dart +++ b/dart-patterns-and-records/step_11_a/lib/main.dart @@ -30,9 +30,7 @@ class DocumentApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } @@ -40,10 +38,7 @@ class DocumentApp extends StatelessWidget { class DocumentScreen extends StatelessWidget { final Document document; - const DocumentScreen({ - required this.document, - super.key, - }); + const DocumentScreen({required this.document, super.key}); @override Widget build(BuildContext context) { @@ -51,9 +46,7 @@ class DocumentScreen extends StatelessWidget { final blocks = document.getBlocks(); return Scaffold( - appBar: AppBar( - title: Text(title), - ), + appBar: AppBar(title: Text(title)), body: Column( children: [ Text('Last modified: $modified'), @@ -74,10 +67,7 @@ class DocumentScreen extends StatelessWidget { class BlockWidget extends StatelessWidget { final Block block; - const BlockWidget({ - required this.block, - super.key, - }); + const BlockWidget({required this.block, super.key}); @override Widget build(BuildContext context) { @@ -85,15 +75,12 @@ class BlockWidget extends StatelessWidget { textStyle = switch (block.type) { 'h1' => Theme.of(context).textTheme.displayMedium, 'p' || 'checkbox' => Theme.of(context).textTheme.bodyMedium, - _ => Theme.of(context).textTheme.bodySmall + _ => Theme.of(context).textTheme.bodySmall, }; return Container( margin: const EdgeInsets.all(8), - child: Text( - block.text, - style: textStyle, - ), + child: Text(block.text, style: textStyle), ); } } diff --git a/dart-patterns-and-records/step_11_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_11_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_11_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_11_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_11_a/pubspec.yaml b/dart-patterns-and-records/step_11_a/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_11_a/pubspec.yaml +++ b/dart-patterns-and-records/step_11_a/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/dart-patterns-and-records/step_11_b/android/.gitignore b/dart-patterns-and-records/step_11_b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_11_b/android/.gitignore +++ b/dart-patterns-and-records/step_11_b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_11_b/android/app/build.gradle b/dart-patterns-and-records/step_11_b/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_11_b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_11_b/android/app/build.gradle.kts b/dart-patterns-and-records/step_11_b/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_11_b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_11_b/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_11_b/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_11_b/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_11_b/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_11_b/android/build.gradle b/dart-patterns-and-records/step_11_b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_11_b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_11_b/android/build.gradle.kts b/dart-patterns-and-records/step_11_b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_11_b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_11_b/android/gradle.properties b/dart-patterns-and-records/step_11_b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_11_b/android/gradle.properties +++ b/dart-patterns-and-records/step_11_b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_11_b/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_11_b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_11_b/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_11_b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_11_b/android/settings.gradle b/dart-patterns-and-records/step_11_b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_11_b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_11_b/android/settings.gradle.kts b/dart-patterns-and-records/step_11_b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_11_b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_11_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_11_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_11_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_11_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_11_b/lib/data.dart b/dart-patterns-and-records/step_11_b/lib/data.dart index e18825beed..f4ddd1af46 100644 --- a/dart-patterns-and-records/step_11_b/lib/data.dart +++ b/dart-patterns-and-records/step_11_b/lib/data.dart @@ -9,13 +9,9 @@ class Document { Document() : _json = jsonDecode(documentJson); (String, {DateTime modified}) get metadata { - if (_json - case { - 'metadata': { - 'title': String title, - 'modified': String localModified, - } - }) { + if (_json case { + 'metadata': {'title': String title, 'modified': String localModified}, + }) { return (title, modified: DateTime.parse(localModified)); } else { throw const FormatException('Unexpected JSON'); diff --git a/dart-patterns-and-records/step_11_b/lib/main.dart b/dart-patterns-and-records/step_11_b/lib/main.dart index 0b2d175b06..7461a77fc0 100644 --- a/dart-patterns-and-records/step_11_b/lib/main.dart +++ b/dart-patterns-and-records/step_11_b/lib/main.dart @@ -33,9 +33,7 @@ class DocumentApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } @@ -43,10 +41,7 @@ class DocumentApp extends StatelessWidget { class DocumentScreen extends StatelessWidget { final Document document; - const DocumentScreen({ - required this.document, - super.key, - }); + const DocumentScreen({required this.document, super.key}); @override Widget build(BuildContext context) { @@ -55,9 +50,7 @@ class DocumentScreen extends StatelessWidget { final blocks = document.getBlocks(); return Scaffold( - appBar: AppBar( - title: Text(title), - ), + appBar: AppBar(title: Text(title)), body: Column( children: [ Text('Last modified: $formattedModifiedDate'), @@ -78,10 +71,7 @@ class DocumentScreen extends StatelessWidget { class BlockWidget extends StatelessWidget { final Block block; - const BlockWidget({ - required this.block, - super.key, - }); + const BlockWidget({required this.block, super.key}); @override Widget build(BuildContext context) { @@ -89,15 +79,12 @@ class BlockWidget extends StatelessWidget { textStyle = switch (block.type) { 'h1' => Theme.of(context).textTheme.displayMedium, 'p' || 'checkbox' => Theme.of(context).textTheme.bodyMedium, - _ => Theme.of(context).textTheme.bodySmall + _ => Theme.of(context).textTheme.bodySmall, }; return Container( margin: const EdgeInsets.all(8), - child: Text( - block.text, - style: textStyle, - ), + child: Text(block.text, style: textStyle), ); } } diff --git a/dart-patterns-and-records/step_11_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_11_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_11_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_11_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_11_b/pubspec.yaml b/dart-patterns-and-records/step_11_b/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_11_b/pubspec.yaml +++ b/dart-patterns-and-records/step_11_b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/dart-patterns-and-records/step_12/android/.gitignore b/dart-patterns-and-records/step_12/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/dart-patterns-and-records/step_12/android/.gitignore +++ b/dart-patterns-and-records/step_12/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/dart-patterns-and-records/step_12/android/app/build.gradle b/dart-patterns-and-records/step_12/android/app/build.gradle deleted file mode 100644 index 49f88182ca..0000000000 --- a/dart-patterns-and-records/step_12/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.patterns_codelab" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.patterns_codelab" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/dart-patterns-and-records/step_12/android/app/build.gradle.kts b/dart-patterns-and-records/step_12/android/app/build.gradle.kts new file mode 100644 index 0000000000..8035444a4d --- /dev/null +++ b/dart-patterns-and-records/step_12/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.patterns_codelab" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.patterns_codelab" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/dart-patterns-and-records/step_12/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt b/dart-patterns-and-records/step_12/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt index 062942413e..f322b113b7 100644 --- a/dart-patterns-and-records/step_12/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt +++ b/dart-patterns-and-records/step_12/android/app/src/main/kotlin/com/example/patterns_codelab/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.patterns_codelab import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/dart-patterns-and-records/step_12/android/build.gradle b/dart-patterns-and-records/step_12/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/dart-patterns-and-records/step_12/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/dart-patterns-and-records/step_12/android/build.gradle.kts b/dart-patterns-and-records/step_12/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/dart-patterns-and-records/step_12/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/dart-patterns-and-records/step_12/android/gradle.properties b/dart-patterns-and-records/step_12/android/gradle.properties index 2597170821..f018a61817 100644 --- a/dart-patterns-and-records/step_12/android/gradle.properties +++ b/dart-patterns-and-records/step_12/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/dart-patterns-and-records/step_12/android/gradle/wrapper/gradle-wrapper.properties b/dart-patterns-and-records/step_12/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/dart-patterns-and-records/step_12/android/gradle/wrapper/gradle-wrapper.properties +++ b/dart-patterns-and-records/step_12/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/dart-patterns-and-records/step_12/android/settings.gradle b/dart-patterns-and-records/step_12/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/dart-patterns-and-records/step_12/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/dart-patterns-and-records/step_12/android/settings.gradle.kts b/dart-patterns-and-records/step_12/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/dart-patterns-and-records/step_12/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/dart-patterns-and-records/step_12/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_12/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/dart-patterns-and-records/step_12/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_12/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_12/lib/data.dart b/dart-patterns-and-records/step_12/lib/data.dart index c31c5f3101..3e2aa39aa7 100644 --- a/dart-patterns-and-records/step_12/lib/data.dart +++ b/dart-patterns-and-records/step_12/lib/data.dart @@ -9,13 +9,9 @@ class Document { Document() : _json = jsonDecode(documentJson); (String, {DateTime modified}) get metadata { - if (_json - case { - 'metadata': { - 'title': String title, - 'modified': String localModified, - } - }) { + if (_json case { + 'metadata': {'title': String title, 'modified': String localModified}, + }) { return (title, modified: DateTime.parse(localModified)); } else { throw const FormatException('Unexpected JSON'); diff --git a/dart-patterns-and-records/step_12/lib/main.dart b/dart-patterns-and-records/step_12/lib/main.dart index 3e42d68194..049c93de52 100644 --- a/dart-patterns-and-records/step_12/lib/main.dart +++ b/dart-patterns-and-records/step_12/lib/main.dart @@ -33,9 +33,7 @@ class DocumentApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData(), - home: DocumentScreen( - document: Document(), - ), + home: DocumentScreen(document: Document()), ); } } @@ -43,10 +41,7 @@ class DocumentApp extends StatelessWidget { class DocumentScreen extends StatelessWidget { final Document document; - const DocumentScreen({ - required this.document, - super.key, - }); + const DocumentScreen({required this.document, super.key}); @override Widget build(BuildContext context) { @@ -55,9 +50,7 @@ class DocumentScreen extends StatelessWidget { final blocks = document.getBlocks(); return Scaffold( - appBar: AppBar( - title: Text(title), - ), + appBar: AppBar(title: Text(title)), body: Column( children: [ Text('Last modified: $formattedModifiedDate'), @@ -78,10 +71,7 @@ class DocumentScreen extends StatelessWidget { class BlockWidget extends StatelessWidget { final Block block; - const BlockWidget({ - required this.block, - super.key, - }); + const BlockWidget({required this.block, super.key}); @override Widget build(BuildContext context) { @@ -89,16 +79,13 @@ class BlockWidget extends StatelessWidget { margin: const EdgeInsets.all(8), child: switch (block) { HeaderBlock(:final text) => Text( - text, - style: Theme.of(context).textTheme.displayMedium, - ), + text, + style: Theme.of(context).textTheme.displayMedium, + ), ParagraphBlock(:final text) => Text(text), CheckboxBlock(:final text, :final isChecked) => Row( - children: [ - Checkbox(value: isChecked, onChanged: (_) {}), - Text(text), - ], - ), + children: [Checkbox(value: isChecked, onChanged: (_) {}), Text(text)], + ), }, ); } diff --git a/dart-patterns-and-records/step_12/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dart-patterns-and-records/step_12/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c5f4a83d76..b72a58da68 100644 --- a/dart-patterns-and-records/step_12/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dart-patterns-and-records/step_12/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/dart-patterns-and-records/step_12/pubspec.yaml b/dart-patterns-and-records/step_12/pubspec.yaml index 950fc8be80..44478e7314 100644 --- a/dart-patterns-and-records/step_12/pubspec.yaml +++ b/dart-patterns-and-records/step_12/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -13,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 flutter: uses-material-design: true diff --git a/deeplink_cookbook/android/.gitignore b/deeplink_cookbook/android/.gitignore index 6f568019d3..55afd919c6 100644 --- a/deeplink_cookbook/android/.gitignore +++ b/deeplink_cookbook/android/.gitignore @@ -7,7 +7,7 @@ gradle-wrapper.jar GeneratedPluginRegistrant.java # Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +# See https://flutter.dev/to/reference-keystore key.properties **/*.keystore **/*.jks diff --git a/deeplink_cookbook/android/app/build.gradle b/deeplink_cookbook/android/app/build.gradle deleted file mode 100644 index 972802b8c3..0000000000 --- a/deeplink_cookbook/android/app/build.gradle +++ /dev/null @@ -1,71 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion flutter.compileSdkVersion - ndkVersion flutter.ndkVersion - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.deeplink_cookbook" - // You can update the following values to match your application needs. - // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdkVersion flutter.minSdkVersion - targetSdkVersion flutter.targetSdkVersion - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" -} diff --git a/deeplink_cookbook/android/app/build.gradle.kts b/deeplink_cookbook/android/app/build.gradle.kts new file mode 100644 index 0000000000..5dc2129c82 --- /dev/null +++ b/deeplink_cookbook/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.deeplink_cookbook" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.deeplink_cookbook" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/deeplink_cookbook/android/app/src/debug/AndroidManifest.xml b/deeplink_cookbook/android/app/src/debug/AndroidManifest.xml index 44c552e60e..399f6981d5 100644 --- a/deeplink_cookbook/android/app/src/debug/AndroidManifest.xml +++ b/deeplink_cookbook/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,4 @@ - + + + + + + + diff --git a/deeplink_cookbook/android/app/src/main/kotlin/com/example/deeplink_cookbook/MainActivity.kt b/deeplink_cookbook/android/app/src/main/kotlin/com/example/deeplink_cookbook/MainActivity.kt index 9c9e60d48b..aaefd90126 100644 --- a/deeplink_cookbook/android/app/src/main/kotlin/com/example/deeplink_cookbook/MainActivity.kt +++ b/deeplink_cookbook/android/app/src/main/kotlin/com/example/deeplink_cookbook/MainActivity.kt @@ -2,5 +2,4 @@ package com.example.deeplink_cookbook import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() { -} +class MainActivity : FlutterActivity() diff --git a/deeplink_cookbook/android/app/src/profile/AndroidManifest.xml b/deeplink_cookbook/android/app/src/profile/AndroidManifest.xml index 44c552e60e..399f6981d5 100644 --- a/deeplink_cookbook/android/app/src/profile/AndroidManifest.xml +++ b/deeplink_cookbook/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,4 @@ - + - - - - - - diff --git a/deeplink_cookbook/windows/runner/utils.cpp b/deeplink_cookbook/windows/runner/utils.cpp index b2b08734db..3a0b46511a 100644 --- a/deeplink_cookbook/windows/runner/utils.cpp +++ b/deeplink_cookbook/windows/runner/utils.cpp @@ -45,13 +45,13 @@ std::string Utf8FromUtf16(const wchar_t* utf16_string) { if (utf16_string == nullptr) { return std::string(); } - int target_length = ::WideCharToMultiByte( + unsigned int target_length = ::WideCharToMultiByte( CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, -1, nullptr, 0, nullptr, nullptr) -1; // remove the trailing null character int input_length = (int)wcslen(utf16_string); std::string utf8_string; - if (target_length <= 0 || target_length > utf8_string.max_size()) { + if (target_length == 0 || target_length > utf8_string.max_size()) { return utf8_string; } utf8_string.resize(target_length); diff --git a/deeplink_cookbook/windows/runner/win32_window.cpp b/deeplink_cookbook/windows/runner/win32_window.cpp index 041a385547..60608d0fe5 100644 --- a/deeplink_cookbook/windows/runner/win32_window.cpp +++ b/deeplink_cookbook/windows/runner/win32_window.cpp @@ -60,7 +60,7 @@ class WindowClassRegistrar { public: ~WindowClassRegistrar() = default; - // Returns the singleton registar instance. + // Returns the singleton registrar instance. static WindowClassRegistrar* GetInstance() { if (!instance_) { instance_ = new WindowClassRegistrar(); diff --git a/deeplink_cookbook/windows/runner/win32_window.h b/deeplink_cookbook/windows/runner/win32_window.h index c86632d8a6..e901dde684 100644 --- a/deeplink_cookbook/windows/runner/win32_window.h +++ b/deeplink_cookbook/windows/runner/win32_window.h @@ -77,7 +77,7 @@ class Win32Window { // OS callback called by message pump. Handles the WM_NCCREATE message which // is passed when the non-client area is being created and enables automatic // non-client DPI scaling so that the non-client area automatically - // responsponds to changes in DPI. All other messages are handled by + // responds to changes in DPI. All other messages are handled by // MessageHandler. static LRESULT CALLBACK WndProc(HWND const window, UINT const message, diff --git a/ffigen_codelab/codelab_rebuild.yaml b/ffigen_codelab/codelab_rebuild.yaml index 86f23b1b65..9dc2dfb6ce 100644 --- a/ffigen_codelab/codelab_rebuild.yaml +++ b/ffigen_codelab/codelab_rebuild.yaml @@ -162,27 +162,27 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:ffigen_app/ffigen_app.dart'; import 'package:flutter/material.dart'; - + const String jsCode = '1+2'; - + void main() { runApp(const MyApp()); } - + class MyApp extends StatefulWidget { const MyApp({super.key}); - + @override State createState() => _MyAppState(); } - + class _MyAppState extends State { late Duktape duktape; String output = ''; - + @override void initState() { super.initState(); @@ -191,33 +191,27 @@ steps: output = 'Initialized Duktape'; }); } - + @override void dispose() { duktape.dispose(); super.dispose(); } - + @override Widget build(BuildContext context) { const textStyle = TextStyle(fontSize: 25); const spacerSmall = SizedBox(height: 10); return MaterialApp( home: Scaffold( - appBar: AppBar( - title: const Text('Duktape Test'), - ), + appBar: AppBar(title: const Text('Duktape Test')), body: Center( child: Container( padding: const EdgeInsets.all(10), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - output, - style: textStyle, - textAlign: TextAlign.center, - ), + Text(output, style: textStyle, textAlign: TextAlign.center), spacerSmall, ElevatedButton( child: const Text('Run JavaScript'), @@ -242,15 +236,15 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:ffi'; import 'dart:io' show Platform; import 'package:ffi/ffi.dart' as ffi; - + import 'duktape_bindings_generated.dart'; - + const String _libName = 'ffigen_app'; - + /// The dynamic library in which the symbols for [DuktapeBindings] can be found. final DynamicLibrary _dylib = () { if (Platform.isMacOS || Platform.isIOS) { @@ -264,44 +258,50 @@ steps: } throw UnsupportedError('Unknown platform: ${Platform.operatingSystem}'); }(); - + /// The bindings to the native functions in [_dylib]. final DuktapeBindings _bindings = DuktapeBindings(_dylib); - + class Duktape { Duktape() { - ctx = - _bindings.duk_create_heap(nullptr, nullptr, nullptr, nullptr, nullptr); + ctx = _bindings.duk_create_heap( + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + ); } - + void evalString(String jsCode) { // From duktape.h: // #define duk_peval_string(ctx,src) \ // (duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME)) - + var nativeUtf8 = jsCode.toNativeUtf8(); _bindings.duk_eval_raw( - ctx, - nativeUtf8.cast(), - 0, - 0 /*args*/ | - DUK_COMPILE_EVAL | - DUK_COMPILE_SAFE | - DUK_COMPILE_NOSOURCE | - DUK_COMPILE_STRLEN | - DUK_COMPILE_NOFILENAME); + ctx, + nativeUtf8.cast(), + 0, + 0 /*args*/ | + DUK_COMPILE_EVAL | + DUK_COMPILE_SAFE | + DUK_COMPILE_NOSOURCE | + DUK_COMPILE_STRLEN | + DUK_COMPILE_NOFILENAME, + ); ffi.malloc.free(nativeUtf8); } - + int getInt(int index) { return _bindings.duk_get_int(ctx, index); } - + void dispose() { _bindings.duk_destroy_heap(ctx); ctx = nullptr; } - + late Pointer ctx; } - name: Patch src/CMakeLists.txt @@ -355,33 +355,12 @@ steps: - name: Run ffigen path: ffigen_app dart: run ffigen --config ffigen.yaml + - name: format duktape bindings + path: ffigen_app + dart: format lib/duktape_bindings_generated.dart - name: dart analyze path: ffigen_app dart: analyze --fatal-infos - - name: Patch android/settings.gradle - path: ffigen_app/example/android/settings.gradle - patch-u: | - --- b/boring_to_beautiful/step_01/android/settings.gradle - +++ a/boring_to_beautiful/step_01/android/settings.gradle - @@ -18,7 +18,7 @@ pluginManagement { - - plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - - id "com.android.application" version "8.1.0" apply false - + id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false - } - - name: Patch - path: ffigen_app/example/android/gradle/wrapper/gradle-wrapper.properties - patch-u: | - --- b/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties - +++ a/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties - @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME - distributionPath=wrapper/dists - zipStoreBase=GRADLE_USER_HOME - zipStorePath=wrapper/dists - -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip - +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip - name: Build Windows app path: ffigen_app/example platforms: [ windows ] @@ -471,38 +450,46 @@ steps: import 'duktape_bindings_generated.dart'; - @@ -13,12 +14,29 @@ const String _libName = 'ffigen_app'; + @@ -13,12 +14,37 @@ const String _libName = 'ffigen_app'; /// The dynamic library in which the symbols for [DuktapeBindings] can be found. final DynamicLibrary _dylib = () { if (Platform.isMacOS || Platform.isIOS) { + if (Platform.environment.containsKey('FLUTTER_TEST')) { + return DynamicLibrary.open( - + 'build/macos/Build/Products/Debug/$_libName/$_libName.framework/$_libName'); + + 'build/macos/Build/Products/Debug/$_libName/$_libName.framework/$_libName', + + ); + } return DynamicLibrary.open('$_libName.framework/$_libName'); } if (Platform.isAndroid || Platform.isLinux) { + if (Platform.environment.containsKey('FLUTTER_TEST')) { + return DynamicLibrary.open( - + 'build/linux/x64/debug/bundle/lib/lib$_libName.so'); + + 'build/linux/x64/debug/bundle/lib/lib$_libName.so', + + ); + } return DynamicLibrary.open('lib$_libName.so'); } if (Platform.isWindows) { + if (Platform.environment.containsKey('FLUTTER_TEST')) { + return switch (Abi.current()) { - + Abi.windowsArm64 => DynamicLibrary.open(p.canonicalize( - + p.join(r'build\windows\arm64\runner\Debug', '$_libName.dll'))), - + Abi.windowsX64 => DynamicLibrary.open(p.canonicalize( - + p.join(r'build\windows\x64\runner\Debug', '$_libName.dll'))), + + Abi.windowsArm64 => DynamicLibrary.open( + + p.canonicalize( + + p.join(r'build\windows\arm64\runner\Debug', '$_libName.dll'), + + ), + + ), + + Abi.windowsX64 => DynamicLibrary.open( + + p.canonicalize( + + p.join(r'build\windows\x64\runner\Debug', '$_libName.dll'), + + ), + + ), + _ => throw 'Unsupported platform', + }; + } return DynamicLibrary.open('$_libName.dll'); } throw UnsupportedError('Unknown platform: ${Platform.operatingSystem}'); - @@ -33,13 +51,13 @@ class Duktape { - _bindings.duk_create_heap(nullptr, nullptr, nullptr, nullptr, nullptr); + @@ -38,13 +64,13 @@ class Duktape { + ); } - void evalString(String jsCode) { @@ -514,12 +501,12 @@ steps: var nativeUtf8 = jsCode.toNativeUtf8(); - _bindings.duk_eval_raw( + final evalResult = _bindings.duk_eval_raw( - ctx, - nativeUtf8.cast(), - 0, - @@ -50,10 +68,21 @@ class Duktape { - DUK_COMPILE_STRLEN | - DUK_COMPILE_NOFILENAME); + ctx, + nativeUtf8.cast(), + 0, + @@ -56,10 +82,22 @@ class Duktape { + DUK_COMPILE_NOFILENAME, + ); ffi.malloc.free(nativeUtf8); + + if (evalResult != 0) { @@ -534,8 +521,9 @@ steps: + String _retrieveTopOfStackAsString() { + Pointer outLengthPtr = ffi.calloc(); + final errorStrPtr = _bindings.duk_safe_to_lstring(ctx, -1, outLengthPtr); - + final returnVal = - + errorStrPtr.cast().toDartString(length: outLengthPtr.value); + + final returnVal = errorStrPtr.cast().toDartString( + + length: outLengthPtr.value, + + ); + ffi.calloc.free(outLengthPtr); + return returnVal; } @@ -563,75 +551,61 @@ steps: // Copyright 2017, 2020, 2022 The Flutter team. All rights reserved. // Use of this source code is governed by a BSD-style license // that can be found in the LICENSE file. - + import 'package:ffigen_app/ffigen_app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:google_fonts/google_fonts.dart'; - + import 'duktape_message.dart'; - + void main() { runApp(const ProviderScope(child: DuktapeApp())); } - + final duktapeMessagesProvider = StateNotifierProvider>((ref) { - return DuktapeMessageNotifier(messages: []); - }); - + return DuktapeMessageNotifier(messages: []); + }); + class DuktapeMessageNotifier extends StateNotifier> { DuktapeMessageNotifier({required List messages}) - : duktape = Duktape(), - super(messages); + : duktape = Duktape(), + super(messages); final Duktape duktape; - + void eval(String code) { - state = [ - DuktapeMessage.evaluate(code), - ...state, - ]; + state = [DuktapeMessage.evaluate(code), ...state]; try { final response = duktape.evalString(code); - state = [ - DuktapeMessage.response(response), - ...state, - ]; + state = [DuktapeMessage.response(response), ...state]; } catch (e) { - state = [ - DuktapeMessage.error('$e'), - ...state, - ]; + state = [DuktapeMessage.error('$e'), ...state]; } } } - + class DuktapeApp extends StatelessWidget { const DuktapeApp({super.key}); - + @override Widget build(BuildContext context) { - return const MaterialApp( - title: 'Duktape App', - home: DuktapeRepl(), - ); + return const MaterialApp(title: 'Duktape App', home: DuktapeRepl()); } } - + class DuktapeRepl extends ConsumerStatefulWidget { - const DuktapeRepl({ - super.key, - }); - + const DuktapeRepl({super.key}); + @override ConsumerState createState() => _DuktapeReplState(); } - + class _DuktapeReplState extends ConsumerState { final _controller = TextEditingController(); final _focusNode = FocusNode(); var _isComposing = false; - + void _handleSubmitted(String text) { _controller.clear(); setState(() { @@ -642,7 +616,7 @@ steps: }); _focusNode.requestFocus(); } - + @override Widget build(BuildContext context) { final messages = ref.watch(duktapeMessagesProvider); @@ -662,38 +636,45 @@ steps: child: ListView.builder( padding: const EdgeInsets.all(8.0), reverse: true, - itemBuilder: (context, idx) => messages[idx].when( - evaluate: (str) => Padding( - padding: const EdgeInsets.symmetric(vertical: 2), - child: Text( - '> $str', - style: GoogleFonts.firaCode( - textStyle: Theme.of(context).textTheme.titleMedium, - ), - ), - ), - response: (str) => Padding( - padding: const EdgeInsets.symmetric(vertical: 2), - child: Text( - '= $str', - style: GoogleFonts.firaCode( - textStyle: Theme.of(context).textTheme.titleMedium, - color: Colors.blue[800], - ), - ), - ), - error: (str) => Padding( - padding: const EdgeInsets.symmetric(vertical: 2), - child: Text( - str, - style: GoogleFonts.firaCode( - textStyle: Theme.of(context).textTheme.titleSmall, - color: Colors.red[800], - fontWeight: FontWeight.bold, - ), + itemBuilder: + (context, idx) => messages[idx].when( + evaluate: + (str) => Padding( + padding: const EdgeInsets.symmetric(vertical: 2), + child: Text( + '> $str', + style: GoogleFonts.firaCode( + textStyle: + Theme.of(context).textTheme.titleMedium, + ), + ), + ), + response: + (str) => Padding( + padding: const EdgeInsets.symmetric(vertical: 2), + child: Text( + '= $str', + style: GoogleFonts.firaCode( + textStyle: + Theme.of(context).textTheme.titleMedium, + color: Colors.blue[800], + ), + ), + ), + error: + (str) => Padding( + padding: const EdgeInsets.symmetric(vertical: 2), + child: Text( + str, + style: GoogleFonts.firaCode( + textStyle: + Theme.of(context).textTheme.titleSmall, + color: Colors.red[800], + fontWeight: FontWeight.bold, + ), + ), + ), ), - ), - ), itemCount: messages.length, ), ), @@ -711,7 +692,7 @@ steps: ), ); } - + Widget _buildTextComposer() { return IconTheme( data: IconThemeData(color: Theme.of(context).colorScheme.secondary), @@ -724,9 +705,7 @@ steps: Flexible( child: TextField( controller: _controller, - decoration: const InputDecoration( - border: InputBorder.none, - ), + decoration: const InputDecoration(border: InputBorder.none), onChanged: (text) { setState(() { _isComposing = text.isNotEmpty; @@ -740,9 +719,10 @@ steps: margin: const EdgeInsets.symmetric(horizontal: 4.0), child: IconButton( icon: const Icon(Icons.send), - onPressed: _isComposing - ? () => _handleSubmitted(_controller.text) - : null, + onPressed: + _isComposing + ? () => _handleSubmitted(_controller.text) + : null, ), ), ], @@ -825,6 +805,9 @@ steps: - name: build runner path: ffigen_app/example dart: run build_runner build --delete-conflicting-outputs + - name: format duktape_message + path: ffigen_app/example + dart: format lib/duktape_message.freezed.dart - name: dart analyze path: ffigen_app dart: analyze --fatal-infos diff --git a/ffigen_codelab/step_03/android/build.gradle b/ffigen_codelab/step_03/android/build.gradle index 5681b7125e..adff069975 100644 --- a/ffigen_codelab/step_03/android/build.gradle +++ b/ffigen_codelab/step_03/android/build.gradle @@ -11,7 +11,7 @@ buildscript { dependencies { // The Android Gradle Plugin knows how to build native code with the NDK. - classpath("com.android.tools.build:gradle:8.1.0") + classpath("com.android.tools.build:gradle:8.7.0") } } diff --git a/ffigen_codelab/step_03/example/android/.gitignore b/ffigen_codelab/step_03/example/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/ffigen_codelab/step_03/example/android/.gitignore +++ b/ffigen_codelab/step_03/example/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/ffigen_codelab/step_03/example/android/app/build.gradle b/ffigen_codelab/step_03/example/android/app/build.gradle deleted file mode 100644 index 858c9239e7..0000000000 --- a/ffigen_codelab/step_03/example/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.ffigen_app_example" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.ffigen_app_example" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/ffigen_codelab/step_03/example/android/app/build.gradle.kts b/ffigen_codelab/step_03/example/android/app/build.gradle.kts new file mode 100644 index 0000000000..1de7c631eb --- /dev/null +++ b/ffigen_codelab/step_03/example/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.ffigen_app_example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.ffigen_app_example" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/ffigen_codelab/step_03/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt b/ffigen_codelab/step_03/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt index bd55dde018..68b7000537 100644 --- a/ffigen_codelab/step_03/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt +++ b/ffigen_codelab/step_03/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.ffigen_app_example import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/ffigen_codelab/step_03/example/android/build.gradle b/ffigen_codelab/step_03/example/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/ffigen_codelab/step_03/example/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/ffigen_codelab/step_03/example/android/build.gradle.kts b/ffigen_codelab/step_03/example/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/ffigen_codelab/step_03/example/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/ffigen_codelab/step_03/example/android/gradle.properties b/ffigen_codelab/step_03/example/android/gradle.properties index 2597170821..f018a61817 100644 --- a/ffigen_codelab/step_03/example/android/gradle.properties +++ b/ffigen_codelab/step_03/example/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/ffigen_codelab/step_03/example/android/gradle/wrapper/gradle-wrapper.properties b/ffigen_codelab/step_03/example/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/ffigen_codelab/step_03/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/ffigen_codelab/step_03/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/ffigen_codelab/step_03/example/android/settings.gradle b/ffigen_codelab/step_03/example/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/ffigen_codelab/step_03/example/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/ffigen_codelab/step_03/example/android/settings.gradle.kts b/ffigen_codelab/step_03/example/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/ffigen_codelab/step_03/example/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/ffigen_codelab/step_03/example/ios/Podfile b/ffigen_codelab/step_03/example/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/ffigen_codelab/step_03/example/ios/Podfile +++ b/ffigen_codelab/step_03/example/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/ffigen_codelab/step_03/example/ios/Runner.xcodeproj/project.pbxproj b/ffigen_codelab/step_03/example/ios/Runner.xcodeproj/project.pbxproj index 11b35beabb..5dce0dac38 100644 --- a/ffigen_codelab/step_03/example/ios/Runner.xcodeproj/project.pbxproj +++ b/ffigen_codelab/step_03/example/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 37B5EBBBFAF9E53C5A5A3131 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C70BDB27F55A3ED8E56180C /* Pods_Runner.framework */; }; + 384D477FC90E5FE14FBB9C9B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F7D2ACBE41A96778898A158E /* Pods_RunnerTests.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3BAAB801B363D2B5694697C8 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 41BA389D069B869AD7889B4B /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B5A497559709EA1F295B2ABD /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D792A817A1AC422F6F9C82 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,60 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0A699E5B0E4355A13752C564 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 13B01B12CFE1D25EDCCA52CD /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 27D792A817A1AC422F6F9C82 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 39EB4D0DC80E04DEDEE47517 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 41BA389D069B869AD7889B4B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 64E59BF5AFBD791B75DE2717 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 72FD69CE914A569D374BC284 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 4E0F56AF76441046B2E429BD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 54C2C7FEA9C49D833A007720 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 65357106E0D2E41A618094B3 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6C70BDB27F55A3ED8E56180C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7DC789C88302A0F93C36C132 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 93A1F1522D2E02875F57A767 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 975C3FBFA1212BE1989BBAEF /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A86DC62688E59DEB11E5C544 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + F7D2ACBE41A96778898A158E /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 6D670872593D25878C4487BA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3BAAB801B363D2B5694697C8 /* Pods_Runner.framework in Frameworks */, + 384D477FC90E5FE14FBB9C9B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - D96534983B06C1B866173361 /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B5A497559709EA1F295B2ABD /* Pods_RunnerTests.framework in Frameworks */, + 37B5EBBBFAF9E53C5A5A3131 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 1464C4D9E37A8A538102B8DD /* Pods */ = { + 29FB55DB424944C14D3275A3 /* Pods */ = { isa = PBXGroup; children = ( - 72FD69CE914A569D374BC284 /* Pods-Runner.debug.xcconfig */, - 39EB4D0DC80E04DEDEE47517 /* Pods-Runner.release.xcconfig */, - A86DC62688E59DEB11E5C544 /* Pods-Runner.profile.xcconfig */, - 64E59BF5AFBD791B75DE2717 /* Pods-RunnerTests.debug.xcconfig */, - 7DC789C88302A0F93C36C132 /* Pods-RunnerTests.release.xcconfig */, - 0A699E5B0E4355A13752C564 /* Pods-RunnerTests.profile.xcconfig */, + 65357106E0D2E41A618094B3 /* Pods-Runner.debug.xcconfig */, + 93A1F1522D2E02875F57A767 /* Pods-Runner.release.xcconfig */, + 54C2C7FEA9C49D833A007720 /* Pods-Runner.profile.xcconfig */, + 13B01B12CFE1D25EDCCA52CD /* Pods-RunnerTests.debug.xcconfig */, + 975C3FBFA1212BE1989BBAEF /* Pods-RunnerTests.release.xcconfig */, + 4E0F56AF76441046B2E429BD /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -109,6 +109,15 @@ path = RunnerTests; sourceTree = ""; }; + 8A7B53D318FBA4992925932E /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6C70BDB27F55A3ED8E56180C /* Pods_Runner.framework */, + F7D2ACBE41A96778898A158E /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -127,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 1464C4D9E37A8A538102B8DD /* Pods */, - C96CA1F9B39CF12E68595C76 /* Frameworks */, + 29FB55DB424944C14D3275A3 /* Pods */, + 8A7B53D318FBA4992925932E /* Frameworks */, ); sourceTree = ""; }; @@ -156,15 +165,6 @@ path = Runner; sourceTree = ""; }; - C96CA1F9B39CF12E68595C76 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 41BA389D069B869AD7889B4B /* Pods_Runner.framework */, - 27D792A817A1AC422F6F9C82 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C76428869724CEC2AD1B9656 /* [CP] Check Pods Manifest.lock */, + 021DCD7A722AB071A5C77AE8 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - D96534983B06C1B866173361 /* Frameworks */, + 6D670872593D25878C4487BA /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - C869F8CB0B0F18B822D29CD3 /* [CP] Check Pods Manifest.lock */, + ADFFF2E0D804F0B8A1446142 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 033E03FC98E5610670E4DB03 /* [CP] Embed Pods Frameworks */, + E14EC01F727DBDDB3D4D083C /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,21 +270,26 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 033E03FC98E5610670E4DB03 /* [CP] Embed Pods Frameworks */ = { + 021DCD7A722AB071A5C77AE8 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { @@ -318,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - C76428869724CEC2AD1B9656 /* [CP] Check Pods Manifest.lock */ = { + ADFFF2E0D804F0B8A1446142 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -333,33 +338,28 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C869F8CB0B0F18B822D29CD3 /* [CP] Check Pods Manifest.lock */ = { + E14EC01F727DBDDB3D4D083C /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 64E59BF5AFBD791B75DE2717 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 13B01B12CFE1D25EDCCA52CD /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7DC789C88302A0F93C36C132 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 975C3FBFA1212BE1989BBAEF /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0A699E5B0E4355A13752C564 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4E0F56AF76441046B2E429BD /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/ffigen_codelab/step_03/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ffigen_codelab/step_03/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/ffigen_codelab/step_03/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ffigen_codelab/step_03/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/ffigen_codelab/step_03/example/lib/main.dart b/ffigen_codelab/step_03/example/lib/main.dart index c58b31eb0b..f0306c07b0 100644 --- a/ffigen_codelab/step_03/example/lib/main.dart +++ b/ffigen_codelab/step_03/example/lib/main.dart @@ -31,9 +31,7 @@ class _MyAppState extends State { const spacerSmall = SizedBox(height: 10); return MaterialApp( home: Scaffold( - appBar: AppBar( - title: const Text('Native Packages'), - ), + appBar: AppBar(title: const Text('Native Packages')), body: SingleChildScrollView( child: Container( padding: const EdgeInsets.all(10), diff --git a/ffigen_codelab/step_03/example/macos/Podfile b/ffigen_codelab/step_03/example/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/ffigen_codelab/step_03/example/macos/Podfile +++ b/ffigen_codelab/step_03/example/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/ffigen_codelab/step_03/example/macos/Runner.xcodeproj/project.pbxproj b/ffigen_codelab/step_03/example/macos/Runner.xcodeproj/project.pbxproj index ca42e7ff4c..5aef7e5f5c 100644 --- a/ffigen_codelab/step_03/example/macos/Runner.xcodeproj/project.pbxproj +++ b/ffigen_codelab/step_03/example/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E0ABE5351EEC7064797E354 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB2E266604615E92796CF34F /* Pods_RunnerTests.framework */; }; + 1C8C89059489393A675CDD46 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C551CF74C447A27874F18AB /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 70D6F45F50A4EDBF85FE4580 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7DB609CA69926401ABE9640 /* Pods_Runner.framework */; }; + FD4F6A6ABF567B438B51441E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0367DD23E825595062E6435 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -78,16 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3FFEEF5A6FD917D69A212B0A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 5FDA6842E56F0C007A1996D4 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6675D4608C63F4E732E35408 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 66DCEB8DA3900A335B5DA07B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6C551CF74C447A27874F18AB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 86211CEC0D1790FBE3C5D8B2 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9A0BF02ED47D73F7064B0917 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 9E9EF64C35AAAA3602964AA7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - A7DB609CA69926401ABE9640 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AB2E266604615E92796CF34F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F19E5B3C65EA370F013BE716 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - FBAE80B05D89C5D84D5C03B4 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + A2F46067E2A9A5E15A5EAD4B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + B0367DD23E825595062E6435 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CB3D46D2C93EC7C2706356FA /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + E738C84FF92335A6E75E26E3 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E0ABE5351EEC7064797E354 /* Pods_RunnerTests.framework in Frameworks */, + FD4F6A6ABF567B438B51441E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 70D6F45F50A4EDBF85FE4580 /* Pods_Runner.framework in Frameworks */, + 1C8C89059489393A675CDD46 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A7A0BE3105C149DB55691A21 /* Pods */, + 88DCA9F60F99C8938CB33876 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - A7A0BE3105C149DB55691A21 /* Pods */ = { + 88DCA9F60F99C8938CB33876 /* Pods */ = { isa = PBXGroup; children = ( - FBAE80B05D89C5D84D5C03B4 /* Pods-Runner.debug.xcconfig */, - 3FFEEF5A6FD917D69A212B0A /* Pods-Runner.release.xcconfig */, - 9A0BF02ED47D73F7064B0917 /* Pods-Runner.profile.xcconfig */, - F19E5B3C65EA370F013BE716 /* Pods-RunnerTests.debug.xcconfig */, - 5FDA6842E56F0C007A1996D4 /* Pods-RunnerTests.release.xcconfig */, - 9E9EF64C35AAAA3602964AA7 /* Pods-RunnerTests.profile.xcconfig */, + A2F46067E2A9A5E15A5EAD4B /* Pods-Runner.debug.xcconfig */, + CB3D46D2C93EC7C2706356FA /* Pods-Runner.release.xcconfig */, + E738C84FF92335A6E75E26E3 /* Pods-Runner.profile.xcconfig */, + 66DCEB8DA3900A335B5DA07B /* Pods-RunnerTests.debug.xcconfig */, + 6675D4608C63F4E732E35408 /* Pods-RunnerTests.release.xcconfig */, + 86211CEC0D1790FBE3C5D8B2 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - A7DB609CA69926401ABE9640 /* Pods_Runner.framework */, - AB2E266604615E92796CF34F /* Pods_RunnerTests.framework */, + 6C551CF74C447A27874F18AB /* Pods_Runner.framework */, + B0367DD23E825595062E6435 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1E3C02A919DB5D8E5C62924B /* [CP] Check Pods Manifest.lock */, + 8C407044D2CDDF53A9D3AC56 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - CDB523A6B35188D3F64E8B1A /* [CP] Check Pods Manifest.lock */, + C852338EF94F000CBCF7D11F /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - D6EA5EEBFAD504A5C6262391 /* [CP] Embed Pods Frameworks */, + EE4863E2E4723B3A412B4656 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,67 +323,67 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 1E3C02A919DB5D8E5C62924B /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 8C407044D2CDDF53A9D3AC56 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - CDB523A6B35188D3F64E8B1A /* [CP] Check Pods Manifest.lock */ = { + C852338EF94F000CBCF7D11F /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,7 +405,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - D6EA5EEBFAD504A5C6262391 /* [CP] Embed Pods Frameworks */ = { + EE4863E2E4723B3A412B4656 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F19E5B3C65EA370F013BE716 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 66DCEB8DA3900A335B5DA07B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5FDA6842E56F0C007A1996D4 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 6675D4608C63F4E732E35408 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9E9EF64C35AAAA3602964AA7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 86211CEC0D1790FBE3C5D8B2 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/ffigen_codelab/step_03/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ffigen_codelab/step_03/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index ec6dd3f545..add807ea9a 100644 --- a/ffigen_codelab/step_03/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ffigen_codelab/step_03/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/ffigen_codelab/step_03/example/pubspec.yaml b/ffigen_codelab/step_03/example/pubspec.yaml index 18ce33533c..bb9b2fc9ba 100644 --- a/ffigen_codelab/step_03/example/pubspec.yaml +++ b/ffigen_codelab/step_03/example/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/ffigen_codelab/step_03/lib/ffigen_app.dart b/ffigen_codelab/step_03/lib/ffigen_app.dart index 190d014278..ec8a3b6145 100644 --- a/ffigen_codelab/step_03/lib/ffigen_app.dart +++ b/ffigen_codelab/step_03/lib/ffigen_app.dart @@ -88,37 +88,39 @@ Future _helperIsolateSendPort = () async { // We receive two types of messages: // 1. A port to send messages on. // 2. Responses to requests we sent. - final ReceivePort receivePort = ReceivePort() - ..listen((dynamic data) { - if (data is SendPort) { - // The helper isolate sent us the port on which we can sent it requests. - completer.complete(data); - return; - } - if (data is _SumResponse) { - // The helper isolate sent us a response to a request we sent. - final Completer completer = _sumRequests[data.id]!; - _sumRequests.remove(data.id); - completer.complete(data.result); - return; - } - throw UnsupportedError('Unsupported message type: ${data.runtimeType}'); - }); - - // Start the helper isolate. - await Isolate.spawn((SendPort sendPort) async { - final ReceivePort helperReceivePort = ReceivePort() - ..listen((dynamic data) { - // On the helper isolate listen to requests and respond to them. - if (data is _SumRequest) { - final int result = _bindings.sum_long_running(data.a, data.b); - final _SumResponse response = _SumResponse(data.id, result); - sendPort.send(response); + final ReceivePort receivePort = + ReceivePort()..listen((dynamic data) { + if (data is SendPort) { + // The helper isolate sent us the port on which we can sent it requests. + completer.complete(data); + return; + } + if (data is _SumResponse) { + // The helper isolate sent us a response to a request we sent. + final Completer completer = _sumRequests[data.id]!; + _sumRequests.remove(data.id); + completer.complete(data.result); return; } throw UnsupportedError('Unsupported message type: ${data.runtimeType}'); }); + // Start the helper isolate. + await Isolate.spawn((SendPort sendPort) async { + final ReceivePort helperReceivePort = + ReceivePort()..listen((dynamic data) { + // On the helper isolate listen to requests and respond to them. + if (data is _SumRequest) { + final int result = _bindings.sum_long_running(data.a, data.b); + final _SumResponse response = _SumResponse(data.id, result); + sendPort.send(response); + return; + } + throw UnsupportedError( + 'Unsupported message type: ${data.runtimeType}', + ); + }); + // Send the port to the main isolate on which we can receive requests. sendPort.send(helperReceivePort.sendPort); }, receivePort.sendPort); diff --git a/ffigen_codelab/step_03/lib/ffigen_app_bindings_generated.dart b/ffigen_codelab/step_03/lib/ffigen_app_bindings_generated.dart index 513983bf0c..b91a32288b 100644 --- a/ffigen_codelab/step_03/lib/ffigen_app_bindings_generated.dart +++ b/ffigen_codelab/step_03/lib/ffigen_app_bindings_generated.dart @@ -15,31 +15,24 @@ import 'dart:ffi' as ffi; class FfigenAppBindings { /// Holds the symbol lookup function. final ffi.Pointer Function(String symbolName) - _lookup; + _lookup; /// The symbols are looked up in [dynamicLibrary]. FfigenAppBindings(ffi.DynamicLibrary dynamicLibrary) - : _lookup = dynamicLibrary.lookup; + : _lookup = dynamicLibrary.lookup; /// The symbols are looked up with [lookup]. FfigenAppBindings.fromLookup( - ffi.Pointer Function(String symbolName) - lookup) - : _lookup = lookup; + ffi.Pointer Function(String symbolName) lookup, + ) : _lookup = lookup; /// A very short-lived native function. /// /// For very short-lived functions, it is fine to call them on the main isolate. /// They will block the Dart execution while running the native function, so /// only do this for native functions which are guaranteed to be short-lived. - int sum( - int a, - int b, - ) { - return _sum( - a, - b, - ); + int sum(int a, int b) { + return _sum(a, b); } late final _sumPtr = @@ -51,19 +44,14 @@ class FfigenAppBindings { /// Do not call these kind of native functions in the main isolate. They will /// block Dart execution. This will cause dropped frames in Flutter applications. /// Instead, call these native functions on a separate isolate. - int sum_long_running( - int a, - int b, - ) { - return _sum_long_running( - a, - b, - ); + int sum_long_running(int a, int b) { + return _sum_long_running(a, b); } late final _sum_long_runningPtr = _lookup>( - 'sum_long_running'); + 'sum_long_running', + ); late final _sum_long_running = _sum_long_runningPtr.asFunction(); } diff --git a/ffigen_codelab/step_03/pubspec.yaml b/ffigen_codelab/step_03/pubspec.yaml index 81ffa506ea..e11a860b72 100644 --- a/ffigen_codelab/step_03/pubspec.yaml +++ b/ffigen_codelab/step_03/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 homepage: environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 flutter: '>=3.3.0' dependencies: diff --git a/ffigen_codelab/step_05/android/build.gradle b/ffigen_codelab/step_05/android/build.gradle index 5681b7125e..adff069975 100644 --- a/ffigen_codelab/step_05/android/build.gradle +++ b/ffigen_codelab/step_05/android/build.gradle @@ -11,7 +11,7 @@ buildscript { dependencies { // The Android Gradle Plugin knows how to build native code with the NDK. - classpath("com.android.tools.build:gradle:8.1.0") + classpath("com.android.tools.build:gradle:8.7.0") } } diff --git a/ffigen_codelab/step_05/example/android/.gitignore b/ffigen_codelab/step_05/example/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/ffigen_codelab/step_05/example/android/.gitignore +++ b/ffigen_codelab/step_05/example/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/ffigen_codelab/step_05/example/android/app/build.gradle b/ffigen_codelab/step_05/example/android/app/build.gradle deleted file mode 100644 index 858c9239e7..0000000000 --- a/ffigen_codelab/step_05/example/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.ffigen_app_example" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.ffigen_app_example" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/ffigen_codelab/step_05/example/android/app/build.gradle.kts b/ffigen_codelab/step_05/example/android/app/build.gradle.kts new file mode 100644 index 0000000000..1de7c631eb --- /dev/null +++ b/ffigen_codelab/step_05/example/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.ffigen_app_example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.ffigen_app_example" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/ffigen_codelab/step_05/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt b/ffigen_codelab/step_05/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt index bd55dde018..68b7000537 100644 --- a/ffigen_codelab/step_05/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt +++ b/ffigen_codelab/step_05/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.ffigen_app_example import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/ffigen_codelab/step_05/example/android/build.gradle b/ffigen_codelab/step_05/example/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/ffigen_codelab/step_05/example/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/ffigen_codelab/step_05/example/android/build.gradle.kts b/ffigen_codelab/step_05/example/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/ffigen_codelab/step_05/example/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/ffigen_codelab/step_05/example/android/gradle.properties b/ffigen_codelab/step_05/example/android/gradle.properties index 2597170821..f018a61817 100644 --- a/ffigen_codelab/step_05/example/android/gradle.properties +++ b/ffigen_codelab/step_05/example/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/ffigen_codelab/step_05/example/android/gradle/wrapper/gradle-wrapper.properties b/ffigen_codelab/step_05/example/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/ffigen_codelab/step_05/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/ffigen_codelab/step_05/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/ffigen_codelab/step_05/example/android/settings.gradle b/ffigen_codelab/step_05/example/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/ffigen_codelab/step_05/example/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/ffigen_codelab/step_05/example/android/settings.gradle.kts b/ffigen_codelab/step_05/example/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/ffigen_codelab/step_05/example/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/ffigen_codelab/step_05/example/ios/Podfile b/ffigen_codelab/step_05/example/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/ffigen_codelab/step_05/example/ios/Podfile +++ b/ffigen_codelab/step_05/example/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/ffigen_codelab/step_05/example/ios/Runner.xcodeproj/project.pbxproj b/ffigen_codelab/step_05/example/ios/Runner.xcodeproj/project.pbxproj index 11b35beabb..5dce0dac38 100644 --- a/ffigen_codelab/step_05/example/ios/Runner.xcodeproj/project.pbxproj +++ b/ffigen_codelab/step_05/example/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 37B5EBBBFAF9E53C5A5A3131 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C70BDB27F55A3ED8E56180C /* Pods_Runner.framework */; }; + 384D477FC90E5FE14FBB9C9B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F7D2ACBE41A96778898A158E /* Pods_RunnerTests.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3BAAB801B363D2B5694697C8 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 41BA389D069B869AD7889B4B /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B5A497559709EA1F295B2ABD /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D792A817A1AC422F6F9C82 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,60 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0A699E5B0E4355A13752C564 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 13B01B12CFE1D25EDCCA52CD /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 27D792A817A1AC422F6F9C82 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 39EB4D0DC80E04DEDEE47517 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 41BA389D069B869AD7889B4B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 64E59BF5AFBD791B75DE2717 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 72FD69CE914A569D374BC284 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 4E0F56AF76441046B2E429BD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 54C2C7FEA9C49D833A007720 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 65357106E0D2E41A618094B3 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6C70BDB27F55A3ED8E56180C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7DC789C88302A0F93C36C132 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 93A1F1522D2E02875F57A767 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 975C3FBFA1212BE1989BBAEF /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A86DC62688E59DEB11E5C544 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + F7D2ACBE41A96778898A158E /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 6D670872593D25878C4487BA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3BAAB801B363D2B5694697C8 /* Pods_Runner.framework in Frameworks */, + 384D477FC90E5FE14FBB9C9B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - D96534983B06C1B866173361 /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B5A497559709EA1F295B2ABD /* Pods_RunnerTests.framework in Frameworks */, + 37B5EBBBFAF9E53C5A5A3131 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 1464C4D9E37A8A538102B8DD /* Pods */ = { + 29FB55DB424944C14D3275A3 /* Pods */ = { isa = PBXGroup; children = ( - 72FD69CE914A569D374BC284 /* Pods-Runner.debug.xcconfig */, - 39EB4D0DC80E04DEDEE47517 /* Pods-Runner.release.xcconfig */, - A86DC62688E59DEB11E5C544 /* Pods-Runner.profile.xcconfig */, - 64E59BF5AFBD791B75DE2717 /* Pods-RunnerTests.debug.xcconfig */, - 7DC789C88302A0F93C36C132 /* Pods-RunnerTests.release.xcconfig */, - 0A699E5B0E4355A13752C564 /* Pods-RunnerTests.profile.xcconfig */, + 65357106E0D2E41A618094B3 /* Pods-Runner.debug.xcconfig */, + 93A1F1522D2E02875F57A767 /* Pods-Runner.release.xcconfig */, + 54C2C7FEA9C49D833A007720 /* Pods-Runner.profile.xcconfig */, + 13B01B12CFE1D25EDCCA52CD /* Pods-RunnerTests.debug.xcconfig */, + 975C3FBFA1212BE1989BBAEF /* Pods-RunnerTests.release.xcconfig */, + 4E0F56AF76441046B2E429BD /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -109,6 +109,15 @@ path = RunnerTests; sourceTree = ""; }; + 8A7B53D318FBA4992925932E /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6C70BDB27F55A3ED8E56180C /* Pods_Runner.framework */, + F7D2ACBE41A96778898A158E /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -127,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 1464C4D9E37A8A538102B8DD /* Pods */, - C96CA1F9B39CF12E68595C76 /* Frameworks */, + 29FB55DB424944C14D3275A3 /* Pods */, + 8A7B53D318FBA4992925932E /* Frameworks */, ); sourceTree = ""; }; @@ -156,15 +165,6 @@ path = Runner; sourceTree = ""; }; - C96CA1F9B39CF12E68595C76 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 41BA389D069B869AD7889B4B /* Pods_Runner.framework */, - 27D792A817A1AC422F6F9C82 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C76428869724CEC2AD1B9656 /* [CP] Check Pods Manifest.lock */, + 021DCD7A722AB071A5C77AE8 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - D96534983B06C1B866173361 /* Frameworks */, + 6D670872593D25878C4487BA /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - C869F8CB0B0F18B822D29CD3 /* [CP] Check Pods Manifest.lock */, + ADFFF2E0D804F0B8A1446142 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 033E03FC98E5610670E4DB03 /* [CP] Embed Pods Frameworks */, + E14EC01F727DBDDB3D4D083C /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,21 +270,26 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 033E03FC98E5610670E4DB03 /* [CP] Embed Pods Frameworks */ = { + 021DCD7A722AB071A5C77AE8 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { @@ -318,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - C76428869724CEC2AD1B9656 /* [CP] Check Pods Manifest.lock */ = { + ADFFF2E0D804F0B8A1446142 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -333,33 +338,28 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C869F8CB0B0F18B822D29CD3 /* [CP] Check Pods Manifest.lock */ = { + E14EC01F727DBDDB3D4D083C /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 64E59BF5AFBD791B75DE2717 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 13B01B12CFE1D25EDCCA52CD /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7DC789C88302A0F93C36C132 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 975C3FBFA1212BE1989BBAEF /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0A699E5B0E4355A13752C564 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4E0F56AF76441046B2E429BD /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/ffigen_codelab/step_05/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ffigen_codelab/step_05/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/ffigen_codelab/step_05/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ffigen_codelab/step_05/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/ffigen_codelab/step_05/example/lib/main.dart b/ffigen_codelab/step_05/example/lib/main.dart index fe9e7935d6..34ed956085 100644 --- a/ffigen_codelab/step_05/example/lib/main.dart +++ b/ffigen_codelab/step_05/example/lib/main.dart @@ -43,20 +43,14 @@ class _MyAppState extends State { const spacerSmall = SizedBox(height: 10); return MaterialApp( home: Scaffold( - appBar: AppBar( - title: const Text('Duktape Test'), - ), + appBar: AppBar(title: const Text('Duktape Test')), body: Center( child: Container( padding: const EdgeInsets.all(10), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - output, - style: textStyle, - textAlign: TextAlign.center, - ), + Text(output, style: textStyle, textAlign: TextAlign.center), spacerSmall, ElevatedButton( child: const Text('Run JavaScript'), diff --git a/ffigen_codelab/step_05/example/macos/Podfile b/ffigen_codelab/step_05/example/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/ffigen_codelab/step_05/example/macos/Podfile +++ b/ffigen_codelab/step_05/example/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/ffigen_codelab/step_05/example/macos/Runner.xcodeproj/project.pbxproj b/ffigen_codelab/step_05/example/macos/Runner.xcodeproj/project.pbxproj index ca42e7ff4c..5aef7e5f5c 100644 --- a/ffigen_codelab/step_05/example/macos/Runner.xcodeproj/project.pbxproj +++ b/ffigen_codelab/step_05/example/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E0ABE5351EEC7064797E354 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB2E266604615E92796CF34F /* Pods_RunnerTests.framework */; }; + 1C8C89059489393A675CDD46 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C551CF74C447A27874F18AB /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 70D6F45F50A4EDBF85FE4580 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7DB609CA69926401ABE9640 /* Pods_Runner.framework */; }; + FD4F6A6ABF567B438B51441E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0367DD23E825595062E6435 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -78,16 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3FFEEF5A6FD917D69A212B0A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 5FDA6842E56F0C007A1996D4 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6675D4608C63F4E732E35408 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 66DCEB8DA3900A335B5DA07B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6C551CF74C447A27874F18AB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 86211CEC0D1790FBE3C5D8B2 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9A0BF02ED47D73F7064B0917 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 9E9EF64C35AAAA3602964AA7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - A7DB609CA69926401ABE9640 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AB2E266604615E92796CF34F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F19E5B3C65EA370F013BE716 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - FBAE80B05D89C5D84D5C03B4 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + A2F46067E2A9A5E15A5EAD4B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + B0367DD23E825595062E6435 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CB3D46D2C93EC7C2706356FA /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + E738C84FF92335A6E75E26E3 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E0ABE5351EEC7064797E354 /* Pods_RunnerTests.framework in Frameworks */, + FD4F6A6ABF567B438B51441E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 70D6F45F50A4EDBF85FE4580 /* Pods_Runner.framework in Frameworks */, + 1C8C89059489393A675CDD46 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A7A0BE3105C149DB55691A21 /* Pods */, + 88DCA9F60F99C8938CB33876 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - A7A0BE3105C149DB55691A21 /* Pods */ = { + 88DCA9F60F99C8938CB33876 /* Pods */ = { isa = PBXGroup; children = ( - FBAE80B05D89C5D84D5C03B4 /* Pods-Runner.debug.xcconfig */, - 3FFEEF5A6FD917D69A212B0A /* Pods-Runner.release.xcconfig */, - 9A0BF02ED47D73F7064B0917 /* Pods-Runner.profile.xcconfig */, - F19E5B3C65EA370F013BE716 /* Pods-RunnerTests.debug.xcconfig */, - 5FDA6842E56F0C007A1996D4 /* Pods-RunnerTests.release.xcconfig */, - 9E9EF64C35AAAA3602964AA7 /* Pods-RunnerTests.profile.xcconfig */, + A2F46067E2A9A5E15A5EAD4B /* Pods-Runner.debug.xcconfig */, + CB3D46D2C93EC7C2706356FA /* Pods-Runner.release.xcconfig */, + E738C84FF92335A6E75E26E3 /* Pods-Runner.profile.xcconfig */, + 66DCEB8DA3900A335B5DA07B /* Pods-RunnerTests.debug.xcconfig */, + 6675D4608C63F4E732E35408 /* Pods-RunnerTests.release.xcconfig */, + 86211CEC0D1790FBE3C5D8B2 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - A7DB609CA69926401ABE9640 /* Pods_Runner.framework */, - AB2E266604615E92796CF34F /* Pods_RunnerTests.framework */, + 6C551CF74C447A27874F18AB /* Pods_Runner.framework */, + B0367DD23E825595062E6435 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1E3C02A919DB5D8E5C62924B /* [CP] Check Pods Manifest.lock */, + 8C407044D2CDDF53A9D3AC56 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - CDB523A6B35188D3F64E8B1A /* [CP] Check Pods Manifest.lock */, + C852338EF94F000CBCF7D11F /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - D6EA5EEBFAD504A5C6262391 /* [CP] Embed Pods Frameworks */, + EE4863E2E4723B3A412B4656 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,67 +323,67 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 1E3C02A919DB5D8E5C62924B /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 8C407044D2CDDF53A9D3AC56 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - CDB523A6B35188D3F64E8B1A /* [CP] Check Pods Manifest.lock */ = { + C852338EF94F000CBCF7D11F /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,7 +405,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - D6EA5EEBFAD504A5C6262391 /* [CP] Embed Pods Frameworks */ = { + EE4863E2E4723B3A412B4656 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F19E5B3C65EA370F013BE716 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 66DCEB8DA3900A335B5DA07B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5FDA6842E56F0C007A1996D4 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 6675D4608C63F4E732E35408 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9E9EF64C35AAAA3602964AA7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 86211CEC0D1790FBE3C5D8B2 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/ffigen_codelab/step_05/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ffigen_codelab/step_05/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index ec6dd3f545..add807ea9a 100644 --- a/ffigen_codelab/step_05/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ffigen_codelab/step_05/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/ffigen_codelab/step_05/example/pubspec.yaml b/ffigen_codelab/step_05/example/pubspec.yaml index 18ce33533c..bb9b2fc9ba 100644 --- a/ffigen_codelab/step_05/example/pubspec.yaml +++ b/ffigen_codelab/step_05/example/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/ffigen_codelab/step_05/lib/duktape_bindings_generated.dart b/ffigen_codelab/step_05/lib/duktape_bindings_generated.dart index d7df5e2909..0eb041df40 100644 --- a/ffigen_codelab/step_05/lib/duktape_bindings_generated.dart +++ b/ffigen_codelab/step_05/lib/duktape_bindings_generated.dart @@ -15,17 +15,16 @@ import 'dart:ffi' as ffi; class DuktapeBindings { /// Holds the symbol lookup function. final ffi.Pointer Function(String symbolName) - _lookup; + _lookup; /// The symbols are looked up in [dynamicLibrary]. DuktapeBindings(ffi.DynamicLibrary dynamicLibrary) - : _lookup = dynamicLibrary.lookup; + : _lookup = dynamicLibrary.lookup; /// The symbols are looked up with [lookup]. DuktapeBindings.fromLookup( - ffi.Pointer Function(String symbolName) - lookup) - : _lookup = lookup; + ffi.Pointer Function(String symbolName) lookup, + ) : _lookup = lookup; /// Context management ffi.Pointer duk_create_heap( @@ -45,226 +44,241 @@ class DuktapeBindings { } late final _duk_create_heapPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + duk_alloc_function, + duk_realloc_function, + duk_free_function, + ffi.Pointer, + duk_fatal_function, + ) + > + >('duk_create_heap'); + late final _duk_create_heap = + _duk_create_heapPtr + .asFunction< + ffi.Pointer Function( duk_alloc_function, duk_realloc_function, duk_free_function, ffi.Pointer, - duk_fatal_function)>>('duk_create_heap'); - late final _duk_create_heap = _duk_create_heapPtr.asFunction< - ffi.Pointer Function( - duk_alloc_function, - duk_realloc_function, - duk_free_function, - ffi.Pointer, - duk_fatal_function)>(); + duk_fatal_function, + ) + >(); - void duk_destroy_heap( - ffi.Pointer ctx, - ) { - return _duk_destroy_heap( - ctx, - ); + void duk_destroy_heap(ffi.Pointer ctx) { + return _duk_destroy_heap(ctx); } late final _duk_destroy_heapPtr = _lookup)>>( - 'duk_destroy_heap'); - late final _duk_destroy_heap = _duk_destroy_heapPtr - .asFunction)>(); + 'duk_destroy_heap', + ); + late final _duk_destroy_heap = + _duk_destroy_heapPtr + .asFunction)>(); void duk_suspend( ffi.Pointer ctx, ffi.Pointer state, ) { - return _duk_suspend( - ctx, - state, - ); + return _duk_suspend(ctx, state); } late final _duk_suspendPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_suspend'); - late final _duk_suspend = _duk_suspendPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_suspend'); + late final _duk_suspend = + _duk_suspendPtr + .asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); void duk_resume( ffi.Pointer ctx, ffi.Pointer state, ) { - return _duk_resume( - ctx, - state, - ); + return _duk_resume(ctx, state); } late final _duk_resumePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_resume'); - late final _duk_resume = _duk_resumePtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_resume'); + late final _duk_resume = + _duk_resumePtr + .asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Memory management /// /// Raw functions have no side effects (cannot trigger GC). - ffi.Pointer duk_alloc_raw( - ffi.Pointer ctx, - int size, - ) { - return _duk_alloc_raw( - ctx, - size, - ); + ffi.Pointer duk_alloc_raw(ffi.Pointer ctx, int size) { + return _duk_alloc_raw(ctx, size); } late final _duk_alloc_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_size_t)>>('duk_alloc_raw'); - late final _duk_alloc_raw = _duk_alloc_rawPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_size_t) + > + >('duk_alloc_raw'); + late final _duk_alloc_raw = + _duk_alloc_rawPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_free_raw( - ffi.Pointer ctx, - ffi.Pointer ptr, - ) { - return _duk_free_raw( - ctx, - ptr, - ); + void duk_free_raw(ffi.Pointer ctx, ffi.Pointer ptr) { + return _duk_free_raw(ctx, ptr); } late final _duk_free_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_free_raw'); - late final _duk_free_raw = _duk_free_rawPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_free_raw'); + late final _duk_free_raw = + _duk_free_rawPtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); ffi.Pointer duk_realloc_raw( ffi.Pointer ctx, ffi.Pointer ptr, int size, ) { - return _duk_realloc_raw( - ctx, - ptr, - size, - ); + return _duk_realloc_raw(ctx, ptr, size); } late final _duk_realloc_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, duk_size_t)>>('duk_realloc_raw'); - late final _duk_realloc_raw = _duk_realloc_rawPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_realloc_raw'); + late final _duk_realloc_raw = + _duk_realloc_rawPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); - ffi.Pointer duk_alloc( - ffi.Pointer ctx, - int size, - ) { - return _duk_alloc( - ctx, - size, - ); + ffi.Pointer duk_alloc(ffi.Pointer ctx, int size) { + return _duk_alloc(ctx, size); } late final _duk_allocPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_size_t)>>('duk_alloc'); - late final _duk_alloc = _duk_allocPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_size_t) + > + >('duk_alloc'); + late final _duk_alloc = + _duk_allocPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_free( - ffi.Pointer ctx, - ffi.Pointer ptr, - ) { - return _duk_free( - ctx, - ptr, - ); + void duk_free(ffi.Pointer ctx, ffi.Pointer ptr) { + return _duk_free(ctx, ptr); } late final _duk_freePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, ffi.Pointer)>>('duk_free'); - late final _duk_free = _duk_freePtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_free'); + late final _duk_free = + _duk_freePtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); ffi.Pointer duk_realloc( ffi.Pointer ctx, ffi.Pointer ptr, int size, ) { - return _duk_realloc( - ctx, - ptr, - size, - ); + return _duk_realloc(ctx, ptr, size); } late final _duk_reallocPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, duk_size_t)>>('duk_realloc'); - late final _duk_realloc = _duk_reallocPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_realloc'); + late final _duk_realloc = + _duk_reallocPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); void duk_get_memory_functions( ffi.Pointer ctx, ffi.Pointer out_funcs, ) { - return _duk_get_memory_functions( - ctx, - out_funcs, - ); + return _duk_get_memory_functions(ctx, out_funcs); } late final _duk_get_memory_functionsPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_get_memory_functions'); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ) + > + >('duk_get_memory_functions'); late final _duk_get_memory_functions = - _duk_get_memory_functionsPtr.asFunction< - void Function( - ffi.Pointer, ffi.Pointer)>(); + _duk_get_memory_functionsPtr + .asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); - void duk_gc( - ffi.Pointer ctx, - int flags, - ) { - return _duk_gc( - ctx, - flags, - ); + void duk_gc(ffi.Pointer ctx, int flags) { + return _duk_gc(ctx, flags); } late final _duk_gcPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_uint_t)>>('duk_gc'); + ffi.NativeFunction, duk_uint_t)> + >('duk_gc'); late final _duk_gc = _duk_gcPtr.asFunction, int)>(); - void duk_throw_raw( - ffi.Pointer ctx, - ) { - return _duk_throw_raw( - ctx, - ); + void duk_throw_raw(ffi.Pointer ctx) { + return _duk_throw_raw(ctx); } late final _duk_throw_rawPtr = _lookup)>>( - 'duk_throw_raw'); + 'duk_throw_raw', + ); late final _duk_throw_raw = _duk_throw_rawPtr.asFunction)>(); @@ -272,18 +286,19 @@ class DuktapeBindings { ffi.Pointer ctx, ffi.Pointer err_msg, ) { - return _duk_fatal_raw( - ctx, - err_msg, - ); + return _duk_fatal_raw(ctx, err_msg); } late final _duk_fatal_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_fatal_raw'); - late final _duk_fatal_raw = _duk_fatal_rawPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_fatal_raw'); + late final _duk_fatal_raw = + _duk_fatal_rawPtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); void duk_error_raw( ffi.Pointer ctx, @@ -292,26 +307,31 @@ class DuktapeBindings { int line, ffi.Pointer fmt, ) { - return _duk_error_raw( - ctx, - err_code, - filename, - line, - fmt, - ); + return _duk_error_raw(ctx, err_code, filename, line, fmt); } late final _duk_error_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_errcode_t, + ffi.Pointer, + duk_int_t, + ffi.Pointer, + ) + > + >('duk_error_raw'); + late final _duk_error_raw = + _duk_error_rawPtr + .asFunction< + void Function( ffi.Pointer, - duk_errcode_t, + int, + ffi.Pointer, + int, ffi.Pointer, - duk_int_t, - ffi.Pointer)>>('duk_error_raw'); - late final _duk_error_raw = _duk_error_rawPtr.asFunction< - void Function(ffi.Pointer, int, ffi.Pointer, int, - ffi.Pointer)>(); + ) + >(); void duk_error_va_raw( ffi.Pointer ctx, @@ -321,185 +341,147 @@ class DuktapeBindings { ffi.Pointer fmt, va_list ap, ) { - return _duk_error_va_raw( - ctx, - err_code, - filename, - line, - fmt, - ap, - ); + return _duk_error_va_raw(ctx, err_code, filename, line, fmt, ap); } late final _duk_error_va_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_errcode_t, + ffi.Pointer, + duk_int_t, + ffi.Pointer, + va_list, + ) + > + >('duk_error_va_raw'); + late final _duk_error_va_raw = + _duk_error_va_rawPtr + .asFunction< + void Function( ffi.Pointer, - duk_errcode_t, + int, ffi.Pointer, - duk_int_t, + int, ffi.Pointer, - va_list)>>('duk_error_va_raw'); - late final _duk_error_va_raw = _duk_error_va_rawPtr.asFunction< - void Function(ffi.Pointer, int, ffi.Pointer, int, - ffi.Pointer, va_list)>(); + va_list, + ) + >(); /// Other state related functions - int duk_is_strict_call( - ffi.Pointer ctx, - ) { - return _duk_is_strict_call( - ctx, - ); + int duk_is_strict_call(ffi.Pointer ctx) { + return _duk_is_strict_call(ctx); } late final _duk_is_strict_callPtr = _lookup< - ffi.NativeFunction)>>( - 'duk_is_strict_call'); - late final _duk_is_strict_call = _duk_is_strict_callPtr - .asFunction)>(); + ffi.NativeFunction)> + >('duk_is_strict_call'); + late final _duk_is_strict_call = + _duk_is_strict_callPtr + .asFunction)>(); - int duk_is_constructor_call( - ffi.Pointer ctx, - ) { - return _duk_is_constructor_call( - ctx, - ); + int duk_is_constructor_call(ffi.Pointer ctx) { + return _duk_is_constructor_call(ctx); } late final _duk_is_constructor_callPtr = _lookup< - ffi.NativeFunction)>>( - 'duk_is_constructor_call'); - late final _duk_is_constructor_call = _duk_is_constructor_callPtr - .asFunction)>(); + ffi.NativeFunction)> + >('duk_is_constructor_call'); + late final _duk_is_constructor_call = + _duk_is_constructor_callPtr + .asFunction)>(); /// Stack management - int duk_normalize_index( - ffi.Pointer ctx, - int idx, - ) { - return _duk_normalize_index( - ctx, - idx, - ); + int duk_normalize_index(ffi.Pointer ctx, int idx) { + return _duk_normalize_index(ctx, idx); } late final _duk_normalize_indexPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( - ffi.Pointer, duk_idx_t)>>('duk_normalize_index'); - late final _duk_normalize_index = _duk_normalize_indexPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_normalize_index'); + late final _duk_normalize_index = + _duk_normalize_indexPtr + .asFunction, int)>(); - int duk_require_normalize_index( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_normalize_index( - ctx, - idx, - ); + int duk_require_normalize_index(ffi.Pointer ctx, int idx) { + return _duk_require_normalize_index(ctx, idx); } late final _duk_require_normalize_indexPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function(ffi.Pointer, - duk_idx_t)>>('duk_require_normalize_index'); - late final _duk_require_normalize_index = _duk_require_normalize_indexPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_normalize_index'); + late final _duk_require_normalize_index = + _duk_require_normalize_indexPtr + .asFunction, int)>(); - int duk_is_valid_index( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_valid_index( - ctx, - idx, - ); + int duk_is_valid_index(ffi.Pointer ctx, int idx) { + return _duk_is_valid_index(ctx, idx); } late final _duk_is_valid_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_valid_index'); - late final _duk_is_valid_index = _duk_is_valid_indexPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_valid_index'); + late final _duk_is_valid_index = + _duk_is_valid_indexPtr + .asFunction, int)>(); - void duk_require_valid_index( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_valid_index( - ctx, - idx, - ); + void duk_require_valid_index(ffi.Pointer ctx, int idx) { + return _duk_require_valid_index(ctx, idx); } late final _duk_require_valid_indexPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_valid_index'); - late final _duk_require_valid_index = _duk_require_valid_indexPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_valid_index'); + late final _duk_require_valid_index = + _duk_require_valid_indexPtr + .asFunction, int)>(); - int duk_get_top( - ffi.Pointer ctx, - ) { - return _duk_get_top( - ctx, - ); + int duk_get_top(ffi.Pointer ctx) { + return _duk_get_top(ctx); } late final _duk_get_topPtr = _lookup)>>( - 'duk_get_top'); + 'duk_get_top', + ); late final _duk_get_top = _duk_get_topPtr.asFunction)>(); - void duk_set_top( - ffi.Pointer ctx, - int idx, - ) { - return _duk_set_top( - ctx, - idx, - ); + void duk_set_top(ffi.Pointer ctx, int idx) { + return _duk_set_top(ctx, idx); } late final _duk_set_topPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_set_top'); - late final _duk_set_top = _duk_set_topPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_set_top'); + late final _duk_set_top = + _duk_set_topPtr + .asFunction, int)>(); - int duk_get_top_index( - ffi.Pointer ctx, - ) { - return _duk_get_top_index( - ctx, - ); + int duk_get_top_index(ffi.Pointer ctx) { + return _duk_get_top_index(ctx); } late final _duk_get_top_indexPtr = _lookup)>>( - 'duk_get_top_index'); - late final _duk_get_top_index = _duk_get_top_indexPtr - .asFunction)>(); + 'duk_get_top_index', + ); + late final _duk_get_top_index = + _duk_get_top_indexPtr + .asFunction)>(); - int duk_require_top_index( - ffi.Pointer ctx, - ) { - return _duk_require_top_index( - ctx, - ); + int duk_require_top_index(ffi.Pointer ctx) { + return _duk_require_top_index(ctx); } late final _duk_require_top_indexPtr = _lookup)>>( - 'duk_require_top_index'); - late final _duk_require_top_index = _duk_require_top_indexPtr - .asFunction)>(); + 'duk_require_top_index', + ); + late final _duk_require_top_index = + _duk_require_top_indexPtr + .asFunction)>(); /// Although extra/top could be an unsigned type here, using a signed type /// makes the API more robust to calling code calculation errors or corner @@ -507,224 +489,147 @@ class DuktapeBindings { /// Negative values are treated as zero, which is better than casting them /// to a large unsigned number. (This principle is used elsewhere in the /// API too.) - int duk_check_stack( - ffi.Pointer ctx, - int extra, - ) { - return _duk_check_stack( - ctx, - extra, - ); + int duk_check_stack(ffi.Pointer ctx, int extra) { + return _duk_check_stack(ctx, extra); } late final _duk_check_stackPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_check_stack'); - late final _duk_check_stack = _duk_check_stackPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_check_stack'); + late final _duk_check_stack = + _duk_check_stackPtr + .asFunction, int)>(); - void duk_require_stack( - ffi.Pointer ctx, - int extra, - ) { - return _duk_require_stack( - ctx, - extra, - ); + void duk_require_stack(ffi.Pointer ctx, int extra) { + return _duk_require_stack(ctx, extra); } late final _duk_require_stackPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_stack'); - late final _duk_require_stack = _duk_require_stackPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_stack'); + late final _duk_require_stack = + _duk_require_stackPtr + .asFunction, int)>(); - int duk_check_stack_top( - ffi.Pointer ctx, - int top, - ) { - return _duk_check_stack_top( - ctx, - top, - ); + int duk_check_stack_top(ffi.Pointer ctx, int top) { + return _duk_check_stack_top(ctx, top); } late final _duk_check_stack_topPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_check_stack_top'); - late final _duk_check_stack_top = _duk_check_stack_topPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_check_stack_top'); + late final _duk_check_stack_top = + _duk_check_stack_topPtr + .asFunction, int)>(); - void duk_require_stack_top( - ffi.Pointer ctx, - int top, - ) { - return _duk_require_stack_top( - ctx, - top, - ); + void duk_require_stack_top(ffi.Pointer ctx, int top) { + return _duk_require_stack_top(ctx, top); } late final _duk_require_stack_topPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_stack_top'); - late final _duk_require_stack_top = _duk_require_stack_topPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_stack_top'); + late final _duk_require_stack_top = + _duk_require_stack_topPtr + .asFunction, int)>(); /// Stack manipulation (other than push/pop) - void duk_swap( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_swap( - ctx, - idx1, - idx2, - ); + void duk_swap(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_swap(ctx, idx1, idx2); } late final _duk_swapPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t, duk_idx_t)>>('duk_swap'); - late final _duk_swap = _duk_swapPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_swap'); + late final _duk_swap = + _duk_swapPtr + .asFunction, int, int)>(); - void duk_swap_top( - ffi.Pointer ctx, - int idx, - ) { - return _duk_swap_top( - ctx, - idx, - ); + void duk_swap_top(ffi.Pointer ctx, int idx) { + return _duk_swap_top(ctx, idx); } late final _duk_swap_topPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_swap_top'); - late final _duk_swap_top = _duk_swap_topPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_swap_top'); + late final _duk_swap_top = + _duk_swap_topPtr + .asFunction, int)>(); - void duk_dup( - ffi.Pointer ctx, - int from_idx, - ) { - return _duk_dup( - ctx, - from_idx, - ); + void duk_dup(ffi.Pointer ctx, int from_idx) { + return _duk_dup(ctx, from_idx); } late final _duk_dupPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_dup'); + ffi.NativeFunction, duk_idx_t)> + >('duk_dup'); late final _duk_dup = _duk_dupPtr.asFunction, int)>(); - void duk_dup_top( - ffi.Pointer ctx, - ) { - return _duk_dup_top( - ctx, - ); + void duk_dup_top(ffi.Pointer ctx) { + return _duk_dup_top(ctx); } late final _duk_dup_topPtr = _lookup)>>( - 'duk_dup_top'); + 'duk_dup_top', + ); late final _duk_dup_top = _duk_dup_topPtr.asFunction)>(); - void duk_insert( - ffi.Pointer ctx, - int to_idx, - ) { - return _duk_insert( - ctx, - to_idx, - ); + void duk_insert(ffi.Pointer ctx, int to_idx) { + return _duk_insert(ctx, to_idx); } late final _duk_insertPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_insert'); + ffi.NativeFunction, duk_idx_t)> + >('duk_insert'); late final _duk_insert = _duk_insertPtr.asFunction, int)>(); - void duk_pull( - ffi.Pointer ctx, - int from_idx, - ) { - return _duk_pull( - ctx, - from_idx, - ); + void duk_pull(ffi.Pointer ctx, int from_idx) { + return _duk_pull(ctx, from_idx); } late final _duk_pullPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_pull'); + ffi.NativeFunction, duk_idx_t)> + >('duk_pull'); late final _duk_pull = _duk_pullPtr.asFunction, int)>(); - void duk_replace( - ffi.Pointer ctx, - int to_idx, - ) { - return _duk_replace( - ctx, - to_idx, - ); + void duk_replace(ffi.Pointer ctx, int to_idx) { + return _duk_replace(ctx, to_idx); } late final _duk_replacePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_replace'); - late final _duk_replace = _duk_replacePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_replace'); + late final _duk_replace = + _duk_replacePtr + .asFunction, int)>(); - void duk_copy( - ffi.Pointer ctx, - int from_idx, - int to_idx, - ) { - return _duk_copy( - ctx, - from_idx, - to_idx, - ); + void duk_copy(ffi.Pointer ctx, int from_idx, int to_idx) { + return _duk_copy(ctx, from_idx, to_idx); } late final _duk_copyPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t, duk_idx_t)>>('duk_copy'); - late final _duk_copy = _duk_copyPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_copy'); + late final _duk_copy = + _duk_copyPtr + .asFunction, int, int)>(); - void duk_remove( - ffi.Pointer ctx, - int idx, - ) { - return _duk_remove( - ctx, - idx, - ); + void duk_remove(ffi.Pointer ctx, int idx) { + return _duk_remove(ctx, idx); } late final _duk_removePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_remove'); + ffi.NativeFunction, duk_idx_t)> + >('duk_remove'); late final _duk_remove = _duk_removePtr.asFunction, int)>(); @@ -734,21 +639,29 @@ class DuktapeBindings { int count, int is_copy, ) { - return _duk_xcopymove_raw( - to_ctx, - from_ctx, - count, - is_copy, - ); + return _duk_xcopymove_raw(to_ctx, from_ctx, count, is_copy); } late final _duk_xcopymove_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - duk_idx_t, duk_bool_t)>>('duk_xcopymove_raw'); - late final _duk_xcopymove_raw = _duk_xcopymove_rawPtr.asFunction< - void Function( - ffi.Pointer, ffi.Pointer, int, int)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + duk_idx_t, + duk_bool_t, + ) + > + >('duk_xcopymove_raw'); + late final _duk_xcopymove_raw = + _duk_xcopymove_rawPtr + .asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + int, + int, + ) + >(); /// Push operations /// @@ -756,446 +669,417 @@ class DuktapeBindings { /// position of the pushed value for convenience. /// /// Note: duk_dup() is technically a push. - void duk_push_undefined( - ffi.Pointer ctx, - ) { - return _duk_push_undefined( - ctx, - ); + void duk_push_undefined(ffi.Pointer ctx) { + return _duk_push_undefined(ctx); } late final _duk_push_undefinedPtr = _lookup)>>( - 'duk_push_undefined'); - late final _duk_push_undefined = _duk_push_undefinedPtr - .asFunction)>(); + 'duk_push_undefined', + ); + late final _duk_push_undefined = + _duk_push_undefinedPtr + .asFunction)>(); - void duk_push_null( - ffi.Pointer ctx, - ) { - return _duk_push_null( - ctx, - ); + void duk_push_null(ffi.Pointer ctx) { + return _duk_push_null(ctx); } late final _duk_push_nullPtr = _lookup)>>( - 'duk_push_null'); + 'duk_push_null', + ); late final _duk_push_null = _duk_push_nullPtr.asFunction)>(); - void duk_push_boolean( - ffi.Pointer ctx, - int val, - ) { - return _duk_push_boolean( - ctx, - val, - ); + void duk_push_boolean(ffi.Pointer ctx, int val) { + return _duk_push_boolean(ctx, val); } late final _duk_push_booleanPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_bool_t)>>('duk_push_boolean'); - late final _duk_push_boolean = _duk_push_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_bool_t)> + >('duk_push_boolean'); + late final _duk_push_boolean = + _duk_push_booleanPtr + .asFunction, int)>(); - void duk_push_true( - ffi.Pointer ctx, - ) { - return _duk_push_true( - ctx, - ); + void duk_push_true(ffi.Pointer ctx) { + return _duk_push_true(ctx); } late final _duk_push_truePtr = _lookup)>>( - 'duk_push_true'); + 'duk_push_true', + ); late final _duk_push_true = _duk_push_truePtr.asFunction)>(); - void duk_push_false( - ffi.Pointer ctx, - ) { - return _duk_push_false( - ctx, - ); + void duk_push_false(ffi.Pointer ctx) { + return _duk_push_false(ctx); } late final _duk_push_falsePtr = _lookup)>>( - 'duk_push_false'); + 'duk_push_false', + ); late final _duk_push_false = _duk_push_falsePtr.asFunction)>(); - void duk_push_number( - ffi.Pointer ctx, - double val, - ) { - return _duk_push_number( - ctx, - val, - ); + void duk_push_number(ffi.Pointer ctx, double val) { + return _duk_push_number(ctx, val); } late final _duk_push_numberPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_double_t)>>('duk_push_number'); - late final _duk_push_number = _duk_push_numberPtr - .asFunction, double)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_double_t) + > + >('duk_push_number'); + late final _duk_push_number = + _duk_push_numberPtr + .asFunction, double)>(); - void duk_push_nan( - ffi.Pointer ctx, - ) { - return _duk_push_nan( - ctx, - ); + void duk_push_nan(ffi.Pointer ctx) { + return _duk_push_nan(ctx); } late final _duk_push_nanPtr = _lookup)>>( - 'duk_push_nan'); + 'duk_push_nan', + ); late final _duk_push_nan = _duk_push_nanPtr.asFunction)>(); - void duk_push_int( - ffi.Pointer ctx, - int val, - ) { - return _duk_push_int( - ctx, - val, - ); + void duk_push_int(ffi.Pointer ctx, int val) { + return _duk_push_int(ctx, val); } late final _duk_push_intPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_int_t)>>('duk_push_int'); - late final _duk_push_int = _duk_push_intPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_int_t)> + >('duk_push_int'); + late final _duk_push_int = + _duk_push_intPtr + .asFunction, int)>(); - void duk_push_uint( - ffi.Pointer ctx, - int val, - ) { - return _duk_push_uint( - ctx, - val, - ); + void duk_push_uint(ffi.Pointer ctx, int val) { + return _duk_push_uint(ctx, val); } late final _duk_push_uintPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_uint_t)>>('duk_push_uint'); - late final _duk_push_uint = _duk_push_uintPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_uint_t)> + >('duk_push_uint'); + late final _duk_push_uint = + _duk_push_uintPtr + .asFunction, int)>(); ffi.Pointer duk_push_string( ffi.Pointer ctx, ffi.Pointer str, ) { - return _duk_push_string( - ctx, - str, - ); + return _duk_push_string(ctx, str); } late final _duk_push_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_string'); - late final _duk_push_string = _duk_push_stringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, + ffi.Pointer, + ) + > + >('duk_push_string'); + late final _duk_push_string = + _duk_push_stringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); ffi.Pointer duk_push_lstring( ffi.Pointer ctx, ffi.Pointer str, int len, ) { - return _duk_push_lstring( - ctx, - str, - len, - ); + return _duk_push_lstring(ctx, str, len); } late final _duk_push_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, duk_size_t)>>('duk_push_lstring'); - late final _duk_push_lstring = _duk_push_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_push_lstring'); + late final _duk_push_lstring = + _duk_push_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); - void duk_push_pointer( - ffi.Pointer ctx, - ffi.Pointer p, - ) { - return _duk_push_pointer( - ctx, - p, - ); + void duk_push_pointer(ffi.Pointer ctx, ffi.Pointer p) { + return _duk_push_pointer(ctx, p); } late final _duk_push_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_pointer'); - late final _duk_push_pointer = _duk_push_pointerPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_push_pointer'); + late final _duk_push_pointer = + _duk_push_pointerPtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); ffi.Pointer duk_push_sprintf( ffi.Pointer ctx, ffi.Pointer fmt, ) { - return _duk_push_sprintf( - ctx, - fmt, - ); + return _duk_push_sprintf(ctx, fmt); } late final _duk_push_sprintfPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_sprintf'); - late final _duk_push_sprintf = _duk_push_sprintfPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, + ffi.Pointer, + ) + > + >('duk_push_sprintf'); + late final _duk_push_sprintf = + _duk_push_sprintfPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); ffi.Pointer duk_push_vsprintf( ffi.Pointer ctx, ffi.Pointer fmt, va_list ap, ) { - return _duk_push_vsprintf( - ctx, - fmt, - ap, - ); + return _duk_push_vsprintf(ctx, fmt, ap); } late final _duk_push_vsprintfPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, va_list)>>('duk_push_vsprintf'); - late final _duk_push_vsprintf = _duk_push_vsprintfPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, va_list)>(); + ffi.Pointer, + ffi.Pointer, + va_list, + ) + > + >('duk_push_vsprintf'); + late final _duk_push_vsprintf = + _duk_push_vsprintfPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + va_list, + ) + >(); ffi.Pointer duk_push_literal_raw( ffi.Pointer ctx, ffi.Pointer str, int len, ) { - return _duk_push_literal_raw( - ctx, - str, - len, - ); + return _duk_push_literal_raw(ctx, str, len); } late final _duk_push_literal_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, duk_size_t)>>('duk_push_literal_raw'); - late final _duk_push_literal_raw = _duk_push_literal_rawPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_push_literal_raw'); + late final _duk_push_literal_raw = + _duk_push_literal_rawPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); - void duk_push_this( - ffi.Pointer ctx, - ) { - return _duk_push_this( - ctx, - ); + void duk_push_this(ffi.Pointer ctx) { + return _duk_push_this(ctx); } late final _duk_push_thisPtr = _lookup)>>( - 'duk_push_this'); + 'duk_push_this', + ); late final _duk_push_this = _duk_push_thisPtr.asFunction)>(); - void duk_push_new_target( - ffi.Pointer ctx, - ) { - return _duk_push_new_target( - ctx, - ); + void duk_push_new_target(ffi.Pointer ctx) { + return _duk_push_new_target(ctx); } late final _duk_push_new_targetPtr = _lookup)>>( - 'duk_push_new_target'); - late final _duk_push_new_target = _duk_push_new_targetPtr - .asFunction)>(); + 'duk_push_new_target', + ); + late final _duk_push_new_target = + _duk_push_new_targetPtr + .asFunction)>(); - void duk_push_current_function( - ffi.Pointer ctx, - ) { - return _duk_push_current_function( - ctx, - ); + void duk_push_current_function(ffi.Pointer ctx) { + return _duk_push_current_function(ctx); } late final _duk_push_current_functionPtr = _lookup)>>( - 'duk_push_current_function'); - late final _duk_push_current_function = _duk_push_current_functionPtr - .asFunction)>(); + 'duk_push_current_function', + ); + late final _duk_push_current_function = + _duk_push_current_functionPtr + .asFunction)>(); - void duk_push_current_thread( - ffi.Pointer ctx, - ) { - return _duk_push_current_thread( - ctx, - ); + void duk_push_current_thread(ffi.Pointer ctx) { + return _duk_push_current_thread(ctx); } late final _duk_push_current_threadPtr = _lookup)>>( - 'duk_push_current_thread'); - late final _duk_push_current_thread = _duk_push_current_threadPtr - .asFunction)>(); + 'duk_push_current_thread', + ); + late final _duk_push_current_thread = + _duk_push_current_threadPtr + .asFunction)>(); - void duk_push_global_object( - ffi.Pointer ctx, - ) { - return _duk_push_global_object( - ctx, - ); + void duk_push_global_object(ffi.Pointer ctx) { + return _duk_push_global_object(ctx); } late final _duk_push_global_objectPtr = _lookup)>>( - 'duk_push_global_object'); - late final _duk_push_global_object = _duk_push_global_objectPtr - .asFunction)>(); + 'duk_push_global_object', + ); + late final _duk_push_global_object = + _duk_push_global_objectPtr + .asFunction)>(); - void duk_push_heap_stash( - ffi.Pointer ctx, - ) { - return _duk_push_heap_stash( - ctx, - ); + void duk_push_heap_stash(ffi.Pointer ctx) { + return _duk_push_heap_stash(ctx); } late final _duk_push_heap_stashPtr = _lookup)>>( - 'duk_push_heap_stash'); - late final _duk_push_heap_stash = _duk_push_heap_stashPtr - .asFunction)>(); + 'duk_push_heap_stash', + ); + late final _duk_push_heap_stash = + _duk_push_heap_stashPtr + .asFunction)>(); - void duk_push_global_stash( - ffi.Pointer ctx, - ) { - return _duk_push_global_stash( - ctx, - ); + void duk_push_global_stash(ffi.Pointer ctx) { + return _duk_push_global_stash(ctx); } late final _duk_push_global_stashPtr = _lookup)>>( - 'duk_push_global_stash'); - late final _duk_push_global_stash = _duk_push_global_stashPtr - .asFunction)>(); + 'duk_push_global_stash', + ); + late final _duk_push_global_stash = + _duk_push_global_stashPtr + .asFunction)>(); void duk_push_thread_stash( ffi.Pointer ctx, ffi.Pointer target_ctx, ) { - return _duk_push_thread_stash( - ctx, - target_ctx, - ); + return _duk_push_thread_stash(ctx, target_ctx); } late final _duk_push_thread_stashPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_thread_stash'); - late final _duk_push_thread_stash = _duk_push_thread_stashPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_push_thread_stash'); + late final _duk_push_thread_stash = + _duk_push_thread_stashPtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); - int duk_push_object( - ffi.Pointer ctx, - ) { - return _duk_push_object( - ctx, - ); + int duk_push_object(ffi.Pointer ctx) { + return _duk_push_object(ctx); } late final _duk_push_objectPtr = _lookup)>>( - 'duk_push_object'); + 'duk_push_object', + ); late final _duk_push_object = _duk_push_objectPtr.asFunction)>(); - int duk_push_bare_object( - ffi.Pointer ctx, - ) { - return _duk_push_bare_object( - ctx, - ); + int duk_push_bare_object(ffi.Pointer ctx) { + return _duk_push_bare_object(ctx); } late final _duk_push_bare_objectPtr = _lookup)>>( - 'duk_push_bare_object'); - late final _duk_push_bare_object = _duk_push_bare_objectPtr - .asFunction)>(); + 'duk_push_bare_object', + ); + late final _duk_push_bare_object = + _duk_push_bare_objectPtr + .asFunction)>(); - int duk_push_array( - ffi.Pointer ctx, - ) { - return _duk_push_array( - ctx, - ); + int duk_push_array(ffi.Pointer ctx) { + return _duk_push_array(ctx); } late final _duk_push_arrayPtr = _lookup)>>( - 'duk_push_array'); + 'duk_push_array', + ); late final _duk_push_array = _duk_push_arrayPtr.asFunction)>(); - int duk_push_bare_array( - ffi.Pointer ctx, - ) { - return _duk_push_bare_array( - ctx, - ); + int duk_push_bare_array(ffi.Pointer ctx) { + return _duk_push_bare_array(ctx); } late final _duk_push_bare_arrayPtr = _lookup)>>( - 'duk_push_bare_array'); - late final _duk_push_bare_array = _duk_push_bare_arrayPtr - .asFunction)>(); + 'duk_push_bare_array', + ); + late final _duk_push_bare_array = + _duk_push_bare_arrayPtr + .asFunction)>(); int duk_push_c_function( ffi.Pointer ctx, duk_c_function func, int nargs, ) { - return _duk_push_c_function( - ctx, - func, - nargs, - ); + return _duk_push_c_function(ctx, func, nargs); } late final _duk_push_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function(ffi.Pointer, duk_c_function, - duk_idx_t)>>('duk_push_c_function'); - late final _duk_push_c_function = _duk_push_c_functionPtr.asFunction< - int Function(ffi.Pointer, duk_c_function, int)>(); + ffi.NativeFunction< + duk_idx_t Function(ffi.Pointer, duk_c_function, duk_idx_t) + > + >('duk_push_c_function'); + late final _duk_push_c_function = + _duk_push_c_functionPtr + .asFunction< + int Function(ffi.Pointer, duk_c_function, int) + >(); int duk_push_c_lightfunc( ffi.Pointer ctx, @@ -1204,55 +1088,53 @@ class DuktapeBindings { int length, int magic, ) { - return _duk_push_c_lightfunc( - ctx, - func, - nargs, - length, - magic, - ); + return _duk_push_c_lightfunc(ctx, func, nargs, length, magic); } late final _duk_push_c_lightfuncPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function(ffi.Pointer, duk_c_function, - duk_idx_t, duk_idx_t, duk_int_t)>>('duk_push_c_lightfunc'); - late final _duk_push_c_lightfunc = _duk_push_c_lightfuncPtr.asFunction< - int Function(ffi.Pointer, duk_c_function, int, int, int)>(); + ffi.NativeFunction< + duk_idx_t Function( + ffi.Pointer, + duk_c_function, + duk_idx_t, + duk_idx_t, + duk_int_t, + ) + > + >('duk_push_c_lightfunc'); + late final _duk_push_c_lightfunc = + _duk_push_c_lightfuncPtr + .asFunction< + int Function( + ffi.Pointer, + duk_c_function, + int, + int, + int, + ) + >(); - int duk_push_thread_raw( - ffi.Pointer ctx, - int flags, - ) { - return _duk_push_thread_raw( - ctx, - flags, - ); + int duk_push_thread_raw(ffi.Pointer ctx, int flags) { + return _duk_push_thread_raw(ctx, flags); } late final _duk_push_thread_rawPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( - ffi.Pointer, duk_uint_t)>>('duk_push_thread_raw'); - late final _duk_push_thread_raw = _duk_push_thread_rawPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_uint_t)> + >('duk_push_thread_raw'); + late final _duk_push_thread_raw = + _duk_push_thread_rawPtr + .asFunction, int)>(); - int duk_push_proxy( - ffi.Pointer ctx, - int proxy_flags, - ) { - return _duk_push_proxy( - ctx, - proxy_flags, - ); + int duk_push_proxy(ffi.Pointer ctx, int proxy_flags) { + return _duk_push_proxy(ctx, proxy_flags); } late final _duk_push_proxyPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( - ffi.Pointer, duk_uint_t)>>('duk_push_proxy'); - late final _duk_push_proxy = _duk_push_proxyPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_uint_t)> + >('duk_push_proxy'); + late final _duk_push_proxy = + _duk_push_proxyPtr + .asFunction, int)>(); int duk_push_error_object_raw( ffi.Pointer ctx, @@ -1261,27 +1143,31 @@ class DuktapeBindings { int line, ffi.Pointer fmt, ) { - return _duk_push_error_object_raw( - ctx, - err_code, - filename, - line, - fmt, - ); + return _duk_push_error_object_raw(ctx, err_code, filename, line, fmt); } late final _duk_push_error_object_rawPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( + ffi.NativeFunction< + duk_idx_t Function( + ffi.Pointer, + duk_errcode_t, + ffi.Pointer, + duk_int_t, + ffi.Pointer, + ) + > + >('duk_push_error_object_raw'); + late final _duk_push_error_object_raw = + _duk_push_error_object_rawPtr + .asFunction< + int Function( ffi.Pointer, - duk_errcode_t, + int, ffi.Pointer, - duk_int_t, - ffi.Pointer)>>('duk_push_error_object_raw'); - late final _duk_push_error_object_raw = - _duk_push_error_object_rawPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer, - int, ffi.Pointer)>(); + int, + ffi.Pointer, + ) + >(); int duk_push_error_object_va_raw( ffi.Pointer ctx, @@ -1302,37 +1188,52 @@ class DuktapeBindings { } late final _duk_push_error_object_va_rawPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( + ffi.NativeFunction< + duk_idx_t Function( + ffi.Pointer, + duk_errcode_t, + ffi.Pointer, + duk_int_t, + ffi.Pointer, + va_list, + ) + > + >('duk_push_error_object_va_raw'); + late final _duk_push_error_object_va_raw = + _duk_push_error_object_va_rawPtr + .asFunction< + int Function( ffi.Pointer, - duk_errcode_t, + int, ffi.Pointer, - duk_int_t, + int, ffi.Pointer, - va_list)>>('duk_push_error_object_va_raw'); - late final _duk_push_error_object_va_raw = - _duk_push_error_object_va_rawPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer, - int, ffi.Pointer, va_list)>(); + va_list, + ) + >(); ffi.Pointer duk_push_buffer_raw( ffi.Pointer ctx, int size, int flags, ) { - return _duk_push_buffer_raw( - ctx, - size, - flags, - ); + return _duk_push_buffer_raw(ctx, size, flags); } late final _duk_push_buffer_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_size_t, - duk_small_uint_t)>>('duk_push_buffer_raw'); - late final _duk_push_buffer_raw = _duk_push_buffer_rawPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, int)>(); + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_size_t, + duk_small_uint_t, + ) + > + >('duk_push_buffer_raw'); + late final _duk_push_buffer_raw = + _duk_push_buffer_rawPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int, int) + >(); void duk_push_buffer_object( ffi.Pointer ctx, @@ -1351,85 +1252,81 @@ class DuktapeBindings { } late final _duk_push_buffer_objectPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, duk_size_t, - duk_size_t, duk_uint_t)>>('duk_push_buffer_object'); - late final _duk_push_buffer_object = _duk_push_buffer_objectPtr.asFunction< - void Function(ffi.Pointer, int, int, int, int)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + duk_size_t, + duk_size_t, + duk_uint_t, + ) + > + >('duk_push_buffer_object'); + late final _duk_push_buffer_object = + _duk_push_buffer_objectPtr + .asFunction< + void Function(ffi.Pointer, int, int, int, int) + >(); int duk_push_heapptr( ffi.Pointer ctx, ffi.Pointer ptr, ) { - return _duk_push_heapptr( - ctx, - ptr, - ); + return _duk_push_heapptr(ctx, ptr); } late final _duk_push_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_heapptr'); - late final _duk_push_heapptr = _duk_push_heapptrPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_idx_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_push_heapptr'); + late final _duk_push_heapptr = + _duk_push_heapptrPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); /// Pop operations - void duk_pop( - ffi.Pointer ctx, - ) { - return _duk_pop( - ctx, - ); + void duk_pop(ffi.Pointer ctx) { + return _duk_pop(ctx); } late final _duk_popPtr = _lookup)>>( - 'duk_pop'); + 'duk_pop', + ); late final _duk_pop = _duk_popPtr.asFunction)>(); - void duk_pop_n( - ffi.Pointer ctx, - int count, - ) { - return _duk_pop_n( - ctx, - count, - ); + void duk_pop_n(ffi.Pointer ctx, int count) { + return _duk_pop_n(ctx, count); } late final _duk_pop_nPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_pop_n'); + ffi.NativeFunction, duk_idx_t)> + >('duk_pop_n'); late final _duk_pop_n = _duk_pop_nPtr.asFunction, int)>(); - void duk_pop_2( - ffi.Pointer ctx, - ) { - return _duk_pop_2( - ctx, - ); + void duk_pop_2(ffi.Pointer ctx) { + return _duk_pop_2(ctx); } late final _duk_pop_2Ptr = _lookup)>>( - 'duk_pop_2'); + 'duk_pop_2', + ); late final _duk_pop_2 = _duk_pop_2Ptr.asFunction)>(); - void duk_pop_3( - ffi.Pointer ctx, - ) { - return _duk_pop_3( - ctx, - ); + void duk_pop_3(ffi.Pointer ctx) { + return _duk_pop_3(ctx); } late final _duk_pop_3Ptr = _lookup)>>( - 'duk_pop_3'); + 'duk_pop_3', + ); late final _duk_pop_3 = _duk_pop_3Ptr.asFunction)>(); @@ -1437,686 +1334,513 @@ class DuktapeBindings { /// /// duk_is_none(), which would indicate whether index it outside of stack, /// is not needed; duk_is_valid_index() gives the same information. - int duk_get_type( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_type( - ctx, - idx, - ); + int duk_get_type(ffi.Pointer ctx, int idx) { + return _duk_get_type(ctx, idx); } late final _duk_get_typePtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_type'); - late final _duk_get_type = _duk_get_typePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_type'); + late final _duk_get_type = + _duk_get_typePtr + .asFunction, int)>(); - int duk_check_type( - ffi.Pointer ctx, - int idx, - int type, - ) { - return _duk_check_type( - ctx, - idx, - type, - ); + int duk_check_type(ffi.Pointer ctx, int idx, int type) { + return _duk_check_type(ctx, idx, type); } late final _duk_check_typePtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_int_t)>>('duk_check_type'); - late final _duk_check_type = _duk_check_typePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_check_type'); + late final _duk_check_type = + _duk_check_typePtr + .asFunction, int, int)>(); - int duk_get_type_mask( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_type_mask( - ctx, - idx, - ); + int duk_get_type_mask(ffi.Pointer ctx, int idx) { + return _duk_get_type_mask(ctx, idx); } late final _duk_get_type_maskPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_type_mask'); - late final _duk_get_type_mask = _duk_get_type_maskPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_type_mask'); + late final _duk_get_type_mask = + _duk_get_type_maskPtr + .asFunction, int)>(); - int duk_check_type_mask( - ffi.Pointer ctx, - int idx, - int mask, - ) { - return _duk_check_type_mask( - ctx, - idx, - mask, - ); + int duk_check_type_mask(ffi.Pointer ctx, int idx, int mask) { + return _duk_check_type_mask(ctx, idx, mask); } late final _duk_check_type_maskPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_check_type_mask'); - late final _duk_check_type_mask = _duk_check_type_maskPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_check_type_mask'); + late final _duk_check_type_mask = + _duk_check_type_maskPtr + .asFunction, int, int)>(); - int duk_is_undefined( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_undefined( - ctx, - idx, - ); + int duk_is_undefined(ffi.Pointer ctx, int idx) { + return _duk_is_undefined(ctx, idx); } late final _duk_is_undefinedPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_undefined'); - late final _duk_is_undefined = _duk_is_undefinedPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_undefined'); + late final _duk_is_undefined = + _duk_is_undefinedPtr + .asFunction, int)>(); - int duk_is_null( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_null( - ctx, - idx, - ); + int duk_is_null(ffi.Pointer ctx, int idx) { + return _duk_is_null(ctx, idx); } late final _duk_is_nullPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_null'); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_null'); late final _duk_is_null = _duk_is_nullPtr.asFunction, int)>(); - int duk_is_boolean( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_boolean( - ctx, - idx, - ); + int duk_is_boolean(ffi.Pointer ctx, int idx) { + return _duk_is_boolean(ctx, idx); } late final _duk_is_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_boolean'); - late final _duk_is_boolean = _duk_is_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_boolean'); + late final _duk_is_boolean = + _duk_is_booleanPtr + .asFunction, int)>(); - int duk_is_number( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_number( - ctx, - idx, - ); + int duk_is_number(ffi.Pointer ctx, int idx) { + return _duk_is_number(ctx, idx); } late final _duk_is_numberPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_number'); - late final _duk_is_number = _duk_is_numberPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_number'); + late final _duk_is_number = + _duk_is_numberPtr + .asFunction, int)>(); - int duk_is_nan( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_nan( - ctx, - idx, - ); + int duk_is_nan(ffi.Pointer ctx, int idx) { + return _duk_is_nan(ctx, idx); } late final _duk_is_nanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_nan'); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_nan'); late final _duk_is_nan = _duk_is_nanPtr.asFunction, int)>(); - int duk_is_string( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_string( - ctx, - idx, - ); + int duk_is_string(ffi.Pointer ctx, int idx) { + return _duk_is_string(ctx, idx); } late final _duk_is_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_string'); - late final _duk_is_string = _duk_is_stringPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_string'); + late final _duk_is_string = + _duk_is_stringPtr + .asFunction, int)>(); - int duk_is_object( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_object( - ctx, - idx, - ); + int duk_is_object(ffi.Pointer ctx, int idx) { + return _duk_is_object(ctx, idx); } late final _duk_is_objectPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_object'); - late final _duk_is_object = _duk_is_objectPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_object'); + late final _duk_is_object = + _duk_is_objectPtr + .asFunction, int)>(); - int duk_is_buffer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_buffer( - ctx, - idx, - ); + int duk_is_buffer(ffi.Pointer ctx, int idx) { + return _duk_is_buffer(ctx, idx); } late final _duk_is_bufferPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_buffer'); - late final _duk_is_buffer = _duk_is_bufferPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_buffer'); + late final _duk_is_buffer = + _duk_is_bufferPtr + .asFunction, int)>(); - int duk_is_buffer_data( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_buffer_data( - ctx, - idx, - ); + int duk_is_buffer_data(ffi.Pointer ctx, int idx) { + return _duk_is_buffer_data(ctx, idx); } late final _duk_is_buffer_dataPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_buffer_data'); - late final _duk_is_buffer_data = _duk_is_buffer_dataPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_buffer_data'); + late final _duk_is_buffer_data = + _duk_is_buffer_dataPtr + .asFunction, int)>(); - int duk_is_pointer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_pointer( - ctx, - idx, - ); + int duk_is_pointer(ffi.Pointer ctx, int idx) { + return _duk_is_pointer(ctx, idx); } late final _duk_is_pointerPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_pointer'); - late final _duk_is_pointer = _duk_is_pointerPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_pointer'); + late final _duk_is_pointer = + _duk_is_pointerPtr + .asFunction, int)>(); - int duk_is_lightfunc( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_lightfunc( - ctx, - idx, - ); + int duk_is_lightfunc(ffi.Pointer ctx, int idx) { + return _duk_is_lightfunc(ctx, idx); } late final _duk_is_lightfuncPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_lightfunc'); - late final _duk_is_lightfunc = _duk_is_lightfuncPtr - .asFunction, int)>(); - - int duk_is_symbol( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_symbol( - ctx, - idx, - ); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_lightfunc'); + late final _duk_is_lightfunc = + _duk_is_lightfuncPtr + .asFunction, int)>(); + + int duk_is_symbol(ffi.Pointer ctx, int idx) { + return _duk_is_symbol(ctx, idx); } late final _duk_is_symbolPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_symbol'); - late final _duk_is_symbol = _duk_is_symbolPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_symbol'); + late final _duk_is_symbol = + _duk_is_symbolPtr + .asFunction, int)>(); - int duk_is_array( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_array( - ctx, - idx, - ); + int duk_is_array(ffi.Pointer ctx, int idx) { + return _duk_is_array(ctx, idx); } late final _duk_is_arrayPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_array'); - late final _duk_is_array = _duk_is_arrayPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_array'); + late final _duk_is_array = + _duk_is_arrayPtr + .asFunction, int)>(); - int duk_is_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_function( - ctx, - idx, - ); + int duk_is_function(ffi.Pointer ctx, int idx) { + return _duk_is_function(ctx, idx); } late final _duk_is_functionPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_function'); - late final _duk_is_function = _duk_is_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_function'); + late final _duk_is_function = + _duk_is_functionPtr + .asFunction, int)>(); - int duk_is_c_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_c_function( - ctx, - idx, - ); + int duk_is_c_function(ffi.Pointer ctx, int idx) { + return _duk_is_c_function(ctx, idx); } late final _duk_is_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_c_function'); - late final _duk_is_c_function = _duk_is_c_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_c_function'); + late final _duk_is_c_function = + _duk_is_c_functionPtr + .asFunction, int)>(); - int duk_is_ecmascript_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_ecmascript_function( - ctx, - idx, - ); + int duk_is_ecmascript_function(ffi.Pointer ctx, int idx) { + return _duk_is_ecmascript_function(ctx, idx); } late final _duk_is_ecmascript_functionPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - duk_idx_t)>>('duk_is_ecmascript_function'); - late final _duk_is_ecmascript_function = _duk_is_ecmascript_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_ecmascript_function'); + late final _duk_is_ecmascript_function = + _duk_is_ecmascript_functionPtr + .asFunction, int)>(); - int duk_is_bound_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_bound_function( - ctx, - idx, - ); + int duk_is_bound_function(ffi.Pointer ctx, int idx) { + return _duk_is_bound_function(ctx, idx); } late final _duk_is_bound_functionPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_bound_function'); - late final _duk_is_bound_function = _duk_is_bound_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_bound_function'); + late final _duk_is_bound_function = + _duk_is_bound_functionPtr + .asFunction, int)>(); - int duk_is_thread( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_thread( - ctx, - idx, - ); + int duk_is_thread(ffi.Pointer ctx, int idx) { + return _duk_is_thread(ctx, idx); } late final _duk_is_threadPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_thread'); - late final _duk_is_thread = _duk_is_threadPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_thread'); + late final _duk_is_thread = + _duk_is_threadPtr + .asFunction, int)>(); - int duk_is_constructable( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_constructable( - ctx, - idx, - ); + int duk_is_constructable(ffi.Pointer ctx, int idx) { + return _duk_is_constructable(ctx, idx); } late final _duk_is_constructablePtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_constructable'); - late final _duk_is_constructable = _duk_is_constructablePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_constructable'); + late final _duk_is_constructable = + _duk_is_constructablePtr + .asFunction, int)>(); - int duk_is_dynamic_buffer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_dynamic_buffer( - ctx, - idx, - ); + int duk_is_dynamic_buffer(ffi.Pointer ctx, int idx) { + return _duk_is_dynamic_buffer(ctx, idx); } late final _duk_is_dynamic_bufferPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_dynamic_buffer'); - late final _duk_is_dynamic_buffer = _duk_is_dynamic_bufferPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_dynamic_buffer'); + late final _duk_is_dynamic_buffer = + _duk_is_dynamic_bufferPtr + .asFunction, int)>(); - int duk_is_fixed_buffer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_fixed_buffer( - ctx, - idx, - ); + int duk_is_fixed_buffer(ffi.Pointer ctx, int idx) { + return _duk_is_fixed_buffer(ctx, idx); } late final _duk_is_fixed_bufferPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_fixed_buffer'); - late final _duk_is_fixed_buffer = _duk_is_fixed_bufferPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_fixed_buffer'); + late final _duk_is_fixed_buffer = + _duk_is_fixed_bufferPtr + .asFunction, int)>(); - int duk_is_external_buffer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_external_buffer( - ctx, - idx, - ); + int duk_is_external_buffer(ffi.Pointer ctx, int idx) { + return _duk_is_external_buffer(ctx, idx); } late final _duk_is_external_bufferPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_external_buffer'); - late final _duk_is_external_buffer = _duk_is_external_bufferPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_external_buffer'); + late final _duk_is_external_buffer = + _duk_is_external_bufferPtr + .asFunction, int)>(); - int duk_get_error_code( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_error_code( - ctx, - idx, - ); + int duk_get_error_code(ffi.Pointer ctx, int idx) { + return _duk_get_error_code(ctx, idx); } late final _duk_get_error_codePtr = _lookup< - ffi.NativeFunction< - duk_errcode_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_error_code'); - late final _duk_get_error_code = _duk_get_error_codePtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_errcode_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_error_code'); + late final _duk_get_error_code = + _duk_get_error_codePtr + .asFunction, int)>(); /// Get operations: no coercion, returns default value for invalid /// indices and invalid value types. /// /// duk_get_undefined() and duk_get_null() would be pointless and /// are not included. - int duk_get_boolean( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_boolean( - ctx, - idx, - ); + int duk_get_boolean(ffi.Pointer ctx, int idx) { + return _duk_get_boolean(ctx, idx); } late final _duk_get_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_boolean'); - late final _duk_get_boolean = _duk_get_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_boolean'); + late final _duk_get_boolean = + _duk_get_booleanPtr + .asFunction, int)>(); - double duk_get_number( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_number( - ctx, - idx, - ); + double duk_get_number(ffi.Pointer ctx, int idx) { + return _duk_get_number(ctx, idx); } late final _duk_get_numberPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_number'); - late final _duk_get_number = _duk_get_numberPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_number'); + late final _duk_get_number = + _duk_get_numberPtr + .asFunction, int)>(); - int duk_get_int( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_int( - ctx, - idx, - ); + int duk_get_int(ffi.Pointer ctx, int idx) { + return _duk_get_int(ctx, idx); } late final _duk_get_intPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_int'); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_int'); late final _duk_get_int = _duk_get_intPtr.asFunction, int)>(); - int duk_get_uint( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_uint( - ctx, - idx, - ); + int duk_get_uint(ffi.Pointer ctx, int idx) { + return _duk_get_uint(ctx, idx); } late final _duk_get_uintPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_uint'); - late final _duk_get_uint = _duk_get_uintPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_uint'); + late final _duk_get_uint = + _duk_get_uintPtr + .asFunction, int)>(); - ffi.Pointer duk_get_string( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_string( - ctx, - idx, - ); + ffi.Pointer duk_get_string(ffi.Pointer ctx, int idx) { + return _duk_get_string(ctx, idx); } late final _duk_get_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_get_string'); - late final _duk_get_string = _duk_get_stringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_string'); + late final _duk_get_string = + _duk_get_stringPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); ffi.Pointer duk_get_lstring( ffi.Pointer ctx, int idx, ffi.Pointer out_len, ) { - return _duk_get_lstring( - ctx, - idx, - out_len, - ); + return _duk_get_lstring(ctx, idx, out_len); } late final _duk_get_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_lstring'); - late final _duk_get_lstring = _duk_get_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_lstring'); + late final _duk_get_lstring = + _duk_get_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_get_buffer( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_get_buffer( - ctx, - idx, - out_size, - ); + return _duk_get_buffer(ctx, idx, out_size); } late final _duk_get_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_buffer'); - late final _duk_get_buffer = _duk_get_bufferPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_buffer'); + late final _duk_get_buffer = + _duk_get_bufferPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_get_buffer_data( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_get_buffer_data( - ctx, - idx, - out_size, - ); + return _duk_get_buffer_data(ctx, idx, out_size); } late final _duk_get_buffer_dataPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_buffer_data'); - late final _duk_get_buffer_data = _duk_get_buffer_dataPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_buffer_data'); + late final _duk_get_buffer_data = + _duk_get_buffer_dataPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); - ffi.Pointer duk_get_pointer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_pointer( - ctx, - idx, - ); + ffi.Pointer duk_get_pointer(ffi.Pointer ctx, int idx) { + return _duk_get_pointer(ctx, idx); } late final _duk_get_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_get_pointer'); - late final _duk_get_pointer = _duk_get_pointerPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_pointer'); + late final _duk_get_pointer = + _duk_get_pointerPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - duk_c_function duk_get_c_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_c_function( - ctx, - idx, - ); + duk_c_function duk_get_c_function(ffi.Pointer ctx, int idx) { + return _duk_get_c_function(ctx, idx); } late final _duk_get_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_c_function Function( - ffi.Pointer, duk_idx_t)>>('duk_get_c_function'); - late final _duk_get_c_function = _duk_get_c_functionPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_c_function Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_c_function'); + late final _duk_get_c_function = + _duk_get_c_functionPtr + .asFunction, int)>(); ffi.Pointer duk_get_context( ffi.Pointer ctx, int idx, ) { - return _duk_get_context( - ctx, - idx, - ); + return _duk_get_context(ctx, idx); } late final _duk_get_contextPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_get_context'); - late final _duk_get_context = _duk_get_contextPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_context'); + late final _duk_get_context = + _duk_get_contextPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - ffi.Pointer duk_get_heapptr( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_heapptr( - ctx, - idx, - ); + ffi.Pointer duk_get_heapptr(ffi.Pointer ctx, int idx) { + return _duk_get_heapptr(ctx, idx); } late final _duk_get_heapptrPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_get_heapptr'); - late final _duk_get_heapptr = _duk_get_heapptrPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_heapptr'); + late final _duk_get_heapptr = + _duk_get_heapptrPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); /// Get-with-explicit default operations: like get operations but with an /// explicit default value. @@ -2125,96 +1849,95 @@ class DuktapeBindings { int idx, int def_value, ) { - return _duk_get_boolean_default( - ctx, - idx, - def_value, - ); + return _duk_get_boolean_default(ctx, idx, def_value); } late final _duk_get_boolean_defaultPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_bool_t)>>('duk_get_boolean_default'); - late final _duk_get_boolean_default = _duk_get_boolean_defaultPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_bool_t) + > + >('duk_get_boolean_default'); + late final _duk_get_boolean_default = + _duk_get_boolean_defaultPtr + .asFunction, int, int)>(); double duk_get_number_default( ffi.Pointer ctx, int idx, double def_value, ) { - return _duk_get_number_default( - ctx, - idx, - def_value, - ); + return _duk_get_number_default(ctx, idx, def_value); } late final _duk_get_number_defaultPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function(ffi.Pointer, duk_idx_t, - duk_double_t)>>('duk_get_number_default'); - late final _duk_get_number_default = _duk_get_number_defaultPtr - .asFunction, int, double)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t, duk_double_t) + > + >('duk_get_number_default'); + late final _duk_get_number_default = + _duk_get_number_defaultPtr + .asFunction, int, double)>(); int duk_get_int_default( ffi.Pointer ctx, int idx, int def_value, ) { - return _duk_get_int_default( - ctx, - idx, - def_value, - ); + return _duk_get_int_default(ctx, idx, def_value); } late final _duk_get_int_defaultPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, duk_idx_t, - duk_int_t)>>('duk_get_int_default'); - late final _duk_get_int_default = _duk_get_int_defaultPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_int_t Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_get_int_default'); + late final _duk_get_int_default = + _duk_get_int_defaultPtr + .asFunction, int, int)>(); int duk_get_uint_default( ffi.Pointer ctx, int idx, int def_value, ) { - return _duk_get_uint_default( - ctx, - idx, - def_value, - ); + return _duk_get_uint_default(ctx, idx, def_value); } late final _duk_get_uint_defaultPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_get_uint_default'); - late final _duk_get_uint_default = _duk_get_uint_defaultPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_uint_t Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_get_uint_default'); + late final _duk_get_uint_default = + _duk_get_uint_defaultPtr + .asFunction, int, int)>(); ffi.Pointer duk_get_string_default( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_get_string_default( - ctx, - idx, - def_value, - ); + return _duk_get_string_default(ctx, idx, def_value); } late final _duk_get_string_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_string_default'); - late final _duk_get_string_default = _duk_get_string_defaultPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_string_default'); + late final _duk_get_string_default = + _duk_get_string_defaultPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_get_lstring_default( ffi.Pointer ctx, @@ -2223,26 +1946,31 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_len, ) { - return _duk_get_lstring_default( - ctx, - idx, - out_len, - def_ptr, - def_len, - ); + return _duk_get_lstring_default(ctx, idx, out_len, def_ptr, def_len); } late final _duk_get_lstring_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_lstring_default'); + late final _duk_get_lstring_default = + _duk_get_lstring_defaultPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_lstring_default'); - late final _duk_get_lstring_default = _duk_get_lstring_defaultPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_get_buffer_default( ffi.Pointer ctx, @@ -2251,26 +1979,31 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_len, ) { - return _duk_get_buffer_default( - ctx, - idx, - out_size, - def_ptr, - def_len, - ); + return _duk_get_buffer_default(ctx, idx, out_size, def_ptr, def_len); } late final _duk_get_buffer_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_buffer_default'); + late final _duk_get_buffer_default = + _duk_get_buffer_defaultPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_buffer_default'); - late final _duk_get_buffer_default = _duk_get_buffer_defaultPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_get_buffer_data_default( ffi.Pointer ctx, @@ -2279,207 +2012,225 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_len, ) { - return _duk_get_buffer_data_default( - ctx, - idx, - out_size, - def_ptr, - def_len, - ); + return _duk_get_buffer_data_default(ctx, idx, out_size, def_ptr, def_len); } late final _duk_get_buffer_data_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_buffer_data_default'); + late final _duk_get_buffer_data_default = + _duk_get_buffer_data_defaultPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_buffer_data_default'); - late final _duk_get_buffer_data_default = - _duk_get_buffer_data_defaultPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_get_pointer_default( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_get_pointer_default( - ctx, - idx, - def_value, - ); + return _duk_get_pointer_default(ctx, idx, def_value); } late final _duk_get_pointer_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_pointer_default'); - late final _duk_get_pointer_default = _duk_get_pointer_defaultPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_pointer_default'); + late final _duk_get_pointer_default = + _duk_get_pointer_defaultPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); duk_c_function duk_get_c_function_default( ffi.Pointer ctx, int idx, duk_c_function def_value, ) { - return _duk_get_c_function_default( - ctx, - idx, - def_value, - ); + return _duk_get_c_function_default(ctx, idx, def_value); } late final _duk_get_c_function_defaultPtr = _lookup< - ffi.NativeFunction< - duk_c_function Function(ffi.Pointer, duk_idx_t, - duk_c_function)>>('duk_get_c_function_default'); + ffi.NativeFunction< + duk_c_function Function( + ffi.Pointer, + duk_idx_t, + duk_c_function, + ) + > + >('duk_get_c_function_default'); late final _duk_get_c_function_default = - _duk_get_c_function_defaultPtr.asFunction< - duk_c_function Function( - ffi.Pointer, int, duk_c_function)>(); + _duk_get_c_function_defaultPtr + .asFunction< + duk_c_function Function( + ffi.Pointer, + int, + duk_c_function, + ) + >(); ffi.Pointer duk_get_context_default( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_get_context_default( - ctx, - idx, - def_value, - ); + return _duk_get_context_default(ctx, idx, def_value); } late final _duk_get_context_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_context_default'); - late final _duk_get_context_default = _duk_get_context_defaultPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_context_default'); + late final _duk_get_context_default = + _duk_get_context_defaultPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_get_heapptr_default( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_get_heapptr_default( - ctx, - idx, - def_value, - ); + return _duk_get_heapptr_default(ctx, idx, def_value); } late final _duk_get_heapptr_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_heapptr_default'); - late final _duk_get_heapptr_default = _duk_get_heapptr_defaultPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_heapptr_default'); + late final _duk_get_heapptr_default = + _duk_get_heapptr_defaultPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); /// Opt operations: like require operations but with an explicit default value /// when value is undefined or index is invalid, null and non-matching types /// cause a TypeError. - int duk_opt_boolean( - ffi.Pointer ctx, - int idx, - int def_value, - ) { - return _duk_opt_boolean( - ctx, - idx, - def_value, - ); + int duk_opt_boolean(ffi.Pointer ctx, int idx, int def_value) { + return _duk_opt_boolean(ctx, idx, def_value); } late final _duk_opt_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_bool_t)>>('duk_opt_boolean'); - late final _duk_opt_boolean = _duk_opt_booleanPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_bool_t) + > + >('duk_opt_boolean'); + late final _duk_opt_boolean = + _duk_opt_booleanPtr + .asFunction, int, int)>(); double duk_opt_number( ffi.Pointer ctx, int idx, double def_value, ) { - return _duk_opt_number( - ctx, - idx, - def_value, - ); + return _duk_opt_number(ctx, idx, def_value); } late final _duk_opt_numberPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function(ffi.Pointer, duk_idx_t, - duk_double_t)>>('duk_opt_number'); - late final _duk_opt_number = _duk_opt_numberPtr - .asFunction, int, double)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t, duk_double_t) + > + >('duk_opt_number'); + late final _duk_opt_number = + _duk_opt_numberPtr + .asFunction, int, double)>(); - int duk_opt_int( - ffi.Pointer ctx, - int idx, - int def_value, - ) { - return _duk_opt_int( - ctx, - idx, - def_value, - ); + int duk_opt_int(ffi.Pointer ctx, int idx, int def_value) { + return _duk_opt_int(ctx, idx, def_value); } late final _duk_opt_intPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t, duk_int_t)>>('duk_opt_int'); - late final _duk_opt_int = _duk_opt_intPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_int_t Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_opt_int'); + late final _duk_opt_int = + _duk_opt_intPtr + .asFunction, int, int)>(); - int duk_opt_uint( - ffi.Pointer ctx, - int idx, - int def_value, - ) { - return _duk_opt_uint( - ctx, - idx, - def_value, - ); + int duk_opt_uint(ffi.Pointer ctx, int idx, int def_value) { + return _duk_opt_uint(ctx, idx, def_value); } late final _duk_opt_uintPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_opt_uint'); - late final _duk_opt_uint = _duk_opt_uintPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_uint_t Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_opt_uint'); + late final _duk_opt_uint = + _duk_opt_uintPtr + .asFunction, int, int)>(); ffi.Pointer duk_opt_string( ffi.Pointer ctx, int idx, ffi.Pointer def_ptr, ) { - return _duk_opt_string( - ctx, - idx, - def_ptr, - ); + return _duk_opt_string(ctx, idx, def_ptr); } late final _duk_opt_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_opt_string'); - late final _duk_opt_string = _duk_opt_stringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_opt_string'); + late final _duk_opt_string = + _duk_opt_stringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_opt_lstring( ffi.Pointer ctx, @@ -2488,26 +2239,31 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_len, ) { - return _duk_opt_lstring( - ctx, - idx, - out_len, - def_ptr, - def_len, - ); + return _duk_opt_lstring(ctx, idx, out_len, def_ptr, def_len); } late final _duk_opt_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_opt_lstring'); + late final _duk_opt_lstring = + _duk_opt_lstringPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_opt_lstring'); - late final _duk_opt_lstring = _duk_opt_lstringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_opt_buffer( ffi.Pointer ctx, @@ -2516,26 +2272,31 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_size, ) { - return _duk_opt_buffer( - ctx, - idx, - out_size, - def_ptr, - def_size, - ); + return _duk_opt_buffer(ctx, idx, out_size, def_ptr, def_size); } late final _duk_opt_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_opt_buffer'); + late final _duk_opt_buffer = + _duk_opt_bufferPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_opt_buffer'); - late final _duk_opt_buffer = _duk_opt_bufferPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_opt_buffer_data( ffi.Pointer ctx, @@ -2544,611 +2305,569 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_size, ) { - return _duk_opt_buffer_data( - ctx, - idx, - out_size, - def_ptr, - def_size, - ); + return _duk_opt_buffer_data(ctx, idx, out_size, def_ptr, def_size); } late final _duk_opt_buffer_dataPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_opt_buffer_data'); + late final _duk_opt_buffer_data = + _duk_opt_buffer_dataPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_opt_buffer_data'); - late final _duk_opt_buffer_data = _duk_opt_buffer_dataPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_opt_pointer( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_opt_pointer( - ctx, - idx, - def_value, - ); + return _duk_opt_pointer(ctx, idx, def_value); } late final _duk_opt_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_opt_pointer'); - late final _duk_opt_pointer = _duk_opt_pointerPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_opt_pointer'); + late final _duk_opt_pointer = + _duk_opt_pointerPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); duk_c_function duk_opt_c_function( ffi.Pointer ctx, int idx, duk_c_function def_value, ) { - return _duk_opt_c_function( - ctx, - idx, - def_value, - ); + return _duk_opt_c_function(ctx, idx, def_value); } late final _duk_opt_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_c_function Function(ffi.Pointer, duk_idx_t, - duk_c_function)>>('duk_opt_c_function'); - late final _duk_opt_c_function = _duk_opt_c_functionPtr.asFunction< - duk_c_function Function(ffi.Pointer, int, duk_c_function)>(); + ffi.NativeFunction< + duk_c_function Function( + ffi.Pointer, + duk_idx_t, + duk_c_function, + ) + > + >('duk_opt_c_function'); + late final _duk_opt_c_function = + _duk_opt_c_functionPtr + .asFunction< + duk_c_function Function( + ffi.Pointer, + int, + duk_c_function, + ) + >(); ffi.Pointer duk_opt_context( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_opt_context( - ctx, - idx, - def_value, - ); + return _duk_opt_context(ctx, idx, def_value); } late final _duk_opt_contextPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_opt_context'); - late final _duk_opt_context = _duk_opt_contextPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_opt_context'); + late final _duk_opt_context = + _duk_opt_contextPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_opt_heapptr( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_opt_heapptr( - ctx, - idx, - def_value, - ); + return _duk_opt_heapptr(ctx, idx, def_value); } late final _duk_opt_heapptrPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_opt_heapptr'); - late final _duk_opt_heapptr = _duk_opt_heapptrPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_opt_heapptr'); + late final _duk_opt_heapptr = + _duk_opt_heapptrPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); - void duk_require_undefined( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_undefined( - ctx, - idx, - ); + void duk_require_undefined(ffi.Pointer ctx, int idx) { + return _duk_require_undefined(ctx, idx); } late final _duk_require_undefinedPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_undefined'); - late final _duk_require_undefined = _duk_require_undefinedPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_undefined'); + late final _duk_require_undefined = + _duk_require_undefinedPtr + .asFunction, int)>(); - void duk_require_null( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_null( - ctx, - idx, - ); + void duk_require_null(ffi.Pointer ctx, int idx) { + return _duk_require_null(ctx, idx); } late final _duk_require_nullPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_null'); - late final _duk_require_null = _duk_require_nullPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_null'); + late final _duk_require_null = + _duk_require_nullPtr + .asFunction, int)>(); - int duk_require_boolean( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_boolean( - ctx, - idx, - ); + int duk_require_boolean(ffi.Pointer ctx, int idx) { + return _duk_require_boolean(ctx, idx); } late final _duk_require_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_require_boolean'); - late final _duk_require_boolean = _duk_require_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_boolean'); + late final _duk_require_boolean = + _duk_require_booleanPtr + .asFunction, int)>(); - double duk_require_number( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_number( - ctx, - idx, - ); + double duk_require_number(ffi.Pointer ctx, int idx) { + return _duk_require_number(ctx, idx); } late final _duk_require_numberPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function( - ffi.Pointer, duk_idx_t)>>('duk_require_number'); - late final _duk_require_number = _duk_require_numberPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_number'); + late final _duk_require_number = + _duk_require_numberPtr + .asFunction, int)>(); - int duk_require_int( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_int( - ctx, - idx, - ); + int duk_require_int(ffi.Pointer ctx, int idx) { + return _duk_require_int(ctx, idx); } late final _duk_require_intPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_require_int'); - late final _duk_require_int = _duk_require_intPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_int'); + late final _duk_require_int = + _duk_require_intPtr + .asFunction, int)>(); - int duk_require_uint( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_uint( - ctx, - idx, - ); + int duk_require_uint(ffi.Pointer ctx, int idx) { + return _duk_require_uint(ctx, idx); } late final _duk_require_uintPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function( - ffi.Pointer, duk_idx_t)>>('duk_require_uint'); - late final _duk_require_uint = _duk_require_uintPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_uint'); + late final _duk_require_uint = + _duk_require_uintPtr + .asFunction, int)>(); ffi.Pointer duk_require_string( ffi.Pointer ctx, int idx, ) { - return _duk_require_string( - ctx, - idx, - ); + return _duk_require_string(ctx, idx); } late final _duk_require_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_require_string'); - late final _duk_require_string = _duk_require_stringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_string'); + late final _duk_require_string = + _duk_require_stringPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); ffi.Pointer duk_require_lstring( ffi.Pointer ctx, int idx, ffi.Pointer out_len, ) { - return _duk_require_lstring( - ctx, - idx, - out_len, - ); + return _duk_require_lstring(ctx, idx, out_len); } late final _duk_require_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_require_lstring'); - late final _duk_require_lstring = _duk_require_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_require_lstring'); + late final _duk_require_lstring = + _duk_require_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); - void duk_require_object( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_object( - ctx, - idx, - ); + void duk_require_object(ffi.Pointer ctx, int idx) { + return _duk_require_object(ctx, idx); } late final _duk_require_objectPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_object'); - late final _duk_require_object = _duk_require_objectPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_object'); + late final _duk_require_object = + _duk_require_objectPtr + .asFunction, int)>(); ffi.Pointer duk_require_buffer( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_require_buffer( - ctx, - idx, - out_size, - ); + return _duk_require_buffer(ctx, idx, out_size); } late final _duk_require_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_require_buffer'); - late final _duk_require_buffer = _duk_require_bufferPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_require_buffer'); + late final _duk_require_buffer = + _duk_require_bufferPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_require_buffer_data( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_require_buffer_data( - ctx, - idx, - out_size, - ); + return _duk_require_buffer_data(ctx, idx, out_size); } late final _duk_require_buffer_dataPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_require_buffer_data'); - late final _duk_require_buffer_data = _duk_require_buffer_dataPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_require_buffer_data'); + late final _duk_require_buffer_data = + _duk_require_buffer_dataPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_require_pointer( ffi.Pointer ctx, int idx, ) { - return _duk_require_pointer( - ctx, - idx, - ); - } - - late final _duk_require_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_require_pointer'); - late final _duk_require_pointer = _duk_require_pointerPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); - - duk_c_function duk_require_c_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_c_function( - ctx, - idx, - ); + return _duk_require_pointer(ctx, idx); + } + + late final _duk_require_pointerPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_pointer'); + late final _duk_require_pointer = + _duk_require_pointerPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); + + duk_c_function duk_require_c_function(ffi.Pointer ctx, int idx) { + return _duk_require_c_function(ctx, idx); } late final _duk_require_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_c_function Function( - ffi.Pointer, duk_idx_t)>>('duk_require_c_function'); - late final _duk_require_c_function = _duk_require_c_functionPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_c_function Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_c_function'); + late final _duk_require_c_function = + _duk_require_c_functionPtr + .asFunction, int)>(); ffi.Pointer duk_require_context( ffi.Pointer ctx, int idx, ) { - return _duk_require_context( - ctx, - idx, - ); + return _duk_require_context(ctx, idx); } late final _duk_require_contextPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_require_context'); - late final _duk_require_context = _duk_require_contextPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_context'); + late final _duk_require_context = + _duk_require_contextPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_require_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_function( - ctx, - idx, - ); + void duk_require_function(ffi.Pointer ctx, int idx) { + return _duk_require_function(ctx, idx); } late final _duk_require_functionPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_function'); - late final _duk_require_function = _duk_require_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_function'); + late final _duk_require_function = + _duk_require_functionPtr + .asFunction, int)>(); - void duk_require_constructor_call( - ffi.Pointer ctx, - ) { - return _duk_require_constructor_call( - ctx, - ); + void duk_require_constructor_call(ffi.Pointer ctx) { + return _duk_require_constructor_call(ctx); } late final _duk_require_constructor_callPtr = _lookup)>>( - 'duk_require_constructor_call'); - late final _duk_require_constructor_call = _duk_require_constructor_callPtr - .asFunction)>(); + 'duk_require_constructor_call', + ); + late final _duk_require_constructor_call = + _duk_require_constructor_callPtr + .asFunction)>(); - void duk_require_constructable( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_constructable( - ctx, - idx, - ); + void duk_require_constructable(ffi.Pointer ctx, int idx) { + return _duk_require_constructable(ctx, idx); } late final _duk_require_constructablePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - duk_idx_t)>>('duk_require_constructable'); - late final _duk_require_constructable = _duk_require_constructablePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_constructable'); + late final _duk_require_constructable = + _duk_require_constructablePtr + .asFunction, int)>(); ffi.Pointer duk_require_heapptr( ffi.Pointer ctx, int idx, ) { - return _duk_require_heapptr( - ctx, - idx, - ); + return _duk_require_heapptr(ctx, idx); } late final _duk_require_heapptrPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_require_heapptr'); - late final _duk_require_heapptr = _duk_require_heapptrPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_heapptr'); + late final _duk_require_heapptr = + _duk_require_heapptrPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); /// Coercion operations: in-place coercion, return coerced value where /// applicable. If index is invalid, throw error. Some coercions may /// throw an expected error (e.g. from a toString() or valueOf() call) /// or an internal error (e.g. from out of memory). - void duk_to_undefined( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_undefined( - ctx, - idx, - ); + void duk_to_undefined(ffi.Pointer ctx, int idx) { + return _duk_to_undefined(ctx, idx); } late final _duk_to_undefinedPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_to_undefined'); - late final _duk_to_undefined = _duk_to_undefinedPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_undefined'); + late final _duk_to_undefined = + _duk_to_undefinedPtr + .asFunction, int)>(); - void duk_to_null( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_null( - ctx, - idx, - ); + void duk_to_null(ffi.Pointer ctx, int idx) { + return _duk_to_null(ctx, idx); } late final _duk_to_nullPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_to_null'); - late final _duk_to_null = _duk_to_nullPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_null'); + late final _duk_to_null = + _duk_to_nullPtr + .asFunction, int)>(); - int duk_to_boolean( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_boolean( - ctx, - idx, - ); + int duk_to_boolean(ffi.Pointer ctx, int idx) { + return _duk_to_boolean(ctx, idx); } late final _duk_to_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_boolean'); - late final _duk_to_boolean = _duk_to_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_boolean'); + late final _duk_to_boolean = + _duk_to_booleanPtr + .asFunction, int)>(); - double duk_to_number( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_number( - ctx, - idx, - ); + double duk_to_number(ffi.Pointer ctx, int idx) { + return _duk_to_number(ctx, idx); } late final _duk_to_numberPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_number'); - late final _duk_to_number = _duk_to_numberPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_number'); + late final _duk_to_number = + _duk_to_numberPtr + .asFunction, int)>(); - int duk_to_int( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_int( - ctx, - idx, - ); + int duk_to_int(ffi.Pointer ctx, int idx) { + return _duk_to_int(ctx, idx); } late final _duk_to_intPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_int'); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_int'); late final _duk_to_int = _duk_to_intPtr.asFunction, int)>(); - int duk_to_uint( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_uint( - ctx, - idx, - ); + int duk_to_uint(ffi.Pointer ctx, int idx) { + return _duk_to_uint(ctx, idx); } late final _duk_to_uintPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_uint'); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_uint'); late final _duk_to_uint = _duk_to_uintPtr.asFunction, int)>(); - int duk_to_int32( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_int32( - ctx, - idx, - ); + int duk_to_int32(ffi.Pointer ctx, int idx) { + return _duk_to_int32(ctx, idx); } late final _duk_to_int32Ptr = _lookup< - ffi.NativeFunction< - duk_int32_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_int32'); - late final _duk_to_int32 = _duk_to_int32Ptr - .asFunction, int)>(); + ffi.NativeFunction< + duk_int32_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_int32'); + late final _duk_to_int32 = + _duk_to_int32Ptr + .asFunction, int)>(); - int duk_to_uint32( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_uint32( - ctx, - idx, - ); + int duk_to_uint32(ffi.Pointer ctx, int idx) { + return _duk_to_uint32(ctx, idx); } late final _duk_to_uint32Ptr = _lookup< - ffi.NativeFunction< - duk_uint32_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_uint32'); - late final _duk_to_uint32 = _duk_to_uint32Ptr - .asFunction, int)>(); + ffi.NativeFunction< + duk_uint32_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_uint32'); + late final _duk_to_uint32 = + _duk_to_uint32Ptr + .asFunction, int)>(); - int duk_to_uint16( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_uint16( - ctx, - idx, - ); + int duk_to_uint16(ffi.Pointer ctx, int idx) { + return _duk_to_uint16(ctx, idx); } late final _duk_to_uint16Ptr = _lookup< - ffi.NativeFunction< - duk_uint16_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_uint16'); - late final _duk_to_uint16 = _duk_to_uint16Ptr - .asFunction, int)>(); + ffi.NativeFunction< + duk_uint16_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_uint16'); + late final _duk_to_uint16 = + _duk_to_uint16Ptr + .asFunction, int)>(); - ffi.Pointer duk_to_string( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_string( - ctx, - idx, - ); + ffi.Pointer duk_to_string(ffi.Pointer ctx, int idx) { + return _duk_to_string(ctx, idx); } late final _duk_to_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_to_string'); - late final _duk_to_string = _duk_to_stringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_string'); + late final _duk_to_string = + _duk_to_stringPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); ffi.Pointer duk_to_lstring( ffi.Pointer ctx, int idx, ffi.Pointer out_len, ) { - return _duk_to_lstring( - ctx, - idx, - out_len, - ); + return _duk_to_lstring(ctx, idx, out_len); } late final _duk_to_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_to_lstring'); - late final _duk_to_lstring = _duk_to_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_to_lstring'); + late final _duk_to_lstring = + _duk_to_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_to_buffer_raw( ffi.Pointer ctx, @@ -3156,74 +2875,68 @@ class DuktapeBindings { ffi.Pointer out_size, int flags, ) { - return _duk_to_buffer_raw( - ctx, - idx, - out_size, - flags, - ); + return _duk_to_buffer_raw(ctx, idx, out_size, flags); } late final _duk_to_buffer_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_uint_t)>>('duk_to_buffer_raw'); - late final _duk_to_buffer_raw = _duk_to_buffer_rawPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_uint_t, + ) + > + >('duk_to_buffer_raw'); + late final _duk_to_buffer_raw = + _duk_to_buffer_rawPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); - ffi.Pointer duk_to_pointer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_pointer( - ctx, - idx, - ); + ffi.Pointer duk_to_pointer(ffi.Pointer ctx, int idx) { + return _duk_to_pointer(ctx, idx); } late final _duk_to_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_to_pointer'); - late final _duk_to_pointer = _duk_to_pointerPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_pointer'); + late final _duk_to_pointer = + _duk_to_pointerPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_to_object( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_object( - ctx, - idx, - ); + void duk_to_object(ffi.Pointer ctx, int idx) { + return _duk_to_object(ctx, idx); } late final _duk_to_objectPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_to_object'); - late final _duk_to_object = _duk_to_objectPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_object'); + late final _duk_to_object = + _duk_to_objectPtr + .asFunction, int)>(); - void duk_to_primitive( - ffi.Pointer ctx, - int idx, - int hint, - ) { - return _duk_to_primitive( - ctx, - idx, - hint, - ); + void duk_to_primitive(ffi.Pointer ctx, int idx, int hint) { + return _duk_to_primitive(ctx, idx, hint); } late final _duk_to_primitivePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_int_t)>>('duk_to_primitive'); - late final _duk_to_primitive = _duk_to_primitivePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_to_primitive'); + late final _duk_to_primitive = + _duk_to_primitivePtr + .asFunction, int, int)>(); /// safe variants of a few coercion operations ffi.Pointer duk_safe_to_lstring( @@ -3231,249 +2944,222 @@ class DuktapeBindings { int idx, ffi.Pointer out_len, ) { - return _duk_safe_to_lstring( - ctx, - idx, - out_len, - ); + return _duk_safe_to_lstring(ctx, idx, out_len); } late final _duk_safe_to_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_safe_to_lstring'); - late final _duk_safe_to_lstring = _duk_safe_to_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_safe_to_lstring'); + late final _duk_safe_to_lstring = + _duk_safe_to_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_to_stacktrace( ffi.Pointer ctx, int idx, ) { - return _duk_to_stacktrace( - ctx, - idx, - ); + return _duk_to_stacktrace(ctx, idx); } late final _duk_to_stacktracePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_to_stacktrace'); - late final _duk_to_stacktrace = _duk_to_stacktracePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_stacktrace'); + late final _duk_to_stacktrace = + _duk_to_stacktracePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); ffi.Pointer duk_safe_to_stacktrace( ffi.Pointer ctx, int idx, ) { - return _duk_safe_to_stacktrace( - ctx, - idx, - ); + return _duk_safe_to_stacktrace(ctx, idx); } late final _duk_safe_to_stacktracePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_safe_to_stacktrace'); - late final _duk_safe_to_stacktrace = _duk_safe_to_stacktracePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_safe_to_stacktrace'); + late final _duk_safe_to_stacktrace = + _duk_safe_to_stacktracePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); /// Value length - int duk_get_length( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_length( - ctx, - idx, - ); + int duk_get_length(ffi.Pointer ctx, int idx) { + return _duk_get_length(ctx, idx); } late final _duk_get_lengthPtr = _lookup< - ffi.NativeFunction< - duk_size_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_length'); - late final _duk_get_length = _duk_get_lengthPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_length'); + late final _duk_get_length = + _duk_get_lengthPtr + .asFunction, int)>(); - void duk_set_length( - ffi.Pointer ctx, - int idx, - int len, - ) { - return _duk_set_length( - ctx, - idx, - len, - ); + void duk_set_length(ffi.Pointer ctx, int idx, int len) { + return _duk_set_length(ctx, idx, len); } late final _duk_set_lengthPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_size_t)>>('duk_set_length'); - late final _duk_set_length = _duk_set_lengthPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_size_t) + > + >('duk_set_length'); + late final _duk_set_length = + _duk_set_lengthPtr + .asFunction, int, int)>(); /// Misc conversion ffi.Pointer duk_base64_encode( ffi.Pointer ctx, int idx, ) { - return _duk_base64_encode( - ctx, - idx, - ); + return _duk_base64_encode(ctx, idx); } late final _duk_base64_encodePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_base64_encode'); - late final _duk_base64_encode = _duk_base64_encodePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_base64_encode'); + late final _duk_base64_encode = + _duk_base64_encodePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_base64_decode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_base64_decode( - ctx, - idx, - ); + void duk_base64_decode(ffi.Pointer ctx, int idx) { + return _duk_base64_decode(ctx, idx); } late final _duk_base64_decodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_base64_decode'); - late final _duk_base64_decode = _duk_base64_decodePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_base64_decode'); + late final _duk_base64_decode = + _duk_base64_decodePtr + .asFunction, int)>(); - ffi.Pointer duk_hex_encode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_hex_encode( - ctx, - idx, - ); + ffi.Pointer duk_hex_encode(ffi.Pointer ctx, int idx) { + return _duk_hex_encode(ctx, idx); } late final _duk_hex_encodePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_hex_encode'); - late final _duk_hex_encode = _duk_hex_encodePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_hex_encode'); + late final _duk_hex_encode = + _duk_hex_encodePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_hex_decode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_hex_decode( - ctx, - idx, - ); + void duk_hex_decode(ffi.Pointer ctx, int idx) { + return _duk_hex_decode(ctx, idx); } late final _duk_hex_decodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_hex_decode'); - late final _duk_hex_decode = _duk_hex_decodePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_hex_decode'); + late final _duk_hex_decode = + _duk_hex_decodePtr + .asFunction, int)>(); - ffi.Pointer duk_json_encode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_json_encode( - ctx, - idx, - ); + ffi.Pointer duk_json_encode(ffi.Pointer ctx, int idx) { + return _duk_json_encode(ctx, idx); } late final _duk_json_encodePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_json_encode'); - late final _duk_json_encode = _duk_json_encodePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_json_encode'); + late final _duk_json_encode = + _duk_json_encodePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_json_decode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_json_decode( - ctx, - idx, - ); + void duk_json_decode(ffi.Pointer ctx, int idx) { + return _duk_json_decode(ctx, idx); } late final _duk_json_decodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_json_decode'); - late final _duk_json_decode = _duk_json_decodePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_json_decode'); + late final _duk_json_decode = + _duk_json_decodePtr + .asFunction, int)>(); void duk_cbor_encode( ffi.Pointer ctx, int idx, int encode_flags, ) { - return _duk_cbor_encode( - ctx, - idx, - encode_flags, - ); + return _duk_cbor_encode(ctx, idx, encode_flags); } late final _duk_cbor_encodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_cbor_encode'); - late final _duk_cbor_encode = _duk_cbor_encodePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_cbor_encode'); + late final _duk_cbor_encode = + _duk_cbor_encodePtr + .asFunction, int, int)>(); void duk_cbor_decode( ffi.Pointer ctx, int idx, int decode_flags, ) { - return _duk_cbor_decode( - ctx, - idx, - decode_flags, - ); + return _duk_cbor_decode(ctx, idx, decode_flags); } late final _duk_cbor_decodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_cbor_decode'); - late final _duk_cbor_decode = _duk_cbor_decodePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_cbor_decode'); + late final _duk_cbor_decode = + _duk_cbor_decodePtr + .asFunction, int, int)>(); ffi.Pointer duk_buffer_to_string( ffi.Pointer ctx, int idx, ) { - return _duk_buffer_to_string( - ctx, - idx, - ); + return _duk_buffer_to_string(ctx, idx); } late final _duk_buffer_to_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_buffer_to_string'); - late final _duk_buffer_to_string = _duk_buffer_to_stringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_buffer_to_string'); + late final _duk_buffer_to_string = + _duk_buffer_to_stringPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); /// Buffer ffi.Pointer duk_resize_buffer( @@ -3481,39 +3167,50 @@ class DuktapeBindings { int idx, int new_size, ) { - return _duk_resize_buffer( - ctx, - idx, - new_size, - ); + return _duk_resize_buffer(ctx, idx, new_size); } late final _duk_resize_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - duk_size_t)>>('duk_resize_buffer'); - late final _duk_resize_buffer = _duk_resize_bufferPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, int)>(); + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + duk_size_t, + ) + > + >('duk_resize_buffer'); + late final _duk_resize_buffer = + _duk_resize_bufferPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int, int) + >(); ffi.Pointer duk_steal_buffer( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_steal_buffer( - ctx, - idx, - out_size, - ); + return _duk_steal_buffer(ctx, idx, out_size); } late final _duk_steal_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_steal_buffer'); - late final _duk_steal_buffer = _duk_steal_bufferPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_steal_buffer'); + late final _duk_steal_buffer = + _duk_steal_bufferPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); void duk_config_buffer( ffi.Pointer ctx, @@ -3521,21 +3218,29 @@ class DuktapeBindings { ffi.Pointer ptr, int len, ) { - return _duk_config_buffer( - ctx, - idx, - ptr, - len, - ); + return _duk_config_buffer(ctx, idx, ptr, len); } late final _duk_config_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_config_buffer'); - late final _duk_config_buffer = _duk_config_bufferPtr.asFunction< - void Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_config_buffer'); + late final _duk_config_buffer = + _duk_config_bufferPtr + .asFunction< + void Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); /// Property access /// @@ -3544,41 +3249,39 @@ class DuktapeBindings { /// The _index variant takes an array index as a property name (e.g. 123 is /// equivalent to the key "123"). The _heapptr variant takes a raw, borrowed /// heap pointer. - int duk_get_prop( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_get_prop( - ctx, - obj_idx, - ); + int duk_get_prop(ffi.Pointer ctx, int obj_idx) { + return _duk_get_prop(ctx, obj_idx); } late final _duk_get_propPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_prop'); - late final _duk_get_prop = _duk_get_propPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_prop'); + late final _duk_get_prop = + _duk_get_propPtr + .asFunction, int)>(); int duk_get_prop_string( ffi.Pointer ctx, int obj_idx, ffi.Pointer key, ) { - return _duk_get_prop_string( - ctx, - obj_idx, - key, - ); + return _duk_get_prop_string(ctx, obj_idx, key); } late final _duk_get_prop_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_prop_string'); - late final _duk_get_prop_string = _duk_get_prop_stringPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_prop_string'); + late final _duk_get_prop_string = + _duk_get_prop_stringPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); int duk_get_prop_lstring( ffi.Pointer ctx, @@ -3586,21 +3289,29 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_get_prop_lstring( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_get_prop_lstring(ctx, obj_idx, key, key_len); } late final _duk_get_prop_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_get_prop_lstring'); - late final _duk_get_prop_lstring = _duk_get_prop_lstringPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_prop_lstring'); + late final _duk_get_prop_lstring = + _duk_get_prop_lstringPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_get_prop_literal_raw( ffi.Pointer ctx, @@ -3608,96 +3319,103 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_get_prop_literal_raw( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_get_prop_literal_raw(ctx, obj_idx, key, key_len); } late final _duk_get_prop_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_get_prop_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_prop_literal_raw'); late final _duk_get_prop_literal_raw = - _duk_get_prop_literal_rawPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + _duk_get_prop_literal_rawPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_get_prop_index( ffi.Pointer ctx, int obj_idx, int arr_idx, ) { - return _duk_get_prop_index( - ctx, - obj_idx, - arr_idx, - ); + return _duk_get_prop_index(ctx, obj_idx, arr_idx); } late final _duk_get_prop_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uarridx_t)>>('duk_get_prop_index'); - late final _duk_get_prop_index = _duk_get_prop_indexPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uarridx_t) + > + >('duk_get_prop_index'); + late final _duk_get_prop_index = + _duk_get_prop_indexPtr + .asFunction, int, int)>(); int duk_get_prop_heapptr( ffi.Pointer ctx, int obj_idx, ffi.Pointer ptr, ) { - return _duk_get_prop_heapptr( - ctx, - obj_idx, - ptr, - ); + return _duk_get_prop_heapptr(ctx, obj_idx, ptr); } late final _duk_get_prop_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_prop_heapptr'); - late final _duk_get_prop_heapptr = _duk_get_prop_heapptrPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); - - int duk_put_prop( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_put_prop( - ctx, - obj_idx, - ); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_prop_heapptr'); + late final _duk_get_prop_heapptr = + _duk_get_prop_heapptrPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); + + int duk_put_prop(ffi.Pointer ctx, int obj_idx) { + return _duk_put_prop(ctx, obj_idx); } late final _duk_put_propPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_put_prop'); - late final _duk_put_prop = _duk_put_propPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_put_prop'); + late final _duk_put_prop = + _duk_put_propPtr + .asFunction, int)>(); int duk_put_prop_string( ffi.Pointer ctx, int obj_idx, ffi.Pointer key, ) { - return _duk_put_prop_string( - ctx, - obj_idx, - key, - ); + return _duk_put_prop_string(ctx, obj_idx, key); } late final _duk_put_prop_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_put_prop_string'); - late final _duk_put_prop_string = _duk_put_prop_stringPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_put_prop_string'); + late final _duk_put_prop_string = + _duk_put_prop_stringPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); int duk_put_prop_lstring( ffi.Pointer ctx, @@ -3705,21 +3423,29 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_put_prop_lstring( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_put_prop_lstring(ctx, obj_idx, key, key_len); } late final _duk_put_prop_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_put_prop_lstring'); - late final _duk_put_prop_lstring = _duk_put_prop_lstringPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_put_prop_lstring'); + late final _duk_put_prop_lstring = + _duk_put_prop_lstringPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_put_prop_literal_raw( ffi.Pointer ctx, @@ -3727,96 +3453,103 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_put_prop_literal_raw( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_put_prop_literal_raw(ctx, obj_idx, key, key_len); } late final _duk_put_prop_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_put_prop_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_put_prop_literal_raw'); late final _duk_put_prop_literal_raw = - _duk_put_prop_literal_rawPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + _duk_put_prop_literal_rawPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_put_prop_index( ffi.Pointer ctx, int obj_idx, int arr_idx, ) { - return _duk_put_prop_index( - ctx, - obj_idx, - arr_idx, - ); + return _duk_put_prop_index(ctx, obj_idx, arr_idx); } late final _duk_put_prop_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uarridx_t)>>('duk_put_prop_index'); - late final _duk_put_prop_index = _duk_put_prop_indexPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uarridx_t) + > + >('duk_put_prop_index'); + late final _duk_put_prop_index = + _duk_put_prop_indexPtr + .asFunction, int, int)>(); int duk_put_prop_heapptr( ffi.Pointer ctx, int obj_idx, ffi.Pointer ptr, ) { - return _duk_put_prop_heapptr( - ctx, - obj_idx, - ptr, - ); + return _duk_put_prop_heapptr(ctx, obj_idx, ptr); } late final _duk_put_prop_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_put_prop_heapptr'); - late final _duk_put_prop_heapptr = _duk_put_prop_heapptrPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); - - int duk_del_prop( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_del_prop( - ctx, - obj_idx, - ); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_put_prop_heapptr'); + late final _duk_put_prop_heapptr = + _duk_put_prop_heapptrPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); + + int duk_del_prop(ffi.Pointer ctx, int obj_idx) { + return _duk_del_prop(ctx, obj_idx); } late final _duk_del_propPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_del_prop'); - late final _duk_del_prop = _duk_del_propPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_del_prop'); + late final _duk_del_prop = + _duk_del_propPtr + .asFunction, int)>(); int duk_del_prop_string( ffi.Pointer ctx, int obj_idx, ffi.Pointer key, ) { - return _duk_del_prop_string( - ctx, - obj_idx, - key, - ); + return _duk_del_prop_string(ctx, obj_idx, key); } late final _duk_del_prop_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_del_prop_string'); - late final _duk_del_prop_string = _duk_del_prop_stringPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_del_prop_string'); + late final _duk_del_prop_string = + _duk_del_prop_stringPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); int duk_del_prop_lstring( ffi.Pointer ctx, @@ -3824,21 +3557,29 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_del_prop_lstring( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_del_prop_lstring(ctx, obj_idx, key, key_len); } late final _duk_del_prop_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_del_prop_lstring'); - late final _duk_del_prop_lstring = _duk_del_prop_lstringPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_del_prop_lstring'); + late final _duk_del_prop_lstring = + _duk_del_prop_lstringPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_del_prop_literal_raw( ffi.Pointer ctx, @@ -3846,96 +3587,103 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_del_prop_literal_raw( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_del_prop_literal_raw(ctx, obj_idx, key, key_len); } late final _duk_del_prop_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_del_prop_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_del_prop_literal_raw'); late final _duk_del_prop_literal_raw = - _duk_del_prop_literal_rawPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + _duk_del_prop_literal_rawPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_del_prop_index( ffi.Pointer ctx, int obj_idx, int arr_idx, ) { - return _duk_del_prop_index( - ctx, - obj_idx, - arr_idx, - ); + return _duk_del_prop_index(ctx, obj_idx, arr_idx); } late final _duk_del_prop_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uarridx_t)>>('duk_del_prop_index'); - late final _duk_del_prop_index = _duk_del_prop_indexPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uarridx_t) + > + >('duk_del_prop_index'); + late final _duk_del_prop_index = + _duk_del_prop_indexPtr + .asFunction, int, int)>(); int duk_del_prop_heapptr( ffi.Pointer ctx, int obj_idx, ffi.Pointer ptr, ) { - return _duk_del_prop_heapptr( - ctx, - obj_idx, - ptr, - ); + return _duk_del_prop_heapptr(ctx, obj_idx, ptr); } late final _duk_del_prop_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_del_prop_heapptr'); - late final _duk_del_prop_heapptr = _duk_del_prop_heapptrPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); - - int duk_has_prop( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_has_prop( - ctx, - obj_idx, - ); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_del_prop_heapptr'); + late final _duk_del_prop_heapptr = + _duk_del_prop_heapptrPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); + + int duk_has_prop(ffi.Pointer ctx, int obj_idx) { + return _duk_has_prop(ctx, obj_idx); } late final _duk_has_propPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_has_prop'); - late final _duk_has_prop = _duk_has_propPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_has_prop'); + late final _duk_has_prop = + _duk_has_propPtr + .asFunction, int)>(); int duk_has_prop_string( ffi.Pointer ctx, int obj_idx, ffi.Pointer key, ) { - return _duk_has_prop_string( - ctx, - obj_idx, - key, - ); + return _duk_has_prop_string(ctx, obj_idx, key); } late final _duk_has_prop_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_has_prop_string'); - late final _duk_has_prop_string = _duk_has_prop_stringPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_has_prop_string'); + late final _duk_has_prop_string = + _duk_has_prop_stringPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); int duk_has_prop_lstring( ffi.Pointer ctx, @@ -3943,21 +3691,29 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_has_prop_lstring( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_has_prop_lstring(ctx, obj_idx, key, key_len); } late final _duk_has_prop_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_has_prop_lstring'); - late final _duk_has_prop_lstring = _duk_has_prop_lstringPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_has_prop_lstring'); + late final _duk_has_prop_lstring = + _duk_has_prop_lstringPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_has_prop_literal_raw( ffi.Pointer ctx, @@ -3965,415 +3721,378 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_has_prop_literal_raw( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_has_prop_literal_raw(ctx, obj_idx, key, key_len); } late final _duk_has_prop_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_has_prop_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_has_prop_literal_raw'); late final _duk_has_prop_literal_raw = - _duk_has_prop_literal_rawPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + _duk_has_prop_literal_rawPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_has_prop_index( ffi.Pointer ctx, int obj_idx, int arr_idx, ) { - return _duk_has_prop_index( - ctx, - obj_idx, - arr_idx, - ); + return _duk_has_prop_index(ctx, obj_idx, arr_idx); } late final _duk_has_prop_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uarridx_t)>>('duk_has_prop_index'); - late final _duk_has_prop_index = _duk_has_prop_indexPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uarridx_t) + > + >('duk_has_prop_index'); + late final _duk_has_prop_index = + _duk_has_prop_indexPtr + .asFunction, int, int)>(); int duk_has_prop_heapptr( ffi.Pointer ctx, int obj_idx, ffi.Pointer ptr, ) { - return _duk_has_prop_heapptr( - ctx, - obj_idx, - ptr, - ); + return _duk_has_prop_heapptr(ctx, obj_idx, ptr); } late final _duk_has_prop_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_has_prop_heapptr'); - late final _duk_has_prop_heapptr = _duk_has_prop_heapptrPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); - - void duk_get_prop_desc( - ffi.Pointer ctx, - int obj_idx, - int flags, - ) { - return _duk_get_prop_desc( - ctx, - obj_idx, - flags, - ); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_has_prop_heapptr'); + late final _duk_has_prop_heapptr = + _duk_has_prop_heapptrPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); + + void duk_get_prop_desc(ffi.Pointer ctx, int obj_idx, int flags) { + return _duk_get_prop_desc(ctx, obj_idx, flags); } - - late final _duk_get_prop_descPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_get_prop_desc'); - late final _duk_get_prop_desc = _duk_get_prop_descPtr - .asFunction, int, int)>(); - - void duk_def_prop( - ffi.Pointer ctx, - int obj_idx, - int flags, - ) { - return _duk_def_prop( - ctx, - obj_idx, - flags, - ); + + late final _duk_get_prop_descPtr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_get_prop_desc'); + late final _duk_get_prop_desc = + _duk_get_prop_descPtr + .asFunction, int, int)>(); + + void duk_def_prop(ffi.Pointer ctx, int obj_idx, int flags) { + return _duk_def_prop(ctx, obj_idx, flags); } late final _duk_def_propPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_def_prop'); - late final _duk_def_prop = _duk_def_propPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_def_prop'); + late final _duk_def_prop = + _duk_def_propPtr + .asFunction, int, int)>(); int duk_get_global_string( ffi.Pointer ctx, ffi.Pointer key, ) { - return _duk_get_global_string( - ctx, - key, - ); + return _duk_get_global_string(ctx, key); } late final _duk_get_global_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_get_global_string'); - late final _duk_get_global_string = _duk_get_global_stringPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_get_global_string'); + late final _duk_get_global_string = + _duk_get_global_stringPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); int duk_get_global_lstring( ffi.Pointer ctx, ffi.Pointer key, int key_len, ) { - return _duk_get_global_lstring( - ctx, - key, - key_len, - ); + return _duk_get_global_lstring(ctx, key, key_len); } late final _duk_get_global_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_global_lstring'); - late final _duk_get_global_lstring = _duk_get_global_lstringPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_global_lstring'); + late final _duk_get_global_lstring = + _duk_get_global_lstringPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer, int) + >(); int duk_get_global_literal_raw( ffi.Pointer ctx, ffi.Pointer key, int key_len, ) { - return _duk_get_global_literal_raw( - ctx, - key, - key_len, - ); + return _duk_get_global_literal_raw(ctx, key, key_len); } late final _duk_get_global_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_global_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_global_literal_raw'); late final _duk_get_global_literal_raw = - _duk_get_global_literal_rawPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + _duk_get_global_literal_rawPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer, int) + >(); int duk_get_global_heapptr( ffi.Pointer ctx, ffi.Pointer ptr, ) { - return _duk_get_global_heapptr( - ctx, - ptr, - ); + return _duk_get_global_heapptr(ctx, ptr); } late final _duk_get_global_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_get_global_heapptr'); - late final _duk_get_global_heapptr = _duk_get_global_heapptrPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_get_global_heapptr'); + late final _duk_get_global_heapptr = + _duk_get_global_heapptrPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); int duk_put_global_string( ffi.Pointer ctx, ffi.Pointer key, ) { - return _duk_put_global_string( - ctx, - key, - ); + return _duk_put_global_string(ctx, key); } late final _duk_put_global_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_put_global_string'); - late final _duk_put_global_string = _duk_put_global_stringPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_put_global_string'); + late final _duk_put_global_string = + _duk_put_global_stringPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); int duk_put_global_lstring( ffi.Pointer ctx, ffi.Pointer key, int key_len, ) { - return _duk_put_global_lstring( - ctx, - key, - key_len, - ); + return _duk_put_global_lstring(ctx, key, key_len); } late final _duk_put_global_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_put_global_lstring'); - late final _duk_put_global_lstring = _duk_put_global_lstringPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_put_global_lstring'); + late final _duk_put_global_lstring = + _duk_put_global_lstringPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer, int) + >(); int duk_put_global_literal_raw( ffi.Pointer ctx, ffi.Pointer key, int key_len, ) { - return _duk_put_global_literal_raw( - ctx, - key, - key_len, - ); + return _duk_put_global_literal_raw(ctx, key, key_len); } late final _duk_put_global_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_put_global_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_put_global_literal_raw'); late final _duk_put_global_literal_raw = - _duk_put_global_literal_rawPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + _duk_put_global_literal_rawPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer, int) + >(); int duk_put_global_heapptr( ffi.Pointer ctx, ffi.Pointer ptr, ) { - return _duk_put_global_heapptr( - ctx, - ptr, - ); + return _duk_put_global_heapptr(ctx, ptr); } late final _duk_put_global_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_put_global_heapptr'); - late final _duk_put_global_heapptr = _duk_put_global_heapptrPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_put_global_heapptr'); + late final _duk_put_global_heapptr = + _duk_put_global_heapptrPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); /// Inspection - void duk_inspect_value( - ffi.Pointer ctx, - int idx, - ) { - return _duk_inspect_value( - ctx, - idx, - ); + void duk_inspect_value(ffi.Pointer ctx, int idx) { + return _duk_inspect_value(ctx, idx); } late final _duk_inspect_valuePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_inspect_value'); - late final _duk_inspect_value = _duk_inspect_valuePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_inspect_value'); + late final _duk_inspect_value = + _duk_inspect_valuePtr + .asFunction, int)>(); - void duk_inspect_callstack_entry( - ffi.Pointer ctx, - int level, - ) { - return _duk_inspect_callstack_entry( - ctx, - level, - ); + void duk_inspect_callstack_entry(ffi.Pointer ctx, int level) { + return _duk_inspect_callstack_entry(ctx, level); } late final _duk_inspect_callstack_entryPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - duk_int_t)>>('duk_inspect_callstack_entry'); - late final _duk_inspect_callstack_entry = _duk_inspect_callstack_entryPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_int_t)> + >('duk_inspect_callstack_entry'); + late final _duk_inspect_callstack_entry = + _duk_inspect_callstack_entryPtr + .asFunction, int)>(); /// Object prototype - void duk_get_prototype( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_prototype( - ctx, - idx, - ); + void duk_get_prototype(ffi.Pointer ctx, int idx) { + return _duk_get_prototype(ctx, idx); } late final _duk_get_prototypePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_get_prototype'); - late final _duk_get_prototype = _duk_get_prototypePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_prototype'); + late final _duk_get_prototype = + _duk_get_prototypePtr + .asFunction, int)>(); - void duk_set_prototype( - ffi.Pointer ctx, - int idx, - ) { - return _duk_set_prototype( - ctx, - idx, - ); + void duk_set_prototype(ffi.Pointer ctx, int idx) { + return _duk_set_prototype(ctx, idx); } late final _duk_set_prototypePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_set_prototype'); - late final _duk_set_prototype = _duk_set_prototypePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_set_prototype'); + late final _duk_set_prototype = + _duk_set_prototypePtr + .asFunction, int)>(); /// Object finalizer - void duk_get_finalizer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_finalizer( - ctx, - idx, - ); + void duk_get_finalizer(ffi.Pointer ctx, int idx) { + return _duk_get_finalizer(ctx, idx); } late final _duk_get_finalizerPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_get_finalizer'); - late final _duk_get_finalizer = _duk_get_finalizerPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_finalizer'); + late final _duk_get_finalizer = + _duk_get_finalizerPtr + .asFunction, int)>(); - void duk_set_finalizer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_set_finalizer( - ctx, - idx, - ); + void duk_set_finalizer(ffi.Pointer ctx, int idx) { + return _duk_set_finalizer(ctx, idx); } late final _duk_set_finalizerPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_set_finalizer'); - late final _duk_set_finalizer = _duk_set_finalizerPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_set_finalizer'); + late final _duk_set_finalizer = + _duk_set_finalizerPtr + .asFunction, int)>(); /// Global object - void duk_set_global_object( - ffi.Pointer ctx, - ) { - return _duk_set_global_object( - ctx, - ); + void duk_set_global_object(ffi.Pointer ctx) { + return _duk_set_global_object(ctx); } late final _duk_set_global_objectPtr = _lookup)>>( - 'duk_set_global_object'); - late final _duk_set_global_object = _duk_set_global_objectPtr - .asFunction)>(); + 'duk_set_global_object', + ); + late final _duk_set_global_object = + _duk_set_global_objectPtr + .asFunction)>(); /// Duktape/C function magic value - int duk_get_magic( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_magic( - ctx, - idx, - ); + int duk_get_magic(ffi.Pointer ctx, int idx) { + return _duk_get_magic(ctx, idx); } late final _duk_get_magicPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_magic'); - late final _duk_get_magic = _duk_get_magicPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_magic'); + late final _duk_get_magic = + _duk_get_magicPtr + .asFunction, int)>(); - void duk_set_magic( - ffi.Pointer ctx, - int idx, - int magic, - ) { - return _duk_set_magic( - ctx, - idx, - magic, - ); + void duk_set_magic(ffi.Pointer ctx, int idx, int magic) { + return _duk_set_magic(ctx, idx, magic); } late final _duk_set_magicPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_int_t)>>('duk_set_magic'); - late final _duk_set_magic = _duk_set_magicPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_set_magic'); + late final _duk_set_magic = + _duk_set_magicPtr + .asFunction, int, int)>(); - int duk_get_current_magic( - ffi.Pointer ctx, - ) { - return _duk_get_current_magic( - ctx, - ); + int duk_get_current_magic(ffi.Pointer ctx) { + return _duk_get_current_magic(ctx); } late final _duk_get_current_magicPtr = _lookup)>>( - 'duk_get_current_magic'); - late final _duk_get_current_magic = _duk_get_current_magicPtr - .asFunction)>(); + 'duk_get_current_magic', + ); + late final _duk_get_current_magic = + _duk_get_current_magicPtr + .asFunction)>(); /// Module helpers: put multiple function or constant properties void duk_put_function_list( @@ -4381,161 +4100,131 @@ class DuktapeBindings { int obj_idx, ffi.Pointer funcs, ) { - return _duk_put_function_list( - ctx, - obj_idx, - funcs, - ); + return _duk_put_function_list(ctx, obj_idx, funcs); } late final _duk_put_function_listPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_put_function_list'); - late final _duk_put_function_list = _duk_put_function_listPtr.asFunction< - void Function(ffi.Pointer, int, - ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_put_function_list'); + late final _duk_put_function_list = + _duk_put_function_listPtr + .asFunction< + void Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); void duk_put_number_list( ffi.Pointer ctx, int obj_idx, ffi.Pointer numbers, ) { - return _duk_put_number_list( - ctx, - obj_idx, - numbers, - ); + return _duk_put_number_list(ctx, obj_idx, numbers); } late final _duk_put_number_listPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_put_number_list'); - late final _duk_put_number_list = _duk_put_number_listPtr.asFunction< - void Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_put_number_list'); + late final _duk_put_number_list = + _duk_put_number_listPtr + .asFunction< + void Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); /// Object operations - void duk_compact( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_compact( - ctx, - obj_idx, - ); + void duk_compact(ffi.Pointer ctx, int obj_idx) { + return _duk_compact(ctx, obj_idx); } late final _duk_compactPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_compact'); - late final _duk_compact = _duk_compactPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_compact'); + late final _duk_compact = + _duk_compactPtr + .asFunction, int)>(); - void duk_enum( - ffi.Pointer ctx, - int obj_idx, - int enum_flags, - ) { - return _duk_enum( - ctx, - obj_idx, - enum_flags, - ); + void duk_enum(ffi.Pointer ctx, int obj_idx, int enum_flags) { + return _duk_enum(ctx, obj_idx, enum_flags); } late final _duk_enumPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t, duk_uint_t)>>('duk_enum'); - late final _duk_enum = _duk_enumPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_enum'); + late final _duk_enum = + _duk_enumPtr + .asFunction, int, int)>(); - int duk_next( - ffi.Pointer ctx, - int enum_idx, - int get_value, - ) { - return _duk_next( - ctx, - enum_idx, - get_value, - ); + int duk_next(ffi.Pointer ctx, int enum_idx, int get_value) { + return _duk_next(ctx, enum_idx, get_value); } late final _duk_nextPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t, duk_bool_t)>>('duk_next'); - late final _duk_next = _duk_nextPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_bool_t) + > + >('duk_next'); + late final _duk_next = + _duk_nextPtr + .asFunction, int, int)>(); - void duk_seal( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_seal( - ctx, - obj_idx, - ); + void duk_seal(ffi.Pointer ctx, int obj_idx) { + return _duk_seal(ctx, obj_idx); } late final _duk_sealPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_seal'); + ffi.NativeFunction, duk_idx_t)> + >('duk_seal'); late final _duk_seal = _duk_sealPtr.asFunction, int)>(); - void duk_freeze( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_freeze( - ctx, - obj_idx, - ); + void duk_freeze(ffi.Pointer ctx, int obj_idx) { + return _duk_freeze(ctx, obj_idx); } late final _duk_freezePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_freeze'); + ffi.NativeFunction, duk_idx_t)> + >('duk_freeze'); late final _duk_freeze = _duk_freezePtr.asFunction, int)>(); /// String manipulation - void duk_concat( - ffi.Pointer ctx, - int count, - ) { - return _duk_concat( - ctx, - count, - ); + void duk_concat(ffi.Pointer ctx, int count) { + return _duk_concat(ctx, count); } late final _duk_concatPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_concat'); + ffi.NativeFunction, duk_idx_t)> + >('duk_concat'); late final _duk_concat = _duk_concatPtr.asFunction, int)>(); - void duk_join( - ffi.Pointer ctx, - int count, - ) { - return _duk_join( - ctx, - count, - ); + void duk_join(ffi.Pointer ctx, int count) { + return _duk_join(ctx, count); } late final _duk_joinPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_join'); + ffi.NativeFunction, duk_idx_t)> + >('duk_join'); late final _duk_join = _duk_joinPtr.asFunction, int)>(); @@ -4545,24 +4234,29 @@ class DuktapeBindings { duk_decode_char_function callback, ffi.Pointer udata, ) { - return _duk_decode_string( - ctx, - idx, - callback, - udata, - ); + return _duk_decode_string(ctx, idx, callback, udata); } late final _duk_decode_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + duk_decode_char_function, + ffi.Pointer, + ) + > + >('duk_decode_string'); + late final _duk_decode_string = + _duk_decode_stringPtr + .asFunction< + void Function( ffi.Pointer, - duk_idx_t, + int, duk_decode_char_function, - ffi.Pointer)>>('duk_decode_string'); - late final _duk_decode_string = _duk_decode_stringPtr.asFunction< - void Function(ffi.Pointer, int, duk_decode_char_function, - ffi.Pointer)>(); + ffi.Pointer, + ) + >(); void duk_map_string( ffi.Pointer ctx, @@ -4570,21 +4264,29 @@ class DuktapeBindings { duk_map_char_function callback, ffi.Pointer udata, ) { - return _duk_map_string( - ctx, - idx, - callback, - udata, - ); + return _duk_map_string(ctx, idx, callback, udata); } late final _duk_map_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_map_char_function, ffi.Pointer)>>('duk_map_string'); - late final _duk_map_string = _duk_map_stringPtr.asFunction< - void Function(ffi.Pointer, int, duk_map_char_function, - ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + duk_map_char_function, + ffi.Pointer, + ) + > + >('duk_map_string'); + late final _duk_map_string = + _duk_map_stringPtr + .asFunction< + void Function( + ffi.Pointer, + int, + duk_map_char_function, + ffi.Pointer, + ) + >(); void duk_substring( ffi.Pointer ctx, @@ -4592,283 +4294,196 @@ class DuktapeBindings { int start_char_offset, int end_char_offset, ) { - return _duk_substring( - ctx, - idx, - start_char_offset, - end_char_offset, - ); + return _duk_substring(ctx, idx, start_char_offset, end_char_offset); } late final _duk_substringPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, duk_size_t, - duk_size_t)>>('duk_substring'); - late final _duk_substring = _duk_substringPtr - .asFunction, int, int, int)>(); - - void duk_trim( - ffi.Pointer ctx, - int idx, - ) { - return _duk_trim( - ctx, - idx, - ); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + duk_size_t, + duk_size_t, + ) + > + >('duk_substring'); + late final _duk_substring = + _duk_substringPtr + .asFunction, int, int, int)>(); + + void duk_trim(ffi.Pointer ctx, int idx) { + return _duk_trim(ctx, idx); } late final _duk_trimPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_trim'); + ffi.NativeFunction, duk_idx_t)> + >('duk_trim'); late final _duk_trim = _duk_trimPtr.asFunction, int)>(); - int duk_char_code_at( - ffi.Pointer ctx, - int idx, - int char_offset, - ) { - return _duk_char_code_at( - ctx, - idx, - char_offset, - ); + int duk_char_code_at(ffi.Pointer ctx, int idx, int char_offset) { + return _duk_char_code_at(ctx, idx, char_offset); } late final _duk_char_code_atPtr = _lookup< - ffi.NativeFunction< - duk_codepoint_t Function(ffi.Pointer, duk_idx_t, - duk_size_t)>>('duk_char_code_at'); - late final _duk_char_code_at = _duk_char_code_atPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_codepoint_t Function(ffi.Pointer, duk_idx_t, duk_size_t) + > + >('duk_char_code_at'); + late final _duk_char_code_at = + _duk_char_code_atPtr + .asFunction, int, int)>(); /// ECMAScript operators - int duk_equals( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_equals( - ctx, - idx1, - idx2, - ); + int duk_equals(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_equals(ctx, idx1, idx2); } late final _duk_equalsPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t, duk_idx_t)>>('duk_equals'); - late final _duk_equals = _duk_equalsPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_equals'); + late final _duk_equals = + _duk_equalsPtr + .asFunction, int, int)>(); - int duk_strict_equals( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_strict_equals( - ctx, - idx1, - idx2, - ); + int duk_strict_equals(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_strict_equals(ctx, idx1, idx2); } late final _duk_strict_equalsPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_strict_equals'); - late final _duk_strict_equals = _duk_strict_equalsPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_strict_equals'); + late final _duk_strict_equals = + _duk_strict_equalsPtr + .asFunction, int, int)>(); - int duk_samevalue( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_samevalue( - ctx, - idx1, - idx2, - ); + int duk_samevalue(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_samevalue(ctx, idx1, idx2); } late final _duk_samevaluePtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_samevalue'); - late final _duk_samevalue = _duk_samevaluePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_samevalue'); + late final _duk_samevalue = + _duk_samevaluePtr + .asFunction, int, int)>(); - int duk_instanceof( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_instanceof( - ctx, - idx1, - idx2, - ); + int duk_instanceof(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_instanceof(ctx, idx1, idx2); } late final _duk_instanceofPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_instanceof'); - late final _duk_instanceof = _duk_instanceofPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_instanceof'); + late final _duk_instanceof = + _duk_instanceofPtr + .asFunction, int, int)>(); /// Random - double duk_random( - ffi.Pointer ctx, - ) { - return _duk_random( - ctx, - ); + double duk_random(ffi.Pointer ctx) { + return _duk_random(ctx); } late final _duk_randomPtr = _lookup< - ffi.NativeFunction)>>( - 'duk_random'); + ffi.NativeFunction)> + >('duk_random'); late final _duk_random = _duk_randomPtr.asFunction)>(); /// Function (method) calls - void duk_call( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_call( - ctx, - nargs, - ); + void duk_call(ffi.Pointer ctx, int nargs) { + return _duk_call(ctx, nargs); } late final _duk_callPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_call'); + ffi.NativeFunction, duk_idx_t)> + >('duk_call'); late final _duk_call = _duk_callPtr.asFunction, int)>(); - void duk_call_method( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_call_method( - ctx, - nargs, - ); + void duk_call_method(ffi.Pointer ctx, int nargs) { + return _duk_call_method(ctx, nargs); } late final _duk_call_methodPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_call_method'); - late final _duk_call_method = _duk_call_methodPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_call_method'); + late final _duk_call_method = + _duk_call_methodPtr + .asFunction, int)>(); - void duk_call_prop( - ffi.Pointer ctx, - int obj_idx, - int nargs, - ) { - return _duk_call_prop( - ctx, - obj_idx, - nargs, - ); + void duk_call_prop(ffi.Pointer ctx, int obj_idx, int nargs) { + return _duk_call_prop(ctx, obj_idx, nargs); } late final _duk_call_propPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_call_prop'); - late final _duk_call_prop = _duk_call_propPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_call_prop'); + late final _duk_call_prop = + _duk_call_propPtr + .asFunction, int, int)>(); - int duk_pcall( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_pcall( - ctx, - nargs, - ); + int duk_pcall(ffi.Pointer ctx, int nargs) { + return _duk_pcall(ctx, nargs); } late final _duk_pcallPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_pcall'); + ffi.NativeFunction, duk_idx_t)> + >('duk_pcall'); late final _duk_pcall = _duk_pcallPtr.asFunction, int)>(); - int duk_pcall_method( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_pcall_method( - ctx, - nargs, - ); + int duk_pcall_method(ffi.Pointer ctx, int nargs) { + return _duk_pcall_method(ctx, nargs); } late final _duk_pcall_methodPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_pcall_method'); - late final _duk_pcall_method = _duk_pcall_methodPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_pcall_method'); + late final _duk_pcall_method = + _duk_pcall_methodPtr + .asFunction, int)>(); - int duk_pcall_prop( - ffi.Pointer ctx, - int obj_idx, - int nargs, - ) { - return _duk_pcall_prop( - ctx, - obj_idx, - nargs, - ); + int duk_pcall_prop(ffi.Pointer ctx, int obj_idx, int nargs) { + return _duk_pcall_prop(ctx, obj_idx, nargs); } late final _duk_pcall_propPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_pcall_prop'); - late final _duk_pcall_prop = _duk_pcall_propPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_int_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_pcall_prop'); + late final _duk_pcall_prop = + _duk_pcall_propPtr + .asFunction, int, int)>(); - void duk_new( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_new( - ctx, - nargs, - ); + void duk_new(ffi.Pointer ctx, int nargs) { + return _duk_new(ctx, nargs); } late final _duk_newPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_new'); + ffi.NativeFunction, duk_idx_t)> + >('duk_new'); late final _duk_new = _duk_newPtr.asFunction, int)>(); - int duk_pnew( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_pnew( - ctx, - nargs, - ); + int duk_pnew(ffi.Pointer ctx, int nargs) { + return _duk_pnew(ctx, nargs); } late final _duk_pnewPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, duk_idx_t)>>('duk_pnew'); + ffi.NativeFunction, duk_idx_t)> + >('duk_pnew'); late final _duk_pnew = _duk_pnewPtr.asFunction, int)>(); @@ -4879,22 +4494,31 @@ class DuktapeBindings { int nargs, int nrets, ) { - return _duk_safe_call( - ctx, - func, - udata, - nargs, - nrets, - ); + return _duk_safe_call(ctx, func, udata, nargs, nrets); } late final _duk_safe_callPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, duk_safe_call_function, - ffi.Pointer, duk_idx_t, duk_idx_t)>>('duk_safe_call'); - late final _duk_safe_call = _duk_safe_callPtr.asFunction< - int Function(ffi.Pointer, duk_safe_call_function, - ffi.Pointer, int, int)>(); + ffi.NativeFunction< + duk_int_t Function( + ffi.Pointer, + duk_safe_call_function, + ffi.Pointer, + duk_idx_t, + duk_idx_t, + ) + > + >('duk_safe_call'); + late final _duk_safe_call = + _duk_safe_callPtr + .asFunction< + int Function( + ffi.Pointer, + duk_safe_call_function, + ffi.Pointer, + int, + int, + ) + >(); /// Compilation and evaluation int duk_eval_raw( @@ -4903,21 +4527,29 @@ class DuktapeBindings { int src_length, int flags, ) { - return _duk_eval_raw( - ctx, - src_buffer, - src_length, - flags, - ); + return _duk_eval_raw(ctx, src_buffer, src_length, flags); } late final _duk_eval_rawPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t, duk_uint_t)>>('duk_eval_raw'); - late final _duk_eval_raw = _duk_eval_rawPtr.asFunction< - int Function( - ffi.Pointer, ffi.Pointer, int, int)>(); + ffi.NativeFunction< + duk_int_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + duk_uint_t, + ) + > + >('duk_eval_raw'); + late final _duk_eval_raw = + _duk_eval_rawPtr + .asFunction< + int Function( + ffi.Pointer, + ffi.Pointer, + int, + int, + ) + >(); int duk_compile_raw( ffi.Pointer ctx, @@ -4925,65 +4557,67 @@ class DuktapeBindings { int src_length, int flags, ) { - return _duk_compile_raw( - ctx, - src_buffer, - src_length, - flags, - ); + return _duk_compile_raw(ctx, src_buffer, src_length, flags); } late final _duk_compile_rawPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t, duk_uint_t)>>('duk_compile_raw'); - late final _duk_compile_raw = _duk_compile_rawPtr.asFunction< - int Function( - ffi.Pointer, ffi.Pointer, int, int)>(); + ffi.NativeFunction< + duk_int_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + duk_uint_t, + ) + > + >('duk_compile_raw'); + late final _duk_compile_raw = + _duk_compile_rawPtr + .asFunction< + int Function( + ffi.Pointer, + ffi.Pointer, + int, + int, + ) + >(); /// Bytecode load/dump - void duk_dump_function( - ffi.Pointer ctx, - ) { - return _duk_dump_function( - ctx, - ); + void duk_dump_function(ffi.Pointer ctx) { + return _duk_dump_function(ctx); } late final _duk_dump_functionPtr = _lookup)>>( - 'duk_dump_function'); - late final _duk_dump_function = _duk_dump_functionPtr - .asFunction)>(); + 'duk_dump_function', + ); + late final _duk_dump_function = + _duk_dump_functionPtr + .asFunction)>(); - void duk_load_function( - ffi.Pointer ctx, - ) { - return _duk_load_function( - ctx, - ); + void duk_load_function(ffi.Pointer ctx) { + return _duk_load_function(ctx); } late final _duk_load_functionPtr = _lookup)>>( - 'duk_load_function'); - late final _duk_load_function = _duk_load_functionPtr - .asFunction)>(); + 'duk_load_function', + ); + late final _duk_load_function = + _duk_load_functionPtr + .asFunction)>(); /// Debugging - void duk_push_context_dump( - ffi.Pointer ctx, - ) { - return _duk_push_context_dump( - ctx, - ); + void duk_push_context_dump(ffi.Pointer ctx) { + return _duk_push_context_dump(ctx); } late final _duk_push_context_dumpPtr = _lookup)>>( - 'duk_push_context_dump'); - late final _duk_push_context_dump = _duk_push_context_dumpPtr - .asFunction)>(); + 'duk_push_context_dump', + ); + late final _duk_push_context_dump = + _duk_push_context_dumpPtr + .asFunction)>(); /// Debugger (debug protocol) void duk_debugger_attach( @@ -5011,8 +4645,24 @@ class DuktapeBindings { } late final _duk_debugger_attachPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_debug_read_function, + duk_debug_write_function, + duk_debug_peek_function, + duk_debug_read_flush_function, + duk_debug_write_flush_function, + duk_debug_request_function, + duk_debug_detached_function, + ffi.Pointer, + ) + > + >('duk_debugger_attach'); + late final _duk_debugger_attach = + _duk_debugger_attachPtr + .asFunction< + void Function( ffi.Pointer, duk_debug_read_function, duk_debug_write_function, @@ -5021,90 +4671,65 @@ class DuktapeBindings { duk_debug_write_flush_function, duk_debug_request_function, duk_debug_detached_function, - ffi.Pointer)>>('duk_debugger_attach'); - late final _duk_debugger_attach = _duk_debugger_attachPtr.asFunction< - void Function( - ffi.Pointer, - duk_debug_read_function, - duk_debug_write_function, - duk_debug_peek_function, - duk_debug_read_flush_function, - duk_debug_write_flush_function, - duk_debug_request_function, - duk_debug_detached_function, - ffi.Pointer)>(); - - void duk_debugger_detach( - ffi.Pointer ctx, - ) { - return _duk_debugger_detach( - ctx, - ); + ffi.Pointer, + ) + >(); + + void duk_debugger_detach(ffi.Pointer ctx) { + return _duk_debugger_detach(ctx); } late final _duk_debugger_detachPtr = _lookup)>>( - 'duk_debugger_detach'); - late final _duk_debugger_detach = _duk_debugger_detachPtr - .asFunction)>(); + 'duk_debugger_detach', + ); + late final _duk_debugger_detach = + _duk_debugger_detachPtr + .asFunction)>(); - void duk_debugger_cooperate( - ffi.Pointer ctx, - ) { - return _duk_debugger_cooperate( - ctx, - ); + void duk_debugger_cooperate(ffi.Pointer ctx) { + return _duk_debugger_cooperate(ctx); } late final _duk_debugger_cooperatePtr = _lookup)>>( - 'duk_debugger_cooperate'); - late final _duk_debugger_cooperate = _duk_debugger_cooperatePtr - .asFunction)>(); + 'duk_debugger_cooperate', + ); + late final _duk_debugger_cooperate = + _duk_debugger_cooperatePtr + .asFunction)>(); - int duk_debugger_notify( - ffi.Pointer ctx, - int nvalues, - ) { - return _duk_debugger_notify( - ctx, - nvalues, - ); + int duk_debugger_notify(ffi.Pointer ctx, int nvalues) { + return _duk_debugger_notify(ctx, nvalues); } late final _duk_debugger_notifyPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_debugger_notify'); - late final _duk_debugger_notify = _duk_debugger_notifyPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_debugger_notify'); + late final _duk_debugger_notify = + _duk_debugger_notifyPtr + .asFunction, int)>(); - void duk_debugger_pause( - ffi.Pointer ctx, - ) { - return _duk_debugger_pause( - ctx, - ); + void duk_debugger_pause(ffi.Pointer ctx) { + return _duk_debugger_pause(ctx); } late final _duk_debugger_pausePtr = _lookup)>>( - 'duk_debugger_pause'); - late final _duk_debugger_pause = _duk_debugger_pausePtr - .asFunction)>(); + 'duk_debugger_pause', + ); + late final _duk_debugger_pause = + _duk_debugger_pausePtr + .asFunction)>(); /// Time handling - double duk_get_now( - ffi.Pointer ctx, - ) { - return _duk_get_now( - ctx, - ); + double duk_get_now(ffi.Pointer ctx) { + return _duk_get_now(ctx); } late final _duk_get_nowPtr = _lookup< - ffi.NativeFunction)>>( - 'duk_get_now'); + ffi.NativeFunction)> + >('duk_get_now'); late final _duk_get_now = _duk_get_nowPtr.asFunction)>(); @@ -5113,38 +4738,51 @@ class DuktapeBindings { double timeval, ffi.Pointer comp, ) { - return _duk_time_to_components( - ctx, - timeval, - comp, - ); + return _duk_time_to_components(ctx, timeval, comp); } late final _duk_time_to_componentsPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_double_t, - ffi.Pointer)>>('duk_time_to_components'); - late final _duk_time_to_components = _duk_time_to_componentsPtr.asFunction< - void Function(ffi.Pointer, double, - ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_double_t, + ffi.Pointer, + ) + > + >('duk_time_to_components'); + late final _duk_time_to_components = + _duk_time_to_componentsPtr + .asFunction< + void Function( + ffi.Pointer, + double, + ffi.Pointer, + ) + >(); double duk_components_to_time( ffi.Pointer ctx, ffi.Pointer comp, ) { - return _duk_components_to_time( - ctx, - comp, - ); + return _duk_components_to_time(ctx, comp); } late final _duk_components_to_timePtr = _lookup< - ffi.NativeFunction< - duk_double_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_components_to_time'); - late final _duk_components_to_time = _duk_components_to_timePtr.asFunction< - double Function( - ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_double_t Function( + ffi.Pointer, + ffi.Pointer, + ) + > + >('duk_components_to_time'); + late final _duk_components_to_time = + _duk_components_to_timePtr + .asFunction< + double Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); } /// Public API specific typedefs @@ -5163,26 +4801,38 @@ final class duk_thread_state extends ffi.Struct { /// A few types are assumed to always exist. typedef duk_size_t = ffi.Size; typedef Dartduk_size_t = int; -typedef duk_alloc_functionFunction = ffi.Pointer Function( - ffi.Pointer udata, duk_size_t size); -typedef Dartduk_alloc_functionFunction = ffi.Pointer Function( - ffi.Pointer udata, Dartduk_size_t size); -typedef duk_alloc_function - = ffi.Pointer>; -typedef duk_realloc_functionFunction = ffi.Pointer Function( - ffi.Pointer udata, ffi.Pointer ptr, duk_size_t size); -typedef Dartduk_realloc_functionFunction = ffi.Pointer Function( - ffi.Pointer udata, - ffi.Pointer ptr, - Dartduk_size_t size); -typedef duk_realloc_function - = ffi.Pointer>; -typedef duk_free_functionFunction = ffi.Void Function( - ffi.Pointer udata, ffi.Pointer ptr); -typedef Dartduk_free_functionFunction = void Function( - ffi.Pointer udata, ffi.Pointer ptr); -typedef duk_free_function - = ffi.Pointer>; +typedef duk_alloc_functionFunction = + ffi.Pointer Function( + ffi.Pointer udata, + duk_size_t size, + ); +typedef Dartduk_alloc_functionFunction = + ffi.Pointer Function( + ffi.Pointer udata, + Dartduk_size_t size, + ); +typedef duk_alloc_function = + ffi.Pointer>; +typedef duk_realloc_functionFunction = + ffi.Pointer Function( + ffi.Pointer udata, + ffi.Pointer ptr, + duk_size_t size, + ); +typedef Dartduk_realloc_functionFunction = + ffi.Pointer Function( + ffi.Pointer udata, + ffi.Pointer ptr, + Dartduk_size_t size, + ); +typedef duk_realloc_function = + ffi.Pointer>; +typedef duk_free_functionFunction = + ffi.Void Function(ffi.Pointer udata, ffi.Pointer ptr); +typedef Dartduk_free_functionFunction = + void Function(ffi.Pointer udata, ffi.Pointer ptr); +typedef duk_free_function = + ffi.Pointer>; final class duk_memory_functions extends ffi.Struct { external duk_alloc_function alloc_func; @@ -5210,12 +4860,12 @@ final class duk_hthread extends ffi.Opaque {} /// 'struct duk_hthread' like the 'duk_hthread' typedef which is used /// exclusively in internals. typedef duk_context = duk_hthread; -typedef duk_c_functionFunction = duk_ret_t Function( - ffi.Pointer ctx); -typedef Dartduk_c_functionFunction = Dartduk_small_int_t Function( - ffi.Pointer ctx); -typedef duk_c_function - = ffi.Pointer>; +typedef duk_c_functionFunction = + duk_ret_t Function(ffi.Pointer ctx); +typedef Dartduk_c_functionFunction = + Dartduk_small_int_t Function(ffi.Pointer ctx); +typedef duk_c_function = + ffi.Pointer>; typedef duk_int_t = ffi.Int; typedef Dartduk_int_t = int; @@ -5275,12 +4925,12 @@ final class duk_time_components extends ffi.Struct { external double weekday; } -typedef duk_fatal_functionFunction = ffi.Void Function( - ffi.Pointer udata, ffi.Pointer msg); -typedef Dartduk_fatal_functionFunction = void Function( - ffi.Pointer udata, ffi.Pointer msg); -typedef duk_fatal_function - = ffi.Pointer>; +typedef duk_fatal_functionFunction = + ffi.Void Function(ffi.Pointer udata, ffi.Pointer msg); +typedef Dartduk_fatal_functionFunction = + void Function(ffi.Pointer udata, ffi.Pointer msg); +typedef duk_fatal_function = + ffi.Pointer>; /// Codepoint type. Must be 32 bits or more because it is used also for /// internal codepoints. The type is signed because negative codepoints @@ -5289,78 +4939,105 @@ typedef duk_fatal_function /// ensure duk_uint32_t casts back and forth nicely. Almost everything /// else uses the signed one. typedef duk_codepoint_t = duk_int_t; -typedef duk_decode_char_functionFunction = ffi.Void Function( - ffi.Pointer udata, duk_codepoint_t codepoint); -typedef Dartduk_decode_char_functionFunction = void Function( - ffi.Pointer udata, Dartduk_int_t codepoint); -typedef duk_decode_char_function - = ffi.Pointer>; -typedef duk_map_char_functionFunction = duk_codepoint_t Function( - ffi.Pointer udata, duk_codepoint_t codepoint); -typedef Dartduk_map_char_functionFunction = Dartduk_int_t Function( - ffi.Pointer udata, Dartduk_int_t codepoint); -typedef duk_map_char_function - = ffi.Pointer>; -typedef duk_safe_call_functionFunction = duk_ret_t Function( - ffi.Pointer ctx, ffi.Pointer udata); -typedef Dartduk_safe_call_functionFunction = Dartduk_small_int_t Function( - ffi.Pointer ctx, ffi.Pointer udata); -typedef duk_safe_call_function - = ffi.Pointer>; -typedef duk_debug_read_functionFunction = duk_size_t Function( - ffi.Pointer udata, - ffi.Pointer buffer, - duk_size_t length); -typedef Dartduk_debug_read_functionFunction = Dartduk_size_t Function( - ffi.Pointer udata, - ffi.Pointer buffer, - Dartduk_size_t length); -typedef duk_debug_read_function - = ffi.Pointer>; -typedef duk_debug_write_functionFunction = duk_size_t Function( - ffi.Pointer udata, - ffi.Pointer buffer, - duk_size_t length); -typedef Dartduk_debug_write_functionFunction = Dartduk_size_t Function( - ffi.Pointer udata, - ffi.Pointer buffer, - Dartduk_size_t length); -typedef duk_debug_write_function - = ffi.Pointer>; -typedef duk_debug_peek_functionFunction = duk_size_t Function( - ffi.Pointer udata); -typedef Dartduk_debug_peek_functionFunction = Dartduk_size_t Function( - ffi.Pointer udata); -typedef duk_debug_peek_function - = ffi.Pointer>; -typedef duk_debug_read_flush_functionFunction = ffi.Void Function( - ffi.Pointer udata); -typedef Dartduk_debug_read_flush_functionFunction = void Function( - ffi.Pointer udata); -typedef duk_debug_read_flush_function - = ffi.Pointer>; -typedef duk_debug_write_flush_functionFunction = ffi.Void Function( - ffi.Pointer udata); -typedef Dartduk_debug_write_flush_functionFunction = void Function( - ffi.Pointer udata); -typedef duk_debug_write_flush_function - = ffi.Pointer>; -typedef duk_debug_request_functionFunction = duk_idx_t Function( - ffi.Pointer ctx, - ffi.Pointer udata, - duk_idx_t nvalues); -typedef Dartduk_debug_request_functionFunction = Dartduk_int_t Function( - ffi.Pointer ctx, - ffi.Pointer udata, - Dartduk_int_t nvalues); -typedef duk_debug_request_function - = ffi.Pointer>; -typedef duk_debug_detached_functionFunction = ffi.Void Function( - ffi.Pointer ctx, ffi.Pointer udata); -typedef Dartduk_debug_detached_functionFunction = void Function( - ffi.Pointer ctx, ffi.Pointer udata); -typedef duk_debug_detached_function - = ffi.Pointer>; +typedef duk_decode_char_functionFunction = + ffi.Void Function(ffi.Pointer udata, duk_codepoint_t codepoint); +typedef Dartduk_decode_char_functionFunction = + void Function(ffi.Pointer udata, Dartduk_int_t codepoint); +typedef duk_decode_char_function = + ffi.Pointer>; +typedef duk_map_char_functionFunction = + duk_codepoint_t Function( + ffi.Pointer udata, + duk_codepoint_t codepoint, + ); +typedef Dartduk_map_char_functionFunction = + Dartduk_int_t Function( + ffi.Pointer udata, + Dartduk_int_t codepoint, + ); +typedef duk_map_char_function = + ffi.Pointer>; +typedef duk_safe_call_functionFunction = + duk_ret_t Function( + ffi.Pointer ctx, + ffi.Pointer udata, + ); +typedef Dartduk_safe_call_functionFunction = + Dartduk_small_int_t Function( + ffi.Pointer ctx, + ffi.Pointer udata, + ); +typedef duk_safe_call_function = + ffi.Pointer>; +typedef duk_debug_read_functionFunction = + duk_size_t Function( + ffi.Pointer udata, + ffi.Pointer buffer, + duk_size_t length, + ); +typedef Dartduk_debug_read_functionFunction = + Dartduk_size_t Function( + ffi.Pointer udata, + ffi.Pointer buffer, + Dartduk_size_t length, + ); +typedef duk_debug_read_function = + ffi.Pointer>; +typedef duk_debug_write_functionFunction = + duk_size_t Function( + ffi.Pointer udata, + ffi.Pointer buffer, + duk_size_t length, + ); +typedef Dartduk_debug_write_functionFunction = + Dartduk_size_t Function( + ffi.Pointer udata, + ffi.Pointer buffer, + Dartduk_size_t length, + ); +typedef duk_debug_write_function = + ffi.Pointer>; +typedef duk_debug_peek_functionFunction = + duk_size_t Function(ffi.Pointer udata); +typedef Dartduk_debug_peek_functionFunction = + Dartduk_size_t Function(ffi.Pointer udata); +typedef duk_debug_peek_function = + ffi.Pointer>; +typedef duk_debug_read_flush_functionFunction = + ffi.Void Function(ffi.Pointer udata); +typedef Dartduk_debug_read_flush_functionFunction = + void Function(ffi.Pointer udata); +typedef duk_debug_read_flush_function = + ffi.Pointer>; +typedef duk_debug_write_flush_functionFunction = + ffi.Void Function(ffi.Pointer udata); +typedef Dartduk_debug_write_flush_functionFunction = + void Function(ffi.Pointer udata); +typedef duk_debug_write_flush_function = + ffi.Pointer>; +typedef duk_debug_request_functionFunction = + duk_idx_t Function( + ffi.Pointer ctx, + ffi.Pointer udata, + duk_idx_t nvalues, + ); +typedef Dartduk_debug_request_functionFunction = + Dartduk_int_t Function( + ffi.Pointer ctx, + ffi.Pointer udata, + Dartduk_int_t nvalues, + ); +typedef duk_debug_request_function = + ffi.Pointer>; +typedef duk_debug_detached_functionFunction = + ffi.Void Function( + ffi.Pointer ctx, + ffi.Pointer udata, + ); +typedef Dartduk_debug_detached_functionFunction = + void Function(ffi.Pointer ctx, ffi.Pointer udata); +typedef duk_debug_detached_function = + ffi.Pointer>; typedef duk_uint_t = ffi.UnsignedInt; typedef Dartduk_uint_t = int; diff --git a/ffigen_codelab/step_05/lib/ffigen_app.dart b/ffigen_codelab/step_05/lib/ffigen_app.dart index 216f909a16..70bea9e3ef 100644 --- a/ffigen_codelab/step_05/lib/ffigen_app.dart +++ b/ffigen_codelab/step_05/lib/ffigen_app.dart @@ -29,8 +29,13 @@ final DuktapeBindings _bindings = DuktapeBindings(_dylib); class Duktape { Duktape() { - ctx = - _bindings.duk_create_heap(nullptr, nullptr, nullptr, nullptr, nullptr); + ctx = _bindings.duk_create_heap( + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + ); } void evalString(String jsCode) { @@ -40,15 +45,16 @@ class Duktape { var nativeUtf8 = jsCode.toNativeUtf8(); _bindings.duk_eval_raw( - ctx, - nativeUtf8.cast(), - 0, - 0 /*args*/ | - DUK_COMPILE_EVAL | - DUK_COMPILE_SAFE | - DUK_COMPILE_NOSOURCE | - DUK_COMPILE_STRLEN | - DUK_COMPILE_NOFILENAME); + ctx, + nativeUtf8.cast(), + 0, + 0 /*args*/ | + DUK_COMPILE_EVAL | + DUK_COMPILE_SAFE | + DUK_COMPILE_NOSOURCE | + DUK_COMPILE_STRLEN | + DUK_COMPILE_NOFILENAME, + ); ffi.malloc.free(nativeUtf8); } diff --git a/ffigen_codelab/step_05/lib/ffigen_app_bindings_generated.dart b/ffigen_codelab/step_05/lib/ffigen_app_bindings_generated.dart index 513983bf0c..b91a32288b 100644 --- a/ffigen_codelab/step_05/lib/ffigen_app_bindings_generated.dart +++ b/ffigen_codelab/step_05/lib/ffigen_app_bindings_generated.dart @@ -15,31 +15,24 @@ import 'dart:ffi' as ffi; class FfigenAppBindings { /// Holds the symbol lookup function. final ffi.Pointer Function(String symbolName) - _lookup; + _lookup; /// The symbols are looked up in [dynamicLibrary]. FfigenAppBindings(ffi.DynamicLibrary dynamicLibrary) - : _lookup = dynamicLibrary.lookup; + : _lookup = dynamicLibrary.lookup; /// The symbols are looked up with [lookup]. FfigenAppBindings.fromLookup( - ffi.Pointer Function(String symbolName) - lookup) - : _lookup = lookup; + ffi.Pointer Function(String symbolName) lookup, + ) : _lookup = lookup; /// A very short-lived native function. /// /// For very short-lived functions, it is fine to call them on the main isolate. /// They will block the Dart execution while running the native function, so /// only do this for native functions which are guaranteed to be short-lived. - int sum( - int a, - int b, - ) { - return _sum( - a, - b, - ); + int sum(int a, int b) { + return _sum(a, b); } late final _sumPtr = @@ -51,19 +44,14 @@ class FfigenAppBindings { /// Do not call these kind of native functions in the main isolate. They will /// block Dart execution. This will cause dropped frames in Flutter applications. /// Instead, call these native functions on a separate isolate. - int sum_long_running( - int a, - int b, - ) { - return _sum_long_running( - a, - b, - ); + int sum_long_running(int a, int b) { + return _sum_long_running(a, b); } late final _sum_long_runningPtr = _lookup>( - 'sum_long_running'); + 'sum_long_running', + ); late final _sum_long_running = _sum_long_runningPtr.asFunction(); } diff --git a/ffigen_codelab/step_05/pubspec.yaml b/ffigen_codelab/step_05/pubspec.yaml index 9628509bde..cb3df64592 100644 --- a/ffigen_codelab/step_05/pubspec.yaml +++ b/ffigen_codelab/step_05/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 homepage: environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 flutter: '>=3.3.0' dependencies: diff --git a/ffigen_codelab/step_06/android/build.gradle b/ffigen_codelab/step_06/android/build.gradle index 5681b7125e..adff069975 100644 --- a/ffigen_codelab/step_06/android/build.gradle +++ b/ffigen_codelab/step_06/android/build.gradle @@ -11,7 +11,7 @@ buildscript { dependencies { // The Android Gradle Plugin knows how to build native code with the NDK. - classpath("com.android.tools.build:gradle:8.1.0") + classpath("com.android.tools.build:gradle:8.7.0") } } diff --git a/ffigen_codelab/step_06/example/android/.gitignore b/ffigen_codelab/step_06/example/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/ffigen_codelab/step_06/example/android/.gitignore +++ b/ffigen_codelab/step_06/example/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/ffigen_codelab/step_06/example/android/app/build.gradle b/ffigen_codelab/step_06/example/android/app/build.gradle deleted file mode 100644 index 858c9239e7..0000000000 --- a/ffigen_codelab/step_06/example/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.ffigen_app_example" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.ffigen_app_example" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/ffigen_codelab/step_06/example/android/app/build.gradle.kts b/ffigen_codelab/step_06/example/android/app/build.gradle.kts new file mode 100644 index 0000000000..1de7c631eb --- /dev/null +++ b/ffigen_codelab/step_06/example/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.ffigen_app_example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.ffigen_app_example" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/ffigen_codelab/step_06/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt b/ffigen_codelab/step_06/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt index bd55dde018..68b7000537 100644 --- a/ffigen_codelab/step_06/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt +++ b/ffigen_codelab/step_06/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.ffigen_app_example import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/ffigen_codelab/step_06/example/android/build.gradle b/ffigen_codelab/step_06/example/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/ffigen_codelab/step_06/example/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/ffigen_codelab/step_06/example/android/build.gradle.kts b/ffigen_codelab/step_06/example/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/ffigen_codelab/step_06/example/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/ffigen_codelab/step_06/example/android/gradle.properties b/ffigen_codelab/step_06/example/android/gradle.properties index 2597170821..f018a61817 100644 --- a/ffigen_codelab/step_06/example/android/gradle.properties +++ b/ffigen_codelab/step_06/example/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/ffigen_codelab/step_06/example/android/gradle/wrapper/gradle-wrapper.properties b/ffigen_codelab/step_06/example/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/ffigen_codelab/step_06/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/ffigen_codelab/step_06/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/ffigen_codelab/step_06/example/android/settings.gradle b/ffigen_codelab/step_06/example/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/ffigen_codelab/step_06/example/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/ffigen_codelab/step_06/example/android/settings.gradle.kts b/ffigen_codelab/step_06/example/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/ffigen_codelab/step_06/example/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/ffigen_codelab/step_06/example/ios/Podfile b/ffigen_codelab/step_06/example/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/ffigen_codelab/step_06/example/ios/Podfile +++ b/ffigen_codelab/step_06/example/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/ffigen_codelab/step_06/example/ios/Runner.xcodeproj/project.pbxproj b/ffigen_codelab/step_06/example/ios/Runner.xcodeproj/project.pbxproj index 11b35beabb..5dce0dac38 100644 --- a/ffigen_codelab/step_06/example/ios/Runner.xcodeproj/project.pbxproj +++ b/ffigen_codelab/step_06/example/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 37B5EBBBFAF9E53C5A5A3131 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C70BDB27F55A3ED8E56180C /* Pods_Runner.framework */; }; + 384D477FC90E5FE14FBB9C9B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F7D2ACBE41A96778898A158E /* Pods_RunnerTests.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3BAAB801B363D2B5694697C8 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 41BA389D069B869AD7889B4B /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B5A497559709EA1F295B2ABD /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D792A817A1AC422F6F9C82 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,60 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0A699E5B0E4355A13752C564 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 13B01B12CFE1D25EDCCA52CD /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 27D792A817A1AC422F6F9C82 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 39EB4D0DC80E04DEDEE47517 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 41BA389D069B869AD7889B4B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 64E59BF5AFBD791B75DE2717 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 72FD69CE914A569D374BC284 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 4E0F56AF76441046B2E429BD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 54C2C7FEA9C49D833A007720 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 65357106E0D2E41A618094B3 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6C70BDB27F55A3ED8E56180C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7DC789C88302A0F93C36C132 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 93A1F1522D2E02875F57A767 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 975C3FBFA1212BE1989BBAEF /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A86DC62688E59DEB11E5C544 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + F7D2ACBE41A96778898A158E /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 6D670872593D25878C4487BA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3BAAB801B363D2B5694697C8 /* Pods_Runner.framework in Frameworks */, + 384D477FC90E5FE14FBB9C9B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - D96534983B06C1B866173361 /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B5A497559709EA1F295B2ABD /* Pods_RunnerTests.framework in Frameworks */, + 37B5EBBBFAF9E53C5A5A3131 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 1464C4D9E37A8A538102B8DD /* Pods */ = { + 29FB55DB424944C14D3275A3 /* Pods */ = { isa = PBXGroup; children = ( - 72FD69CE914A569D374BC284 /* Pods-Runner.debug.xcconfig */, - 39EB4D0DC80E04DEDEE47517 /* Pods-Runner.release.xcconfig */, - A86DC62688E59DEB11E5C544 /* Pods-Runner.profile.xcconfig */, - 64E59BF5AFBD791B75DE2717 /* Pods-RunnerTests.debug.xcconfig */, - 7DC789C88302A0F93C36C132 /* Pods-RunnerTests.release.xcconfig */, - 0A699E5B0E4355A13752C564 /* Pods-RunnerTests.profile.xcconfig */, + 65357106E0D2E41A618094B3 /* Pods-Runner.debug.xcconfig */, + 93A1F1522D2E02875F57A767 /* Pods-Runner.release.xcconfig */, + 54C2C7FEA9C49D833A007720 /* Pods-Runner.profile.xcconfig */, + 13B01B12CFE1D25EDCCA52CD /* Pods-RunnerTests.debug.xcconfig */, + 975C3FBFA1212BE1989BBAEF /* Pods-RunnerTests.release.xcconfig */, + 4E0F56AF76441046B2E429BD /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -109,6 +109,15 @@ path = RunnerTests; sourceTree = ""; }; + 8A7B53D318FBA4992925932E /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6C70BDB27F55A3ED8E56180C /* Pods_Runner.framework */, + F7D2ACBE41A96778898A158E /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -127,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 1464C4D9E37A8A538102B8DD /* Pods */, - C96CA1F9B39CF12E68595C76 /* Frameworks */, + 29FB55DB424944C14D3275A3 /* Pods */, + 8A7B53D318FBA4992925932E /* Frameworks */, ); sourceTree = ""; }; @@ -156,15 +165,6 @@ path = Runner; sourceTree = ""; }; - C96CA1F9B39CF12E68595C76 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 41BA389D069B869AD7889B4B /* Pods_Runner.framework */, - 27D792A817A1AC422F6F9C82 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C76428869724CEC2AD1B9656 /* [CP] Check Pods Manifest.lock */, + 021DCD7A722AB071A5C77AE8 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - D96534983B06C1B866173361 /* Frameworks */, + 6D670872593D25878C4487BA /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - C869F8CB0B0F18B822D29CD3 /* [CP] Check Pods Manifest.lock */, + ADFFF2E0D804F0B8A1446142 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 033E03FC98E5610670E4DB03 /* [CP] Embed Pods Frameworks */, + E14EC01F727DBDDB3D4D083C /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,21 +270,26 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 033E03FC98E5610670E4DB03 /* [CP] Embed Pods Frameworks */ = { + 021DCD7A722AB071A5C77AE8 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { @@ -318,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - C76428869724CEC2AD1B9656 /* [CP] Check Pods Manifest.lock */ = { + ADFFF2E0D804F0B8A1446142 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -333,33 +338,28 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C869F8CB0B0F18B822D29CD3 /* [CP] Check Pods Manifest.lock */ = { + E14EC01F727DBDDB3D4D083C /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 64E59BF5AFBD791B75DE2717 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 13B01B12CFE1D25EDCCA52CD /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7DC789C88302A0F93C36C132 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 975C3FBFA1212BE1989BBAEF /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0A699E5B0E4355A13752C564 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4E0F56AF76441046B2E429BD /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/ffigen_codelab/step_06/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ffigen_codelab/step_06/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/ffigen_codelab/step_06/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ffigen_codelab/step_06/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/ffigen_codelab/step_06/example/lib/main.dart b/ffigen_codelab/step_06/example/lib/main.dart index fe9e7935d6..34ed956085 100644 --- a/ffigen_codelab/step_06/example/lib/main.dart +++ b/ffigen_codelab/step_06/example/lib/main.dart @@ -43,20 +43,14 @@ class _MyAppState extends State { const spacerSmall = SizedBox(height: 10); return MaterialApp( home: Scaffold( - appBar: AppBar( - title: const Text('Duktape Test'), - ), + appBar: AppBar(title: const Text('Duktape Test')), body: Center( child: Container( padding: const EdgeInsets.all(10), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - output, - style: textStyle, - textAlign: TextAlign.center, - ), + Text(output, style: textStyle, textAlign: TextAlign.center), spacerSmall, ElevatedButton( child: const Text('Run JavaScript'), diff --git a/ffigen_codelab/step_06/example/macos/Podfile b/ffigen_codelab/step_06/example/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/ffigen_codelab/step_06/example/macos/Podfile +++ b/ffigen_codelab/step_06/example/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/ffigen_codelab/step_06/example/macos/Runner.xcodeproj/project.pbxproj b/ffigen_codelab/step_06/example/macos/Runner.xcodeproj/project.pbxproj index ca42e7ff4c..5aef7e5f5c 100644 --- a/ffigen_codelab/step_06/example/macos/Runner.xcodeproj/project.pbxproj +++ b/ffigen_codelab/step_06/example/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E0ABE5351EEC7064797E354 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB2E266604615E92796CF34F /* Pods_RunnerTests.framework */; }; + 1C8C89059489393A675CDD46 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C551CF74C447A27874F18AB /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 70D6F45F50A4EDBF85FE4580 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7DB609CA69926401ABE9640 /* Pods_Runner.framework */; }; + FD4F6A6ABF567B438B51441E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0367DD23E825595062E6435 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -78,16 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3FFEEF5A6FD917D69A212B0A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 5FDA6842E56F0C007A1996D4 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6675D4608C63F4E732E35408 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 66DCEB8DA3900A335B5DA07B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6C551CF74C447A27874F18AB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 86211CEC0D1790FBE3C5D8B2 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9A0BF02ED47D73F7064B0917 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 9E9EF64C35AAAA3602964AA7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - A7DB609CA69926401ABE9640 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AB2E266604615E92796CF34F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F19E5B3C65EA370F013BE716 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - FBAE80B05D89C5D84D5C03B4 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + A2F46067E2A9A5E15A5EAD4B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + B0367DD23E825595062E6435 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CB3D46D2C93EC7C2706356FA /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + E738C84FF92335A6E75E26E3 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E0ABE5351EEC7064797E354 /* Pods_RunnerTests.framework in Frameworks */, + FD4F6A6ABF567B438B51441E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 70D6F45F50A4EDBF85FE4580 /* Pods_Runner.framework in Frameworks */, + 1C8C89059489393A675CDD46 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A7A0BE3105C149DB55691A21 /* Pods */, + 88DCA9F60F99C8938CB33876 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - A7A0BE3105C149DB55691A21 /* Pods */ = { + 88DCA9F60F99C8938CB33876 /* Pods */ = { isa = PBXGroup; children = ( - FBAE80B05D89C5D84D5C03B4 /* Pods-Runner.debug.xcconfig */, - 3FFEEF5A6FD917D69A212B0A /* Pods-Runner.release.xcconfig */, - 9A0BF02ED47D73F7064B0917 /* Pods-Runner.profile.xcconfig */, - F19E5B3C65EA370F013BE716 /* Pods-RunnerTests.debug.xcconfig */, - 5FDA6842E56F0C007A1996D4 /* Pods-RunnerTests.release.xcconfig */, - 9E9EF64C35AAAA3602964AA7 /* Pods-RunnerTests.profile.xcconfig */, + A2F46067E2A9A5E15A5EAD4B /* Pods-Runner.debug.xcconfig */, + CB3D46D2C93EC7C2706356FA /* Pods-Runner.release.xcconfig */, + E738C84FF92335A6E75E26E3 /* Pods-Runner.profile.xcconfig */, + 66DCEB8DA3900A335B5DA07B /* Pods-RunnerTests.debug.xcconfig */, + 6675D4608C63F4E732E35408 /* Pods-RunnerTests.release.xcconfig */, + 86211CEC0D1790FBE3C5D8B2 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - A7DB609CA69926401ABE9640 /* Pods_Runner.framework */, - AB2E266604615E92796CF34F /* Pods_RunnerTests.framework */, + 6C551CF74C447A27874F18AB /* Pods_Runner.framework */, + B0367DD23E825595062E6435 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1E3C02A919DB5D8E5C62924B /* [CP] Check Pods Manifest.lock */, + 8C407044D2CDDF53A9D3AC56 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - CDB523A6B35188D3F64E8B1A /* [CP] Check Pods Manifest.lock */, + C852338EF94F000CBCF7D11F /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - D6EA5EEBFAD504A5C6262391 /* [CP] Embed Pods Frameworks */, + EE4863E2E4723B3A412B4656 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,67 +323,67 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 1E3C02A919DB5D8E5C62924B /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 8C407044D2CDDF53A9D3AC56 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - CDB523A6B35188D3F64E8B1A /* [CP] Check Pods Manifest.lock */ = { + C852338EF94F000CBCF7D11F /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,7 +405,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - D6EA5EEBFAD504A5C6262391 /* [CP] Embed Pods Frameworks */ = { + EE4863E2E4723B3A412B4656 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F19E5B3C65EA370F013BE716 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 66DCEB8DA3900A335B5DA07B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5FDA6842E56F0C007A1996D4 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 6675D4608C63F4E732E35408 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9E9EF64C35AAAA3602964AA7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 86211CEC0D1790FBE3C5D8B2 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/ffigen_codelab/step_06/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ffigen_codelab/step_06/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index ec6dd3f545..add807ea9a 100644 --- a/ffigen_codelab/step_06/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ffigen_codelab/step_06/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/ffigen_codelab/step_06/example/pubspec.yaml b/ffigen_codelab/step_06/example/pubspec.yaml index 18ce33533c..bb9b2fc9ba 100644 --- a/ffigen_codelab/step_06/example/pubspec.yaml +++ b/ffigen_codelab/step_06/example/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/ffigen_codelab/step_06/lib/duktape_bindings_generated.dart b/ffigen_codelab/step_06/lib/duktape_bindings_generated.dart index d7df5e2909..0eb041df40 100644 --- a/ffigen_codelab/step_06/lib/duktape_bindings_generated.dart +++ b/ffigen_codelab/step_06/lib/duktape_bindings_generated.dart @@ -15,17 +15,16 @@ import 'dart:ffi' as ffi; class DuktapeBindings { /// Holds the symbol lookup function. final ffi.Pointer Function(String symbolName) - _lookup; + _lookup; /// The symbols are looked up in [dynamicLibrary]. DuktapeBindings(ffi.DynamicLibrary dynamicLibrary) - : _lookup = dynamicLibrary.lookup; + : _lookup = dynamicLibrary.lookup; /// The symbols are looked up with [lookup]. DuktapeBindings.fromLookup( - ffi.Pointer Function(String symbolName) - lookup) - : _lookup = lookup; + ffi.Pointer Function(String symbolName) lookup, + ) : _lookup = lookup; /// Context management ffi.Pointer duk_create_heap( @@ -45,226 +44,241 @@ class DuktapeBindings { } late final _duk_create_heapPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + duk_alloc_function, + duk_realloc_function, + duk_free_function, + ffi.Pointer, + duk_fatal_function, + ) + > + >('duk_create_heap'); + late final _duk_create_heap = + _duk_create_heapPtr + .asFunction< + ffi.Pointer Function( duk_alloc_function, duk_realloc_function, duk_free_function, ffi.Pointer, - duk_fatal_function)>>('duk_create_heap'); - late final _duk_create_heap = _duk_create_heapPtr.asFunction< - ffi.Pointer Function( - duk_alloc_function, - duk_realloc_function, - duk_free_function, - ffi.Pointer, - duk_fatal_function)>(); + duk_fatal_function, + ) + >(); - void duk_destroy_heap( - ffi.Pointer ctx, - ) { - return _duk_destroy_heap( - ctx, - ); + void duk_destroy_heap(ffi.Pointer ctx) { + return _duk_destroy_heap(ctx); } late final _duk_destroy_heapPtr = _lookup)>>( - 'duk_destroy_heap'); - late final _duk_destroy_heap = _duk_destroy_heapPtr - .asFunction)>(); + 'duk_destroy_heap', + ); + late final _duk_destroy_heap = + _duk_destroy_heapPtr + .asFunction)>(); void duk_suspend( ffi.Pointer ctx, ffi.Pointer state, ) { - return _duk_suspend( - ctx, - state, - ); + return _duk_suspend(ctx, state); } late final _duk_suspendPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_suspend'); - late final _duk_suspend = _duk_suspendPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_suspend'); + late final _duk_suspend = + _duk_suspendPtr + .asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); void duk_resume( ffi.Pointer ctx, ffi.Pointer state, ) { - return _duk_resume( - ctx, - state, - ); + return _duk_resume(ctx, state); } late final _duk_resumePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_resume'); - late final _duk_resume = _duk_resumePtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_resume'); + late final _duk_resume = + _duk_resumePtr + .asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Memory management /// /// Raw functions have no side effects (cannot trigger GC). - ffi.Pointer duk_alloc_raw( - ffi.Pointer ctx, - int size, - ) { - return _duk_alloc_raw( - ctx, - size, - ); + ffi.Pointer duk_alloc_raw(ffi.Pointer ctx, int size) { + return _duk_alloc_raw(ctx, size); } late final _duk_alloc_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_size_t)>>('duk_alloc_raw'); - late final _duk_alloc_raw = _duk_alloc_rawPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_size_t) + > + >('duk_alloc_raw'); + late final _duk_alloc_raw = + _duk_alloc_rawPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_free_raw( - ffi.Pointer ctx, - ffi.Pointer ptr, - ) { - return _duk_free_raw( - ctx, - ptr, - ); + void duk_free_raw(ffi.Pointer ctx, ffi.Pointer ptr) { + return _duk_free_raw(ctx, ptr); } late final _duk_free_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_free_raw'); - late final _duk_free_raw = _duk_free_rawPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_free_raw'); + late final _duk_free_raw = + _duk_free_rawPtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); ffi.Pointer duk_realloc_raw( ffi.Pointer ctx, ffi.Pointer ptr, int size, ) { - return _duk_realloc_raw( - ctx, - ptr, - size, - ); + return _duk_realloc_raw(ctx, ptr, size); } late final _duk_realloc_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, duk_size_t)>>('duk_realloc_raw'); - late final _duk_realloc_raw = _duk_realloc_rawPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_realloc_raw'); + late final _duk_realloc_raw = + _duk_realloc_rawPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); - ffi.Pointer duk_alloc( - ffi.Pointer ctx, - int size, - ) { - return _duk_alloc( - ctx, - size, - ); + ffi.Pointer duk_alloc(ffi.Pointer ctx, int size) { + return _duk_alloc(ctx, size); } late final _duk_allocPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_size_t)>>('duk_alloc'); - late final _duk_alloc = _duk_allocPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_size_t) + > + >('duk_alloc'); + late final _duk_alloc = + _duk_allocPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_free( - ffi.Pointer ctx, - ffi.Pointer ptr, - ) { - return _duk_free( - ctx, - ptr, - ); + void duk_free(ffi.Pointer ctx, ffi.Pointer ptr) { + return _duk_free(ctx, ptr); } late final _duk_freePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, ffi.Pointer)>>('duk_free'); - late final _duk_free = _duk_freePtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_free'); + late final _duk_free = + _duk_freePtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); ffi.Pointer duk_realloc( ffi.Pointer ctx, ffi.Pointer ptr, int size, ) { - return _duk_realloc( - ctx, - ptr, - size, - ); + return _duk_realloc(ctx, ptr, size); } late final _duk_reallocPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, duk_size_t)>>('duk_realloc'); - late final _duk_realloc = _duk_reallocPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_realloc'); + late final _duk_realloc = + _duk_reallocPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); void duk_get_memory_functions( ffi.Pointer ctx, ffi.Pointer out_funcs, ) { - return _duk_get_memory_functions( - ctx, - out_funcs, - ); + return _duk_get_memory_functions(ctx, out_funcs); } late final _duk_get_memory_functionsPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_get_memory_functions'); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ) + > + >('duk_get_memory_functions'); late final _duk_get_memory_functions = - _duk_get_memory_functionsPtr.asFunction< - void Function( - ffi.Pointer, ffi.Pointer)>(); + _duk_get_memory_functionsPtr + .asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); - void duk_gc( - ffi.Pointer ctx, - int flags, - ) { - return _duk_gc( - ctx, - flags, - ); + void duk_gc(ffi.Pointer ctx, int flags) { + return _duk_gc(ctx, flags); } late final _duk_gcPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_uint_t)>>('duk_gc'); + ffi.NativeFunction, duk_uint_t)> + >('duk_gc'); late final _duk_gc = _duk_gcPtr.asFunction, int)>(); - void duk_throw_raw( - ffi.Pointer ctx, - ) { - return _duk_throw_raw( - ctx, - ); + void duk_throw_raw(ffi.Pointer ctx) { + return _duk_throw_raw(ctx); } late final _duk_throw_rawPtr = _lookup)>>( - 'duk_throw_raw'); + 'duk_throw_raw', + ); late final _duk_throw_raw = _duk_throw_rawPtr.asFunction)>(); @@ -272,18 +286,19 @@ class DuktapeBindings { ffi.Pointer ctx, ffi.Pointer err_msg, ) { - return _duk_fatal_raw( - ctx, - err_msg, - ); + return _duk_fatal_raw(ctx, err_msg); } late final _duk_fatal_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_fatal_raw'); - late final _duk_fatal_raw = _duk_fatal_rawPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_fatal_raw'); + late final _duk_fatal_raw = + _duk_fatal_rawPtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); void duk_error_raw( ffi.Pointer ctx, @@ -292,26 +307,31 @@ class DuktapeBindings { int line, ffi.Pointer fmt, ) { - return _duk_error_raw( - ctx, - err_code, - filename, - line, - fmt, - ); + return _duk_error_raw(ctx, err_code, filename, line, fmt); } late final _duk_error_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_errcode_t, + ffi.Pointer, + duk_int_t, + ffi.Pointer, + ) + > + >('duk_error_raw'); + late final _duk_error_raw = + _duk_error_rawPtr + .asFunction< + void Function( ffi.Pointer, - duk_errcode_t, + int, + ffi.Pointer, + int, ffi.Pointer, - duk_int_t, - ffi.Pointer)>>('duk_error_raw'); - late final _duk_error_raw = _duk_error_rawPtr.asFunction< - void Function(ffi.Pointer, int, ffi.Pointer, int, - ffi.Pointer)>(); + ) + >(); void duk_error_va_raw( ffi.Pointer ctx, @@ -321,185 +341,147 @@ class DuktapeBindings { ffi.Pointer fmt, va_list ap, ) { - return _duk_error_va_raw( - ctx, - err_code, - filename, - line, - fmt, - ap, - ); + return _duk_error_va_raw(ctx, err_code, filename, line, fmt, ap); } late final _duk_error_va_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_errcode_t, + ffi.Pointer, + duk_int_t, + ffi.Pointer, + va_list, + ) + > + >('duk_error_va_raw'); + late final _duk_error_va_raw = + _duk_error_va_rawPtr + .asFunction< + void Function( ffi.Pointer, - duk_errcode_t, + int, ffi.Pointer, - duk_int_t, + int, ffi.Pointer, - va_list)>>('duk_error_va_raw'); - late final _duk_error_va_raw = _duk_error_va_rawPtr.asFunction< - void Function(ffi.Pointer, int, ffi.Pointer, int, - ffi.Pointer, va_list)>(); + va_list, + ) + >(); /// Other state related functions - int duk_is_strict_call( - ffi.Pointer ctx, - ) { - return _duk_is_strict_call( - ctx, - ); + int duk_is_strict_call(ffi.Pointer ctx) { + return _duk_is_strict_call(ctx); } late final _duk_is_strict_callPtr = _lookup< - ffi.NativeFunction)>>( - 'duk_is_strict_call'); - late final _duk_is_strict_call = _duk_is_strict_callPtr - .asFunction)>(); + ffi.NativeFunction)> + >('duk_is_strict_call'); + late final _duk_is_strict_call = + _duk_is_strict_callPtr + .asFunction)>(); - int duk_is_constructor_call( - ffi.Pointer ctx, - ) { - return _duk_is_constructor_call( - ctx, - ); + int duk_is_constructor_call(ffi.Pointer ctx) { + return _duk_is_constructor_call(ctx); } late final _duk_is_constructor_callPtr = _lookup< - ffi.NativeFunction)>>( - 'duk_is_constructor_call'); - late final _duk_is_constructor_call = _duk_is_constructor_callPtr - .asFunction)>(); + ffi.NativeFunction)> + >('duk_is_constructor_call'); + late final _duk_is_constructor_call = + _duk_is_constructor_callPtr + .asFunction)>(); /// Stack management - int duk_normalize_index( - ffi.Pointer ctx, - int idx, - ) { - return _duk_normalize_index( - ctx, - idx, - ); + int duk_normalize_index(ffi.Pointer ctx, int idx) { + return _duk_normalize_index(ctx, idx); } late final _duk_normalize_indexPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( - ffi.Pointer, duk_idx_t)>>('duk_normalize_index'); - late final _duk_normalize_index = _duk_normalize_indexPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_normalize_index'); + late final _duk_normalize_index = + _duk_normalize_indexPtr + .asFunction, int)>(); - int duk_require_normalize_index( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_normalize_index( - ctx, - idx, - ); + int duk_require_normalize_index(ffi.Pointer ctx, int idx) { + return _duk_require_normalize_index(ctx, idx); } late final _duk_require_normalize_indexPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function(ffi.Pointer, - duk_idx_t)>>('duk_require_normalize_index'); - late final _duk_require_normalize_index = _duk_require_normalize_indexPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_normalize_index'); + late final _duk_require_normalize_index = + _duk_require_normalize_indexPtr + .asFunction, int)>(); - int duk_is_valid_index( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_valid_index( - ctx, - idx, - ); + int duk_is_valid_index(ffi.Pointer ctx, int idx) { + return _duk_is_valid_index(ctx, idx); } late final _duk_is_valid_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_valid_index'); - late final _duk_is_valid_index = _duk_is_valid_indexPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_valid_index'); + late final _duk_is_valid_index = + _duk_is_valid_indexPtr + .asFunction, int)>(); - void duk_require_valid_index( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_valid_index( - ctx, - idx, - ); + void duk_require_valid_index(ffi.Pointer ctx, int idx) { + return _duk_require_valid_index(ctx, idx); } late final _duk_require_valid_indexPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_valid_index'); - late final _duk_require_valid_index = _duk_require_valid_indexPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_valid_index'); + late final _duk_require_valid_index = + _duk_require_valid_indexPtr + .asFunction, int)>(); - int duk_get_top( - ffi.Pointer ctx, - ) { - return _duk_get_top( - ctx, - ); + int duk_get_top(ffi.Pointer ctx) { + return _duk_get_top(ctx); } late final _duk_get_topPtr = _lookup)>>( - 'duk_get_top'); + 'duk_get_top', + ); late final _duk_get_top = _duk_get_topPtr.asFunction)>(); - void duk_set_top( - ffi.Pointer ctx, - int idx, - ) { - return _duk_set_top( - ctx, - idx, - ); + void duk_set_top(ffi.Pointer ctx, int idx) { + return _duk_set_top(ctx, idx); } late final _duk_set_topPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_set_top'); - late final _duk_set_top = _duk_set_topPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_set_top'); + late final _duk_set_top = + _duk_set_topPtr + .asFunction, int)>(); - int duk_get_top_index( - ffi.Pointer ctx, - ) { - return _duk_get_top_index( - ctx, - ); + int duk_get_top_index(ffi.Pointer ctx) { + return _duk_get_top_index(ctx); } late final _duk_get_top_indexPtr = _lookup)>>( - 'duk_get_top_index'); - late final _duk_get_top_index = _duk_get_top_indexPtr - .asFunction)>(); + 'duk_get_top_index', + ); + late final _duk_get_top_index = + _duk_get_top_indexPtr + .asFunction)>(); - int duk_require_top_index( - ffi.Pointer ctx, - ) { - return _duk_require_top_index( - ctx, - ); + int duk_require_top_index(ffi.Pointer ctx) { + return _duk_require_top_index(ctx); } late final _duk_require_top_indexPtr = _lookup)>>( - 'duk_require_top_index'); - late final _duk_require_top_index = _duk_require_top_indexPtr - .asFunction)>(); + 'duk_require_top_index', + ); + late final _duk_require_top_index = + _duk_require_top_indexPtr + .asFunction)>(); /// Although extra/top could be an unsigned type here, using a signed type /// makes the API more robust to calling code calculation errors or corner @@ -507,224 +489,147 @@ class DuktapeBindings { /// Negative values are treated as zero, which is better than casting them /// to a large unsigned number. (This principle is used elsewhere in the /// API too.) - int duk_check_stack( - ffi.Pointer ctx, - int extra, - ) { - return _duk_check_stack( - ctx, - extra, - ); + int duk_check_stack(ffi.Pointer ctx, int extra) { + return _duk_check_stack(ctx, extra); } late final _duk_check_stackPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_check_stack'); - late final _duk_check_stack = _duk_check_stackPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_check_stack'); + late final _duk_check_stack = + _duk_check_stackPtr + .asFunction, int)>(); - void duk_require_stack( - ffi.Pointer ctx, - int extra, - ) { - return _duk_require_stack( - ctx, - extra, - ); + void duk_require_stack(ffi.Pointer ctx, int extra) { + return _duk_require_stack(ctx, extra); } late final _duk_require_stackPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_stack'); - late final _duk_require_stack = _duk_require_stackPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_stack'); + late final _duk_require_stack = + _duk_require_stackPtr + .asFunction, int)>(); - int duk_check_stack_top( - ffi.Pointer ctx, - int top, - ) { - return _duk_check_stack_top( - ctx, - top, - ); + int duk_check_stack_top(ffi.Pointer ctx, int top) { + return _duk_check_stack_top(ctx, top); } late final _duk_check_stack_topPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_check_stack_top'); - late final _duk_check_stack_top = _duk_check_stack_topPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_check_stack_top'); + late final _duk_check_stack_top = + _duk_check_stack_topPtr + .asFunction, int)>(); - void duk_require_stack_top( - ffi.Pointer ctx, - int top, - ) { - return _duk_require_stack_top( - ctx, - top, - ); + void duk_require_stack_top(ffi.Pointer ctx, int top) { + return _duk_require_stack_top(ctx, top); } late final _duk_require_stack_topPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_stack_top'); - late final _duk_require_stack_top = _duk_require_stack_topPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_stack_top'); + late final _duk_require_stack_top = + _duk_require_stack_topPtr + .asFunction, int)>(); /// Stack manipulation (other than push/pop) - void duk_swap( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_swap( - ctx, - idx1, - idx2, - ); + void duk_swap(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_swap(ctx, idx1, idx2); } late final _duk_swapPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t, duk_idx_t)>>('duk_swap'); - late final _duk_swap = _duk_swapPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_swap'); + late final _duk_swap = + _duk_swapPtr + .asFunction, int, int)>(); - void duk_swap_top( - ffi.Pointer ctx, - int idx, - ) { - return _duk_swap_top( - ctx, - idx, - ); + void duk_swap_top(ffi.Pointer ctx, int idx) { + return _duk_swap_top(ctx, idx); } late final _duk_swap_topPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_swap_top'); - late final _duk_swap_top = _duk_swap_topPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_swap_top'); + late final _duk_swap_top = + _duk_swap_topPtr + .asFunction, int)>(); - void duk_dup( - ffi.Pointer ctx, - int from_idx, - ) { - return _duk_dup( - ctx, - from_idx, - ); + void duk_dup(ffi.Pointer ctx, int from_idx) { + return _duk_dup(ctx, from_idx); } late final _duk_dupPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_dup'); + ffi.NativeFunction, duk_idx_t)> + >('duk_dup'); late final _duk_dup = _duk_dupPtr.asFunction, int)>(); - void duk_dup_top( - ffi.Pointer ctx, - ) { - return _duk_dup_top( - ctx, - ); + void duk_dup_top(ffi.Pointer ctx) { + return _duk_dup_top(ctx); } late final _duk_dup_topPtr = _lookup)>>( - 'duk_dup_top'); + 'duk_dup_top', + ); late final _duk_dup_top = _duk_dup_topPtr.asFunction)>(); - void duk_insert( - ffi.Pointer ctx, - int to_idx, - ) { - return _duk_insert( - ctx, - to_idx, - ); + void duk_insert(ffi.Pointer ctx, int to_idx) { + return _duk_insert(ctx, to_idx); } late final _duk_insertPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_insert'); + ffi.NativeFunction, duk_idx_t)> + >('duk_insert'); late final _duk_insert = _duk_insertPtr.asFunction, int)>(); - void duk_pull( - ffi.Pointer ctx, - int from_idx, - ) { - return _duk_pull( - ctx, - from_idx, - ); + void duk_pull(ffi.Pointer ctx, int from_idx) { + return _duk_pull(ctx, from_idx); } late final _duk_pullPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_pull'); + ffi.NativeFunction, duk_idx_t)> + >('duk_pull'); late final _duk_pull = _duk_pullPtr.asFunction, int)>(); - void duk_replace( - ffi.Pointer ctx, - int to_idx, - ) { - return _duk_replace( - ctx, - to_idx, - ); + void duk_replace(ffi.Pointer ctx, int to_idx) { + return _duk_replace(ctx, to_idx); } late final _duk_replacePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_replace'); - late final _duk_replace = _duk_replacePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_replace'); + late final _duk_replace = + _duk_replacePtr + .asFunction, int)>(); - void duk_copy( - ffi.Pointer ctx, - int from_idx, - int to_idx, - ) { - return _duk_copy( - ctx, - from_idx, - to_idx, - ); + void duk_copy(ffi.Pointer ctx, int from_idx, int to_idx) { + return _duk_copy(ctx, from_idx, to_idx); } late final _duk_copyPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t, duk_idx_t)>>('duk_copy'); - late final _duk_copy = _duk_copyPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_copy'); + late final _duk_copy = + _duk_copyPtr + .asFunction, int, int)>(); - void duk_remove( - ffi.Pointer ctx, - int idx, - ) { - return _duk_remove( - ctx, - idx, - ); + void duk_remove(ffi.Pointer ctx, int idx) { + return _duk_remove(ctx, idx); } late final _duk_removePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_remove'); + ffi.NativeFunction, duk_idx_t)> + >('duk_remove'); late final _duk_remove = _duk_removePtr.asFunction, int)>(); @@ -734,21 +639,29 @@ class DuktapeBindings { int count, int is_copy, ) { - return _duk_xcopymove_raw( - to_ctx, - from_ctx, - count, - is_copy, - ); + return _duk_xcopymove_raw(to_ctx, from_ctx, count, is_copy); } late final _duk_xcopymove_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - duk_idx_t, duk_bool_t)>>('duk_xcopymove_raw'); - late final _duk_xcopymove_raw = _duk_xcopymove_rawPtr.asFunction< - void Function( - ffi.Pointer, ffi.Pointer, int, int)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + duk_idx_t, + duk_bool_t, + ) + > + >('duk_xcopymove_raw'); + late final _duk_xcopymove_raw = + _duk_xcopymove_rawPtr + .asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + int, + int, + ) + >(); /// Push operations /// @@ -756,446 +669,417 @@ class DuktapeBindings { /// position of the pushed value for convenience. /// /// Note: duk_dup() is technically a push. - void duk_push_undefined( - ffi.Pointer ctx, - ) { - return _duk_push_undefined( - ctx, - ); + void duk_push_undefined(ffi.Pointer ctx) { + return _duk_push_undefined(ctx); } late final _duk_push_undefinedPtr = _lookup)>>( - 'duk_push_undefined'); - late final _duk_push_undefined = _duk_push_undefinedPtr - .asFunction)>(); + 'duk_push_undefined', + ); + late final _duk_push_undefined = + _duk_push_undefinedPtr + .asFunction)>(); - void duk_push_null( - ffi.Pointer ctx, - ) { - return _duk_push_null( - ctx, - ); + void duk_push_null(ffi.Pointer ctx) { + return _duk_push_null(ctx); } late final _duk_push_nullPtr = _lookup)>>( - 'duk_push_null'); + 'duk_push_null', + ); late final _duk_push_null = _duk_push_nullPtr.asFunction)>(); - void duk_push_boolean( - ffi.Pointer ctx, - int val, - ) { - return _duk_push_boolean( - ctx, - val, - ); + void duk_push_boolean(ffi.Pointer ctx, int val) { + return _duk_push_boolean(ctx, val); } late final _duk_push_booleanPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_bool_t)>>('duk_push_boolean'); - late final _duk_push_boolean = _duk_push_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_bool_t)> + >('duk_push_boolean'); + late final _duk_push_boolean = + _duk_push_booleanPtr + .asFunction, int)>(); - void duk_push_true( - ffi.Pointer ctx, - ) { - return _duk_push_true( - ctx, - ); + void duk_push_true(ffi.Pointer ctx) { + return _duk_push_true(ctx); } late final _duk_push_truePtr = _lookup)>>( - 'duk_push_true'); + 'duk_push_true', + ); late final _duk_push_true = _duk_push_truePtr.asFunction)>(); - void duk_push_false( - ffi.Pointer ctx, - ) { - return _duk_push_false( - ctx, - ); + void duk_push_false(ffi.Pointer ctx) { + return _duk_push_false(ctx); } late final _duk_push_falsePtr = _lookup)>>( - 'duk_push_false'); + 'duk_push_false', + ); late final _duk_push_false = _duk_push_falsePtr.asFunction)>(); - void duk_push_number( - ffi.Pointer ctx, - double val, - ) { - return _duk_push_number( - ctx, - val, - ); + void duk_push_number(ffi.Pointer ctx, double val) { + return _duk_push_number(ctx, val); } late final _duk_push_numberPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_double_t)>>('duk_push_number'); - late final _duk_push_number = _duk_push_numberPtr - .asFunction, double)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_double_t) + > + >('duk_push_number'); + late final _duk_push_number = + _duk_push_numberPtr + .asFunction, double)>(); - void duk_push_nan( - ffi.Pointer ctx, - ) { - return _duk_push_nan( - ctx, - ); + void duk_push_nan(ffi.Pointer ctx) { + return _duk_push_nan(ctx); } late final _duk_push_nanPtr = _lookup)>>( - 'duk_push_nan'); + 'duk_push_nan', + ); late final _duk_push_nan = _duk_push_nanPtr.asFunction)>(); - void duk_push_int( - ffi.Pointer ctx, - int val, - ) { - return _duk_push_int( - ctx, - val, - ); + void duk_push_int(ffi.Pointer ctx, int val) { + return _duk_push_int(ctx, val); } late final _duk_push_intPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_int_t)>>('duk_push_int'); - late final _duk_push_int = _duk_push_intPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_int_t)> + >('duk_push_int'); + late final _duk_push_int = + _duk_push_intPtr + .asFunction, int)>(); - void duk_push_uint( - ffi.Pointer ctx, - int val, - ) { - return _duk_push_uint( - ctx, - val, - ); + void duk_push_uint(ffi.Pointer ctx, int val) { + return _duk_push_uint(ctx, val); } late final _duk_push_uintPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_uint_t)>>('duk_push_uint'); - late final _duk_push_uint = _duk_push_uintPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_uint_t)> + >('duk_push_uint'); + late final _duk_push_uint = + _duk_push_uintPtr + .asFunction, int)>(); ffi.Pointer duk_push_string( ffi.Pointer ctx, ffi.Pointer str, ) { - return _duk_push_string( - ctx, - str, - ); + return _duk_push_string(ctx, str); } late final _duk_push_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_string'); - late final _duk_push_string = _duk_push_stringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, + ffi.Pointer, + ) + > + >('duk_push_string'); + late final _duk_push_string = + _duk_push_stringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); ffi.Pointer duk_push_lstring( ffi.Pointer ctx, ffi.Pointer str, int len, ) { - return _duk_push_lstring( - ctx, - str, - len, - ); + return _duk_push_lstring(ctx, str, len); } late final _duk_push_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, duk_size_t)>>('duk_push_lstring'); - late final _duk_push_lstring = _duk_push_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_push_lstring'); + late final _duk_push_lstring = + _duk_push_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); - void duk_push_pointer( - ffi.Pointer ctx, - ffi.Pointer p, - ) { - return _duk_push_pointer( - ctx, - p, - ); + void duk_push_pointer(ffi.Pointer ctx, ffi.Pointer p) { + return _duk_push_pointer(ctx, p); } late final _duk_push_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_pointer'); - late final _duk_push_pointer = _duk_push_pointerPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_push_pointer'); + late final _duk_push_pointer = + _duk_push_pointerPtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); ffi.Pointer duk_push_sprintf( ffi.Pointer ctx, ffi.Pointer fmt, ) { - return _duk_push_sprintf( - ctx, - fmt, - ); + return _duk_push_sprintf(ctx, fmt); } late final _duk_push_sprintfPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_sprintf'); - late final _duk_push_sprintf = _duk_push_sprintfPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, + ffi.Pointer, + ) + > + >('duk_push_sprintf'); + late final _duk_push_sprintf = + _duk_push_sprintfPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); ffi.Pointer duk_push_vsprintf( ffi.Pointer ctx, ffi.Pointer fmt, va_list ap, ) { - return _duk_push_vsprintf( - ctx, - fmt, - ap, - ); + return _duk_push_vsprintf(ctx, fmt, ap); } late final _duk_push_vsprintfPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, va_list)>>('duk_push_vsprintf'); - late final _duk_push_vsprintf = _duk_push_vsprintfPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, va_list)>(); + ffi.Pointer, + ffi.Pointer, + va_list, + ) + > + >('duk_push_vsprintf'); + late final _duk_push_vsprintf = + _duk_push_vsprintfPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + va_list, + ) + >(); ffi.Pointer duk_push_literal_raw( ffi.Pointer ctx, ffi.Pointer str, int len, ) { - return _duk_push_literal_raw( - ctx, - str, - len, - ); + return _duk_push_literal_raw(ctx, str, len); } late final _duk_push_literal_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, duk_size_t)>>('duk_push_literal_raw'); - late final _duk_push_literal_raw = _duk_push_literal_rawPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_push_literal_raw'); + late final _duk_push_literal_raw = + _duk_push_literal_rawPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); - void duk_push_this( - ffi.Pointer ctx, - ) { - return _duk_push_this( - ctx, - ); + void duk_push_this(ffi.Pointer ctx) { + return _duk_push_this(ctx); } late final _duk_push_thisPtr = _lookup)>>( - 'duk_push_this'); + 'duk_push_this', + ); late final _duk_push_this = _duk_push_thisPtr.asFunction)>(); - void duk_push_new_target( - ffi.Pointer ctx, - ) { - return _duk_push_new_target( - ctx, - ); + void duk_push_new_target(ffi.Pointer ctx) { + return _duk_push_new_target(ctx); } late final _duk_push_new_targetPtr = _lookup)>>( - 'duk_push_new_target'); - late final _duk_push_new_target = _duk_push_new_targetPtr - .asFunction)>(); + 'duk_push_new_target', + ); + late final _duk_push_new_target = + _duk_push_new_targetPtr + .asFunction)>(); - void duk_push_current_function( - ffi.Pointer ctx, - ) { - return _duk_push_current_function( - ctx, - ); + void duk_push_current_function(ffi.Pointer ctx) { + return _duk_push_current_function(ctx); } late final _duk_push_current_functionPtr = _lookup)>>( - 'duk_push_current_function'); - late final _duk_push_current_function = _duk_push_current_functionPtr - .asFunction)>(); + 'duk_push_current_function', + ); + late final _duk_push_current_function = + _duk_push_current_functionPtr + .asFunction)>(); - void duk_push_current_thread( - ffi.Pointer ctx, - ) { - return _duk_push_current_thread( - ctx, - ); + void duk_push_current_thread(ffi.Pointer ctx) { + return _duk_push_current_thread(ctx); } late final _duk_push_current_threadPtr = _lookup)>>( - 'duk_push_current_thread'); - late final _duk_push_current_thread = _duk_push_current_threadPtr - .asFunction)>(); + 'duk_push_current_thread', + ); + late final _duk_push_current_thread = + _duk_push_current_threadPtr + .asFunction)>(); - void duk_push_global_object( - ffi.Pointer ctx, - ) { - return _duk_push_global_object( - ctx, - ); + void duk_push_global_object(ffi.Pointer ctx) { + return _duk_push_global_object(ctx); } late final _duk_push_global_objectPtr = _lookup)>>( - 'duk_push_global_object'); - late final _duk_push_global_object = _duk_push_global_objectPtr - .asFunction)>(); + 'duk_push_global_object', + ); + late final _duk_push_global_object = + _duk_push_global_objectPtr + .asFunction)>(); - void duk_push_heap_stash( - ffi.Pointer ctx, - ) { - return _duk_push_heap_stash( - ctx, - ); + void duk_push_heap_stash(ffi.Pointer ctx) { + return _duk_push_heap_stash(ctx); } late final _duk_push_heap_stashPtr = _lookup)>>( - 'duk_push_heap_stash'); - late final _duk_push_heap_stash = _duk_push_heap_stashPtr - .asFunction)>(); + 'duk_push_heap_stash', + ); + late final _duk_push_heap_stash = + _duk_push_heap_stashPtr + .asFunction)>(); - void duk_push_global_stash( - ffi.Pointer ctx, - ) { - return _duk_push_global_stash( - ctx, - ); + void duk_push_global_stash(ffi.Pointer ctx) { + return _duk_push_global_stash(ctx); } late final _duk_push_global_stashPtr = _lookup)>>( - 'duk_push_global_stash'); - late final _duk_push_global_stash = _duk_push_global_stashPtr - .asFunction)>(); + 'duk_push_global_stash', + ); + late final _duk_push_global_stash = + _duk_push_global_stashPtr + .asFunction)>(); void duk_push_thread_stash( ffi.Pointer ctx, ffi.Pointer target_ctx, ) { - return _duk_push_thread_stash( - ctx, - target_ctx, - ); + return _duk_push_thread_stash(ctx, target_ctx); } late final _duk_push_thread_stashPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_thread_stash'); - late final _duk_push_thread_stash = _duk_push_thread_stashPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_push_thread_stash'); + late final _duk_push_thread_stash = + _duk_push_thread_stashPtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); - int duk_push_object( - ffi.Pointer ctx, - ) { - return _duk_push_object( - ctx, - ); + int duk_push_object(ffi.Pointer ctx) { + return _duk_push_object(ctx); } late final _duk_push_objectPtr = _lookup)>>( - 'duk_push_object'); + 'duk_push_object', + ); late final _duk_push_object = _duk_push_objectPtr.asFunction)>(); - int duk_push_bare_object( - ffi.Pointer ctx, - ) { - return _duk_push_bare_object( - ctx, - ); + int duk_push_bare_object(ffi.Pointer ctx) { + return _duk_push_bare_object(ctx); } late final _duk_push_bare_objectPtr = _lookup)>>( - 'duk_push_bare_object'); - late final _duk_push_bare_object = _duk_push_bare_objectPtr - .asFunction)>(); + 'duk_push_bare_object', + ); + late final _duk_push_bare_object = + _duk_push_bare_objectPtr + .asFunction)>(); - int duk_push_array( - ffi.Pointer ctx, - ) { - return _duk_push_array( - ctx, - ); + int duk_push_array(ffi.Pointer ctx) { + return _duk_push_array(ctx); } late final _duk_push_arrayPtr = _lookup)>>( - 'duk_push_array'); + 'duk_push_array', + ); late final _duk_push_array = _duk_push_arrayPtr.asFunction)>(); - int duk_push_bare_array( - ffi.Pointer ctx, - ) { - return _duk_push_bare_array( - ctx, - ); + int duk_push_bare_array(ffi.Pointer ctx) { + return _duk_push_bare_array(ctx); } late final _duk_push_bare_arrayPtr = _lookup)>>( - 'duk_push_bare_array'); - late final _duk_push_bare_array = _duk_push_bare_arrayPtr - .asFunction)>(); + 'duk_push_bare_array', + ); + late final _duk_push_bare_array = + _duk_push_bare_arrayPtr + .asFunction)>(); int duk_push_c_function( ffi.Pointer ctx, duk_c_function func, int nargs, ) { - return _duk_push_c_function( - ctx, - func, - nargs, - ); + return _duk_push_c_function(ctx, func, nargs); } late final _duk_push_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function(ffi.Pointer, duk_c_function, - duk_idx_t)>>('duk_push_c_function'); - late final _duk_push_c_function = _duk_push_c_functionPtr.asFunction< - int Function(ffi.Pointer, duk_c_function, int)>(); + ffi.NativeFunction< + duk_idx_t Function(ffi.Pointer, duk_c_function, duk_idx_t) + > + >('duk_push_c_function'); + late final _duk_push_c_function = + _duk_push_c_functionPtr + .asFunction< + int Function(ffi.Pointer, duk_c_function, int) + >(); int duk_push_c_lightfunc( ffi.Pointer ctx, @@ -1204,55 +1088,53 @@ class DuktapeBindings { int length, int magic, ) { - return _duk_push_c_lightfunc( - ctx, - func, - nargs, - length, - magic, - ); + return _duk_push_c_lightfunc(ctx, func, nargs, length, magic); } late final _duk_push_c_lightfuncPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function(ffi.Pointer, duk_c_function, - duk_idx_t, duk_idx_t, duk_int_t)>>('duk_push_c_lightfunc'); - late final _duk_push_c_lightfunc = _duk_push_c_lightfuncPtr.asFunction< - int Function(ffi.Pointer, duk_c_function, int, int, int)>(); + ffi.NativeFunction< + duk_idx_t Function( + ffi.Pointer, + duk_c_function, + duk_idx_t, + duk_idx_t, + duk_int_t, + ) + > + >('duk_push_c_lightfunc'); + late final _duk_push_c_lightfunc = + _duk_push_c_lightfuncPtr + .asFunction< + int Function( + ffi.Pointer, + duk_c_function, + int, + int, + int, + ) + >(); - int duk_push_thread_raw( - ffi.Pointer ctx, - int flags, - ) { - return _duk_push_thread_raw( - ctx, - flags, - ); + int duk_push_thread_raw(ffi.Pointer ctx, int flags) { + return _duk_push_thread_raw(ctx, flags); } late final _duk_push_thread_rawPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( - ffi.Pointer, duk_uint_t)>>('duk_push_thread_raw'); - late final _duk_push_thread_raw = _duk_push_thread_rawPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_uint_t)> + >('duk_push_thread_raw'); + late final _duk_push_thread_raw = + _duk_push_thread_rawPtr + .asFunction, int)>(); - int duk_push_proxy( - ffi.Pointer ctx, - int proxy_flags, - ) { - return _duk_push_proxy( - ctx, - proxy_flags, - ); + int duk_push_proxy(ffi.Pointer ctx, int proxy_flags) { + return _duk_push_proxy(ctx, proxy_flags); } late final _duk_push_proxyPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( - ffi.Pointer, duk_uint_t)>>('duk_push_proxy'); - late final _duk_push_proxy = _duk_push_proxyPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_uint_t)> + >('duk_push_proxy'); + late final _duk_push_proxy = + _duk_push_proxyPtr + .asFunction, int)>(); int duk_push_error_object_raw( ffi.Pointer ctx, @@ -1261,27 +1143,31 @@ class DuktapeBindings { int line, ffi.Pointer fmt, ) { - return _duk_push_error_object_raw( - ctx, - err_code, - filename, - line, - fmt, - ); + return _duk_push_error_object_raw(ctx, err_code, filename, line, fmt); } late final _duk_push_error_object_rawPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( + ffi.NativeFunction< + duk_idx_t Function( + ffi.Pointer, + duk_errcode_t, + ffi.Pointer, + duk_int_t, + ffi.Pointer, + ) + > + >('duk_push_error_object_raw'); + late final _duk_push_error_object_raw = + _duk_push_error_object_rawPtr + .asFunction< + int Function( ffi.Pointer, - duk_errcode_t, + int, ffi.Pointer, - duk_int_t, - ffi.Pointer)>>('duk_push_error_object_raw'); - late final _duk_push_error_object_raw = - _duk_push_error_object_rawPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer, - int, ffi.Pointer)>(); + int, + ffi.Pointer, + ) + >(); int duk_push_error_object_va_raw( ffi.Pointer ctx, @@ -1302,37 +1188,52 @@ class DuktapeBindings { } late final _duk_push_error_object_va_rawPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( + ffi.NativeFunction< + duk_idx_t Function( + ffi.Pointer, + duk_errcode_t, + ffi.Pointer, + duk_int_t, + ffi.Pointer, + va_list, + ) + > + >('duk_push_error_object_va_raw'); + late final _duk_push_error_object_va_raw = + _duk_push_error_object_va_rawPtr + .asFunction< + int Function( ffi.Pointer, - duk_errcode_t, + int, ffi.Pointer, - duk_int_t, + int, ffi.Pointer, - va_list)>>('duk_push_error_object_va_raw'); - late final _duk_push_error_object_va_raw = - _duk_push_error_object_va_rawPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer, - int, ffi.Pointer, va_list)>(); + va_list, + ) + >(); ffi.Pointer duk_push_buffer_raw( ffi.Pointer ctx, int size, int flags, ) { - return _duk_push_buffer_raw( - ctx, - size, - flags, - ); + return _duk_push_buffer_raw(ctx, size, flags); } late final _duk_push_buffer_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_size_t, - duk_small_uint_t)>>('duk_push_buffer_raw'); - late final _duk_push_buffer_raw = _duk_push_buffer_rawPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, int)>(); + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_size_t, + duk_small_uint_t, + ) + > + >('duk_push_buffer_raw'); + late final _duk_push_buffer_raw = + _duk_push_buffer_rawPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int, int) + >(); void duk_push_buffer_object( ffi.Pointer ctx, @@ -1351,85 +1252,81 @@ class DuktapeBindings { } late final _duk_push_buffer_objectPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, duk_size_t, - duk_size_t, duk_uint_t)>>('duk_push_buffer_object'); - late final _duk_push_buffer_object = _duk_push_buffer_objectPtr.asFunction< - void Function(ffi.Pointer, int, int, int, int)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + duk_size_t, + duk_size_t, + duk_uint_t, + ) + > + >('duk_push_buffer_object'); + late final _duk_push_buffer_object = + _duk_push_buffer_objectPtr + .asFunction< + void Function(ffi.Pointer, int, int, int, int) + >(); int duk_push_heapptr( ffi.Pointer ctx, ffi.Pointer ptr, ) { - return _duk_push_heapptr( - ctx, - ptr, - ); + return _duk_push_heapptr(ctx, ptr); } late final _duk_push_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_heapptr'); - late final _duk_push_heapptr = _duk_push_heapptrPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_idx_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_push_heapptr'); + late final _duk_push_heapptr = + _duk_push_heapptrPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); /// Pop operations - void duk_pop( - ffi.Pointer ctx, - ) { - return _duk_pop( - ctx, - ); + void duk_pop(ffi.Pointer ctx) { + return _duk_pop(ctx); } late final _duk_popPtr = _lookup)>>( - 'duk_pop'); + 'duk_pop', + ); late final _duk_pop = _duk_popPtr.asFunction)>(); - void duk_pop_n( - ffi.Pointer ctx, - int count, - ) { - return _duk_pop_n( - ctx, - count, - ); + void duk_pop_n(ffi.Pointer ctx, int count) { + return _duk_pop_n(ctx, count); } late final _duk_pop_nPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_pop_n'); + ffi.NativeFunction, duk_idx_t)> + >('duk_pop_n'); late final _duk_pop_n = _duk_pop_nPtr.asFunction, int)>(); - void duk_pop_2( - ffi.Pointer ctx, - ) { - return _duk_pop_2( - ctx, - ); + void duk_pop_2(ffi.Pointer ctx) { + return _duk_pop_2(ctx); } late final _duk_pop_2Ptr = _lookup)>>( - 'duk_pop_2'); + 'duk_pop_2', + ); late final _duk_pop_2 = _duk_pop_2Ptr.asFunction)>(); - void duk_pop_3( - ffi.Pointer ctx, - ) { - return _duk_pop_3( - ctx, - ); + void duk_pop_3(ffi.Pointer ctx) { + return _duk_pop_3(ctx); } late final _duk_pop_3Ptr = _lookup)>>( - 'duk_pop_3'); + 'duk_pop_3', + ); late final _duk_pop_3 = _duk_pop_3Ptr.asFunction)>(); @@ -1437,686 +1334,513 @@ class DuktapeBindings { /// /// duk_is_none(), which would indicate whether index it outside of stack, /// is not needed; duk_is_valid_index() gives the same information. - int duk_get_type( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_type( - ctx, - idx, - ); + int duk_get_type(ffi.Pointer ctx, int idx) { + return _duk_get_type(ctx, idx); } late final _duk_get_typePtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_type'); - late final _duk_get_type = _duk_get_typePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_type'); + late final _duk_get_type = + _duk_get_typePtr + .asFunction, int)>(); - int duk_check_type( - ffi.Pointer ctx, - int idx, - int type, - ) { - return _duk_check_type( - ctx, - idx, - type, - ); + int duk_check_type(ffi.Pointer ctx, int idx, int type) { + return _duk_check_type(ctx, idx, type); } late final _duk_check_typePtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_int_t)>>('duk_check_type'); - late final _duk_check_type = _duk_check_typePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_check_type'); + late final _duk_check_type = + _duk_check_typePtr + .asFunction, int, int)>(); - int duk_get_type_mask( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_type_mask( - ctx, - idx, - ); + int duk_get_type_mask(ffi.Pointer ctx, int idx) { + return _duk_get_type_mask(ctx, idx); } late final _duk_get_type_maskPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_type_mask'); - late final _duk_get_type_mask = _duk_get_type_maskPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_type_mask'); + late final _duk_get_type_mask = + _duk_get_type_maskPtr + .asFunction, int)>(); - int duk_check_type_mask( - ffi.Pointer ctx, - int idx, - int mask, - ) { - return _duk_check_type_mask( - ctx, - idx, - mask, - ); + int duk_check_type_mask(ffi.Pointer ctx, int idx, int mask) { + return _duk_check_type_mask(ctx, idx, mask); } late final _duk_check_type_maskPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_check_type_mask'); - late final _duk_check_type_mask = _duk_check_type_maskPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_check_type_mask'); + late final _duk_check_type_mask = + _duk_check_type_maskPtr + .asFunction, int, int)>(); - int duk_is_undefined( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_undefined( - ctx, - idx, - ); + int duk_is_undefined(ffi.Pointer ctx, int idx) { + return _duk_is_undefined(ctx, idx); } late final _duk_is_undefinedPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_undefined'); - late final _duk_is_undefined = _duk_is_undefinedPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_undefined'); + late final _duk_is_undefined = + _duk_is_undefinedPtr + .asFunction, int)>(); - int duk_is_null( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_null( - ctx, - idx, - ); + int duk_is_null(ffi.Pointer ctx, int idx) { + return _duk_is_null(ctx, idx); } late final _duk_is_nullPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_null'); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_null'); late final _duk_is_null = _duk_is_nullPtr.asFunction, int)>(); - int duk_is_boolean( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_boolean( - ctx, - idx, - ); + int duk_is_boolean(ffi.Pointer ctx, int idx) { + return _duk_is_boolean(ctx, idx); } late final _duk_is_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_boolean'); - late final _duk_is_boolean = _duk_is_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_boolean'); + late final _duk_is_boolean = + _duk_is_booleanPtr + .asFunction, int)>(); - int duk_is_number( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_number( - ctx, - idx, - ); + int duk_is_number(ffi.Pointer ctx, int idx) { + return _duk_is_number(ctx, idx); } late final _duk_is_numberPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_number'); - late final _duk_is_number = _duk_is_numberPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_number'); + late final _duk_is_number = + _duk_is_numberPtr + .asFunction, int)>(); - int duk_is_nan( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_nan( - ctx, - idx, - ); + int duk_is_nan(ffi.Pointer ctx, int idx) { + return _duk_is_nan(ctx, idx); } late final _duk_is_nanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_nan'); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_nan'); late final _duk_is_nan = _duk_is_nanPtr.asFunction, int)>(); - int duk_is_string( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_string( - ctx, - idx, - ); + int duk_is_string(ffi.Pointer ctx, int idx) { + return _duk_is_string(ctx, idx); } late final _duk_is_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_string'); - late final _duk_is_string = _duk_is_stringPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_string'); + late final _duk_is_string = + _duk_is_stringPtr + .asFunction, int)>(); - int duk_is_object( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_object( - ctx, - idx, - ); + int duk_is_object(ffi.Pointer ctx, int idx) { + return _duk_is_object(ctx, idx); } late final _duk_is_objectPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_object'); - late final _duk_is_object = _duk_is_objectPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_object'); + late final _duk_is_object = + _duk_is_objectPtr + .asFunction, int)>(); - int duk_is_buffer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_buffer( - ctx, - idx, - ); + int duk_is_buffer(ffi.Pointer ctx, int idx) { + return _duk_is_buffer(ctx, idx); } late final _duk_is_bufferPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_buffer'); - late final _duk_is_buffer = _duk_is_bufferPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_buffer'); + late final _duk_is_buffer = + _duk_is_bufferPtr + .asFunction, int)>(); - int duk_is_buffer_data( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_buffer_data( - ctx, - idx, - ); + int duk_is_buffer_data(ffi.Pointer ctx, int idx) { + return _duk_is_buffer_data(ctx, idx); } late final _duk_is_buffer_dataPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_buffer_data'); - late final _duk_is_buffer_data = _duk_is_buffer_dataPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_buffer_data'); + late final _duk_is_buffer_data = + _duk_is_buffer_dataPtr + .asFunction, int)>(); - int duk_is_pointer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_pointer( - ctx, - idx, - ); + int duk_is_pointer(ffi.Pointer ctx, int idx) { + return _duk_is_pointer(ctx, idx); } late final _duk_is_pointerPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_pointer'); - late final _duk_is_pointer = _duk_is_pointerPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_pointer'); + late final _duk_is_pointer = + _duk_is_pointerPtr + .asFunction, int)>(); - int duk_is_lightfunc( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_lightfunc( - ctx, - idx, - ); + int duk_is_lightfunc(ffi.Pointer ctx, int idx) { + return _duk_is_lightfunc(ctx, idx); } late final _duk_is_lightfuncPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_lightfunc'); - late final _duk_is_lightfunc = _duk_is_lightfuncPtr - .asFunction, int)>(); - - int duk_is_symbol( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_symbol( - ctx, - idx, - ); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_lightfunc'); + late final _duk_is_lightfunc = + _duk_is_lightfuncPtr + .asFunction, int)>(); + + int duk_is_symbol(ffi.Pointer ctx, int idx) { + return _duk_is_symbol(ctx, idx); } late final _duk_is_symbolPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_symbol'); - late final _duk_is_symbol = _duk_is_symbolPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_symbol'); + late final _duk_is_symbol = + _duk_is_symbolPtr + .asFunction, int)>(); - int duk_is_array( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_array( - ctx, - idx, - ); + int duk_is_array(ffi.Pointer ctx, int idx) { + return _duk_is_array(ctx, idx); } late final _duk_is_arrayPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_array'); - late final _duk_is_array = _duk_is_arrayPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_array'); + late final _duk_is_array = + _duk_is_arrayPtr + .asFunction, int)>(); - int duk_is_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_function( - ctx, - idx, - ); + int duk_is_function(ffi.Pointer ctx, int idx) { + return _duk_is_function(ctx, idx); } late final _duk_is_functionPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_function'); - late final _duk_is_function = _duk_is_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_function'); + late final _duk_is_function = + _duk_is_functionPtr + .asFunction, int)>(); - int duk_is_c_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_c_function( - ctx, - idx, - ); + int duk_is_c_function(ffi.Pointer ctx, int idx) { + return _duk_is_c_function(ctx, idx); } late final _duk_is_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_c_function'); - late final _duk_is_c_function = _duk_is_c_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_c_function'); + late final _duk_is_c_function = + _duk_is_c_functionPtr + .asFunction, int)>(); - int duk_is_ecmascript_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_ecmascript_function( - ctx, - idx, - ); + int duk_is_ecmascript_function(ffi.Pointer ctx, int idx) { + return _duk_is_ecmascript_function(ctx, idx); } late final _duk_is_ecmascript_functionPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - duk_idx_t)>>('duk_is_ecmascript_function'); - late final _duk_is_ecmascript_function = _duk_is_ecmascript_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_ecmascript_function'); + late final _duk_is_ecmascript_function = + _duk_is_ecmascript_functionPtr + .asFunction, int)>(); - int duk_is_bound_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_bound_function( - ctx, - idx, - ); + int duk_is_bound_function(ffi.Pointer ctx, int idx) { + return _duk_is_bound_function(ctx, idx); } late final _duk_is_bound_functionPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_bound_function'); - late final _duk_is_bound_function = _duk_is_bound_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_bound_function'); + late final _duk_is_bound_function = + _duk_is_bound_functionPtr + .asFunction, int)>(); - int duk_is_thread( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_thread( - ctx, - idx, - ); + int duk_is_thread(ffi.Pointer ctx, int idx) { + return _duk_is_thread(ctx, idx); } late final _duk_is_threadPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_thread'); - late final _duk_is_thread = _duk_is_threadPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_thread'); + late final _duk_is_thread = + _duk_is_threadPtr + .asFunction, int)>(); - int duk_is_constructable( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_constructable( - ctx, - idx, - ); + int duk_is_constructable(ffi.Pointer ctx, int idx) { + return _duk_is_constructable(ctx, idx); } late final _duk_is_constructablePtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_constructable'); - late final _duk_is_constructable = _duk_is_constructablePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_constructable'); + late final _duk_is_constructable = + _duk_is_constructablePtr + .asFunction, int)>(); - int duk_is_dynamic_buffer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_dynamic_buffer( - ctx, - idx, - ); + int duk_is_dynamic_buffer(ffi.Pointer ctx, int idx) { + return _duk_is_dynamic_buffer(ctx, idx); } late final _duk_is_dynamic_bufferPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_dynamic_buffer'); - late final _duk_is_dynamic_buffer = _duk_is_dynamic_bufferPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_dynamic_buffer'); + late final _duk_is_dynamic_buffer = + _duk_is_dynamic_bufferPtr + .asFunction, int)>(); - int duk_is_fixed_buffer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_fixed_buffer( - ctx, - idx, - ); + int duk_is_fixed_buffer(ffi.Pointer ctx, int idx) { + return _duk_is_fixed_buffer(ctx, idx); } late final _duk_is_fixed_bufferPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_fixed_buffer'); - late final _duk_is_fixed_buffer = _duk_is_fixed_bufferPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_fixed_buffer'); + late final _duk_is_fixed_buffer = + _duk_is_fixed_bufferPtr + .asFunction, int)>(); - int duk_is_external_buffer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_external_buffer( - ctx, - idx, - ); + int duk_is_external_buffer(ffi.Pointer ctx, int idx) { + return _duk_is_external_buffer(ctx, idx); } late final _duk_is_external_bufferPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_external_buffer'); - late final _duk_is_external_buffer = _duk_is_external_bufferPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_external_buffer'); + late final _duk_is_external_buffer = + _duk_is_external_bufferPtr + .asFunction, int)>(); - int duk_get_error_code( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_error_code( - ctx, - idx, - ); + int duk_get_error_code(ffi.Pointer ctx, int idx) { + return _duk_get_error_code(ctx, idx); } late final _duk_get_error_codePtr = _lookup< - ffi.NativeFunction< - duk_errcode_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_error_code'); - late final _duk_get_error_code = _duk_get_error_codePtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_errcode_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_error_code'); + late final _duk_get_error_code = + _duk_get_error_codePtr + .asFunction, int)>(); /// Get operations: no coercion, returns default value for invalid /// indices and invalid value types. /// /// duk_get_undefined() and duk_get_null() would be pointless and /// are not included. - int duk_get_boolean( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_boolean( - ctx, - idx, - ); + int duk_get_boolean(ffi.Pointer ctx, int idx) { + return _duk_get_boolean(ctx, idx); } late final _duk_get_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_boolean'); - late final _duk_get_boolean = _duk_get_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_boolean'); + late final _duk_get_boolean = + _duk_get_booleanPtr + .asFunction, int)>(); - double duk_get_number( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_number( - ctx, - idx, - ); + double duk_get_number(ffi.Pointer ctx, int idx) { + return _duk_get_number(ctx, idx); } late final _duk_get_numberPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_number'); - late final _duk_get_number = _duk_get_numberPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_number'); + late final _duk_get_number = + _duk_get_numberPtr + .asFunction, int)>(); - int duk_get_int( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_int( - ctx, - idx, - ); + int duk_get_int(ffi.Pointer ctx, int idx) { + return _duk_get_int(ctx, idx); } late final _duk_get_intPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_int'); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_int'); late final _duk_get_int = _duk_get_intPtr.asFunction, int)>(); - int duk_get_uint( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_uint( - ctx, - idx, - ); + int duk_get_uint(ffi.Pointer ctx, int idx) { + return _duk_get_uint(ctx, idx); } late final _duk_get_uintPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_uint'); - late final _duk_get_uint = _duk_get_uintPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_uint'); + late final _duk_get_uint = + _duk_get_uintPtr + .asFunction, int)>(); - ffi.Pointer duk_get_string( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_string( - ctx, - idx, - ); + ffi.Pointer duk_get_string(ffi.Pointer ctx, int idx) { + return _duk_get_string(ctx, idx); } late final _duk_get_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_get_string'); - late final _duk_get_string = _duk_get_stringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_string'); + late final _duk_get_string = + _duk_get_stringPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); ffi.Pointer duk_get_lstring( ffi.Pointer ctx, int idx, ffi.Pointer out_len, ) { - return _duk_get_lstring( - ctx, - idx, - out_len, - ); + return _duk_get_lstring(ctx, idx, out_len); } late final _duk_get_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_lstring'); - late final _duk_get_lstring = _duk_get_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_lstring'); + late final _duk_get_lstring = + _duk_get_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_get_buffer( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_get_buffer( - ctx, - idx, - out_size, - ); + return _duk_get_buffer(ctx, idx, out_size); } late final _duk_get_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_buffer'); - late final _duk_get_buffer = _duk_get_bufferPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_buffer'); + late final _duk_get_buffer = + _duk_get_bufferPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_get_buffer_data( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_get_buffer_data( - ctx, - idx, - out_size, - ); + return _duk_get_buffer_data(ctx, idx, out_size); } late final _duk_get_buffer_dataPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_buffer_data'); - late final _duk_get_buffer_data = _duk_get_buffer_dataPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_buffer_data'); + late final _duk_get_buffer_data = + _duk_get_buffer_dataPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); - ffi.Pointer duk_get_pointer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_pointer( - ctx, - idx, - ); + ffi.Pointer duk_get_pointer(ffi.Pointer ctx, int idx) { + return _duk_get_pointer(ctx, idx); } late final _duk_get_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_get_pointer'); - late final _duk_get_pointer = _duk_get_pointerPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_pointer'); + late final _duk_get_pointer = + _duk_get_pointerPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - duk_c_function duk_get_c_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_c_function( - ctx, - idx, - ); + duk_c_function duk_get_c_function(ffi.Pointer ctx, int idx) { + return _duk_get_c_function(ctx, idx); } late final _duk_get_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_c_function Function( - ffi.Pointer, duk_idx_t)>>('duk_get_c_function'); - late final _duk_get_c_function = _duk_get_c_functionPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_c_function Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_c_function'); + late final _duk_get_c_function = + _duk_get_c_functionPtr + .asFunction, int)>(); ffi.Pointer duk_get_context( ffi.Pointer ctx, int idx, ) { - return _duk_get_context( - ctx, - idx, - ); + return _duk_get_context(ctx, idx); } late final _duk_get_contextPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_get_context'); - late final _duk_get_context = _duk_get_contextPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_context'); + late final _duk_get_context = + _duk_get_contextPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - ffi.Pointer duk_get_heapptr( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_heapptr( - ctx, - idx, - ); + ffi.Pointer duk_get_heapptr(ffi.Pointer ctx, int idx) { + return _duk_get_heapptr(ctx, idx); } late final _duk_get_heapptrPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_get_heapptr'); - late final _duk_get_heapptr = _duk_get_heapptrPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_heapptr'); + late final _duk_get_heapptr = + _duk_get_heapptrPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); /// Get-with-explicit default operations: like get operations but with an /// explicit default value. @@ -2125,96 +1849,95 @@ class DuktapeBindings { int idx, int def_value, ) { - return _duk_get_boolean_default( - ctx, - idx, - def_value, - ); + return _duk_get_boolean_default(ctx, idx, def_value); } late final _duk_get_boolean_defaultPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_bool_t)>>('duk_get_boolean_default'); - late final _duk_get_boolean_default = _duk_get_boolean_defaultPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_bool_t) + > + >('duk_get_boolean_default'); + late final _duk_get_boolean_default = + _duk_get_boolean_defaultPtr + .asFunction, int, int)>(); double duk_get_number_default( ffi.Pointer ctx, int idx, double def_value, ) { - return _duk_get_number_default( - ctx, - idx, - def_value, - ); + return _duk_get_number_default(ctx, idx, def_value); } late final _duk_get_number_defaultPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function(ffi.Pointer, duk_idx_t, - duk_double_t)>>('duk_get_number_default'); - late final _duk_get_number_default = _duk_get_number_defaultPtr - .asFunction, int, double)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t, duk_double_t) + > + >('duk_get_number_default'); + late final _duk_get_number_default = + _duk_get_number_defaultPtr + .asFunction, int, double)>(); int duk_get_int_default( ffi.Pointer ctx, int idx, int def_value, ) { - return _duk_get_int_default( - ctx, - idx, - def_value, - ); + return _duk_get_int_default(ctx, idx, def_value); } late final _duk_get_int_defaultPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, duk_idx_t, - duk_int_t)>>('duk_get_int_default'); - late final _duk_get_int_default = _duk_get_int_defaultPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_int_t Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_get_int_default'); + late final _duk_get_int_default = + _duk_get_int_defaultPtr + .asFunction, int, int)>(); int duk_get_uint_default( ffi.Pointer ctx, int idx, int def_value, ) { - return _duk_get_uint_default( - ctx, - idx, - def_value, - ); + return _duk_get_uint_default(ctx, idx, def_value); } late final _duk_get_uint_defaultPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_get_uint_default'); - late final _duk_get_uint_default = _duk_get_uint_defaultPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_uint_t Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_get_uint_default'); + late final _duk_get_uint_default = + _duk_get_uint_defaultPtr + .asFunction, int, int)>(); ffi.Pointer duk_get_string_default( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_get_string_default( - ctx, - idx, - def_value, - ); + return _duk_get_string_default(ctx, idx, def_value); } late final _duk_get_string_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_string_default'); - late final _duk_get_string_default = _duk_get_string_defaultPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_string_default'); + late final _duk_get_string_default = + _duk_get_string_defaultPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_get_lstring_default( ffi.Pointer ctx, @@ -2223,26 +1946,31 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_len, ) { - return _duk_get_lstring_default( - ctx, - idx, - out_len, - def_ptr, - def_len, - ); + return _duk_get_lstring_default(ctx, idx, out_len, def_ptr, def_len); } late final _duk_get_lstring_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_lstring_default'); + late final _duk_get_lstring_default = + _duk_get_lstring_defaultPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_lstring_default'); - late final _duk_get_lstring_default = _duk_get_lstring_defaultPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_get_buffer_default( ffi.Pointer ctx, @@ -2251,26 +1979,31 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_len, ) { - return _duk_get_buffer_default( - ctx, - idx, - out_size, - def_ptr, - def_len, - ); + return _duk_get_buffer_default(ctx, idx, out_size, def_ptr, def_len); } late final _duk_get_buffer_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_buffer_default'); + late final _duk_get_buffer_default = + _duk_get_buffer_defaultPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_buffer_default'); - late final _duk_get_buffer_default = _duk_get_buffer_defaultPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_get_buffer_data_default( ffi.Pointer ctx, @@ -2279,207 +2012,225 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_len, ) { - return _duk_get_buffer_data_default( - ctx, - idx, - out_size, - def_ptr, - def_len, - ); + return _duk_get_buffer_data_default(ctx, idx, out_size, def_ptr, def_len); } late final _duk_get_buffer_data_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_buffer_data_default'); + late final _duk_get_buffer_data_default = + _duk_get_buffer_data_defaultPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_buffer_data_default'); - late final _duk_get_buffer_data_default = - _duk_get_buffer_data_defaultPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_get_pointer_default( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_get_pointer_default( - ctx, - idx, - def_value, - ); + return _duk_get_pointer_default(ctx, idx, def_value); } late final _duk_get_pointer_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_pointer_default'); - late final _duk_get_pointer_default = _duk_get_pointer_defaultPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_pointer_default'); + late final _duk_get_pointer_default = + _duk_get_pointer_defaultPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); duk_c_function duk_get_c_function_default( ffi.Pointer ctx, int idx, duk_c_function def_value, ) { - return _duk_get_c_function_default( - ctx, - idx, - def_value, - ); + return _duk_get_c_function_default(ctx, idx, def_value); } late final _duk_get_c_function_defaultPtr = _lookup< - ffi.NativeFunction< - duk_c_function Function(ffi.Pointer, duk_idx_t, - duk_c_function)>>('duk_get_c_function_default'); + ffi.NativeFunction< + duk_c_function Function( + ffi.Pointer, + duk_idx_t, + duk_c_function, + ) + > + >('duk_get_c_function_default'); late final _duk_get_c_function_default = - _duk_get_c_function_defaultPtr.asFunction< - duk_c_function Function( - ffi.Pointer, int, duk_c_function)>(); + _duk_get_c_function_defaultPtr + .asFunction< + duk_c_function Function( + ffi.Pointer, + int, + duk_c_function, + ) + >(); ffi.Pointer duk_get_context_default( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_get_context_default( - ctx, - idx, - def_value, - ); + return _duk_get_context_default(ctx, idx, def_value); } late final _duk_get_context_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_context_default'); - late final _duk_get_context_default = _duk_get_context_defaultPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_context_default'); + late final _duk_get_context_default = + _duk_get_context_defaultPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_get_heapptr_default( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_get_heapptr_default( - ctx, - idx, - def_value, - ); + return _duk_get_heapptr_default(ctx, idx, def_value); } late final _duk_get_heapptr_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_heapptr_default'); - late final _duk_get_heapptr_default = _duk_get_heapptr_defaultPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_heapptr_default'); + late final _duk_get_heapptr_default = + _duk_get_heapptr_defaultPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); /// Opt operations: like require operations but with an explicit default value /// when value is undefined or index is invalid, null and non-matching types /// cause a TypeError. - int duk_opt_boolean( - ffi.Pointer ctx, - int idx, - int def_value, - ) { - return _duk_opt_boolean( - ctx, - idx, - def_value, - ); + int duk_opt_boolean(ffi.Pointer ctx, int idx, int def_value) { + return _duk_opt_boolean(ctx, idx, def_value); } late final _duk_opt_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_bool_t)>>('duk_opt_boolean'); - late final _duk_opt_boolean = _duk_opt_booleanPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_bool_t) + > + >('duk_opt_boolean'); + late final _duk_opt_boolean = + _duk_opt_booleanPtr + .asFunction, int, int)>(); double duk_opt_number( ffi.Pointer ctx, int idx, double def_value, ) { - return _duk_opt_number( - ctx, - idx, - def_value, - ); + return _duk_opt_number(ctx, idx, def_value); } late final _duk_opt_numberPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function(ffi.Pointer, duk_idx_t, - duk_double_t)>>('duk_opt_number'); - late final _duk_opt_number = _duk_opt_numberPtr - .asFunction, int, double)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t, duk_double_t) + > + >('duk_opt_number'); + late final _duk_opt_number = + _duk_opt_numberPtr + .asFunction, int, double)>(); - int duk_opt_int( - ffi.Pointer ctx, - int idx, - int def_value, - ) { - return _duk_opt_int( - ctx, - idx, - def_value, - ); + int duk_opt_int(ffi.Pointer ctx, int idx, int def_value) { + return _duk_opt_int(ctx, idx, def_value); } late final _duk_opt_intPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t, duk_int_t)>>('duk_opt_int'); - late final _duk_opt_int = _duk_opt_intPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_int_t Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_opt_int'); + late final _duk_opt_int = + _duk_opt_intPtr + .asFunction, int, int)>(); - int duk_opt_uint( - ffi.Pointer ctx, - int idx, - int def_value, - ) { - return _duk_opt_uint( - ctx, - idx, - def_value, - ); + int duk_opt_uint(ffi.Pointer ctx, int idx, int def_value) { + return _duk_opt_uint(ctx, idx, def_value); } late final _duk_opt_uintPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_opt_uint'); - late final _duk_opt_uint = _duk_opt_uintPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_uint_t Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_opt_uint'); + late final _duk_opt_uint = + _duk_opt_uintPtr + .asFunction, int, int)>(); ffi.Pointer duk_opt_string( ffi.Pointer ctx, int idx, ffi.Pointer def_ptr, ) { - return _duk_opt_string( - ctx, - idx, - def_ptr, - ); + return _duk_opt_string(ctx, idx, def_ptr); } late final _duk_opt_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_opt_string'); - late final _duk_opt_string = _duk_opt_stringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_opt_string'); + late final _duk_opt_string = + _duk_opt_stringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_opt_lstring( ffi.Pointer ctx, @@ -2488,26 +2239,31 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_len, ) { - return _duk_opt_lstring( - ctx, - idx, - out_len, - def_ptr, - def_len, - ); + return _duk_opt_lstring(ctx, idx, out_len, def_ptr, def_len); } late final _duk_opt_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_opt_lstring'); + late final _duk_opt_lstring = + _duk_opt_lstringPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_opt_lstring'); - late final _duk_opt_lstring = _duk_opt_lstringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_opt_buffer( ffi.Pointer ctx, @@ -2516,26 +2272,31 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_size, ) { - return _duk_opt_buffer( - ctx, - idx, - out_size, - def_ptr, - def_size, - ); + return _duk_opt_buffer(ctx, idx, out_size, def_ptr, def_size); } late final _duk_opt_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_opt_buffer'); + late final _duk_opt_buffer = + _duk_opt_bufferPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_opt_buffer'); - late final _duk_opt_buffer = _duk_opt_bufferPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_opt_buffer_data( ffi.Pointer ctx, @@ -2544,611 +2305,569 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_size, ) { - return _duk_opt_buffer_data( - ctx, - idx, - out_size, - def_ptr, - def_size, - ); + return _duk_opt_buffer_data(ctx, idx, out_size, def_ptr, def_size); } late final _duk_opt_buffer_dataPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_opt_buffer_data'); + late final _duk_opt_buffer_data = + _duk_opt_buffer_dataPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_opt_buffer_data'); - late final _duk_opt_buffer_data = _duk_opt_buffer_dataPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_opt_pointer( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_opt_pointer( - ctx, - idx, - def_value, - ); + return _duk_opt_pointer(ctx, idx, def_value); } late final _duk_opt_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_opt_pointer'); - late final _duk_opt_pointer = _duk_opt_pointerPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_opt_pointer'); + late final _duk_opt_pointer = + _duk_opt_pointerPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); duk_c_function duk_opt_c_function( ffi.Pointer ctx, int idx, duk_c_function def_value, ) { - return _duk_opt_c_function( - ctx, - idx, - def_value, - ); + return _duk_opt_c_function(ctx, idx, def_value); } late final _duk_opt_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_c_function Function(ffi.Pointer, duk_idx_t, - duk_c_function)>>('duk_opt_c_function'); - late final _duk_opt_c_function = _duk_opt_c_functionPtr.asFunction< - duk_c_function Function(ffi.Pointer, int, duk_c_function)>(); + ffi.NativeFunction< + duk_c_function Function( + ffi.Pointer, + duk_idx_t, + duk_c_function, + ) + > + >('duk_opt_c_function'); + late final _duk_opt_c_function = + _duk_opt_c_functionPtr + .asFunction< + duk_c_function Function( + ffi.Pointer, + int, + duk_c_function, + ) + >(); ffi.Pointer duk_opt_context( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_opt_context( - ctx, - idx, - def_value, - ); + return _duk_opt_context(ctx, idx, def_value); } late final _duk_opt_contextPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_opt_context'); - late final _duk_opt_context = _duk_opt_contextPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_opt_context'); + late final _duk_opt_context = + _duk_opt_contextPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_opt_heapptr( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_opt_heapptr( - ctx, - idx, - def_value, - ); + return _duk_opt_heapptr(ctx, idx, def_value); } late final _duk_opt_heapptrPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_opt_heapptr'); - late final _duk_opt_heapptr = _duk_opt_heapptrPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_opt_heapptr'); + late final _duk_opt_heapptr = + _duk_opt_heapptrPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); - void duk_require_undefined( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_undefined( - ctx, - idx, - ); + void duk_require_undefined(ffi.Pointer ctx, int idx) { + return _duk_require_undefined(ctx, idx); } late final _duk_require_undefinedPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_undefined'); - late final _duk_require_undefined = _duk_require_undefinedPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_undefined'); + late final _duk_require_undefined = + _duk_require_undefinedPtr + .asFunction, int)>(); - void duk_require_null( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_null( - ctx, - idx, - ); + void duk_require_null(ffi.Pointer ctx, int idx) { + return _duk_require_null(ctx, idx); } late final _duk_require_nullPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_null'); - late final _duk_require_null = _duk_require_nullPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_null'); + late final _duk_require_null = + _duk_require_nullPtr + .asFunction, int)>(); - int duk_require_boolean( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_boolean( - ctx, - idx, - ); + int duk_require_boolean(ffi.Pointer ctx, int idx) { + return _duk_require_boolean(ctx, idx); } late final _duk_require_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_require_boolean'); - late final _duk_require_boolean = _duk_require_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_boolean'); + late final _duk_require_boolean = + _duk_require_booleanPtr + .asFunction, int)>(); - double duk_require_number( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_number( - ctx, - idx, - ); + double duk_require_number(ffi.Pointer ctx, int idx) { + return _duk_require_number(ctx, idx); } late final _duk_require_numberPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function( - ffi.Pointer, duk_idx_t)>>('duk_require_number'); - late final _duk_require_number = _duk_require_numberPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_number'); + late final _duk_require_number = + _duk_require_numberPtr + .asFunction, int)>(); - int duk_require_int( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_int( - ctx, - idx, - ); + int duk_require_int(ffi.Pointer ctx, int idx) { + return _duk_require_int(ctx, idx); } late final _duk_require_intPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_require_int'); - late final _duk_require_int = _duk_require_intPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_int'); + late final _duk_require_int = + _duk_require_intPtr + .asFunction, int)>(); - int duk_require_uint( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_uint( - ctx, - idx, - ); + int duk_require_uint(ffi.Pointer ctx, int idx) { + return _duk_require_uint(ctx, idx); } late final _duk_require_uintPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function( - ffi.Pointer, duk_idx_t)>>('duk_require_uint'); - late final _duk_require_uint = _duk_require_uintPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_uint'); + late final _duk_require_uint = + _duk_require_uintPtr + .asFunction, int)>(); ffi.Pointer duk_require_string( ffi.Pointer ctx, int idx, ) { - return _duk_require_string( - ctx, - idx, - ); + return _duk_require_string(ctx, idx); } late final _duk_require_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_require_string'); - late final _duk_require_string = _duk_require_stringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_string'); + late final _duk_require_string = + _duk_require_stringPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); ffi.Pointer duk_require_lstring( ffi.Pointer ctx, int idx, ffi.Pointer out_len, ) { - return _duk_require_lstring( - ctx, - idx, - out_len, - ); + return _duk_require_lstring(ctx, idx, out_len); } late final _duk_require_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_require_lstring'); - late final _duk_require_lstring = _duk_require_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_require_lstring'); + late final _duk_require_lstring = + _duk_require_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); - void duk_require_object( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_object( - ctx, - idx, - ); + void duk_require_object(ffi.Pointer ctx, int idx) { + return _duk_require_object(ctx, idx); } late final _duk_require_objectPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_object'); - late final _duk_require_object = _duk_require_objectPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_object'); + late final _duk_require_object = + _duk_require_objectPtr + .asFunction, int)>(); ffi.Pointer duk_require_buffer( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_require_buffer( - ctx, - idx, - out_size, - ); + return _duk_require_buffer(ctx, idx, out_size); } late final _duk_require_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_require_buffer'); - late final _duk_require_buffer = _duk_require_bufferPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_require_buffer'); + late final _duk_require_buffer = + _duk_require_bufferPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_require_buffer_data( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_require_buffer_data( - ctx, - idx, - out_size, - ); + return _duk_require_buffer_data(ctx, idx, out_size); } late final _duk_require_buffer_dataPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_require_buffer_data'); - late final _duk_require_buffer_data = _duk_require_buffer_dataPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_require_buffer_data'); + late final _duk_require_buffer_data = + _duk_require_buffer_dataPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_require_pointer( ffi.Pointer ctx, int idx, ) { - return _duk_require_pointer( - ctx, - idx, - ); - } - - late final _duk_require_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_require_pointer'); - late final _duk_require_pointer = _duk_require_pointerPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); - - duk_c_function duk_require_c_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_c_function( - ctx, - idx, - ); + return _duk_require_pointer(ctx, idx); + } + + late final _duk_require_pointerPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_pointer'); + late final _duk_require_pointer = + _duk_require_pointerPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); + + duk_c_function duk_require_c_function(ffi.Pointer ctx, int idx) { + return _duk_require_c_function(ctx, idx); } late final _duk_require_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_c_function Function( - ffi.Pointer, duk_idx_t)>>('duk_require_c_function'); - late final _duk_require_c_function = _duk_require_c_functionPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_c_function Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_c_function'); + late final _duk_require_c_function = + _duk_require_c_functionPtr + .asFunction, int)>(); ffi.Pointer duk_require_context( ffi.Pointer ctx, int idx, ) { - return _duk_require_context( - ctx, - idx, - ); + return _duk_require_context(ctx, idx); } late final _duk_require_contextPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_require_context'); - late final _duk_require_context = _duk_require_contextPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_context'); + late final _duk_require_context = + _duk_require_contextPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_require_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_function( - ctx, - idx, - ); + void duk_require_function(ffi.Pointer ctx, int idx) { + return _duk_require_function(ctx, idx); } late final _duk_require_functionPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_function'); - late final _duk_require_function = _duk_require_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_function'); + late final _duk_require_function = + _duk_require_functionPtr + .asFunction, int)>(); - void duk_require_constructor_call( - ffi.Pointer ctx, - ) { - return _duk_require_constructor_call( - ctx, - ); + void duk_require_constructor_call(ffi.Pointer ctx) { + return _duk_require_constructor_call(ctx); } late final _duk_require_constructor_callPtr = _lookup)>>( - 'duk_require_constructor_call'); - late final _duk_require_constructor_call = _duk_require_constructor_callPtr - .asFunction)>(); + 'duk_require_constructor_call', + ); + late final _duk_require_constructor_call = + _duk_require_constructor_callPtr + .asFunction)>(); - void duk_require_constructable( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_constructable( - ctx, - idx, - ); + void duk_require_constructable(ffi.Pointer ctx, int idx) { + return _duk_require_constructable(ctx, idx); } late final _duk_require_constructablePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - duk_idx_t)>>('duk_require_constructable'); - late final _duk_require_constructable = _duk_require_constructablePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_constructable'); + late final _duk_require_constructable = + _duk_require_constructablePtr + .asFunction, int)>(); ffi.Pointer duk_require_heapptr( ffi.Pointer ctx, int idx, ) { - return _duk_require_heapptr( - ctx, - idx, - ); + return _duk_require_heapptr(ctx, idx); } late final _duk_require_heapptrPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_require_heapptr'); - late final _duk_require_heapptr = _duk_require_heapptrPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_heapptr'); + late final _duk_require_heapptr = + _duk_require_heapptrPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); /// Coercion operations: in-place coercion, return coerced value where /// applicable. If index is invalid, throw error. Some coercions may /// throw an expected error (e.g. from a toString() or valueOf() call) /// or an internal error (e.g. from out of memory). - void duk_to_undefined( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_undefined( - ctx, - idx, - ); + void duk_to_undefined(ffi.Pointer ctx, int idx) { + return _duk_to_undefined(ctx, idx); } late final _duk_to_undefinedPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_to_undefined'); - late final _duk_to_undefined = _duk_to_undefinedPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_undefined'); + late final _duk_to_undefined = + _duk_to_undefinedPtr + .asFunction, int)>(); - void duk_to_null( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_null( - ctx, - idx, - ); + void duk_to_null(ffi.Pointer ctx, int idx) { + return _duk_to_null(ctx, idx); } late final _duk_to_nullPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_to_null'); - late final _duk_to_null = _duk_to_nullPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_null'); + late final _duk_to_null = + _duk_to_nullPtr + .asFunction, int)>(); - int duk_to_boolean( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_boolean( - ctx, - idx, - ); + int duk_to_boolean(ffi.Pointer ctx, int idx) { + return _duk_to_boolean(ctx, idx); } late final _duk_to_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_boolean'); - late final _duk_to_boolean = _duk_to_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_boolean'); + late final _duk_to_boolean = + _duk_to_booleanPtr + .asFunction, int)>(); - double duk_to_number( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_number( - ctx, - idx, - ); + double duk_to_number(ffi.Pointer ctx, int idx) { + return _duk_to_number(ctx, idx); } late final _duk_to_numberPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_number'); - late final _duk_to_number = _duk_to_numberPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_number'); + late final _duk_to_number = + _duk_to_numberPtr + .asFunction, int)>(); - int duk_to_int( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_int( - ctx, - idx, - ); + int duk_to_int(ffi.Pointer ctx, int idx) { + return _duk_to_int(ctx, idx); } late final _duk_to_intPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_int'); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_int'); late final _duk_to_int = _duk_to_intPtr.asFunction, int)>(); - int duk_to_uint( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_uint( - ctx, - idx, - ); + int duk_to_uint(ffi.Pointer ctx, int idx) { + return _duk_to_uint(ctx, idx); } late final _duk_to_uintPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_uint'); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_uint'); late final _duk_to_uint = _duk_to_uintPtr.asFunction, int)>(); - int duk_to_int32( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_int32( - ctx, - idx, - ); + int duk_to_int32(ffi.Pointer ctx, int idx) { + return _duk_to_int32(ctx, idx); } late final _duk_to_int32Ptr = _lookup< - ffi.NativeFunction< - duk_int32_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_int32'); - late final _duk_to_int32 = _duk_to_int32Ptr - .asFunction, int)>(); + ffi.NativeFunction< + duk_int32_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_int32'); + late final _duk_to_int32 = + _duk_to_int32Ptr + .asFunction, int)>(); - int duk_to_uint32( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_uint32( - ctx, - idx, - ); + int duk_to_uint32(ffi.Pointer ctx, int idx) { + return _duk_to_uint32(ctx, idx); } late final _duk_to_uint32Ptr = _lookup< - ffi.NativeFunction< - duk_uint32_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_uint32'); - late final _duk_to_uint32 = _duk_to_uint32Ptr - .asFunction, int)>(); + ffi.NativeFunction< + duk_uint32_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_uint32'); + late final _duk_to_uint32 = + _duk_to_uint32Ptr + .asFunction, int)>(); - int duk_to_uint16( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_uint16( - ctx, - idx, - ); + int duk_to_uint16(ffi.Pointer ctx, int idx) { + return _duk_to_uint16(ctx, idx); } late final _duk_to_uint16Ptr = _lookup< - ffi.NativeFunction< - duk_uint16_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_uint16'); - late final _duk_to_uint16 = _duk_to_uint16Ptr - .asFunction, int)>(); + ffi.NativeFunction< + duk_uint16_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_uint16'); + late final _duk_to_uint16 = + _duk_to_uint16Ptr + .asFunction, int)>(); - ffi.Pointer duk_to_string( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_string( - ctx, - idx, - ); + ffi.Pointer duk_to_string(ffi.Pointer ctx, int idx) { + return _duk_to_string(ctx, idx); } late final _duk_to_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_to_string'); - late final _duk_to_string = _duk_to_stringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_string'); + late final _duk_to_string = + _duk_to_stringPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); ffi.Pointer duk_to_lstring( ffi.Pointer ctx, int idx, ffi.Pointer out_len, ) { - return _duk_to_lstring( - ctx, - idx, - out_len, - ); + return _duk_to_lstring(ctx, idx, out_len); } late final _duk_to_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_to_lstring'); - late final _duk_to_lstring = _duk_to_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_to_lstring'); + late final _duk_to_lstring = + _duk_to_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_to_buffer_raw( ffi.Pointer ctx, @@ -3156,74 +2875,68 @@ class DuktapeBindings { ffi.Pointer out_size, int flags, ) { - return _duk_to_buffer_raw( - ctx, - idx, - out_size, - flags, - ); + return _duk_to_buffer_raw(ctx, idx, out_size, flags); } late final _duk_to_buffer_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_uint_t)>>('duk_to_buffer_raw'); - late final _duk_to_buffer_raw = _duk_to_buffer_rawPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_uint_t, + ) + > + >('duk_to_buffer_raw'); + late final _duk_to_buffer_raw = + _duk_to_buffer_rawPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); - ffi.Pointer duk_to_pointer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_pointer( - ctx, - idx, - ); + ffi.Pointer duk_to_pointer(ffi.Pointer ctx, int idx) { + return _duk_to_pointer(ctx, idx); } late final _duk_to_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_to_pointer'); - late final _duk_to_pointer = _duk_to_pointerPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_pointer'); + late final _duk_to_pointer = + _duk_to_pointerPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_to_object( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_object( - ctx, - idx, - ); + void duk_to_object(ffi.Pointer ctx, int idx) { + return _duk_to_object(ctx, idx); } late final _duk_to_objectPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_to_object'); - late final _duk_to_object = _duk_to_objectPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_object'); + late final _duk_to_object = + _duk_to_objectPtr + .asFunction, int)>(); - void duk_to_primitive( - ffi.Pointer ctx, - int idx, - int hint, - ) { - return _duk_to_primitive( - ctx, - idx, - hint, - ); + void duk_to_primitive(ffi.Pointer ctx, int idx, int hint) { + return _duk_to_primitive(ctx, idx, hint); } late final _duk_to_primitivePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_int_t)>>('duk_to_primitive'); - late final _duk_to_primitive = _duk_to_primitivePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_to_primitive'); + late final _duk_to_primitive = + _duk_to_primitivePtr + .asFunction, int, int)>(); /// safe variants of a few coercion operations ffi.Pointer duk_safe_to_lstring( @@ -3231,249 +2944,222 @@ class DuktapeBindings { int idx, ffi.Pointer out_len, ) { - return _duk_safe_to_lstring( - ctx, - idx, - out_len, - ); + return _duk_safe_to_lstring(ctx, idx, out_len); } late final _duk_safe_to_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_safe_to_lstring'); - late final _duk_safe_to_lstring = _duk_safe_to_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_safe_to_lstring'); + late final _duk_safe_to_lstring = + _duk_safe_to_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_to_stacktrace( ffi.Pointer ctx, int idx, ) { - return _duk_to_stacktrace( - ctx, - idx, - ); + return _duk_to_stacktrace(ctx, idx); } late final _duk_to_stacktracePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_to_stacktrace'); - late final _duk_to_stacktrace = _duk_to_stacktracePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_stacktrace'); + late final _duk_to_stacktrace = + _duk_to_stacktracePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); ffi.Pointer duk_safe_to_stacktrace( ffi.Pointer ctx, int idx, ) { - return _duk_safe_to_stacktrace( - ctx, - idx, - ); + return _duk_safe_to_stacktrace(ctx, idx); } late final _duk_safe_to_stacktracePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_safe_to_stacktrace'); - late final _duk_safe_to_stacktrace = _duk_safe_to_stacktracePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_safe_to_stacktrace'); + late final _duk_safe_to_stacktrace = + _duk_safe_to_stacktracePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); /// Value length - int duk_get_length( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_length( - ctx, - idx, - ); + int duk_get_length(ffi.Pointer ctx, int idx) { + return _duk_get_length(ctx, idx); } late final _duk_get_lengthPtr = _lookup< - ffi.NativeFunction< - duk_size_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_length'); - late final _duk_get_length = _duk_get_lengthPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_length'); + late final _duk_get_length = + _duk_get_lengthPtr + .asFunction, int)>(); - void duk_set_length( - ffi.Pointer ctx, - int idx, - int len, - ) { - return _duk_set_length( - ctx, - idx, - len, - ); + void duk_set_length(ffi.Pointer ctx, int idx, int len) { + return _duk_set_length(ctx, idx, len); } late final _duk_set_lengthPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_size_t)>>('duk_set_length'); - late final _duk_set_length = _duk_set_lengthPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_size_t) + > + >('duk_set_length'); + late final _duk_set_length = + _duk_set_lengthPtr + .asFunction, int, int)>(); /// Misc conversion ffi.Pointer duk_base64_encode( ffi.Pointer ctx, int idx, ) { - return _duk_base64_encode( - ctx, - idx, - ); + return _duk_base64_encode(ctx, idx); } late final _duk_base64_encodePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_base64_encode'); - late final _duk_base64_encode = _duk_base64_encodePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_base64_encode'); + late final _duk_base64_encode = + _duk_base64_encodePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_base64_decode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_base64_decode( - ctx, - idx, - ); + void duk_base64_decode(ffi.Pointer ctx, int idx) { + return _duk_base64_decode(ctx, idx); } late final _duk_base64_decodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_base64_decode'); - late final _duk_base64_decode = _duk_base64_decodePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_base64_decode'); + late final _duk_base64_decode = + _duk_base64_decodePtr + .asFunction, int)>(); - ffi.Pointer duk_hex_encode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_hex_encode( - ctx, - idx, - ); + ffi.Pointer duk_hex_encode(ffi.Pointer ctx, int idx) { + return _duk_hex_encode(ctx, idx); } late final _duk_hex_encodePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_hex_encode'); - late final _duk_hex_encode = _duk_hex_encodePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_hex_encode'); + late final _duk_hex_encode = + _duk_hex_encodePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_hex_decode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_hex_decode( - ctx, - idx, - ); + void duk_hex_decode(ffi.Pointer ctx, int idx) { + return _duk_hex_decode(ctx, idx); } late final _duk_hex_decodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_hex_decode'); - late final _duk_hex_decode = _duk_hex_decodePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_hex_decode'); + late final _duk_hex_decode = + _duk_hex_decodePtr + .asFunction, int)>(); - ffi.Pointer duk_json_encode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_json_encode( - ctx, - idx, - ); + ffi.Pointer duk_json_encode(ffi.Pointer ctx, int idx) { + return _duk_json_encode(ctx, idx); } late final _duk_json_encodePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_json_encode'); - late final _duk_json_encode = _duk_json_encodePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_json_encode'); + late final _duk_json_encode = + _duk_json_encodePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_json_decode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_json_decode( - ctx, - idx, - ); + void duk_json_decode(ffi.Pointer ctx, int idx) { + return _duk_json_decode(ctx, idx); } late final _duk_json_decodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_json_decode'); - late final _duk_json_decode = _duk_json_decodePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_json_decode'); + late final _duk_json_decode = + _duk_json_decodePtr + .asFunction, int)>(); void duk_cbor_encode( ffi.Pointer ctx, int idx, int encode_flags, ) { - return _duk_cbor_encode( - ctx, - idx, - encode_flags, - ); + return _duk_cbor_encode(ctx, idx, encode_flags); } late final _duk_cbor_encodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_cbor_encode'); - late final _duk_cbor_encode = _duk_cbor_encodePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_cbor_encode'); + late final _duk_cbor_encode = + _duk_cbor_encodePtr + .asFunction, int, int)>(); void duk_cbor_decode( ffi.Pointer ctx, int idx, int decode_flags, ) { - return _duk_cbor_decode( - ctx, - idx, - decode_flags, - ); + return _duk_cbor_decode(ctx, idx, decode_flags); } late final _duk_cbor_decodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_cbor_decode'); - late final _duk_cbor_decode = _duk_cbor_decodePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_cbor_decode'); + late final _duk_cbor_decode = + _duk_cbor_decodePtr + .asFunction, int, int)>(); ffi.Pointer duk_buffer_to_string( ffi.Pointer ctx, int idx, ) { - return _duk_buffer_to_string( - ctx, - idx, - ); + return _duk_buffer_to_string(ctx, idx); } late final _duk_buffer_to_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_buffer_to_string'); - late final _duk_buffer_to_string = _duk_buffer_to_stringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_buffer_to_string'); + late final _duk_buffer_to_string = + _duk_buffer_to_stringPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); /// Buffer ffi.Pointer duk_resize_buffer( @@ -3481,39 +3167,50 @@ class DuktapeBindings { int idx, int new_size, ) { - return _duk_resize_buffer( - ctx, - idx, - new_size, - ); + return _duk_resize_buffer(ctx, idx, new_size); } late final _duk_resize_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - duk_size_t)>>('duk_resize_buffer'); - late final _duk_resize_buffer = _duk_resize_bufferPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, int)>(); + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + duk_size_t, + ) + > + >('duk_resize_buffer'); + late final _duk_resize_buffer = + _duk_resize_bufferPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int, int) + >(); ffi.Pointer duk_steal_buffer( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_steal_buffer( - ctx, - idx, - out_size, - ); + return _duk_steal_buffer(ctx, idx, out_size); } late final _duk_steal_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_steal_buffer'); - late final _duk_steal_buffer = _duk_steal_bufferPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_steal_buffer'); + late final _duk_steal_buffer = + _duk_steal_bufferPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); void duk_config_buffer( ffi.Pointer ctx, @@ -3521,21 +3218,29 @@ class DuktapeBindings { ffi.Pointer ptr, int len, ) { - return _duk_config_buffer( - ctx, - idx, - ptr, - len, - ); + return _duk_config_buffer(ctx, idx, ptr, len); } late final _duk_config_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_config_buffer'); - late final _duk_config_buffer = _duk_config_bufferPtr.asFunction< - void Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_config_buffer'); + late final _duk_config_buffer = + _duk_config_bufferPtr + .asFunction< + void Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); /// Property access /// @@ -3544,41 +3249,39 @@ class DuktapeBindings { /// The _index variant takes an array index as a property name (e.g. 123 is /// equivalent to the key "123"). The _heapptr variant takes a raw, borrowed /// heap pointer. - int duk_get_prop( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_get_prop( - ctx, - obj_idx, - ); + int duk_get_prop(ffi.Pointer ctx, int obj_idx) { + return _duk_get_prop(ctx, obj_idx); } late final _duk_get_propPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_prop'); - late final _duk_get_prop = _duk_get_propPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_prop'); + late final _duk_get_prop = + _duk_get_propPtr + .asFunction, int)>(); int duk_get_prop_string( ffi.Pointer ctx, int obj_idx, ffi.Pointer key, ) { - return _duk_get_prop_string( - ctx, - obj_idx, - key, - ); + return _duk_get_prop_string(ctx, obj_idx, key); } late final _duk_get_prop_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_prop_string'); - late final _duk_get_prop_string = _duk_get_prop_stringPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_prop_string'); + late final _duk_get_prop_string = + _duk_get_prop_stringPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); int duk_get_prop_lstring( ffi.Pointer ctx, @@ -3586,21 +3289,29 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_get_prop_lstring( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_get_prop_lstring(ctx, obj_idx, key, key_len); } late final _duk_get_prop_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_get_prop_lstring'); - late final _duk_get_prop_lstring = _duk_get_prop_lstringPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_prop_lstring'); + late final _duk_get_prop_lstring = + _duk_get_prop_lstringPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_get_prop_literal_raw( ffi.Pointer ctx, @@ -3608,96 +3319,103 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_get_prop_literal_raw( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_get_prop_literal_raw(ctx, obj_idx, key, key_len); } late final _duk_get_prop_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_get_prop_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_prop_literal_raw'); late final _duk_get_prop_literal_raw = - _duk_get_prop_literal_rawPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + _duk_get_prop_literal_rawPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_get_prop_index( ffi.Pointer ctx, int obj_idx, int arr_idx, ) { - return _duk_get_prop_index( - ctx, - obj_idx, - arr_idx, - ); + return _duk_get_prop_index(ctx, obj_idx, arr_idx); } late final _duk_get_prop_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uarridx_t)>>('duk_get_prop_index'); - late final _duk_get_prop_index = _duk_get_prop_indexPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uarridx_t) + > + >('duk_get_prop_index'); + late final _duk_get_prop_index = + _duk_get_prop_indexPtr + .asFunction, int, int)>(); int duk_get_prop_heapptr( ffi.Pointer ctx, int obj_idx, ffi.Pointer ptr, ) { - return _duk_get_prop_heapptr( - ctx, - obj_idx, - ptr, - ); + return _duk_get_prop_heapptr(ctx, obj_idx, ptr); } late final _duk_get_prop_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_prop_heapptr'); - late final _duk_get_prop_heapptr = _duk_get_prop_heapptrPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); - - int duk_put_prop( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_put_prop( - ctx, - obj_idx, - ); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_prop_heapptr'); + late final _duk_get_prop_heapptr = + _duk_get_prop_heapptrPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); + + int duk_put_prop(ffi.Pointer ctx, int obj_idx) { + return _duk_put_prop(ctx, obj_idx); } late final _duk_put_propPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_put_prop'); - late final _duk_put_prop = _duk_put_propPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_put_prop'); + late final _duk_put_prop = + _duk_put_propPtr + .asFunction, int)>(); int duk_put_prop_string( ffi.Pointer ctx, int obj_idx, ffi.Pointer key, ) { - return _duk_put_prop_string( - ctx, - obj_idx, - key, - ); + return _duk_put_prop_string(ctx, obj_idx, key); } late final _duk_put_prop_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_put_prop_string'); - late final _duk_put_prop_string = _duk_put_prop_stringPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_put_prop_string'); + late final _duk_put_prop_string = + _duk_put_prop_stringPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); int duk_put_prop_lstring( ffi.Pointer ctx, @@ -3705,21 +3423,29 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_put_prop_lstring( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_put_prop_lstring(ctx, obj_idx, key, key_len); } late final _duk_put_prop_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_put_prop_lstring'); - late final _duk_put_prop_lstring = _duk_put_prop_lstringPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_put_prop_lstring'); + late final _duk_put_prop_lstring = + _duk_put_prop_lstringPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_put_prop_literal_raw( ffi.Pointer ctx, @@ -3727,96 +3453,103 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_put_prop_literal_raw( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_put_prop_literal_raw(ctx, obj_idx, key, key_len); } late final _duk_put_prop_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_put_prop_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_put_prop_literal_raw'); late final _duk_put_prop_literal_raw = - _duk_put_prop_literal_rawPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + _duk_put_prop_literal_rawPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_put_prop_index( ffi.Pointer ctx, int obj_idx, int arr_idx, ) { - return _duk_put_prop_index( - ctx, - obj_idx, - arr_idx, - ); + return _duk_put_prop_index(ctx, obj_idx, arr_idx); } late final _duk_put_prop_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uarridx_t)>>('duk_put_prop_index'); - late final _duk_put_prop_index = _duk_put_prop_indexPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uarridx_t) + > + >('duk_put_prop_index'); + late final _duk_put_prop_index = + _duk_put_prop_indexPtr + .asFunction, int, int)>(); int duk_put_prop_heapptr( ffi.Pointer ctx, int obj_idx, ffi.Pointer ptr, ) { - return _duk_put_prop_heapptr( - ctx, - obj_idx, - ptr, - ); + return _duk_put_prop_heapptr(ctx, obj_idx, ptr); } late final _duk_put_prop_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_put_prop_heapptr'); - late final _duk_put_prop_heapptr = _duk_put_prop_heapptrPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); - - int duk_del_prop( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_del_prop( - ctx, - obj_idx, - ); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_put_prop_heapptr'); + late final _duk_put_prop_heapptr = + _duk_put_prop_heapptrPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); + + int duk_del_prop(ffi.Pointer ctx, int obj_idx) { + return _duk_del_prop(ctx, obj_idx); } late final _duk_del_propPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_del_prop'); - late final _duk_del_prop = _duk_del_propPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_del_prop'); + late final _duk_del_prop = + _duk_del_propPtr + .asFunction, int)>(); int duk_del_prop_string( ffi.Pointer ctx, int obj_idx, ffi.Pointer key, ) { - return _duk_del_prop_string( - ctx, - obj_idx, - key, - ); + return _duk_del_prop_string(ctx, obj_idx, key); } late final _duk_del_prop_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_del_prop_string'); - late final _duk_del_prop_string = _duk_del_prop_stringPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_del_prop_string'); + late final _duk_del_prop_string = + _duk_del_prop_stringPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); int duk_del_prop_lstring( ffi.Pointer ctx, @@ -3824,21 +3557,29 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_del_prop_lstring( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_del_prop_lstring(ctx, obj_idx, key, key_len); } late final _duk_del_prop_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_del_prop_lstring'); - late final _duk_del_prop_lstring = _duk_del_prop_lstringPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_del_prop_lstring'); + late final _duk_del_prop_lstring = + _duk_del_prop_lstringPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_del_prop_literal_raw( ffi.Pointer ctx, @@ -3846,96 +3587,103 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_del_prop_literal_raw( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_del_prop_literal_raw(ctx, obj_idx, key, key_len); } late final _duk_del_prop_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_del_prop_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_del_prop_literal_raw'); late final _duk_del_prop_literal_raw = - _duk_del_prop_literal_rawPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + _duk_del_prop_literal_rawPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_del_prop_index( ffi.Pointer ctx, int obj_idx, int arr_idx, ) { - return _duk_del_prop_index( - ctx, - obj_idx, - arr_idx, - ); + return _duk_del_prop_index(ctx, obj_idx, arr_idx); } late final _duk_del_prop_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uarridx_t)>>('duk_del_prop_index'); - late final _duk_del_prop_index = _duk_del_prop_indexPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uarridx_t) + > + >('duk_del_prop_index'); + late final _duk_del_prop_index = + _duk_del_prop_indexPtr + .asFunction, int, int)>(); int duk_del_prop_heapptr( ffi.Pointer ctx, int obj_idx, ffi.Pointer ptr, ) { - return _duk_del_prop_heapptr( - ctx, - obj_idx, - ptr, - ); + return _duk_del_prop_heapptr(ctx, obj_idx, ptr); } late final _duk_del_prop_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_del_prop_heapptr'); - late final _duk_del_prop_heapptr = _duk_del_prop_heapptrPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); - - int duk_has_prop( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_has_prop( - ctx, - obj_idx, - ); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_del_prop_heapptr'); + late final _duk_del_prop_heapptr = + _duk_del_prop_heapptrPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); + + int duk_has_prop(ffi.Pointer ctx, int obj_idx) { + return _duk_has_prop(ctx, obj_idx); } late final _duk_has_propPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_has_prop'); - late final _duk_has_prop = _duk_has_propPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_has_prop'); + late final _duk_has_prop = + _duk_has_propPtr + .asFunction, int)>(); int duk_has_prop_string( ffi.Pointer ctx, int obj_idx, ffi.Pointer key, ) { - return _duk_has_prop_string( - ctx, - obj_idx, - key, - ); + return _duk_has_prop_string(ctx, obj_idx, key); } late final _duk_has_prop_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_has_prop_string'); - late final _duk_has_prop_string = _duk_has_prop_stringPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_has_prop_string'); + late final _duk_has_prop_string = + _duk_has_prop_stringPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); int duk_has_prop_lstring( ffi.Pointer ctx, @@ -3943,21 +3691,29 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_has_prop_lstring( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_has_prop_lstring(ctx, obj_idx, key, key_len); } late final _duk_has_prop_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_has_prop_lstring'); - late final _duk_has_prop_lstring = _duk_has_prop_lstringPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_has_prop_lstring'); + late final _duk_has_prop_lstring = + _duk_has_prop_lstringPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_has_prop_literal_raw( ffi.Pointer ctx, @@ -3965,415 +3721,378 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_has_prop_literal_raw( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_has_prop_literal_raw(ctx, obj_idx, key, key_len); } late final _duk_has_prop_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_has_prop_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_has_prop_literal_raw'); late final _duk_has_prop_literal_raw = - _duk_has_prop_literal_rawPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + _duk_has_prop_literal_rawPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_has_prop_index( ffi.Pointer ctx, int obj_idx, int arr_idx, ) { - return _duk_has_prop_index( - ctx, - obj_idx, - arr_idx, - ); + return _duk_has_prop_index(ctx, obj_idx, arr_idx); } late final _duk_has_prop_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uarridx_t)>>('duk_has_prop_index'); - late final _duk_has_prop_index = _duk_has_prop_indexPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uarridx_t) + > + >('duk_has_prop_index'); + late final _duk_has_prop_index = + _duk_has_prop_indexPtr + .asFunction, int, int)>(); int duk_has_prop_heapptr( ffi.Pointer ctx, int obj_idx, ffi.Pointer ptr, ) { - return _duk_has_prop_heapptr( - ctx, - obj_idx, - ptr, - ); + return _duk_has_prop_heapptr(ctx, obj_idx, ptr); } late final _duk_has_prop_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_has_prop_heapptr'); - late final _duk_has_prop_heapptr = _duk_has_prop_heapptrPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); - - void duk_get_prop_desc( - ffi.Pointer ctx, - int obj_idx, - int flags, - ) { - return _duk_get_prop_desc( - ctx, - obj_idx, - flags, - ); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_has_prop_heapptr'); + late final _duk_has_prop_heapptr = + _duk_has_prop_heapptrPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); + + void duk_get_prop_desc(ffi.Pointer ctx, int obj_idx, int flags) { + return _duk_get_prop_desc(ctx, obj_idx, flags); } - - late final _duk_get_prop_descPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_get_prop_desc'); - late final _duk_get_prop_desc = _duk_get_prop_descPtr - .asFunction, int, int)>(); - - void duk_def_prop( - ffi.Pointer ctx, - int obj_idx, - int flags, - ) { - return _duk_def_prop( - ctx, - obj_idx, - flags, - ); + + late final _duk_get_prop_descPtr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_get_prop_desc'); + late final _duk_get_prop_desc = + _duk_get_prop_descPtr + .asFunction, int, int)>(); + + void duk_def_prop(ffi.Pointer ctx, int obj_idx, int flags) { + return _duk_def_prop(ctx, obj_idx, flags); } late final _duk_def_propPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_def_prop'); - late final _duk_def_prop = _duk_def_propPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_def_prop'); + late final _duk_def_prop = + _duk_def_propPtr + .asFunction, int, int)>(); int duk_get_global_string( ffi.Pointer ctx, ffi.Pointer key, ) { - return _duk_get_global_string( - ctx, - key, - ); + return _duk_get_global_string(ctx, key); } late final _duk_get_global_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_get_global_string'); - late final _duk_get_global_string = _duk_get_global_stringPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_get_global_string'); + late final _duk_get_global_string = + _duk_get_global_stringPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); int duk_get_global_lstring( ffi.Pointer ctx, ffi.Pointer key, int key_len, ) { - return _duk_get_global_lstring( - ctx, - key, - key_len, - ); + return _duk_get_global_lstring(ctx, key, key_len); } late final _duk_get_global_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_global_lstring'); - late final _duk_get_global_lstring = _duk_get_global_lstringPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_global_lstring'); + late final _duk_get_global_lstring = + _duk_get_global_lstringPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer, int) + >(); int duk_get_global_literal_raw( ffi.Pointer ctx, ffi.Pointer key, int key_len, ) { - return _duk_get_global_literal_raw( - ctx, - key, - key_len, - ); + return _duk_get_global_literal_raw(ctx, key, key_len); } late final _duk_get_global_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_global_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_global_literal_raw'); late final _duk_get_global_literal_raw = - _duk_get_global_literal_rawPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + _duk_get_global_literal_rawPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer, int) + >(); int duk_get_global_heapptr( ffi.Pointer ctx, ffi.Pointer ptr, ) { - return _duk_get_global_heapptr( - ctx, - ptr, - ); + return _duk_get_global_heapptr(ctx, ptr); } late final _duk_get_global_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_get_global_heapptr'); - late final _duk_get_global_heapptr = _duk_get_global_heapptrPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_get_global_heapptr'); + late final _duk_get_global_heapptr = + _duk_get_global_heapptrPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); int duk_put_global_string( ffi.Pointer ctx, ffi.Pointer key, ) { - return _duk_put_global_string( - ctx, - key, - ); + return _duk_put_global_string(ctx, key); } late final _duk_put_global_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_put_global_string'); - late final _duk_put_global_string = _duk_put_global_stringPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_put_global_string'); + late final _duk_put_global_string = + _duk_put_global_stringPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); int duk_put_global_lstring( ffi.Pointer ctx, ffi.Pointer key, int key_len, ) { - return _duk_put_global_lstring( - ctx, - key, - key_len, - ); + return _duk_put_global_lstring(ctx, key, key_len); } late final _duk_put_global_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_put_global_lstring'); - late final _duk_put_global_lstring = _duk_put_global_lstringPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_put_global_lstring'); + late final _duk_put_global_lstring = + _duk_put_global_lstringPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer, int) + >(); int duk_put_global_literal_raw( ffi.Pointer ctx, ffi.Pointer key, int key_len, ) { - return _duk_put_global_literal_raw( - ctx, - key, - key_len, - ); + return _duk_put_global_literal_raw(ctx, key, key_len); } late final _duk_put_global_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_put_global_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_put_global_literal_raw'); late final _duk_put_global_literal_raw = - _duk_put_global_literal_rawPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + _duk_put_global_literal_rawPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer, int) + >(); int duk_put_global_heapptr( ffi.Pointer ctx, ffi.Pointer ptr, ) { - return _duk_put_global_heapptr( - ctx, - ptr, - ); + return _duk_put_global_heapptr(ctx, ptr); } late final _duk_put_global_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_put_global_heapptr'); - late final _duk_put_global_heapptr = _duk_put_global_heapptrPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_put_global_heapptr'); + late final _duk_put_global_heapptr = + _duk_put_global_heapptrPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); /// Inspection - void duk_inspect_value( - ffi.Pointer ctx, - int idx, - ) { - return _duk_inspect_value( - ctx, - idx, - ); + void duk_inspect_value(ffi.Pointer ctx, int idx) { + return _duk_inspect_value(ctx, idx); } late final _duk_inspect_valuePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_inspect_value'); - late final _duk_inspect_value = _duk_inspect_valuePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_inspect_value'); + late final _duk_inspect_value = + _duk_inspect_valuePtr + .asFunction, int)>(); - void duk_inspect_callstack_entry( - ffi.Pointer ctx, - int level, - ) { - return _duk_inspect_callstack_entry( - ctx, - level, - ); + void duk_inspect_callstack_entry(ffi.Pointer ctx, int level) { + return _duk_inspect_callstack_entry(ctx, level); } late final _duk_inspect_callstack_entryPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - duk_int_t)>>('duk_inspect_callstack_entry'); - late final _duk_inspect_callstack_entry = _duk_inspect_callstack_entryPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_int_t)> + >('duk_inspect_callstack_entry'); + late final _duk_inspect_callstack_entry = + _duk_inspect_callstack_entryPtr + .asFunction, int)>(); /// Object prototype - void duk_get_prototype( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_prototype( - ctx, - idx, - ); + void duk_get_prototype(ffi.Pointer ctx, int idx) { + return _duk_get_prototype(ctx, idx); } late final _duk_get_prototypePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_get_prototype'); - late final _duk_get_prototype = _duk_get_prototypePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_prototype'); + late final _duk_get_prototype = + _duk_get_prototypePtr + .asFunction, int)>(); - void duk_set_prototype( - ffi.Pointer ctx, - int idx, - ) { - return _duk_set_prototype( - ctx, - idx, - ); + void duk_set_prototype(ffi.Pointer ctx, int idx) { + return _duk_set_prototype(ctx, idx); } late final _duk_set_prototypePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_set_prototype'); - late final _duk_set_prototype = _duk_set_prototypePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_set_prototype'); + late final _duk_set_prototype = + _duk_set_prototypePtr + .asFunction, int)>(); /// Object finalizer - void duk_get_finalizer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_finalizer( - ctx, - idx, - ); + void duk_get_finalizer(ffi.Pointer ctx, int idx) { + return _duk_get_finalizer(ctx, idx); } late final _duk_get_finalizerPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_get_finalizer'); - late final _duk_get_finalizer = _duk_get_finalizerPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_finalizer'); + late final _duk_get_finalizer = + _duk_get_finalizerPtr + .asFunction, int)>(); - void duk_set_finalizer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_set_finalizer( - ctx, - idx, - ); + void duk_set_finalizer(ffi.Pointer ctx, int idx) { + return _duk_set_finalizer(ctx, idx); } late final _duk_set_finalizerPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_set_finalizer'); - late final _duk_set_finalizer = _duk_set_finalizerPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_set_finalizer'); + late final _duk_set_finalizer = + _duk_set_finalizerPtr + .asFunction, int)>(); /// Global object - void duk_set_global_object( - ffi.Pointer ctx, - ) { - return _duk_set_global_object( - ctx, - ); + void duk_set_global_object(ffi.Pointer ctx) { + return _duk_set_global_object(ctx); } late final _duk_set_global_objectPtr = _lookup)>>( - 'duk_set_global_object'); - late final _duk_set_global_object = _duk_set_global_objectPtr - .asFunction)>(); + 'duk_set_global_object', + ); + late final _duk_set_global_object = + _duk_set_global_objectPtr + .asFunction)>(); /// Duktape/C function magic value - int duk_get_magic( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_magic( - ctx, - idx, - ); + int duk_get_magic(ffi.Pointer ctx, int idx) { + return _duk_get_magic(ctx, idx); } late final _duk_get_magicPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_magic'); - late final _duk_get_magic = _duk_get_magicPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_magic'); + late final _duk_get_magic = + _duk_get_magicPtr + .asFunction, int)>(); - void duk_set_magic( - ffi.Pointer ctx, - int idx, - int magic, - ) { - return _duk_set_magic( - ctx, - idx, - magic, - ); + void duk_set_magic(ffi.Pointer ctx, int idx, int magic) { + return _duk_set_magic(ctx, idx, magic); } late final _duk_set_magicPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_int_t)>>('duk_set_magic'); - late final _duk_set_magic = _duk_set_magicPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_set_magic'); + late final _duk_set_magic = + _duk_set_magicPtr + .asFunction, int, int)>(); - int duk_get_current_magic( - ffi.Pointer ctx, - ) { - return _duk_get_current_magic( - ctx, - ); + int duk_get_current_magic(ffi.Pointer ctx) { + return _duk_get_current_magic(ctx); } late final _duk_get_current_magicPtr = _lookup)>>( - 'duk_get_current_magic'); - late final _duk_get_current_magic = _duk_get_current_magicPtr - .asFunction)>(); + 'duk_get_current_magic', + ); + late final _duk_get_current_magic = + _duk_get_current_magicPtr + .asFunction)>(); /// Module helpers: put multiple function or constant properties void duk_put_function_list( @@ -4381,161 +4100,131 @@ class DuktapeBindings { int obj_idx, ffi.Pointer funcs, ) { - return _duk_put_function_list( - ctx, - obj_idx, - funcs, - ); + return _duk_put_function_list(ctx, obj_idx, funcs); } late final _duk_put_function_listPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_put_function_list'); - late final _duk_put_function_list = _duk_put_function_listPtr.asFunction< - void Function(ffi.Pointer, int, - ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_put_function_list'); + late final _duk_put_function_list = + _duk_put_function_listPtr + .asFunction< + void Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); void duk_put_number_list( ffi.Pointer ctx, int obj_idx, ffi.Pointer numbers, ) { - return _duk_put_number_list( - ctx, - obj_idx, - numbers, - ); + return _duk_put_number_list(ctx, obj_idx, numbers); } late final _duk_put_number_listPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_put_number_list'); - late final _duk_put_number_list = _duk_put_number_listPtr.asFunction< - void Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_put_number_list'); + late final _duk_put_number_list = + _duk_put_number_listPtr + .asFunction< + void Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); /// Object operations - void duk_compact( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_compact( - ctx, - obj_idx, - ); + void duk_compact(ffi.Pointer ctx, int obj_idx) { + return _duk_compact(ctx, obj_idx); } late final _duk_compactPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_compact'); - late final _duk_compact = _duk_compactPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_compact'); + late final _duk_compact = + _duk_compactPtr + .asFunction, int)>(); - void duk_enum( - ffi.Pointer ctx, - int obj_idx, - int enum_flags, - ) { - return _duk_enum( - ctx, - obj_idx, - enum_flags, - ); + void duk_enum(ffi.Pointer ctx, int obj_idx, int enum_flags) { + return _duk_enum(ctx, obj_idx, enum_flags); } late final _duk_enumPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t, duk_uint_t)>>('duk_enum'); - late final _duk_enum = _duk_enumPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_enum'); + late final _duk_enum = + _duk_enumPtr + .asFunction, int, int)>(); - int duk_next( - ffi.Pointer ctx, - int enum_idx, - int get_value, - ) { - return _duk_next( - ctx, - enum_idx, - get_value, - ); + int duk_next(ffi.Pointer ctx, int enum_idx, int get_value) { + return _duk_next(ctx, enum_idx, get_value); } late final _duk_nextPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t, duk_bool_t)>>('duk_next'); - late final _duk_next = _duk_nextPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_bool_t) + > + >('duk_next'); + late final _duk_next = + _duk_nextPtr + .asFunction, int, int)>(); - void duk_seal( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_seal( - ctx, - obj_idx, - ); + void duk_seal(ffi.Pointer ctx, int obj_idx) { + return _duk_seal(ctx, obj_idx); } late final _duk_sealPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_seal'); + ffi.NativeFunction, duk_idx_t)> + >('duk_seal'); late final _duk_seal = _duk_sealPtr.asFunction, int)>(); - void duk_freeze( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_freeze( - ctx, - obj_idx, - ); + void duk_freeze(ffi.Pointer ctx, int obj_idx) { + return _duk_freeze(ctx, obj_idx); } late final _duk_freezePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_freeze'); + ffi.NativeFunction, duk_idx_t)> + >('duk_freeze'); late final _duk_freeze = _duk_freezePtr.asFunction, int)>(); /// String manipulation - void duk_concat( - ffi.Pointer ctx, - int count, - ) { - return _duk_concat( - ctx, - count, - ); + void duk_concat(ffi.Pointer ctx, int count) { + return _duk_concat(ctx, count); } late final _duk_concatPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_concat'); + ffi.NativeFunction, duk_idx_t)> + >('duk_concat'); late final _duk_concat = _duk_concatPtr.asFunction, int)>(); - void duk_join( - ffi.Pointer ctx, - int count, - ) { - return _duk_join( - ctx, - count, - ); + void duk_join(ffi.Pointer ctx, int count) { + return _duk_join(ctx, count); } late final _duk_joinPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_join'); + ffi.NativeFunction, duk_idx_t)> + >('duk_join'); late final _duk_join = _duk_joinPtr.asFunction, int)>(); @@ -4545,24 +4234,29 @@ class DuktapeBindings { duk_decode_char_function callback, ffi.Pointer udata, ) { - return _duk_decode_string( - ctx, - idx, - callback, - udata, - ); + return _duk_decode_string(ctx, idx, callback, udata); } late final _duk_decode_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + duk_decode_char_function, + ffi.Pointer, + ) + > + >('duk_decode_string'); + late final _duk_decode_string = + _duk_decode_stringPtr + .asFunction< + void Function( ffi.Pointer, - duk_idx_t, + int, duk_decode_char_function, - ffi.Pointer)>>('duk_decode_string'); - late final _duk_decode_string = _duk_decode_stringPtr.asFunction< - void Function(ffi.Pointer, int, duk_decode_char_function, - ffi.Pointer)>(); + ffi.Pointer, + ) + >(); void duk_map_string( ffi.Pointer ctx, @@ -4570,21 +4264,29 @@ class DuktapeBindings { duk_map_char_function callback, ffi.Pointer udata, ) { - return _duk_map_string( - ctx, - idx, - callback, - udata, - ); + return _duk_map_string(ctx, idx, callback, udata); } late final _duk_map_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_map_char_function, ffi.Pointer)>>('duk_map_string'); - late final _duk_map_string = _duk_map_stringPtr.asFunction< - void Function(ffi.Pointer, int, duk_map_char_function, - ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + duk_map_char_function, + ffi.Pointer, + ) + > + >('duk_map_string'); + late final _duk_map_string = + _duk_map_stringPtr + .asFunction< + void Function( + ffi.Pointer, + int, + duk_map_char_function, + ffi.Pointer, + ) + >(); void duk_substring( ffi.Pointer ctx, @@ -4592,283 +4294,196 @@ class DuktapeBindings { int start_char_offset, int end_char_offset, ) { - return _duk_substring( - ctx, - idx, - start_char_offset, - end_char_offset, - ); + return _duk_substring(ctx, idx, start_char_offset, end_char_offset); } late final _duk_substringPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, duk_size_t, - duk_size_t)>>('duk_substring'); - late final _duk_substring = _duk_substringPtr - .asFunction, int, int, int)>(); - - void duk_trim( - ffi.Pointer ctx, - int idx, - ) { - return _duk_trim( - ctx, - idx, - ); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + duk_size_t, + duk_size_t, + ) + > + >('duk_substring'); + late final _duk_substring = + _duk_substringPtr + .asFunction, int, int, int)>(); + + void duk_trim(ffi.Pointer ctx, int idx) { + return _duk_trim(ctx, idx); } late final _duk_trimPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_trim'); + ffi.NativeFunction, duk_idx_t)> + >('duk_trim'); late final _duk_trim = _duk_trimPtr.asFunction, int)>(); - int duk_char_code_at( - ffi.Pointer ctx, - int idx, - int char_offset, - ) { - return _duk_char_code_at( - ctx, - idx, - char_offset, - ); + int duk_char_code_at(ffi.Pointer ctx, int idx, int char_offset) { + return _duk_char_code_at(ctx, idx, char_offset); } late final _duk_char_code_atPtr = _lookup< - ffi.NativeFunction< - duk_codepoint_t Function(ffi.Pointer, duk_idx_t, - duk_size_t)>>('duk_char_code_at'); - late final _duk_char_code_at = _duk_char_code_atPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_codepoint_t Function(ffi.Pointer, duk_idx_t, duk_size_t) + > + >('duk_char_code_at'); + late final _duk_char_code_at = + _duk_char_code_atPtr + .asFunction, int, int)>(); /// ECMAScript operators - int duk_equals( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_equals( - ctx, - idx1, - idx2, - ); + int duk_equals(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_equals(ctx, idx1, idx2); } late final _duk_equalsPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t, duk_idx_t)>>('duk_equals'); - late final _duk_equals = _duk_equalsPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_equals'); + late final _duk_equals = + _duk_equalsPtr + .asFunction, int, int)>(); - int duk_strict_equals( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_strict_equals( - ctx, - idx1, - idx2, - ); + int duk_strict_equals(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_strict_equals(ctx, idx1, idx2); } late final _duk_strict_equalsPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_strict_equals'); - late final _duk_strict_equals = _duk_strict_equalsPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_strict_equals'); + late final _duk_strict_equals = + _duk_strict_equalsPtr + .asFunction, int, int)>(); - int duk_samevalue( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_samevalue( - ctx, - idx1, - idx2, - ); + int duk_samevalue(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_samevalue(ctx, idx1, idx2); } late final _duk_samevaluePtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_samevalue'); - late final _duk_samevalue = _duk_samevaluePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_samevalue'); + late final _duk_samevalue = + _duk_samevaluePtr + .asFunction, int, int)>(); - int duk_instanceof( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_instanceof( - ctx, - idx1, - idx2, - ); + int duk_instanceof(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_instanceof(ctx, idx1, idx2); } late final _duk_instanceofPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_instanceof'); - late final _duk_instanceof = _duk_instanceofPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_instanceof'); + late final _duk_instanceof = + _duk_instanceofPtr + .asFunction, int, int)>(); /// Random - double duk_random( - ffi.Pointer ctx, - ) { - return _duk_random( - ctx, - ); + double duk_random(ffi.Pointer ctx) { + return _duk_random(ctx); } late final _duk_randomPtr = _lookup< - ffi.NativeFunction)>>( - 'duk_random'); + ffi.NativeFunction)> + >('duk_random'); late final _duk_random = _duk_randomPtr.asFunction)>(); /// Function (method) calls - void duk_call( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_call( - ctx, - nargs, - ); + void duk_call(ffi.Pointer ctx, int nargs) { + return _duk_call(ctx, nargs); } late final _duk_callPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_call'); + ffi.NativeFunction, duk_idx_t)> + >('duk_call'); late final _duk_call = _duk_callPtr.asFunction, int)>(); - void duk_call_method( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_call_method( - ctx, - nargs, - ); + void duk_call_method(ffi.Pointer ctx, int nargs) { + return _duk_call_method(ctx, nargs); } late final _duk_call_methodPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_call_method'); - late final _duk_call_method = _duk_call_methodPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_call_method'); + late final _duk_call_method = + _duk_call_methodPtr + .asFunction, int)>(); - void duk_call_prop( - ffi.Pointer ctx, - int obj_idx, - int nargs, - ) { - return _duk_call_prop( - ctx, - obj_idx, - nargs, - ); + void duk_call_prop(ffi.Pointer ctx, int obj_idx, int nargs) { + return _duk_call_prop(ctx, obj_idx, nargs); } late final _duk_call_propPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_call_prop'); - late final _duk_call_prop = _duk_call_propPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_call_prop'); + late final _duk_call_prop = + _duk_call_propPtr + .asFunction, int, int)>(); - int duk_pcall( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_pcall( - ctx, - nargs, - ); + int duk_pcall(ffi.Pointer ctx, int nargs) { + return _duk_pcall(ctx, nargs); } late final _duk_pcallPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_pcall'); + ffi.NativeFunction, duk_idx_t)> + >('duk_pcall'); late final _duk_pcall = _duk_pcallPtr.asFunction, int)>(); - int duk_pcall_method( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_pcall_method( - ctx, - nargs, - ); + int duk_pcall_method(ffi.Pointer ctx, int nargs) { + return _duk_pcall_method(ctx, nargs); } late final _duk_pcall_methodPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_pcall_method'); - late final _duk_pcall_method = _duk_pcall_methodPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_pcall_method'); + late final _duk_pcall_method = + _duk_pcall_methodPtr + .asFunction, int)>(); - int duk_pcall_prop( - ffi.Pointer ctx, - int obj_idx, - int nargs, - ) { - return _duk_pcall_prop( - ctx, - obj_idx, - nargs, - ); + int duk_pcall_prop(ffi.Pointer ctx, int obj_idx, int nargs) { + return _duk_pcall_prop(ctx, obj_idx, nargs); } late final _duk_pcall_propPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_pcall_prop'); - late final _duk_pcall_prop = _duk_pcall_propPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_int_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_pcall_prop'); + late final _duk_pcall_prop = + _duk_pcall_propPtr + .asFunction, int, int)>(); - void duk_new( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_new( - ctx, - nargs, - ); + void duk_new(ffi.Pointer ctx, int nargs) { + return _duk_new(ctx, nargs); } late final _duk_newPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_new'); + ffi.NativeFunction, duk_idx_t)> + >('duk_new'); late final _duk_new = _duk_newPtr.asFunction, int)>(); - int duk_pnew( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_pnew( - ctx, - nargs, - ); + int duk_pnew(ffi.Pointer ctx, int nargs) { + return _duk_pnew(ctx, nargs); } late final _duk_pnewPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, duk_idx_t)>>('duk_pnew'); + ffi.NativeFunction, duk_idx_t)> + >('duk_pnew'); late final _duk_pnew = _duk_pnewPtr.asFunction, int)>(); @@ -4879,22 +4494,31 @@ class DuktapeBindings { int nargs, int nrets, ) { - return _duk_safe_call( - ctx, - func, - udata, - nargs, - nrets, - ); + return _duk_safe_call(ctx, func, udata, nargs, nrets); } late final _duk_safe_callPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, duk_safe_call_function, - ffi.Pointer, duk_idx_t, duk_idx_t)>>('duk_safe_call'); - late final _duk_safe_call = _duk_safe_callPtr.asFunction< - int Function(ffi.Pointer, duk_safe_call_function, - ffi.Pointer, int, int)>(); + ffi.NativeFunction< + duk_int_t Function( + ffi.Pointer, + duk_safe_call_function, + ffi.Pointer, + duk_idx_t, + duk_idx_t, + ) + > + >('duk_safe_call'); + late final _duk_safe_call = + _duk_safe_callPtr + .asFunction< + int Function( + ffi.Pointer, + duk_safe_call_function, + ffi.Pointer, + int, + int, + ) + >(); /// Compilation and evaluation int duk_eval_raw( @@ -4903,21 +4527,29 @@ class DuktapeBindings { int src_length, int flags, ) { - return _duk_eval_raw( - ctx, - src_buffer, - src_length, - flags, - ); + return _duk_eval_raw(ctx, src_buffer, src_length, flags); } late final _duk_eval_rawPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t, duk_uint_t)>>('duk_eval_raw'); - late final _duk_eval_raw = _duk_eval_rawPtr.asFunction< - int Function( - ffi.Pointer, ffi.Pointer, int, int)>(); + ffi.NativeFunction< + duk_int_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + duk_uint_t, + ) + > + >('duk_eval_raw'); + late final _duk_eval_raw = + _duk_eval_rawPtr + .asFunction< + int Function( + ffi.Pointer, + ffi.Pointer, + int, + int, + ) + >(); int duk_compile_raw( ffi.Pointer ctx, @@ -4925,65 +4557,67 @@ class DuktapeBindings { int src_length, int flags, ) { - return _duk_compile_raw( - ctx, - src_buffer, - src_length, - flags, - ); + return _duk_compile_raw(ctx, src_buffer, src_length, flags); } late final _duk_compile_rawPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t, duk_uint_t)>>('duk_compile_raw'); - late final _duk_compile_raw = _duk_compile_rawPtr.asFunction< - int Function( - ffi.Pointer, ffi.Pointer, int, int)>(); + ffi.NativeFunction< + duk_int_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + duk_uint_t, + ) + > + >('duk_compile_raw'); + late final _duk_compile_raw = + _duk_compile_rawPtr + .asFunction< + int Function( + ffi.Pointer, + ffi.Pointer, + int, + int, + ) + >(); /// Bytecode load/dump - void duk_dump_function( - ffi.Pointer ctx, - ) { - return _duk_dump_function( - ctx, - ); + void duk_dump_function(ffi.Pointer ctx) { + return _duk_dump_function(ctx); } late final _duk_dump_functionPtr = _lookup)>>( - 'duk_dump_function'); - late final _duk_dump_function = _duk_dump_functionPtr - .asFunction)>(); + 'duk_dump_function', + ); + late final _duk_dump_function = + _duk_dump_functionPtr + .asFunction)>(); - void duk_load_function( - ffi.Pointer ctx, - ) { - return _duk_load_function( - ctx, - ); + void duk_load_function(ffi.Pointer ctx) { + return _duk_load_function(ctx); } late final _duk_load_functionPtr = _lookup)>>( - 'duk_load_function'); - late final _duk_load_function = _duk_load_functionPtr - .asFunction)>(); + 'duk_load_function', + ); + late final _duk_load_function = + _duk_load_functionPtr + .asFunction)>(); /// Debugging - void duk_push_context_dump( - ffi.Pointer ctx, - ) { - return _duk_push_context_dump( - ctx, - ); + void duk_push_context_dump(ffi.Pointer ctx) { + return _duk_push_context_dump(ctx); } late final _duk_push_context_dumpPtr = _lookup)>>( - 'duk_push_context_dump'); - late final _duk_push_context_dump = _duk_push_context_dumpPtr - .asFunction)>(); + 'duk_push_context_dump', + ); + late final _duk_push_context_dump = + _duk_push_context_dumpPtr + .asFunction)>(); /// Debugger (debug protocol) void duk_debugger_attach( @@ -5011,8 +4645,24 @@ class DuktapeBindings { } late final _duk_debugger_attachPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_debug_read_function, + duk_debug_write_function, + duk_debug_peek_function, + duk_debug_read_flush_function, + duk_debug_write_flush_function, + duk_debug_request_function, + duk_debug_detached_function, + ffi.Pointer, + ) + > + >('duk_debugger_attach'); + late final _duk_debugger_attach = + _duk_debugger_attachPtr + .asFunction< + void Function( ffi.Pointer, duk_debug_read_function, duk_debug_write_function, @@ -5021,90 +4671,65 @@ class DuktapeBindings { duk_debug_write_flush_function, duk_debug_request_function, duk_debug_detached_function, - ffi.Pointer)>>('duk_debugger_attach'); - late final _duk_debugger_attach = _duk_debugger_attachPtr.asFunction< - void Function( - ffi.Pointer, - duk_debug_read_function, - duk_debug_write_function, - duk_debug_peek_function, - duk_debug_read_flush_function, - duk_debug_write_flush_function, - duk_debug_request_function, - duk_debug_detached_function, - ffi.Pointer)>(); - - void duk_debugger_detach( - ffi.Pointer ctx, - ) { - return _duk_debugger_detach( - ctx, - ); + ffi.Pointer, + ) + >(); + + void duk_debugger_detach(ffi.Pointer ctx) { + return _duk_debugger_detach(ctx); } late final _duk_debugger_detachPtr = _lookup)>>( - 'duk_debugger_detach'); - late final _duk_debugger_detach = _duk_debugger_detachPtr - .asFunction)>(); + 'duk_debugger_detach', + ); + late final _duk_debugger_detach = + _duk_debugger_detachPtr + .asFunction)>(); - void duk_debugger_cooperate( - ffi.Pointer ctx, - ) { - return _duk_debugger_cooperate( - ctx, - ); + void duk_debugger_cooperate(ffi.Pointer ctx) { + return _duk_debugger_cooperate(ctx); } late final _duk_debugger_cooperatePtr = _lookup)>>( - 'duk_debugger_cooperate'); - late final _duk_debugger_cooperate = _duk_debugger_cooperatePtr - .asFunction)>(); + 'duk_debugger_cooperate', + ); + late final _duk_debugger_cooperate = + _duk_debugger_cooperatePtr + .asFunction)>(); - int duk_debugger_notify( - ffi.Pointer ctx, - int nvalues, - ) { - return _duk_debugger_notify( - ctx, - nvalues, - ); + int duk_debugger_notify(ffi.Pointer ctx, int nvalues) { + return _duk_debugger_notify(ctx, nvalues); } late final _duk_debugger_notifyPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_debugger_notify'); - late final _duk_debugger_notify = _duk_debugger_notifyPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_debugger_notify'); + late final _duk_debugger_notify = + _duk_debugger_notifyPtr + .asFunction, int)>(); - void duk_debugger_pause( - ffi.Pointer ctx, - ) { - return _duk_debugger_pause( - ctx, - ); + void duk_debugger_pause(ffi.Pointer ctx) { + return _duk_debugger_pause(ctx); } late final _duk_debugger_pausePtr = _lookup)>>( - 'duk_debugger_pause'); - late final _duk_debugger_pause = _duk_debugger_pausePtr - .asFunction)>(); + 'duk_debugger_pause', + ); + late final _duk_debugger_pause = + _duk_debugger_pausePtr + .asFunction)>(); /// Time handling - double duk_get_now( - ffi.Pointer ctx, - ) { - return _duk_get_now( - ctx, - ); + double duk_get_now(ffi.Pointer ctx) { + return _duk_get_now(ctx); } late final _duk_get_nowPtr = _lookup< - ffi.NativeFunction)>>( - 'duk_get_now'); + ffi.NativeFunction)> + >('duk_get_now'); late final _duk_get_now = _duk_get_nowPtr.asFunction)>(); @@ -5113,38 +4738,51 @@ class DuktapeBindings { double timeval, ffi.Pointer comp, ) { - return _duk_time_to_components( - ctx, - timeval, - comp, - ); + return _duk_time_to_components(ctx, timeval, comp); } late final _duk_time_to_componentsPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_double_t, - ffi.Pointer)>>('duk_time_to_components'); - late final _duk_time_to_components = _duk_time_to_componentsPtr.asFunction< - void Function(ffi.Pointer, double, - ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_double_t, + ffi.Pointer, + ) + > + >('duk_time_to_components'); + late final _duk_time_to_components = + _duk_time_to_componentsPtr + .asFunction< + void Function( + ffi.Pointer, + double, + ffi.Pointer, + ) + >(); double duk_components_to_time( ffi.Pointer ctx, ffi.Pointer comp, ) { - return _duk_components_to_time( - ctx, - comp, - ); + return _duk_components_to_time(ctx, comp); } late final _duk_components_to_timePtr = _lookup< - ffi.NativeFunction< - duk_double_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_components_to_time'); - late final _duk_components_to_time = _duk_components_to_timePtr.asFunction< - double Function( - ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_double_t Function( + ffi.Pointer, + ffi.Pointer, + ) + > + >('duk_components_to_time'); + late final _duk_components_to_time = + _duk_components_to_timePtr + .asFunction< + double Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); } /// Public API specific typedefs @@ -5163,26 +4801,38 @@ final class duk_thread_state extends ffi.Struct { /// A few types are assumed to always exist. typedef duk_size_t = ffi.Size; typedef Dartduk_size_t = int; -typedef duk_alloc_functionFunction = ffi.Pointer Function( - ffi.Pointer udata, duk_size_t size); -typedef Dartduk_alloc_functionFunction = ffi.Pointer Function( - ffi.Pointer udata, Dartduk_size_t size); -typedef duk_alloc_function - = ffi.Pointer>; -typedef duk_realloc_functionFunction = ffi.Pointer Function( - ffi.Pointer udata, ffi.Pointer ptr, duk_size_t size); -typedef Dartduk_realloc_functionFunction = ffi.Pointer Function( - ffi.Pointer udata, - ffi.Pointer ptr, - Dartduk_size_t size); -typedef duk_realloc_function - = ffi.Pointer>; -typedef duk_free_functionFunction = ffi.Void Function( - ffi.Pointer udata, ffi.Pointer ptr); -typedef Dartduk_free_functionFunction = void Function( - ffi.Pointer udata, ffi.Pointer ptr); -typedef duk_free_function - = ffi.Pointer>; +typedef duk_alloc_functionFunction = + ffi.Pointer Function( + ffi.Pointer udata, + duk_size_t size, + ); +typedef Dartduk_alloc_functionFunction = + ffi.Pointer Function( + ffi.Pointer udata, + Dartduk_size_t size, + ); +typedef duk_alloc_function = + ffi.Pointer>; +typedef duk_realloc_functionFunction = + ffi.Pointer Function( + ffi.Pointer udata, + ffi.Pointer ptr, + duk_size_t size, + ); +typedef Dartduk_realloc_functionFunction = + ffi.Pointer Function( + ffi.Pointer udata, + ffi.Pointer ptr, + Dartduk_size_t size, + ); +typedef duk_realloc_function = + ffi.Pointer>; +typedef duk_free_functionFunction = + ffi.Void Function(ffi.Pointer udata, ffi.Pointer ptr); +typedef Dartduk_free_functionFunction = + void Function(ffi.Pointer udata, ffi.Pointer ptr); +typedef duk_free_function = + ffi.Pointer>; final class duk_memory_functions extends ffi.Struct { external duk_alloc_function alloc_func; @@ -5210,12 +4860,12 @@ final class duk_hthread extends ffi.Opaque {} /// 'struct duk_hthread' like the 'duk_hthread' typedef which is used /// exclusively in internals. typedef duk_context = duk_hthread; -typedef duk_c_functionFunction = duk_ret_t Function( - ffi.Pointer ctx); -typedef Dartduk_c_functionFunction = Dartduk_small_int_t Function( - ffi.Pointer ctx); -typedef duk_c_function - = ffi.Pointer>; +typedef duk_c_functionFunction = + duk_ret_t Function(ffi.Pointer ctx); +typedef Dartduk_c_functionFunction = + Dartduk_small_int_t Function(ffi.Pointer ctx); +typedef duk_c_function = + ffi.Pointer>; typedef duk_int_t = ffi.Int; typedef Dartduk_int_t = int; @@ -5275,12 +4925,12 @@ final class duk_time_components extends ffi.Struct { external double weekday; } -typedef duk_fatal_functionFunction = ffi.Void Function( - ffi.Pointer udata, ffi.Pointer msg); -typedef Dartduk_fatal_functionFunction = void Function( - ffi.Pointer udata, ffi.Pointer msg); -typedef duk_fatal_function - = ffi.Pointer>; +typedef duk_fatal_functionFunction = + ffi.Void Function(ffi.Pointer udata, ffi.Pointer msg); +typedef Dartduk_fatal_functionFunction = + void Function(ffi.Pointer udata, ffi.Pointer msg); +typedef duk_fatal_function = + ffi.Pointer>; /// Codepoint type. Must be 32 bits or more because it is used also for /// internal codepoints. The type is signed because negative codepoints @@ -5289,78 +4939,105 @@ typedef duk_fatal_function /// ensure duk_uint32_t casts back and forth nicely. Almost everything /// else uses the signed one. typedef duk_codepoint_t = duk_int_t; -typedef duk_decode_char_functionFunction = ffi.Void Function( - ffi.Pointer udata, duk_codepoint_t codepoint); -typedef Dartduk_decode_char_functionFunction = void Function( - ffi.Pointer udata, Dartduk_int_t codepoint); -typedef duk_decode_char_function - = ffi.Pointer>; -typedef duk_map_char_functionFunction = duk_codepoint_t Function( - ffi.Pointer udata, duk_codepoint_t codepoint); -typedef Dartduk_map_char_functionFunction = Dartduk_int_t Function( - ffi.Pointer udata, Dartduk_int_t codepoint); -typedef duk_map_char_function - = ffi.Pointer>; -typedef duk_safe_call_functionFunction = duk_ret_t Function( - ffi.Pointer ctx, ffi.Pointer udata); -typedef Dartduk_safe_call_functionFunction = Dartduk_small_int_t Function( - ffi.Pointer ctx, ffi.Pointer udata); -typedef duk_safe_call_function - = ffi.Pointer>; -typedef duk_debug_read_functionFunction = duk_size_t Function( - ffi.Pointer udata, - ffi.Pointer buffer, - duk_size_t length); -typedef Dartduk_debug_read_functionFunction = Dartduk_size_t Function( - ffi.Pointer udata, - ffi.Pointer buffer, - Dartduk_size_t length); -typedef duk_debug_read_function - = ffi.Pointer>; -typedef duk_debug_write_functionFunction = duk_size_t Function( - ffi.Pointer udata, - ffi.Pointer buffer, - duk_size_t length); -typedef Dartduk_debug_write_functionFunction = Dartduk_size_t Function( - ffi.Pointer udata, - ffi.Pointer buffer, - Dartduk_size_t length); -typedef duk_debug_write_function - = ffi.Pointer>; -typedef duk_debug_peek_functionFunction = duk_size_t Function( - ffi.Pointer udata); -typedef Dartduk_debug_peek_functionFunction = Dartduk_size_t Function( - ffi.Pointer udata); -typedef duk_debug_peek_function - = ffi.Pointer>; -typedef duk_debug_read_flush_functionFunction = ffi.Void Function( - ffi.Pointer udata); -typedef Dartduk_debug_read_flush_functionFunction = void Function( - ffi.Pointer udata); -typedef duk_debug_read_flush_function - = ffi.Pointer>; -typedef duk_debug_write_flush_functionFunction = ffi.Void Function( - ffi.Pointer udata); -typedef Dartduk_debug_write_flush_functionFunction = void Function( - ffi.Pointer udata); -typedef duk_debug_write_flush_function - = ffi.Pointer>; -typedef duk_debug_request_functionFunction = duk_idx_t Function( - ffi.Pointer ctx, - ffi.Pointer udata, - duk_idx_t nvalues); -typedef Dartduk_debug_request_functionFunction = Dartduk_int_t Function( - ffi.Pointer ctx, - ffi.Pointer udata, - Dartduk_int_t nvalues); -typedef duk_debug_request_function - = ffi.Pointer>; -typedef duk_debug_detached_functionFunction = ffi.Void Function( - ffi.Pointer ctx, ffi.Pointer udata); -typedef Dartduk_debug_detached_functionFunction = void Function( - ffi.Pointer ctx, ffi.Pointer udata); -typedef duk_debug_detached_function - = ffi.Pointer>; +typedef duk_decode_char_functionFunction = + ffi.Void Function(ffi.Pointer udata, duk_codepoint_t codepoint); +typedef Dartduk_decode_char_functionFunction = + void Function(ffi.Pointer udata, Dartduk_int_t codepoint); +typedef duk_decode_char_function = + ffi.Pointer>; +typedef duk_map_char_functionFunction = + duk_codepoint_t Function( + ffi.Pointer udata, + duk_codepoint_t codepoint, + ); +typedef Dartduk_map_char_functionFunction = + Dartduk_int_t Function( + ffi.Pointer udata, + Dartduk_int_t codepoint, + ); +typedef duk_map_char_function = + ffi.Pointer>; +typedef duk_safe_call_functionFunction = + duk_ret_t Function( + ffi.Pointer ctx, + ffi.Pointer udata, + ); +typedef Dartduk_safe_call_functionFunction = + Dartduk_small_int_t Function( + ffi.Pointer ctx, + ffi.Pointer udata, + ); +typedef duk_safe_call_function = + ffi.Pointer>; +typedef duk_debug_read_functionFunction = + duk_size_t Function( + ffi.Pointer udata, + ffi.Pointer buffer, + duk_size_t length, + ); +typedef Dartduk_debug_read_functionFunction = + Dartduk_size_t Function( + ffi.Pointer udata, + ffi.Pointer buffer, + Dartduk_size_t length, + ); +typedef duk_debug_read_function = + ffi.Pointer>; +typedef duk_debug_write_functionFunction = + duk_size_t Function( + ffi.Pointer udata, + ffi.Pointer buffer, + duk_size_t length, + ); +typedef Dartduk_debug_write_functionFunction = + Dartduk_size_t Function( + ffi.Pointer udata, + ffi.Pointer buffer, + Dartduk_size_t length, + ); +typedef duk_debug_write_function = + ffi.Pointer>; +typedef duk_debug_peek_functionFunction = + duk_size_t Function(ffi.Pointer udata); +typedef Dartduk_debug_peek_functionFunction = + Dartduk_size_t Function(ffi.Pointer udata); +typedef duk_debug_peek_function = + ffi.Pointer>; +typedef duk_debug_read_flush_functionFunction = + ffi.Void Function(ffi.Pointer udata); +typedef Dartduk_debug_read_flush_functionFunction = + void Function(ffi.Pointer udata); +typedef duk_debug_read_flush_function = + ffi.Pointer>; +typedef duk_debug_write_flush_functionFunction = + ffi.Void Function(ffi.Pointer udata); +typedef Dartduk_debug_write_flush_functionFunction = + void Function(ffi.Pointer udata); +typedef duk_debug_write_flush_function = + ffi.Pointer>; +typedef duk_debug_request_functionFunction = + duk_idx_t Function( + ffi.Pointer ctx, + ffi.Pointer udata, + duk_idx_t nvalues, + ); +typedef Dartduk_debug_request_functionFunction = + Dartduk_int_t Function( + ffi.Pointer ctx, + ffi.Pointer udata, + Dartduk_int_t nvalues, + ); +typedef duk_debug_request_function = + ffi.Pointer>; +typedef duk_debug_detached_functionFunction = + ffi.Void Function( + ffi.Pointer ctx, + ffi.Pointer udata, + ); +typedef Dartduk_debug_detached_functionFunction = + void Function(ffi.Pointer ctx, ffi.Pointer udata); +typedef duk_debug_detached_function = + ffi.Pointer>; typedef duk_uint_t = ffi.UnsignedInt; typedef Dartduk_uint_t = int; diff --git a/ffigen_codelab/step_06/lib/ffigen_app.dart b/ffigen_codelab/step_06/lib/ffigen_app.dart index 216f909a16..70bea9e3ef 100644 --- a/ffigen_codelab/step_06/lib/ffigen_app.dart +++ b/ffigen_codelab/step_06/lib/ffigen_app.dart @@ -29,8 +29,13 @@ final DuktapeBindings _bindings = DuktapeBindings(_dylib); class Duktape { Duktape() { - ctx = - _bindings.duk_create_heap(nullptr, nullptr, nullptr, nullptr, nullptr); + ctx = _bindings.duk_create_heap( + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + ); } void evalString(String jsCode) { @@ -40,15 +45,16 @@ class Duktape { var nativeUtf8 = jsCode.toNativeUtf8(); _bindings.duk_eval_raw( - ctx, - nativeUtf8.cast(), - 0, - 0 /*args*/ | - DUK_COMPILE_EVAL | - DUK_COMPILE_SAFE | - DUK_COMPILE_NOSOURCE | - DUK_COMPILE_STRLEN | - DUK_COMPILE_NOFILENAME); + ctx, + nativeUtf8.cast(), + 0, + 0 /*args*/ | + DUK_COMPILE_EVAL | + DUK_COMPILE_SAFE | + DUK_COMPILE_NOSOURCE | + DUK_COMPILE_STRLEN | + DUK_COMPILE_NOFILENAME, + ); ffi.malloc.free(nativeUtf8); } diff --git a/ffigen_codelab/step_06/lib/ffigen_app_bindings_generated.dart b/ffigen_codelab/step_06/lib/ffigen_app_bindings_generated.dart index 513983bf0c..b91a32288b 100644 --- a/ffigen_codelab/step_06/lib/ffigen_app_bindings_generated.dart +++ b/ffigen_codelab/step_06/lib/ffigen_app_bindings_generated.dart @@ -15,31 +15,24 @@ import 'dart:ffi' as ffi; class FfigenAppBindings { /// Holds the symbol lookup function. final ffi.Pointer Function(String symbolName) - _lookup; + _lookup; /// The symbols are looked up in [dynamicLibrary]. FfigenAppBindings(ffi.DynamicLibrary dynamicLibrary) - : _lookup = dynamicLibrary.lookup; + : _lookup = dynamicLibrary.lookup; /// The symbols are looked up with [lookup]. FfigenAppBindings.fromLookup( - ffi.Pointer Function(String symbolName) - lookup) - : _lookup = lookup; + ffi.Pointer Function(String symbolName) lookup, + ) : _lookup = lookup; /// A very short-lived native function. /// /// For very short-lived functions, it is fine to call them on the main isolate. /// They will block the Dart execution while running the native function, so /// only do this for native functions which are guaranteed to be short-lived. - int sum( - int a, - int b, - ) { - return _sum( - a, - b, - ); + int sum(int a, int b) { + return _sum(a, b); } late final _sumPtr = @@ -51,19 +44,14 @@ class FfigenAppBindings { /// Do not call these kind of native functions in the main isolate. They will /// block Dart execution. This will cause dropped frames in Flutter applications. /// Instead, call these native functions on a separate isolate. - int sum_long_running( - int a, - int b, - ) { - return _sum_long_running( - a, - b, - ); + int sum_long_running(int a, int b) { + return _sum_long_running(a, b); } late final _sum_long_runningPtr = _lookup>( - 'sum_long_running'); + 'sum_long_running', + ); late final _sum_long_running = _sum_long_runningPtr.asFunction(); } diff --git a/ffigen_codelab/step_06/pubspec.yaml b/ffigen_codelab/step_06/pubspec.yaml index 9628509bde..cb3df64592 100644 --- a/ffigen_codelab/step_06/pubspec.yaml +++ b/ffigen_codelab/step_06/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 homepage: environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 flutter: '>=3.3.0' dependencies: diff --git a/ffigen_codelab/step_07/android/build.gradle b/ffigen_codelab/step_07/android/build.gradle index 5681b7125e..adff069975 100644 --- a/ffigen_codelab/step_07/android/build.gradle +++ b/ffigen_codelab/step_07/android/build.gradle @@ -11,7 +11,7 @@ buildscript { dependencies { // The Android Gradle Plugin knows how to build native code with the NDK. - classpath("com.android.tools.build:gradle:8.1.0") + classpath("com.android.tools.build:gradle:8.7.0") } } diff --git a/ffigen_codelab/step_07/example/android/.gitignore b/ffigen_codelab/step_07/example/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/ffigen_codelab/step_07/example/android/.gitignore +++ b/ffigen_codelab/step_07/example/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/ffigen_codelab/step_07/example/android/app/build.gradle b/ffigen_codelab/step_07/example/android/app/build.gradle deleted file mode 100644 index 858c9239e7..0000000000 --- a/ffigen_codelab/step_07/example/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.ffigen_app_example" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.ffigen_app_example" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/ffigen_codelab/step_07/example/android/app/build.gradle.kts b/ffigen_codelab/step_07/example/android/app/build.gradle.kts new file mode 100644 index 0000000000..1de7c631eb --- /dev/null +++ b/ffigen_codelab/step_07/example/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.ffigen_app_example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.ffigen_app_example" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/ffigen_codelab/step_07/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt b/ffigen_codelab/step_07/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt index bd55dde018..68b7000537 100644 --- a/ffigen_codelab/step_07/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt +++ b/ffigen_codelab/step_07/example/android/app/src/main/kotlin/com/example/ffigen_app_example/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.ffigen_app_example import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/ffigen_codelab/step_07/example/android/build.gradle b/ffigen_codelab/step_07/example/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/ffigen_codelab/step_07/example/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/ffigen_codelab/step_07/example/android/build.gradle.kts b/ffigen_codelab/step_07/example/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/ffigen_codelab/step_07/example/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/ffigen_codelab/step_07/example/android/gradle.properties b/ffigen_codelab/step_07/example/android/gradle.properties index 2597170821..f018a61817 100644 --- a/ffigen_codelab/step_07/example/android/gradle.properties +++ b/ffigen_codelab/step_07/example/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/ffigen_codelab/step_07/example/android/gradle/wrapper/gradle-wrapper.properties b/ffigen_codelab/step_07/example/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/ffigen_codelab/step_07/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/ffigen_codelab/step_07/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/ffigen_codelab/step_07/example/android/settings.gradle b/ffigen_codelab/step_07/example/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/ffigen_codelab/step_07/example/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/ffigen_codelab/step_07/example/android/settings.gradle.kts b/ffigen_codelab/step_07/example/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/ffigen_codelab/step_07/example/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/ffigen_codelab/step_07/example/ios/Podfile b/ffigen_codelab/step_07/example/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/ffigen_codelab/step_07/example/ios/Podfile +++ b/ffigen_codelab/step_07/example/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/ffigen_codelab/step_07/example/ios/Runner.xcodeproj/project.pbxproj b/ffigen_codelab/step_07/example/ios/Runner.xcodeproj/project.pbxproj index 11b35beabb..5dce0dac38 100644 --- a/ffigen_codelab/step_07/example/ios/Runner.xcodeproj/project.pbxproj +++ b/ffigen_codelab/step_07/example/ios/Runner.xcodeproj/project.pbxproj @@ -9,13 +9,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 37B5EBBBFAF9E53C5A5A3131 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C70BDB27F55A3ED8E56180C /* Pods_Runner.framework */; }; + 384D477FC90E5FE14FBB9C9B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F7D2ACBE41A96778898A158E /* Pods_RunnerTests.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3BAAB801B363D2B5694697C8 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 41BA389D069B869AD7889B4B /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B5A497559709EA1F295B2ABD /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D792A817A1AC422F6F9C82 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,60 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0A699E5B0E4355A13752C564 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 13B01B12CFE1D25EDCCA52CD /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 27D792A817A1AC422F6F9C82 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 39EB4D0DC80E04DEDEE47517 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 41BA389D069B869AD7889B4B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 64E59BF5AFBD791B75DE2717 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 72FD69CE914A569D374BC284 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 4E0F56AF76441046B2E429BD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 54C2C7FEA9C49D833A007720 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 65357106E0D2E41A618094B3 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6C70BDB27F55A3ED8E56180C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7DC789C88302A0F93C36C132 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 93A1F1522D2E02875F57A767 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 975C3FBFA1212BE1989BBAEF /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A86DC62688E59DEB11E5C544 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + F7D2ACBE41A96778898A158E /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 6D670872593D25878C4487BA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3BAAB801B363D2B5694697C8 /* Pods_Runner.framework in Frameworks */, + 384D477FC90E5FE14FBB9C9B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - D96534983B06C1B866173361 /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B5A497559709EA1F295B2ABD /* Pods_RunnerTests.framework in Frameworks */, + 37B5EBBBFAF9E53C5A5A3131 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 1464C4D9E37A8A538102B8DD /* Pods */ = { + 29FB55DB424944C14D3275A3 /* Pods */ = { isa = PBXGroup; children = ( - 72FD69CE914A569D374BC284 /* Pods-Runner.debug.xcconfig */, - 39EB4D0DC80E04DEDEE47517 /* Pods-Runner.release.xcconfig */, - A86DC62688E59DEB11E5C544 /* Pods-Runner.profile.xcconfig */, - 64E59BF5AFBD791B75DE2717 /* Pods-RunnerTests.debug.xcconfig */, - 7DC789C88302A0F93C36C132 /* Pods-RunnerTests.release.xcconfig */, - 0A699E5B0E4355A13752C564 /* Pods-RunnerTests.profile.xcconfig */, + 65357106E0D2E41A618094B3 /* Pods-Runner.debug.xcconfig */, + 93A1F1522D2E02875F57A767 /* Pods-Runner.release.xcconfig */, + 54C2C7FEA9C49D833A007720 /* Pods-Runner.profile.xcconfig */, + 13B01B12CFE1D25EDCCA52CD /* Pods-RunnerTests.debug.xcconfig */, + 975C3FBFA1212BE1989BBAEF /* Pods-RunnerTests.release.xcconfig */, + 4E0F56AF76441046B2E429BD /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -109,6 +109,15 @@ path = RunnerTests; sourceTree = ""; }; + 8A7B53D318FBA4992925932E /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6C70BDB27F55A3ED8E56180C /* Pods_Runner.framework */, + F7D2ACBE41A96778898A158E /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -127,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 1464C4D9E37A8A538102B8DD /* Pods */, - C96CA1F9B39CF12E68595C76 /* Frameworks */, + 29FB55DB424944C14D3275A3 /* Pods */, + 8A7B53D318FBA4992925932E /* Frameworks */, ); sourceTree = ""; }; @@ -156,15 +165,6 @@ path = Runner; sourceTree = ""; }; - C96CA1F9B39CF12E68595C76 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 41BA389D069B869AD7889B4B /* Pods_Runner.framework */, - 27D792A817A1AC422F6F9C82 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - C76428869724CEC2AD1B9656 /* [CP] Check Pods Manifest.lock */, + 021DCD7A722AB071A5C77AE8 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - D96534983B06C1B866173361 /* Frameworks */, + 6D670872593D25878C4487BA /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - C869F8CB0B0F18B822D29CD3 /* [CP] Check Pods Manifest.lock */, + ADFFF2E0D804F0B8A1446142 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 033E03FC98E5610670E4DB03 /* [CP] Embed Pods Frameworks */, + E14EC01F727DBDDB3D4D083C /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,21 +270,26 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 033E03FC98E5610670E4DB03 /* [CP] Embed Pods Frameworks */ = { + 021DCD7A722AB071A5C77AE8 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { @@ -318,7 +323,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - C76428869724CEC2AD1B9656 /* [CP] Check Pods Manifest.lock */ = { + ADFFF2E0D804F0B8A1446142 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -333,33 +338,28 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C869F8CB0B0F18B822D29CD3 /* [CP] Check Pods Manifest.lock */ = { + E14EC01F727DBDDB3D4D083C /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 64E59BF5AFBD791B75DE2717 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 13B01B12CFE1D25EDCCA52CD /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7DC789C88302A0F93C36C132 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 975C3FBFA1212BE1989BBAEF /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0A699E5B0E4355A13752C564 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4E0F56AF76441046B2E429BD /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/ffigen_codelab/step_07/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ffigen_codelab/step_07/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/ffigen_codelab/step_07/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ffigen_codelab/step_07/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/ffigen_codelab/step_07/example/lib/duktape_message.freezed.dart b/ffigen_codelab/step_07/example/lib/duktape_message.freezed.dart index 8e309d94ba..43dd321f08 100644 --- a/ffigen_codelab/step_07/example/lib/duktape_message.freezed.dart +++ b/ffigen_codelab/step_07/example/lib/duktape_message.freezed.dart @@ -12,7 +12,8 @@ part of 'duktape_message.dart'; T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models', +); /// @nodoc mixin _$DuktapeMessage { @@ -21,52 +22,47 @@ mixin _$DuktapeMessage { required TResult Function(String code) evaluate, required TResult Function(String result) response, required TResult Function(String log) error, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ TResult? Function(String code)? evaluate, TResult? Function(String result)? response, TResult? Function(String log)? error, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ TResult Function(String code)? evaluate, TResult Function(String result)? response, TResult Function(String log)? error, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult map({ required TResult Function(DuktapeMessageCode value) evaluate, required TResult Function(DuktapeMessageResponse value) response, required TResult Function(DuktapeMessageError value) error, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ TResult? Function(DuktapeMessageCode value)? evaluate, TResult? Function(DuktapeMessageResponse value)? response, TResult? Function(DuktapeMessageError value)? error, - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeMap({ TResult Function(DuktapeMessageCode value)? evaluate, TResult Function(DuktapeMessageResponse value)? response, TResult Function(DuktapeMessageError value)? error, required TResult orElse(), - }) => - throw _privateConstructorUsedError; + }) => throw _privateConstructorUsedError; } /// @nodoc abstract class $DuktapeMessageCopyWith<$Res> { factory $DuktapeMessageCopyWith( - DuktapeMessage value, $Res Function(DuktapeMessage) then) = - _$DuktapeMessageCopyWithImpl<$Res, DuktapeMessage>; + DuktapeMessage value, + $Res Function(DuktapeMessage) then, + ) = _$DuktapeMessageCopyWithImpl<$Res, DuktapeMessage>; } /// @nodoc @@ -85,9 +81,10 @@ class _$DuktapeMessageCopyWithImpl<$Res, $Val extends DuktapeMessage> /// @nodoc abstract class _$$DuktapeMessageCodeImplCopyWith<$Res> { - factory _$$DuktapeMessageCodeImplCopyWith(_$DuktapeMessageCodeImpl value, - $Res Function(_$DuktapeMessageCodeImpl) then) = - __$$DuktapeMessageCodeImplCopyWithImpl<$Res>; + factory _$$DuktapeMessageCodeImplCopyWith( + _$DuktapeMessageCodeImpl value, + $Res Function(_$DuktapeMessageCodeImpl) then, + ) = __$$DuktapeMessageCodeImplCopyWithImpl<$Res>; @useResult $Res call({String code}); } @@ -96,23 +93,24 @@ abstract class _$$DuktapeMessageCodeImplCopyWith<$Res> { class __$$DuktapeMessageCodeImplCopyWithImpl<$Res> extends _$DuktapeMessageCopyWithImpl<$Res, _$DuktapeMessageCodeImpl> implements _$$DuktapeMessageCodeImplCopyWith<$Res> { - __$$DuktapeMessageCodeImplCopyWithImpl(_$DuktapeMessageCodeImpl _value, - $Res Function(_$DuktapeMessageCodeImpl) _then) - : super(_value, _then); + __$$DuktapeMessageCodeImplCopyWithImpl( + _$DuktapeMessageCodeImpl _value, + $Res Function(_$DuktapeMessageCodeImpl) _then, + ) : super(_value, _then); /// Create a copy of DuktapeMessage /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? code = null, - }) { - return _then(_$DuktapeMessageCodeImpl( - null == code - ? _value.code - : code // ignore: cast_nullable_to_non_nullable - as String, - )); + $Res call({Object? code = null}) { + return _then( + _$DuktapeMessageCodeImpl( + null == code + ? _value.code + : code // ignore: cast_nullable_to_non_nullable + as String, + ), + ); } } @@ -147,7 +145,9 @@ class _$DuktapeMessageCodeImpl implements DuktapeMessageCode { @pragma('vm:prefer-inline') _$$DuktapeMessageCodeImplCopyWith<_$DuktapeMessageCodeImpl> get copyWith => __$$DuktapeMessageCodeImplCopyWithImpl<_$DuktapeMessageCodeImpl>( - this, _$identity); + this, + _$identity, + ); @override @optionalTypeArgs @@ -233,9 +233,9 @@ abstract class DuktapeMessageCode implements DuktapeMessage { /// @nodoc abstract class _$$DuktapeMessageResponseImplCopyWith<$Res> { factory _$$DuktapeMessageResponseImplCopyWith( - _$DuktapeMessageResponseImpl value, - $Res Function(_$DuktapeMessageResponseImpl) then) = - __$$DuktapeMessageResponseImplCopyWithImpl<$Res>; + _$DuktapeMessageResponseImpl value, + $Res Function(_$DuktapeMessageResponseImpl) then, + ) = __$$DuktapeMessageResponseImplCopyWithImpl<$Res>; @useResult $Res call({String result}); } @@ -245,23 +245,23 @@ class __$$DuktapeMessageResponseImplCopyWithImpl<$Res> extends _$DuktapeMessageCopyWithImpl<$Res, _$DuktapeMessageResponseImpl> implements _$$DuktapeMessageResponseImplCopyWith<$Res> { __$$DuktapeMessageResponseImplCopyWithImpl( - _$DuktapeMessageResponseImpl _value, - $Res Function(_$DuktapeMessageResponseImpl) _then) - : super(_value, _then); + _$DuktapeMessageResponseImpl _value, + $Res Function(_$DuktapeMessageResponseImpl) _then, + ) : super(_value, _then); /// Create a copy of DuktapeMessage /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? result = null, - }) { - return _then(_$DuktapeMessageResponseImpl( - null == result - ? _value.result - : result // ignore: cast_nullable_to_non_nullable - as String, - )); + $Res call({Object? result = null}) { + return _then( + _$DuktapeMessageResponseImpl( + null == result + ? _value.result + : result // ignore: cast_nullable_to_non_nullable + as String, + ), + ); } } @@ -295,8 +295,11 @@ class _$DuktapeMessageResponseImpl implements DuktapeMessageResponse { @override @pragma('vm:prefer-inline') _$$DuktapeMessageResponseImplCopyWith<_$DuktapeMessageResponseImpl> - get copyWith => __$$DuktapeMessageResponseImplCopyWithImpl< - _$DuktapeMessageResponseImpl>(this, _$identity); + get copyWith => + __$$DuktapeMessageResponseImplCopyWithImpl<_$DuktapeMessageResponseImpl>( + this, + _$identity, + ); @override @optionalTypeArgs @@ -377,14 +380,15 @@ abstract class DuktapeMessageResponse implements DuktapeMessage { /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) _$$DuktapeMessageResponseImplCopyWith<_$DuktapeMessageResponseImpl> - get copyWith => throw _privateConstructorUsedError; + get copyWith => throw _privateConstructorUsedError; } /// @nodoc abstract class _$$DuktapeMessageErrorImplCopyWith<$Res> { - factory _$$DuktapeMessageErrorImplCopyWith(_$DuktapeMessageErrorImpl value, - $Res Function(_$DuktapeMessageErrorImpl) then) = - __$$DuktapeMessageErrorImplCopyWithImpl<$Res>; + factory _$$DuktapeMessageErrorImplCopyWith( + _$DuktapeMessageErrorImpl value, + $Res Function(_$DuktapeMessageErrorImpl) then, + ) = __$$DuktapeMessageErrorImplCopyWithImpl<$Res>; @useResult $Res call({String log}); } @@ -393,23 +397,24 @@ abstract class _$$DuktapeMessageErrorImplCopyWith<$Res> { class __$$DuktapeMessageErrorImplCopyWithImpl<$Res> extends _$DuktapeMessageCopyWithImpl<$Res, _$DuktapeMessageErrorImpl> implements _$$DuktapeMessageErrorImplCopyWith<$Res> { - __$$DuktapeMessageErrorImplCopyWithImpl(_$DuktapeMessageErrorImpl _value, - $Res Function(_$DuktapeMessageErrorImpl) _then) - : super(_value, _then); + __$$DuktapeMessageErrorImplCopyWithImpl( + _$DuktapeMessageErrorImpl _value, + $Res Function(_$DuktapeMessageErrorImpl) _then, + ) : super(_value, _then); /// Create a copy of DuktapeMessage /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override - $Res call({ - Object? log = null, - }) { - return _then(_$DuktapeMessageErrorImpl( - null == log - ? _value.log - : log // ignore: cast_nullable_to_non_nullable - as String, - )); + $Res call({Object? log = null}) { + return _then( + _$DuktapeMessageErrorImpl( + null == log + ? _value.log + : log // ignore: cast_nullable_to_non_nullable + as String, + ), + ); } } @@ -444,7 +449,9 @@ class _$DuktapeMessageErrorImpl implements DuktapeMessageError { @pragma('vm:prefer-inline') _$$DuktapeMessageErrorImplCopyWith<_$DuktapeMessageErrorImpl> get copyWith => __$$DuktapeMessageErrorImplCopyWithImpl<_$DuktapeMessageErrorImpl>( - this, _$identity); + this, + _$identity, + ); @override @optionalTypeArgs diff --git a/ffigen_codelab/step_07/example/lib/main.dart b/ffigen_codelab/step_07/example/lib/main.dart index 4f403f3d00..61c431dff4 100644 --- a/ffigen_codelab/step_07/example/lib/main.dart +++ b/ffigen_codelab/step_07/example/lib/main.dart @@ -15,31 +15,22 @@ void main() { final duktapeMessagesProvider = StateNotifierProvider>((ref) { - return DuktapeMessageNotifier(messages: []); -}); + return DuktapeMessageNotifier(messages: []); + }); class DuktapeMessageNotifier extends StateNotifier> { DuktapeMessageNotifier({required List messages}) - : duktape = Duktape(), - super(messages); + : duktape = Duktape(), + super(messages); final Duktape duktape; void eval(String code) { - state = [ - DuktapeMessage.evaluate(code), - ...state, - ]; + state = [DuktapeMessage.evaluate(code), ...state]; try { final response = duktape.evalString(code); - state = [ - DuktapeMessage.response(response), - ...state, - ]; + state = [DuktapeMessage.response(response), ...state]; } catch (e) { - state = [ - DuktapeMessage.error('$e'), - ...state, - ]; + state = [DuktapeMessage.error('$e'), ...state]; } } } @@ -49,17 +40,12 @@ class DuktapeApp extends StatelessWidget { @override Widget build(BuildContext context) { - return const MaterialApp( - title: 'Duktape App', - home: DuktapeRepl(), - ); + return const MaterialApp(title: 'Duktape App', home: DuktapeRepl()); } } class DuktapeRepl extends ConsumerStatefulWidget { - const DuktapeRepl({ - super.key, - }); + const DuktapeRepl({super.key}); @override ConsumerState createState() => _DuktapeReplState(); @@ -100,38 +86,45 @@ class _DuktapeReplState extends ConsumerState { child: ListView.builder( padding: const EdgeInsets.all(8.0), reverse: true, - itemBuilder: (context, idx) => messages[idx].when( - evaluate: (str) => Padding( - padding: const EdgeInsets.symmetric(vertical: 2), - child: Text( - '> $str', - style: GoogleFonts.firaCode( - textStyle: Theme.of(context).textTheme.titleMedium, - ), - ), - ), - response: (str) => Padding( - padding: const EdgeInsets.symmetric(vertical: 2), - child: Text( - '= $str', - style: GoogleFonts.firaCode( - textStyle: Theme.of(context).textTheme.titleMedium, - color: Colors.blue[800], - ), + itemBuilder: + (context, idx) => messages[idx].when( + evaluate: + (str) => Padding( + padding: const EdgeInsets.symmetric(vertical: 2), + child: Text( + '> $str', + style: GoogleFonts.firaCode( + textStyle: + Theme.of(context).textTheme.titleMedium, + ), + ), + ), + response: + (str) => Padding( + padding: const EdgeInsets.symmetric(vertical: 2), + child: Text( + '= $str', + style: GoogleFonts.firaCode( + textStyle: + Theme.of(context).textTheme.titleMedium, + color: Colors.blue[800], + ), + ), + ), + error: + (str) => Padding( + padding: const EdgeInsets.symmetric(vertical: 2), + child: Text( + str, + style: GoogleFonts.firaCode( + textStyle: + Theme.of(context).textTheme.titleSmall, + color: Colors.red[800], + fontWeight: FontWeight.bold, + ), + ), + ), ), - ), - error: (str) => Padding( - padding: const EdgeInsets.symmetric(vertical: 2), - child: Text( - str, - style: GoogleFonts.firaCode( - textStyle: Theme.of(context).textTheme.titleSmall, - color: Colors.red[800], - fontWeight: FontWeight.bold, - ), - ), - ), - ), itemCount: messages.length, ), ), @@ -162,9 +155,7 @@ class _DuktapeReplState extends ConsumerState { Flexible( child: TextField( controller: _controller, - decoration: const InputDecoration( - border: InputBorder.none, - ), + decoration: const InputDecoration(border: InputBorder.none), onChanged: (text) { setState(() { _isComposing = text.isNotEmpty; @@ -178,9 +169,10 @@ class _DuktapeReplState extends ConsumerState { margin: const EdgeInsets.symmetric(horizontal: 4.0), child: IconButton( icon: const Icon(Icons.send), - onPressed: _isComposing - ? () => _handleSubmitted(_controller.text) - : null, + onPressed: + _isComposing + ? () => _handleSubmitted(_controller.text) + : null, ), ), ], diff --git a/ffigen_codelab/step_07/example/macos/Podfile b/ffigen_codelab/step_07/example/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/ffigen_codelab/step_07/example/macos/Podfile +++ b/ffigen_codelab/step_07/example/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/ffigen_codelab/step_07/example/macos/Runner.xcodeproj/project.pbxproj b/ffigen_codelab/step_07/example/macos/Runner.xcodeproj/project.pbxproj index ca42e7ff4c..5aef7e5f5c 100644 --- a/ffigen_codelab/step_07/example/macos/Runner.xcodeproj/project.pbxproj +++ b/ffigen_codelab/step_07/example/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E0ABE5351EEC7064797E354 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB2E266604615E92796CF34F /* Pods_RunnerTests.framework */; }; + 1C8C89059489393A675CDD46 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C551CF74C447A27874F18AB /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 70D6F45F50A4EDBF85FE4580 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7DB609CA69926401ABE9640 /* Pods_Runner.framework */; }; + FD4F6A6ABF567B438B51441E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0367DD23E825595062E6435 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -78,16 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3FFEEF5A6FD917D69A212B0A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 5FDA6842E56F0C007A1996D4 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6675D4608C63F4E732E35408 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 66DCEB8DA3900A335B5DA07B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6C551CF74C447A27874F18AB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 86211CEC0D1790FBE3C5D8B2 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9A0BF02ED47D73F7064B0917 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 9E9EF64C35AAAA3602964AA7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - A7DB609CA69926401ABE9640 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AB2E266604615E92796CF34F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F19E5B3C65EA370F013BE716 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - FBAE80B05D89C5D84D5C03B4 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + A2F46067E2A9A5E15A5EAD4B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + B0367DD23E825595062E6435 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CB3D46D2C93EC7C2706356FA /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + E738C84FF92335A6E75E26E3 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E0ABE5351EEC7064797E354 /* Pods_RunnerTests.framework in Frameworks */, + FD4F6A6ABF567B438B51441E /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 70D6F45F50A4EDBF85FE4580 /* Pods_Runner.framework in Frameworks */, + 1C8C89059489393A675CDD46 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A7A0BE3105C149DB55691A21 /* Pods */, + 88DCA9F60F99C8938CB33876 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - A7A0BE3105C149DB55691A21 /* Pods */ = { + 88DCA9F60F99C8938CB33876 /* Pods */ = { isa = PBXGroup; children = ( - FBAE80B05D89C5D84D5C03B4 /* Pods-Runner.debug.xcconfig */, - 3FFEEF5A6FD917D69A212B0A /* Pods-Runner.release.xcconfig */, - 9A0BF02ED47D73F7064B0917 /* Pods-Runner.profile.xcconfig */, - F19E5B3C65EA370F013BE716 /* Pods-RunnerTests.debug.xcconfig */, - 5FDA6842E56F0C007A1996D4 /* Pods-RunnerTests.release.xcconfig */, - 9E9EF64C35AAAA3602964AA7 /* Pods-RunnerTests.profile.xcconfig */, + A2F46067E2A9A5E15A5EAD4B /* Pods-Runner.debug.xcconfig */, + CB3D46D2C93EC7C2706356FA /* Pods-Runner.release.xcconfig */, + E738C84FF92335A6E75E26E3 /* Pods-Runner.profile.xcconfig */, + 66DCEB8DA3900A335B5DA07B /* Pods-RunnerTests.debug.xcconfig */, + 6675D4608C63F4E732E35408 /* Pods-RunnerTests.release.xcconfig */, + 86211CEC0D1790FBE3C5D8B2 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - A7DB609CA69926401ABE9640 /* Pods_Runner.framework */, - AB2E266604615E92796CF34F /* Pods_RunnerTests.framework */, + 6C551CF74C447A27874F18AB /* Pods_Runner.framework */, + B0367DD23E825595062E6435 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1E3C02A919DB5D8E5C62924B /* [CP] Check Pods Manifest.lock */, + 8C407044D2CDDF53A9D3AC56 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - CDB523A6B35188D3F64E8B1A /* [CP] Check Pods Manifest.lock */, + C852338EF94F000CBCF7D11F /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - D6EA5EEBFAD504A5C6262391 /* [CP] Embed Pods Frameworks */, + EE4863E2E4723B3A412B4656 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,67 +323,67 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 1E3C02A919DB5D8E5C62924B /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 8C407044D2CDDF53A9D3AC56 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - CDB523A6B35188D3F64E8B1A /* [CP] Check Pods Manifest.lock */ = { + C852338EF94F000CBCF7D11F /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,7 +405,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - D6EA5EEBFAD504A5C6262391 /* [CP] Embed Pods Frameworks */ = { + EE4863E2E4723B3A412B4656 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F19E5B3C65EA370F013BE716 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 66DCEB8DA3900A335B5DA07B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5FDA6842E56F0C007A1996D4 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 6675D4608C63F4E732E35408 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9E9EF64C35AAAA3602964AA7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 86211CEC0D1790FBE3C5D8B2 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/ffigen_codelab/step_07/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ffigen_codelab/step_07/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index ec6dd3f545..add807ea9a 100644 --- a/ffigen_codelab/step_07/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ffigen_codelab/step_07/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/ffigen_codelab/step_07/example/pubspec.yaml b/ffigen_codelab/step_07/example/pubspec.yaml index 2b16b20627..586bee839a 100644 --- a/ffigen_codelab/step_07/example/pubspec.yaml +++ b/ffigen_codelab/step_07/example/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/ffigen_codelab/step_07/lib/duktape_bindings_generated.dart b/ffigen_codelab/step_07/lib/duktape_bindings_generated.dart index d7df5e2909..0eb041df40 100644 --- a/ffigen_codelab/step_07/lib/duktape_bindings_generated.dart +++ b/ffigen_codelab/step_07/lib/duktape_bindings_generated.dart @@ -15,17 +15,16 @@ import 'dart:ffi' as ffi; class DuktapeBindings { /// Holds the symbol lookup function. final ffi.Pointer Function(String symbolName) - _lookup; + _lookup; /// The symbols are looked up in [dynamicLibrary]. DuktapeBindings(ffi.DynamicLibrary dynamicLibrary) - : _lookup = dynamicLibrary.lookup; + : _lookup = dynamicLibrary.lookup; /// The symbols are looked up with [lookup]. DuktapeBindings.fromLookup( - ffi.Pointer Function(String symbolName) - lookup) - : _lookup = lookup; + ffi.Pointer Function(String symbolName) lookup, + ) : _lookup = lookup; /// Context management ffi.Pointer duk_create_heap( @@ -45,226 +44,241 @@ class DuktapeBindings { } late final _duk_create_heapPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + duk_alloc_function, + duk_realloc_function, + duk_free_function, + ffi.Pointer, + duk_fatal_function, + ) + > + >('duk_create_heap'); + late final _duk_create_heap = + _duk_create_heapPtr + .asFunction< + ffi.Pointer Function( duk_alloc_function, duk_realloc_function, duk_free_function, ffi.Pointer, - duk_fatal_function)>>('duk_create_heap'); - late final _duk_create_heap = _duk_create_heapPtr.asFunction< - ffi.Pointer Function( - duk_alloc_function, - duk_realloc_function, - duk_free_function, - ffi.Pointer, - duk_fatal_function)>(); + duk_fatal_function, + ) + >(); - void duk_destroy_heap( - ffi.Pointer ctx, - ) { - return _duk_destroy_heap( - ctx, - ); + void duk_destroy_heap(ffi.Pointer ctx) { + return _duk_destroy_heap(ctx); } late final _duk_destroy_heapPtr = _lookup)>>( - 'duk_destroy_heap'); - late final _duk_destroy_heap = _duk_destroy_heapPtr - .asFunction)>(); + 'duk_destroy_heap', + ); + late final _duk_destroy_heap = + _duk_destroy_heapPtr + .asFunction)>(); void duk_suspend( ffi.Pointer ctx, ffi.Pointer state, ) { - return _duk_suspend( - ctx, - state, - ); + return _duk_suspend(ctx, state); } late final _duk_suspendPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_suspend'); - late final _duk_suspend = _duk_suspendPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_suspend'); + late final _duk_suspend = + _duk_suspendPtr + .asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); void duk_resume( ffi.Pointer ctx, ffi.Pointer state, ) { - return _duk_resume( - ctx, - state, - ); + return _duk_resume(ctx, state); } late final _duk_resumePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_resume'); - late final _duk_resume = _duk_resumePtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_resume'); + late final _duk_resume = + _duk_resumePtr + .asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); /// Memory management /// /// Raw functions have no side effects (cannot trigger GC). - ffi.Pointer duk_alloc_raw( - ffi.Pointer ctx, - int size, - ) { - return _duk_alloc_raw( - ctx, - size, - ); + ffi.Pointer duk_alloc_raw(ffi.Pointer ctx, int size) { + return _duk_alloc_raw(ctx, size); } late final _duk_alloc_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_size_t)>>('duk_alloc_raw'); - late final _duk_alloc_raw = _duk_alloc_rawPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_size_t) + > + >('duk_alloc_raw'); + late final _duk_alloc_raw = + _duk_alloc_rawPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_free_raw( - ffi.Pointer ctx, - ffi.Pointer ptr, - ) { - return _duk_free_raw( - ctx, - ptr, - ); + void duk_free_raw(ffi.Pointer ctx, ffi.Pointer ptr) { + return _duk_free_raw(ctx, ptr); } late final _duk_free_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_free_raw'); - late final _duk_free_raw = _duk_free_rawPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_free_raw'); + late final _duk_free_raw = + _duk_free_rawPtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); ffi.Pointer duk_realloc_raw( ffi.Pointer ctx, ffi.Pointer ptr, int size, ) { - return _duk_realloc_raw( - ctx, - ptr, - size, - ); + return _duk_realloc_raw(ctx, ptr, size); } late final _duk_realloc_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, duk_size_t)>>('duk_realloc_raw'); - late final _duk_realloc_raw = _duk_realloc_rawPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_realloc_raw'); + late final _duk_realloc_raw = + _duk_realloc_rawPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); - ffi.Pointer duk_alloc( - ffi.Pointer ctx, - int size, - ) { - return _duk_alloc( - ctx, - size, - ); + ffi.Pointer duk_alloc(ffi.Pointer ctx, int size) { + return _duk_alloc(ctx, size); } late final _duk_allocPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_size_t)>>('duk_alloc'); - late final _duk_alloc = _duk_allocPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_size_t) + > + >('duk_alloc'); + late final _duk_alloc = + _duk_allocPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_free( - ffi.Pointer ctx, - ffi.Pointer ptr, - ) { - return _duk_free( - ctx, - ptr, - ); + void duk_free(ffi.Pointer ctx, ffi.Pointer ptr) { + return _duk_free(ctx, ptr); } late final _duk_freePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, ffi.Pointer)>>('duk_free'); - late final _duk_free = _duk_freePtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_free'); + late final _duk_free = + _duk_freePtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); ffi.Pointer duk_realloc( ffi.Pointer ctx, ffi.Pointer ptr, int size, ) { - return _duk_realloc( - ctx, - ptr, - size, - ); + return _duk_realloc(ctx, ptr, size); } late final _duk_reallocPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, duk_size_t)>>('duk_realloc'); - late final _duk_realloc = _duk_reallocPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_realloc'); + late final _duk_realloc = + _duk_reallocPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); void duk_get_memory_functions( ffi.Pointer ctx, ffi.Pointer out_funcs, ) { - return _duk_get_memory_functions( - ctx, - out_funcs, - ); + return _duk_get_memory_functions(ctx, out_funcs); } late final _duk_get_memory_functionsPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_get_memory_functions'); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ) + > + >('duk_get_memory_functions'); late final _duk_get_memory_functions = - _duk_get_memory_functionsPtr.asFunction< - void Function( - ffi.Pointer, ffi.Pointer)>(); + _duk_get_memory_functionsPtr + .asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); - void duk_gc( - ffi.Pointer ctx, - int flags, - ) { - return _duk_gc( - ctx, - flags, - ); + void duk_gc(ffi.Pointer ctx, int flags) { + return _duk_gc(ctx, flags); } late final _duk_gcPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_uint_t)>>('duk_gc'); + ffi.NativeFunction, duk_uint_t)> + >('duk_gc'); late final _duk_gc = _duk_gcPtr.asFunction, int)>(); - void duk_throw_raw( - ffi.Pointer ctx, - ) { - return _duk_throw_raw( - ctx, - ); + void duk_throw_raw(ffi.Pointer ctx) { + return _duk_throw_raw(ctx); } late final _duk_throw_rawPtr = _lookup)>>( - 'duk_throw_raw'); + 'duk_throw_raw', + ); late final _duk_throw_raw = _duk_throw_rawPtr.asFunction)>(); @@ -272,18 +286,19 @@ class DuktapeBindings { ffi.Pointer ctx, ffi.Pointer err_msg, ) { - return _duk_fatal_raw( - ctx, - err_msg, - ); + return _duk_fatal_raw(ctx, err_msg); } late final _duk_fatal_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_fatal_raw'); - late final _duk_fatal_raw = _duk_fatal_rawPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_fatal_raw'); + late final _duk_fatal_raw = + _duk_fatal_rawPtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); void duk_error_raw( ffi.Pointer ctx, @@ -292,26 +307,31 @@ class DuktapeBindings { int line, ffi.Pointer fmt, ) { - return _duk_error_raw( - ctx, - err_code, - filename, - line, - fmt, - ); + return _duk_error_raw(ctx, err_code, filename, line, fmt); } late final _duk_error_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_errcode_t, + ffi.Pointer, + duk_int_t, + ffi.Pointer, + ) + > + >('duk_error_raw'); + late final _duk_error_raw = + _duk_error_rawPtr + .asFunction< + void Function( ffi.Pointer, - duk_errcode_t, + int, + ffi.Pointer, + int, ffi.Pointer, - duk_int_t, - ffi.Pointer)>>('duk_error_raw'); - late final _duk_error_raw = _duk_error_rawPtr.asFunction< - void Function(ffi.Pointer, int, ffi.Pointer, int, - ffi.Pointer)>(); + ) + >(); void duk_error_va_raw( ffi.Pointer ctx, @@ -321,185 +341,147 @@ class DuktapeBindings { ffi.Pointer fmt, va_list ap, ) { - return _duk_error_va_raw( - ctx, - err_code, - filename, - line, - fmt, - ap, - ); + return _duk_error_va_raw(ctx, err_code, filename, line, fmt, ap); } late final _duk_error_va_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_errcode_t, + ffi.Pointer, + duk_int_t, + ffi.Pointer, + va_list, + ) + > + >('duk_error_va_raw'); + late final _duk_error_va_raw = + _duk_error_va_rawPtr + .asFunction< + void Function( ffi.Pointer, - duk_errcode_t, + int, ffi.Pointer, - duk_int_t, + int, ffi.Pointer, - va_list)>>('duk_error_va_raw'); - late final _duk_error_va_raw = _duk_error_va_rawPtr.asFunction< - void Function(ffi.Pointer, int, ffi.Pointer, int, - ffi.Pointer, va_list)>(); + va_list, + ) + >(); /// Other state related functions - int duk_is_strict_call( - ffi.Pointer ctx, - ) { - return _duk_is_strict_call( - ctx, - ); + int duk_is_strict_call(ffi.Pointer ctx) { + return _duk_is_strict_call(ctx); } late final _duk_is_strict_callPtr = _lookup< - ffi.NativeFunction)>>( - 'duk_is_strict_call'); - late final _duk_is_strict_call = _duk_is_strict_callPtr - .asFunction)>(); + ffi.NativeFunction)> + >('duk_is_strict_call'); + late final _duk_is_strict_call = + _duk_is_strict_callPtr + .asFunction)>(); - int duk_is_constructor_call( - ffi.Pointer ctx, - ) { - return _duk_is_constructor_call( - ctx, - ); + int duk_is_constructor_call(ffi.Pointer ctx) { + return _duk_is_constructor_call(ctx); } late final _duk_is_constructor_callPtr = _lookup< - ffi.NativeFunction)>>( - 'duk_is_constructor_call'); - late final _duk_is_constructor_call = _duk_is_constructor_callPtr - .asFunction)>(); + ffi.NativeFunction)> + >('duk_is_constructor_call'); + late final _duk_is_constructor_call = + _duk_is_constructor_callPtr + .asFunction)>(); /// Stack management - int duk_normalize_index( - ffi.Pointer ctx, - int idx, - ) { - return _duk_normalize_index( - ctx, - idx, - ); + int duk_normalize_index(ffi.Pointer ctx, int idx) { + return _duk_normalize_index(ctx, idx); } late final _duk_normalize_indexPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( - ffi.Pointer, duk_idx_t)>>('duk_normalize_index'); - late final _duk_normalize_index = _duk_normalize_indexPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_normalize_index'); + late final _duk_normalize_index = + _duk_normalize_indexPtr + .asFunction, int)>(); - int duk_require_normalize_index( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_normalize_index( - ctx, - idx, - ); + int duk_require_normalize_index(ffi.Pointer ctx, int idx) { + return _duk_require_normalize_index(ctx, idx); } late final _duk_require_normalize_indexPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function(ffi.Pointer, - duk_idx_t)>>('duk_require_normalize_index'); - late final _duk_require_normalize_index = _duk_require_normalize_indexPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_normalize_index'); + late final _duk_require_normalize_index = + _duk_require_normalize_indexPtr + .asFunction, int)>(); - int duk_is_valid_index( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_valid_index( - ctx, - idx, - ); + int duk_is_valid_index(ffi.Pointer ctx, int idx) { + return _duk_is_valid_index(ctx, idx); } late final _duk_is_valid_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_valid_index'); - late final _duk_is_valid_index = _duk_is_valid_indexPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_valid_index'); + late final _duk_is_valid_index = + _duk_is_valid_indexPtr + .asFunction, int)>(); - void duk_require_valid_index( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_valid_index( - ctx, - idx, - ); + void duk_require_valid_index(ffi.Pointer ctx, int idx) { + return _duk_require_valid_index(ctx, idx); } late final _duk_require_valid_indexPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_valid_index'); - late final _duk_require_valid_index = _duk_require_valid_indexPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_valid_index'); + late final _duk_require_valid_index = + _duk_require_valid_indexPtr + .asFunction, int)>(); - int duk_get_top( - ffi.Pointer ctx, - ) { - return _duk_get_top( - ctx, - ); + int duk_get_top(ffi.Pointer ctx) { + return _duk_get_top(ctx); } late final _duk_get_topPtr = _lookup)>>( - 'duk_get_top'); + 'duk_get_top', + ); late final _duk_get_top = _duk_get_topPtr.asFunction)>(); - void duk_set_top( - ffi.Pointer ctx, - int idx, - ) { - return _duk_set_top( - ctx, - idx, - ); + void duk_set_top(ffi.Pointer ctx, int idx) { + return _duk_set_top(ctx, idx); } late final _duk_set_topPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_set_top'); - late final _duk_set_top = _duk_set_topPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_set_top'); + late final _duk_set_top = + _duk_set_topPtr + .asFunction, int)>(); - int duk_get_top_index( - ffi.Pointer ctx, - ) { - return _duk_get_top_index( - ctx, - ); + int duk_get_top_index(ffi.Pointer ctx) { + return _duk_get_top_index(ctx); } late final _duk_get_top_indexPtr = _lookup)>>( - 'duk_get_top_index'); - late final _duk_get_top_index = _duk_get_top_indexPtr - .asFunction)>(); + 'duk_get_top_index', + ); + late final _duk_get_top_index = + _duk_get_top_indexPtr + .asFunction)>(); - int duk_require_top_index( - ffi.Pointer ctx, - ) { - return _duk_require_top_index( - ctx, - ); + int duk_require_top_index(ffi.Pointer ctx) { + return _duk_require_top_index(ctx); } late final _duk_require_top_indexPtr = _lookup)>>( - 'duk_require_top_index'); - late final _duk_require_top_index = _duk_require_top_indexPtr - .asFunction)>(); + 'duk_require_top_index', + ); + late final _duk_require_top_index = + _duk_require_top_indexPtr + .asFunction)>(); /// Although extra/top could be an unsigned type here, using a signed type /// makes the API more robust to calling code calculation errors or corner @@ -507,224 +489,147 @@ class DuktapeBindings { /// Negative values are treated as zero, which is better than casting them /// to a large unsigned number. (This principle is used elsewhere in the /// API too.) - int duk_check_stack( - ffi.Pointer ctx, - int extra, - ) { - return _duk_check_stack( - ctx, - extra, - ); + int duk_check_stack(ffi.Pointer ctx, int extra) { + return _duk_check_stack(ctx, extra); } late final _duk_check_stackPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_check_stack'); - late final _duk_check_stack = _duk_check_stackPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_check_stack'); + late final _duk_check_stack = + _duk_check_stackPtr + .asFunction, int)>(); - void duk_require_stack( - ffi.Pointer ctx, - int extra, - ) { - return _duk_require_stack( - ctx, - extra, - ); + void duk_require_stack(ffi.Pointer ctx, int extra) { + return _duk_require_stack(ctx, extra); } late final _duk_require_stackPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_stack'); - late final _duk_require_stack = _duk_require_stackPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_stack'); + late final _duk_require_stack = + _duk_require_stackPtr + .asFunction, int)>(); - int duk_check_stack_top( - ffi.Pointer ctx, - int top, - ) { - return _duk_check_stack_top( - ctx, - top, - ); + int duk_check_stack_top(ffi.Pointer ctx, int top) { + return _duk_check_stack_top(ctx, top); } late final _duk_check_stack_topPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_check_stack_top'); - late final _duk_check_stack_top = _duk_check_stack_topPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_check_stack_top'); + late final _duk_check_stack_top = + _duk_check_stack_topPtr + .asFunction, int)>(); - void duk_require_stack_top( - ffi.Pointer ctx, - int top, - ) { - return _duk_require_stack_top( - ctx, - top, - ); + void duk_require_stack_top(ffi.Pointer ctx, int top) { + return _duk_require_stack_top(ctx, top); } late final _duk_require_stack_topPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_stack_top'); - late final _duk_require_stack_top = _duk_require_stack_topPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_stack_top'); + late final _duk_require_stack_top = + _duk_require_stack_topPtr + .asFunction, int)>(); /// Stack manipulation (other than push/pop) - void duk_swap( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_swap( - ctx, - idx1, - idx2, - ); + void duk_swap(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_swap(ctx, idx1, idx2); } late final _duk_swapPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t, duk_idx_t)>>('duk_swap'); - late final _duk_swap = _duk_swapPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_swap'); + late final _duk_swap = + _duk_swapPtr + .asFunction, int, int)>(); - void duk_swap_top( - ffi.Pointer ctx, - int idx, - ) { - return _duk_swap_top( - ctx, - idx, - ); + void duk_swap_top(ffi.Pointer ctx, int idx) { + return _duk_swap_top(ctx, idx); } late final _duk_swap_topPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_swap_top'); - late final _duk_swap_top = _duk_swap_topPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_swap_top'); + late final _duk_swap_top = + _duk_swap_topPtr + .asFunction, int)>(); - void duk_dup( - ffi.Pointer ctx, - int from_idx, - ) { - return _duk_dup( - ctx, - from_idx, - ); + void duk_dup(ffi.Pointer ctx, int from_idx) { + return _duk_dup(ctx, from_idx); } late final _duk_dupPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_dup'); + ffi.NativeFunction, duk_idx_t)> + >('duk_dup'); late final _duk_dup = _duk_dupPtr.asFunction, int)>(); - void duk_dup_top( - ffi.Pointer ctx, - ) { - return _duk_dup_top( - ctx, - ); + void duk_dup_top(ffi.Pointer ctx) { + return _duk_dup_top(ctx); } late final _duk_dup_topPtr = _lookup)>>( - 'duk_dup_top'); + 'duk_dup_top', + ); late final _duk_dup_top = _duk_dup_topPtr.asFunction)>(); - void duk_insert( - ffi.Pointer ctx, - int to_idx, - ) { - return _duk_insert( - ctx, - to_idx, - ); + void duk_insert(ffi.Pointer ctx, int to_idx) { + return _duk_insert(ctx, to_idx); } late final _duk_insertPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_insert'); + ffi.NativeFunction, duk_idx_t)> + >('duk_insert'); late final _duk_insert = _duk_insertPtr.asFunction, int)>(); - void duk_pull( - ffi.Pointer ctx, - int from_idx, - ) { - return _duk_pull( - ctx, - from_idx, - ); + void duk_pull(ffi.Pointer ctx, int from_idx) { + return _duk_pull(ctx, from_idx); } late final _duk_pullPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_pull'); + ffi.NativeFunction, duk_idx_t)> + >('duk_pull'); late final _duk_pull = _duk_pullPtr.asFunction, int)>(); - void duk_replace( - ffi.Pointer ctx, - int to_idx, - ) { - return _duk_replace( - ctx, - to_idx, - ); + void duk_replace(ffi.Pointer ctx, int to_idx) { + return _duk_replace(ctx, to_idx); } late final _duk_replacePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_replace'); - late final _duk_replace = _duk_replacePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_replace'); + late final _duk_replace = + _duk_replacePtr + .asFunction, int)>(); - void duk_copy( - ffi.Pointer ctx, - int from_idx, - int to_idx, - ) { - return _duk_copy( - ctx, - from_idx, - to_idx, - ); + void duk_copy(ffi.Pointer ctx, int from_idx, int to_idx) { + return _duk_copy(ctx, from_idx, to_idx); } late final _duk_copyPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t, duk_idx_t)>>('duk_copy'); - late final _duk_copy = _duk_copyPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_copy'); + late final _duk_copy = + _duk_copyPtr + .asFunction, int, int)>(); - void duk_remove( - ffi.Pointer ctx, - int idx, - ) { - return _duk_remove( - ctx, - idx, - ); + void duk_remove(ffi.Pointer ctx, int idx) { + return _duk_remove(ctx, idx); } late final _duk_removePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_remove'); + ffi.NativeFunction, duk_idx_t)> + >('duk_remove'); late final _duk_remove = _duk_removePtr.asFunction, int)>(); @@ -734,21 +639,29 @@ class DuktapeBindings { int count, int is_copy, ) { - return _duk_xcopymove_raw( - to_ctx, - from_ctx, - count, - is_copy, - ); + return _duk_xcopymove_raw(to_ctx, from_ctx, count, is_copy); } late final _duk_xcopymove_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - duk_idx_t, duk_bool_t)>>('duk_xcopymove_raw'); - late final _duk_xcopymove_raw = _duk_xcopymove_rawPtr.asFunction< - void Function( - ffi.Pointer, ffi.Pointer, int, int)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + duk_idx_t, + duk_bool_t, + ) + > + >('duk_xcopymove_raw'); + late final _duk_xcopymove_raw = + _duk_xcopymove_rawPtr + .asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + int, + int, + ) + >(); /// Push operations /// @@ -756,446 +669,417 @@ class DuktapeBindings { /// position of the pushed value for convenience. /// /// Note: duk_dup() is technically a push. - void duk_push_undefined( - ffi.Pointer ctx, - ) { - return _duk_push_undefined( - ctx, - ); + void duk_push_undefined(ffi.Pointer ctx) { + return _duk_push_undefined(ctx); } late final _duk_push_undefinedPtr = _lookup)>>( - 'duk_push_undefined'); - late final _duk_push_undefined = _duk_push_undefinedPtr - .asFunction)>(); + 'duk_push_undefined', + ); + late final _duk_push_undefined = + _duk_push_undefinedPtr + .asFunction)>(); - void duk_push_null( - ffi.Pointer ctx, - ) { - return _duk_push_null( - ctx, - ); + void duk_push_null(ffi.Pointer ctx) { + return _duk_push_null(ctx); } late final _duk_push_nullPtr = _lookup)>>( - 'duk_push_null'); + 'duk_push_null', + ); late final _duk_push_null = _duk_push_nullPtr.asFunction)>(); - void duk_push_boolean( - ffi.Pointer ctx, - int val, - ) { - return _duk_push_boolean( - ctx, - val, - ); + void duk_push_boolean(ffi.Pointer ctx, int val) { + return _duk_push_boolean(ctx, val); } late final _duk_push_booleanPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_bool_t)>>('duk_push_boolean'); - late final _duk_push_boolean = _duk_push_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_bool_t)> + >('duk_push_boolean'); + late final _duk_push_boolean = + _duk_push_booleanPtr + .asFunction, int)>(); - void duk_push_true( - ffi.Pointer ctx, - ) { - return _duk_push_true( - ctx, - ); + void duk_push_true(ffi.Pointer ctx) { + return _duk_push_true(ctx); } late final _duk_push_truePtr = _lookup)>>( - 'duk_push_true'); + 'duk_push_true', + ); late final _duk_push_true = _duk_push_truePtr.asFunction)>(); - void duk_push_false( - ffi.Pointer ctx, - ) { - return _duk_push_false( - ctx, - ); + void duk_push_false(ffi.Pointer ctx) { + return _duk_push_false(ctx); } late final _duk_push_falsePtr = _lookup)>>( - 'duk_push_false'); + 'duk_push_false', + ); late final _duk_push_false = _duk_push_falsePtr.asFunction)>(); - void duk_push_number( - ffi.Pointer ctx, - double val, - ) { - return _duk_push_number( - ctx, - val, - ); + void duk_push_number(ffi.Pointer ctx, double val) { + return _duk_push_number(ctx, val); } late final _duk_push_numberPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_double_t)>>('duk_push_number'); - late final _duk_push_number = _duk_push_numberPtr - .asFunction, double)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_double_t) + > + >('duk_push_number'); + late final _duk_push_number = + _duk_push_numberPtr + .asFunction, double)>(); - void duk_push_nan( - ffi.Pointer ctx, - ) { - return _duk_push_nan( - ctx, - ); + void duk_push_nan(ffi.Pointer ctx) { + return _duk_push_nan(ctx); } late final _duk_push_nanPtr = _lookup)>>( - 'duk_push_nan'); + 'duk_push_nan', + ); late final _duk_push_nan = _duk_push_nanPtr.asFunction)>(); - void duk_push_int( - ffi.Pointer ctx, - int val, - ) { - return _duk_push_int( - ctx, - val, - ); + void duk_push_int(ffi.Pointer ctx, int val) { + return _duk_push_int(ctx, val); } late final _duk_push_intPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_int_t)>>('duk_push_int'); - late final _duk_push_int = _duk_push_intPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_int_t)> + >('duk_push_int'); + late final _duk_push_int = + _duk_push_intPtr + .asFunction, int)>(); - void duk_push_uint( - ffi.Pointer ctx, - int val, - ) { - return _duk_push_uint( - ctx, - val, - ); + void duk_push_uint(ffi.Pointer ctx, int val) { + return _duk_push_uint(ctx, val); } late final _duk_push_uintPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_uint_t)>>('duk_push_uint'); - late final _duk_push_uint = _duk_push_uintPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_uint_t)> + >('duk_push_uint'); + late final _duk_push_uint = + _duk_push_uintPtr + .asFunction, int)>(); ffi.Pointer duk_push_string( ffi.Pointer ctx, ffi.Pointer str, ) { - return _duk_push_string( - ctx, - str, - ); + return _duk_push_string(ctx, str); } late final _duk_push_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_string'); - late final _duk_push_string = _duk_push_stringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, + ffi.Pointer, + ) + > + >('duk_push_string'); + late final _duk_push_string = + _duk_push_stringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); ffi.Pointer duk_push_lstring( ffi.Pointer ctx, ffi.Pointer str, int len, ) { - return _duk_push_lstring( - ctx, - str, - len, - ); + return _duk_push_lstring(ctx, str, len); } late final _duk_push_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, duk_size_t)>>('duk_push_lstring'); - late final _duk_push_lstring = _duk_push_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_push_lstring'); + late final _duk_push_lstring = + _duk_push_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); - void duk_push_pointer( - ffi.Pointer ctx, - ffi.Pointer p, - ) { - return _duk_push_pointer( - ctx, - p, - ); + void duk_push_pointer(ffi.Pointer ctx, ffi.Pointer p) { + return _duk_push_pointer(ctx, p); } late final _duk_push_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_pointer'); - late final _duk_push_pointer = _duk_push_pointerPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_push_pointer'); + late final _duk_push_pointer = + _duk_push_pointerPtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); ffi.Pointer duk_push_sprintf( ffi.Pointer ctx, ffi.Pointer fmt, ) { - return _duk_push_sprintf( - ctx, - fmt, - ); + return _duk_push_sprintf(ctx, fmt); } late final _duk_push_sprintfPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_sprintf'); - late final _duk_push_sprintf = _duk_push_sprintfPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(); + ffi.Pointer, + ffi.Pointer, + ) + > + >('duk_push_sprintf'); + late final _duk_push_sprintf = + _duk_push_sprintfPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); ffi.Pointer duk_push_vsprintf( ffi.Pointer ctx, ffi.Pointer fmt, va_list ap, ) { - return _duk_push_vsprintf( - ctx, - fmt, - ap, - ); + return _duk_push_vsprintf(ctx, fmt, ap); } late final _duk_push_vsprintfPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, va_list)>>('duk_push_vsprintf'); - late final _duk_push_vsprintf = _duk_push_vsprintfPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, va_list)>(); + ffi.Pointer, + ffi.Pointer, + va_list, + ) + > + >('duk_push_vsprintf'); + late final _duk_push_vsprintf = + _duk_push_vsprintfPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + va_list, + ) + >(); ffi.Pointer duk_push_literal_raw( ffi.Pointer ctx, ffi.Pointer str, int len, ) { - return _duk_push_literal_raw( - ctx, - str, - len, - ); + return _duk_push_literal_raw(ctx, str, len); } late final _duk_push_literal_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, duk_size_t)>>('duk_push_literal_raw'); - late final _duk_push_literal_raw = _duk_push_literal_rawPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, int)>(); + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_push_literal_raw'); + late final _duk_push_literal_raw = + _duk_push_literal_rawPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ) + >(); - void duk_push_this( - ffi.Pointer ctx, - ) { - return _duk_push_this( - ctx, - ); + void duk_push_this(ffi.Pointer ctx) { + return _duk_push_this(ctx); } late final _duk_push_thisPtr = _lookup)>>( - 'duk_push_this'); + 'duk_push_this', + ); late final _duk_push_this = _duk_push_thisPtr.asFunction)>(); - void duk_push_new_target( - ffi.Pointer ctx, - ) { - return _duk_push_new_target( - ctx, - ); + void duk_push_new_target(ffi.Pointer ctx) { + return _duk_push_new_target(ctx); } late final _duk_push_new_targetPtr = _lookup)>>( - 'duk_push_new_target'); - late final _duk_push_new_target = _duk_push_new_targetPtr - .asFunction)>(); + 'duk_push_new_target', + ); + late final _duk_push_new_target = + _duk_push_new_targetPtr + .asFunction)>(); - void duk_push_current_function( - ffi.Pointer ctx, - ) { - return _duk_push_current_function( - ctx, - ); + void duk_push_current_function(ffi.Pointer ctx) { + return _duk_push_current_function(ctx); } late final _duk_push_current_functionPtr = _lookup)>>( - 'duk_push_current_function'); - late final _duk_push_current_function = _duk_push_current_functionPtr - .asFunction)>(); + 'duk_push_current_function', + ); + late final _duk_push_current_function = + _duk_push_current_functionPtr + .asFunction)>(); - void duk_push_current_thread( - ffi.Pointer ctx, - ) { - return _duk_push_current_thread( - ctx, - ); + void duk_push_current_thread(ffi.Pointer ctx) { + return _duk_push_current_thread(ctx); } late final _duk_push_current_threadPtr = _lookup)>>( - 'duk_push_current_thread'); - late final _duk_push_current_thread = _duk_push_current_threadPtr - .asFunction)>(); + 'duk_push_current_thread', + ); + late final _duk_push_current_thread = + _duk_push_current_threadPtr + .asFunction)>(); - void duk_push_global_object( - ffi.Pointer ctx, - ) { - return _duk_push_global_object( - ctx, - ); + void duk_push_global_object(ffi.Pointer ctx) { + return _duk_push_global_object(ctx); } late final _duk_push_global_objectPtr = _lookup)>>( - 'duk_push_global_object'); - late final _duk_push_global_object = _duk_push_global_objectPtr - .asFunction)>(); + 'duk_push_global_object', + ); + late final _duk_push_global_object = + _duk_push_global_objectPtr + .asFunction)>(); - void duk_push_heap_stash( - ffi.Pointer ctx, - ) { - return _duk_push_heap_stash( - ctx, - ); + void duk_push_heap_stash(ffi.Pointer ctx) { + return _duk_push_heap_stash(ctx); } late final _duk_push_heap_stashPtr = _lookup)>>( - 'duk_push_heap_stash'); - late final _duk_push_heap_stash = _duk_push_heap_stashPtr - .asFunction)>(); + 'duk_push_heap_stash', + ); + late final _duk_push_heap_stash = + _duk_push_heap_stashPtr + .asFunction)>(); - void duk_push_global_stash( - ffi.Pointer ctx, - ) { - return _duk_push_global_stash( - ctx, - ); + void duk_push_global_stash(ffi.Pointer ctx) { + return _duk_push_global_stash(ctx); } late final _duk_push_global_stashPtr = _lookup)>>( - 'duk_push_global_stash'); - late final _duk_push_global_stash = _duk_push_global_stashPtr - .asFunction)>(); + 'duk_push_global_stash', + ); + late final _duk_push_global_stash = + _duk_push_global_stashPtr + .asFunction)>(); void duk_push_thread_stash( ffi.Pointer ctx, ffi.Pointer target_ctx, ) { - return _duk_push_thread_stash( - ctx, - target_ctx, - ); + return _duk_push_thread_stash(ctx, target_ctx); } late final _duk_push_thread_stashPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_thread_stash'); - late final _duk_push_thread_stash = _duk_push_thread_stashPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer) + > + >('duk_push_thread_stash'); + late final _duk_push_thread_stash = + _duk_push_thread_stashPtr + .asFunction< + void Function(ffi.Pointer, ffi.Pointer) + >(); - int duk_push_object( - ffi.Pointer ctx, - ) { - return _duk_push_object( - ctx, - ); + int duk_push_object(ffi.Pointer ctx) { + return _duk_push_object(ctx); } late final _duk_push_objectPtr = _lookup)>>( - 'duk_push_object'); + 'duk_push_object', + ); late final _duk_push_object = _duk_push_objectPtr.asFunction)>(); - int duk_push_bare_object( - ffi.Pointer ctx, - ) { - return _duk_push_bare_object( - ctx, - ); + int duk_push_bare_object(ffi.Pointer ctx) { + return _duk_push_bare_object(ctx); } late final _duk_push_bare_objectPtr = _lookup)>>( - 'duk_push_bare_object'); - late final _duk_push_bare_object = _duk_push_bare_objectPtr - .asFunction)>(); + 'duk_push_bare_object', + ); + late final _duk_push_bare_object = + _duk_push_bare_objectPtr + .asFunction)>(); - int duk_push_array( - ffi.Pointer ctx, - ) { - return _duk_push_array( - ctx, - ); + int duk_push_array(ffi.Pointer ctx) { + return _duk_push_array(ctx); } late final _duk_push_arrayPtr = _lookup)>>( - 'duk_push_array'); + 'duk_push_array', + ); late final _duk_push_array = _duk_push_arrayPtr.asFunction)>(); - int duk_push_bare_array( - ffi.Pointer ctx, - ) { - return _duk_push_bare_array( - ctx, - ); + int duk_push_bare_array(ffi.Pointer ctx) { + return _duk_push_bare_array(ctx); } late final _duk_push_bare_arrayPtr = _lookup)>>( - 'duk_push_bare_array'); - late final _duk_push_bare_array = _duk_push_bare_arrayPtr - .asFunction)>(); + 'duk_push_bare_array', + ); + late final _duk_push_bare_array = + _duk_push_bare_arrayPtr + .asFunction)>(); int duk_push_c_function( ffi.Pointer ctx, duk_c_function func, int nargs, ) { - return _duk_push_c_function( - ctx, - func, - nargs, - ); + return _duk_push_c_function(ctx, func, nargs); } late final _duk_push_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function(ffi.Pointer, duk_c_function, - duk_idx_t)>>('duk_push_c_function'); - late final _duk_push_c_function = _duk_push_c_functionPtr.asFunction< - int Function(ffi.Pointer, duk_c_function, int)>(); + ffi.NativeFunction< + duk_idx_t Function(ffi.Pointer, duk_c_function, duk_idx_t) + > + >('duk_push_c_function'); + late final _duk_push_c_function = + _duk_push_c_functionPtr + .asFunction< + int Function(ffi.Pointer, duk_c_function, int) + >(); int duk_push_c_lightfunc( ffi.Pointer ctx, @@ -1204,55 +1088,53 @@ class DuktapeBindings { int length, int magic, ) { - return _duk_push_c_lightfunc( - ctx, - func, - nargs, - length, - magic, - ); + return _duk_push_c_lightfunc(ctx, func, nargs, length, magic); } late final _duk_push_c_lightfuncPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function(ffi.Pointer, duk_c_function, - duk_idx_t, duk_idx_t, duk_int_t)>>('duk_push_c_lightfunc'); - late final _duk_push_c_lightfunc = _duk_push_c_lightfuncPtr.asFunction< - int Function(ffi.Pointer, duk_c_function, int, int, int)>(); + ffi.NativeFunction< + duk_idx_t Function( + ffi.Pointer, + duk_c_function, + duk_idx_t, + duk_idx_t, + duk_int_t, + ) + > + >('duk_push_c_lightfunc'); + late final _duk_push_c_lightfunc = + _duk_push_c_lightfuncPtr + .asFunction< + int Function( + ffi.Pointer, + duk_c_function, + int, + int, + int, + ) + >(); - int duk_push_thread_raw( - ffi.Pointer ctx, - int flags, - ) { - return _duk_push_thread_raw( - ctx, - flags, - ); + int duk_push_thread_raw(ffi.Pointer ctx, int flags) { + return _duk_push_thread_raw(ctx, flags); } late final _duk_push_thread_rawPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( - ffi.Pointer, duk_uint_t)>>('duk_push_thread_raw'); - late final _duk_push_thread_raw = _duk_push_thread_rawPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_uint_t)> + >('duk_push_thread_raw'); + late final _duk_push_thread_raw = + _duk_push_thread_rawPtr + .asFunction, int)>(); - int duk_push_proxy( - ffi.Pointer ctx, - int proxy_flags, - ) { - return _duk_push_proxy( - ctx, - proxy_flags, - ); + int duk_push_proxy(ffi.Pointer ctx, int proxy_flags) { + return _duk_push_proxy(ctx, proxy_flags); } late final _duk_push_proxyPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( - ffi.Pointer, duk_uint_t)>>('duk_push_proxy'); - late final _duk_push_proxy = _duk_push_proxyPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_uint_t)> + >('duk_push_proxy'); + late final _duk_push_proxy = + _duk_push_proxyPtr + .asFunction, int)>(); int duk_push_error_object_raw( ffi.Pointer ctx, @@ -1261,27 +1143,31 @@ class DuktapeBindings { int line, ffi.Pointer fmt, ) { - return _duk_push_error_object_raw( - ctx, - err_code, - filename, - line, - fmt, - ); + return _duk_push_error_object_raw(ctx, err_code, filename, line, fmt); } late final _duk_push_error_object_rawPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( + ffi.NativeFunction< + duk_idx_t Function( + ffi.Pointer, + duk_errcode_t, + ffi.Pointer, + duk_int_t, + ffi.Pointer, + ) + > + >('duk_push_error_object_raw'); + late final _duk_push_error_object_raw = + _duk_push_error_object_rawPtr + .asFunction< + int Function( ffi.Pointer, - duk_errcode_t, + int, ffi.Pointer, - duk_int_t, - ffi.Pointer)>>('duk_push_error_object_raw'); - late final _duk_push_error_object_raw = - _duk_push_error_object_rawPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer, - int, ffi.Pointer)>(); + int, + ffi.Pointer, + ) + >(); int duk_push_error_object_va_raw( ffi.Pointer ctx, @@ -1302,37 +1188,52 @@ class DuktapeBindings { } late final _duk_push_error_object_va_rawPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function( + ffi.NativeFunction< + duk_idx_t Function( + ffi.Pointer, + duk_errcode_t, + ffi.Pointer, + duk_int_t, + ffi.Pointer, + va_list, + ) + > + >('duk_push_error_object_va_raw'); + late final _duk_push_error_object_va_raw = + _duk_push_error_object_va_rawPtr + .asFunction< + int Function( ffi.Pointer, - duk_errcode_t, + int, ffi.Pointer, - duk_int_t, + int, ffi.Pointer, - va_list)>>('duk_push_error_object_va_raw'); - late final _duk_push_error_object_va_raw = - _duk_push_error_object_va_rawPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer, - int, ffi.Pointer, va_list)>(); + va_list, + ) + >(); ffi.Pointer duk_push_buffer_raw( ffi.Pointer ctx, int size, int flags, ) { - return _duk_push_buffer_raw( - ctx, - size, - flags, - ); + return _duk_push_buffer_raw(ctx, size, flags); } late final _duk_push_buffer_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_size_t, - duk_small_uint_t)>>('duk_push_buffer_raw'); - late final _duk_push_buffer_raw = _duk_push_buffer_rawPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, int)>(); + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_size_t, + duk_small_uint_t, + ) + > + >('duk_push_buffer_raw'); + late final _duk_push_buffer_raw = + _duk_push_buffer_rawPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int, int) + >(); void duk_push_buffer_object( ffi.Pointer ctx, @@ -1351,85 +1252,81 @@ class DuktapeBindings { } late final _duk_push_buffer_objectPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, duk_size_t, - duk_size_t, duk_uint_t)>>('duk_push_buffer_object'); - late final _duk_push_buffer_object = _duk_push_buffer_objectPtr.asFunction< - void Function(ffi.Pointer, int, int, int, int)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + duk_size_t, + duk_size_t, + duk_uint_t, + ) + > + >('duk_push_buffer_object'); + late final _duk_push_buffer_object = + _duk_push_buffer_objectPtr + .asFunction< + void Function(ffi.Pointer, int, int, int, int) + >(); int duk_push_heapptr( ffi.Pointer ctx, ffi.Pointer ptr, ) { - return _duk_push_heapptr( - ctx, - ptr, - ); + return _duk_push_heapptr(ctx, ptr); } late final _duk_push_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_idx_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_push_heapptr'); - late final _duk_push_heapptr = _duk_push_heapptrPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_idx_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_push_heapptr'); + late final _duk_push_heapptr = + _duk_push_heapptrPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); /// Pop operations - void duk_pop( - ffi.Pointer ctx, - ) { - return _duk_pop( - ctx, - ); + void duk_pop(ffi.Pointer ctx) { + return _duk_pop(ctx); } late final _duk_popPtr = _lookup)>>( - 'duk_pop'); + 'duk_pop', + ); late final _duk_pop = _duk_popPtr.asFunction)>(); - void duk_pop_n( - ffi.Pointer ctx, - int count, - ) { - return _duk_pop_n( - ctx, - count, - ); + void duk_pop_n(ffi.Pointer ctx, int count) { + return _duk_pop_n(ctx, count); } late final _duk_pop_nPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_pop_n'); + ffi.NativeFunction, duk_idx_t)> + >('duk_pop_n'); late final _duk_pop_n = _duk_pop_nPtr.asFunction, int)>(); - void duk_pop_2( - ffi.Pointer ctx, - ) { - return _duk_pop_2( - ctx, - ); + void duk_pop_2(ffi.Pointer ctx) { + return _duk_pop_2(ctx); } late final _duk_pop_2Ptr = _lookup)>>( - 'duk_pop_2'); + 'duk_pop_2', + ); late final _duk_pop_2 = _duk_pop_2Ptr.asFunction)>(); - void duk_pop_3( - ffi.Pointer ctx, - ) { - return _duk_pop_3( - ctx, - ); + void duk_pop_3(ffi.Pointer ctx) { + return _duk_pop_3(ctx); } late final _duk_pop_3Ptr = _lookup)>>( - 'duk_pop_3'); + 'duk_pop_3', + ); late final _duk_pop_3 = _duk_pop_3Ptr.asFunction)>(); @@ -1437,686 +1334,513 @@ class DuktapeBindings { /// /// duk_is_none(), which would indicate whether index it outside of stack, /// is not needed; duk_is_valid_index() gives the same information. - int duk_get_type( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_type( - ctx, - idx, - ); + int duk_get_type(ffi.Pointer ctx, int idx) { + return _duk_get_type(ctx, idx); } late final _duk_get_typePtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_type'); - late final _duk_get_type = _duk_get_typePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_type'); + late final _duk_get_type = + _duk_get_typePtr + .asFunction, int)>(); - int duk_check_type( - ffi.Pointer ctx, - int idx, - int type, - ) { - return _duk_check_type( - ctx, - idx, - type, - ); + int duk_check_type(ffi.Pointer ctx, int idx, int type) { + return _duk_check_type(ctx, idx, type); } late final _duk_check_typePtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_int_t)>>('duk_check_type'); - late final _duk_check_type = _duk_check_typePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_check_type'); + late final _duk_check_type = + _duk_check_typePtr + .asFunction, int, int)>(); - int duk_get_type_mask( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_type_mask( - ctx, - idx, - ); + int duk_get_type_mask(ffi.Pointer ctx, int idx) { + return _duk_get_type_mask(ctx, idx); } late final _duk_get_type_maskPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_type_mask'); - late final _duk_get_type_mask = _duk_get_type_maskPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_type_mask'); + late final _duk_get_type_mask = + _duk_get_type_maskPtr + .asFunction, int)>(); - int duk_check_type_mask( - ffi.Pointer ctx, - int idx, - int mask, - ) { - return _duk_check_type_mask( - ctx, - idx, - mask, - ); + int duk_check_type_mask(ffi.Pointer ctx, int idx, int mask) { + return _duk_check_type_mask(ctx, idx, mask); } late final _duk_check_type_maskPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_check_type_mask'); - late final _duk_check_type_mask = _duk_check_type_maskPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_check_type_mask'); + late final _duk_check_type_mask = + _duk_check_type_maskPtr + .asFunction, int, int)>(); - int duk_is_undefined( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_undefined( - ctx, - idx, - ); + int duk_is_undefined(ffi.Pointer ctx, int idx) { + return _duk_is_undefined(ctx, idx); } late final _duk_is_undefinedPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_undefined'); - late final _duk_is_undefined = _duk_is_undefinedPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_undefined'); + late final _duk_is_undefined = + _duk_is_undefinedPtr + .asFunction, int)>(); - int duk_is_null( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_null( - ctx, - idx, - ); + int duk_is_null(ffi.Pointer ctx, int idx) { + return _duk_is_null(ctx, idx); } late final _duk_is_nullPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_null'); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_null'); late final _duk_is_null = _duk_is_nullPtr.asFunction, int)>(); - int duk_is_boolean( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_boolean( - ctx, - idx, - ); + int duk_is_boolean(ffi.Pointer ctx, int idx) { + return _duk_is_boolean(ctx, idx); } late final _duk_is_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_boolean'); - late final _duk_is_boolean = _duk_is_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_boolean'); + late final _duk_is_boolean = + _duk_is_booleanPtr + .asFunction, int)>(); - int duk_is_number( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_number( - ctx, - idx, - ); + int duk_is_number(ffi.Pointer ctx, int idx) { + return _duk_is_number(ctx, idx); } late final _duk_is_numberPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_number'); - late final _duk_is_number = _duk_is_numberPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_number'); + late final _duk_is_number = + _duk_is_numberPtr + .asFunction, int)>(); - int duk_is_nan( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_nan( - ctx, - idx, - ); + int duk_is_nan(ffi.Pointer ctx, int idx) { + return _duk_is_nan(ctx, idx); } late final _duk_is_nanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_nan'); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_nan'); late final _duk_is_nan = _duk_is_nanPtr.asFunction, int)>(); - int duk_is_string( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_string( - ctx, - idx, - ); + int duk_is_string(ffi.Pointer ctx, int idx) { + return _duk_is_string(ctx, idx); } late final _duk_is_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_string'); - late final _duk_is_string = _duk_is_stringPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_string'); + late final _duk_is_string = + _duk_is_stringPtr + .asFunction, int)>(); - int duk_is_object( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_object( - ctx, - idx, - ); + int duk_is_object(ffi.Pointer ctx, int idx) { + return _duk_is_object(ctx, idx); } late final _duk_is_objectPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_object'); - late final _duk_is_object = _duk_is_objectPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_object'); + late final _duk_is_object = + _duk_is_objectPtr + .asFunction, int)>(); - int duk_is_buffer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_buffer( - ctx, - idx, - ); + int duk_is_buffer(ffi.Pointer ctx, int idx) { + return _duk_is_buffer(ctx, idx); } late final _duk_is_bufferPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_buffer'); - late final _duk_is_buffer = _duk_is_bufferPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_buffer'); + late final _duk_is_buffer = + _duk_is_bufferPtr + .asFunction, int)>(); - int duk_is_buffer_data( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_buffer_data( - ctx, - idx, - ); + int duk_is_buffer_data(ffi.Pointer ctx, int idx) { + return _duk_is_buffer_data(ctx, idx); } late final _duk_is_buffer_dataPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_buffer_data'); - late final _duk_is_buffer_data = _duk_is_buffer_dataPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_buffer_data'); + late final _duk_is_buffer_data = + _duk_is_buffer_dataPtr + .asFunction, int)>(); - int duk_is_pointer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_pointer( - ctx, - idx, - ); + int duk_is_pointer(ffi.Pointer ctx, int idx) { + return _duk_is_pointer(ctx, idx); } late final _duk_is_pointerPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_pointer'); - late final _duk_is_pointer = _duk_is_pointerPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_pointer'); + late final _duk_is_pointer = + _duk_is_pointerPtr + .asFunction, int)>(); - int duk_is_lightfunc( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_lightfunc( - ctx, - idx, - ); + int duk_is_lightfunc(ffi.Pointer ctx, int idx) { + return _duk_is_lightfunc(ctx, idx); } late final _duk_is_lightfuncPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_lightfunc'); - late final _duk_is_lightfunc = _duk_is_lightfuncPtr - .asFunction, int)>(); - - int duk_is_symbol( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_symbol( - ctx, - idx, - ); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_lightfunc'); + late final _duk_is_lightfunc = + _duk_is_lightfuncPtr + .asFunction, int)>(); + + int duk_is_symbol(ffi.Pointer ctx, int idx) { + return _duk_is_symbol(ctx, idx); } late final _duk_is_symbolPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_symbol'); - late final _duk_is_symbol = _duk_is_symbolPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_symbol'); + late final _duk_is_symbol = + _duk_is_symbolPtr + .asFunction, int)>(); - int duk_is_array( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_array( - ctx, - idx, - ); + int duk_is_array(ffi.Pointer ctx, int idx) { + return _duk_is_array(ctx, idx); } late final _duk_is_arrayPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_array'); - late final _duk_is_array = _duk_is_arrayPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_array'); + late final _duk_is_array = + _duk_is_arrayPtr + .asFunction, int)>(); - int duk_is_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_function( - ctx, - idx, - ); + int duk_is_function(ffi.Pointer ctx, int idx) { + return _duk_is_function(ctx, idx); } late final _duk_is_functionPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_function'); - late final _duk_is_function = _duk_is_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_function'); + late final _duk_is_function = + _duk_is_functionPtr + .asFunction, int)>(); - int duk_is_c_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_c_function( - ctx, - idx, - ); + int duk_is_c_function(ffi.Pointer ctx, int idx) { + return _duk_is_c_function(ctx, idx); } late final _duk_is_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_c_function'); - late final _duk_is_c_function = _duk_is_c_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_c_function'); + late final _duk_is_c_function = + _duk_is_c_functionPtr + .asFunction, int)>(); - int duk_is_ecmascript_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_ecmascript_function( - ctx, - idx, - ); + int duk_is_ecmascript_function(ffi.Pointer ctx, int idx) { + return _duk_is_ecmascript_function(ctx, idx); } late final _duk_is_ecmascript_functionPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - duk_idx_t)>>('duk_is_ecmascript_function'); - late final _duk_is_ecmascript_function = _duk_is_ecmascript_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_ecmascript_function'); + late final _duk_is_ecmascript_function = + _duk_is_ecmascript_functionPtr + .asFunction, int)>(); - int duk_is_bound_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_bound_function( - ctx, - idx, - ); + int duk_is_bound_function(ffi.Pointer ctx, int idx) { + return _duk_is_bound_function(ctx, idx); } late final _duk_is_bound_functionPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_bound_function'); - late final _duk_is_bound_function = _duk_is_bound_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_bound_function'); + late final _duk_is_bound_function = + _duk_is_bound_functionPtr + .asFunction, int)>(); - int duk_is_thread( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_thread( - ctx, - idx, - ); + int duk_is_thread(ffi.Pointer ctx, int idx) { + return _duk_is_thread(ctx, idx); } late final _duk_is_threadPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_thread'); - late final _duk_is_thread = _duk_is_threadPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_thread'); + late final _duk_is_thread = + _duk_is_threadPtr + .asFunction, int)>(); - int duk_is_constructable( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_constructable( - ctx, - idx, - ); + int duk_is_constructable(ffi.Pointer ctx, int idx) { + return _duk_is_constructable(ctx, idx); } late final _duk_is_constructablePtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_constructable'); - late final _duk_is_constructable = _duk_is_constructablePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_constructable'); + late final _duk_is_constructable = + _duk_is_constructablePtr + .asFunction, int)>(); - int duk_is_dynamic_buffer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_dynamic_buffer( - ctx, - idx, - ); + int duk_is_dynamic_buffer(ffi.Pointer ctx, int idx) { + return _duk_is_dynamic_buffer(ctx, idx); } late final _duk_is_dynamic_bufferPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_dynamic_buffer'); - late final _duk_is_dynamic_buffer = _duk_is_dynamic_bufferPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_dynamic_buffer'); + late final _duk_is_dynamic_buffer = + _duk_is_dynamic_bufferPtr + .asFunction, int)>(); - int duk_is_fixed_buffer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_fixed_buffer( - ctx, - idx, - ); + int duk_is_fixed_buffer(ffi.Pointer ctx, int idx) { + return _duk_is_fixed_buffer(ctx, idx); } late final _duk_is_fixed_bufferPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_fixed_buffer'); - late final _duk_is_fixed_buffer = _duk_is_fixed_bufferPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_fixed_buffer'); + late final _duk_is_fixed_buffer = + _duk_is_fixed_bufferPtr + .asFunction, int)>(); - int duk_is_external_buffer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_is_external_buffer( - ctx, - idx, - ); + int duk_is_external_buffer(ffi.Pointer ctx, int idx) { + return _duk_is_external_buffer(ctx, idx); } late final _duk_is_external_bufferPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_is_external_buffer'); - late final _duk_is_external_buffer = _duk_is_external_bufferPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_is_external_buffer'); + late final _duk_is_external_buffer = + _duk_is_external_bufferPtr + .asFunction, int)>(); - int duk_get_error_code( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_error_code( - ctx, - idx, - ); + int duk_get_error_code(ffi.Pointer ctx, int idx) { + return _duk_get_error_code(ctx, idx); } late final _duk_get_error_codePtr = _lookup< - ffi.NativeFunction< - duk_errcode_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_error_code'); - late final _duk_get_error_code = _duk_get_error_codePtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_errcode_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_error_code'); + late final _duk_get_error_code = + _duk_get_error_codePtr + .asFunction, int)>(); /// Get operations: no coercion, returns default value for invalid /// indices and invalid value types. /// /// duk_get_undefined() and duk_get_null() would be pointless and /// are not included. - int duk_get_boolean( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_boolean( - ctx, - idx, - ); + int duk_get_boolean(ffi.Pointer ctx, int idx) { + return _duk_get_boolean(ctx, idx); } late final _duk_get_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_boolean'); - late final _duk_get_boolean = _duk_get_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_boolean'); + late final _duk_get_boolean = + _duk_get_booleanPtr + .asFunction, int)>(); - double duk_get_number( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_number( - ctx, - idx, - ); + double duk_get_number(ffi.Pointer ctx, int idx) { + return _duk_get_number(ctx, idx); } late final _duk_get_numberPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_number'); - late final _duk_get_number = _duk_get_numberPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_number'); + late final _duk_get_number = + _duk_get_numberPtr + .asFunction, int)>(); - int duk_get_int( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_int( - ctx, - idx, - ); + int duk_get_int(ffi.Pointer ctx, int idx) { + return _duk_get_int(ctx, idx); } late final _duk_get_intPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_int'); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_int'); late final _duk_get_int = _duk_get_intPtr.asFunction, int)>(); - int duk_get_uint( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_uint( - ctx, - idx, - ); + int duk_get_uint(ffi.Pointer ctx, int idx) { + return _duk_get_uint(ctx, idx); } late final _duk_get_uintPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_uint'); - late final _duk_get_uint = _duk_get_uintPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_uint'); + late final _duk_get_uint = + _duk_get_uintPtr + .asFunction, int)>(); - ffi.Pointer duk_get_string( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_string( - ctx, - idx, - ); + ffi.Pointer duk_get_string(ffi.Pointer ctx, int idx) { + return _duk_get_string(ctx, idx); } late final _duk_get_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_get_string'); - late final _duk_get_string = _duk_get_stringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_string'); + late final _duk_get_string = + _duk_get_stringPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); ffi.Pointer duk_get_lstring( ffi.Pointer ctx, int idx, ffi.Pointer out_len, ) { - return _duk_get_lstring( - ctx, - idx, - out_len, - ); + return _duk_get_lstring(ctx, idx, out_len); } late final _duk_get_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_lstring'); - late final _duk_get_lstring = _duk_get_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_lstring'); + late final _duk_get_lstring = + _duk_get_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_get_buffer( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_get_buffer( - ctx, - idx, - out_size, - ); + return _duk_get_buffer(ctx, idx, out_size); } late final _duk_get_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_buffer'); - late final _duk_get_buffer = _duk_get_bufferPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_buffer'); + late final _duk_get_buffer = + _duk_get_bufferPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_get_buffer_data( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_get_buffer_data( - ctx, - idx, - out_size, - ); + return _duk_get_buffer_data(ctx, idx, out_size); } late final _duk_get_buffer_dataPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_buffer_data'); - late final _duk_get_buffer_data = _duk_get_buffer_dataPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_buffer_data'); + late final _duk_get_buffer_data = + _duk_get_buffer_dataPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); - ffi.Pointer duk_get_pointer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_pointer( - ctx, - idx, - ); + ffi.Pointer duk_get_pointer(ffi.Pointer ctx, int idx) { + return _duk_get_pointer(ctx, idx); } late final _duk_get_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_get_pointer'); - late final _duk_get_pointer = _duk_get_pointerPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_pointer'); + late final _duk_get_pointer = + _duk_get_pointerPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - duk_c_function duk_get_c_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_c_function( - ctx, - idx, - ); + duk_c_function duk_get_c_function(ffi.Pointer ctx, int idx) { + return _duk_get_c_function(ctx, idx); } late final _duk_get_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_c_function Function( - ffi.Pointer, duk_idx_t)>>('duk_get_c_function'); - late final _duk_get_c_function = _duk_get_c_functionPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_c_function Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_c_function'); + late final _duk_get_c_function = + _duk_get_c_functionPtr + .asFunction, int)>(); ffi.Pointer duk_get_context( ffi.Pointer ctx, int idx, ) { - return _duk_get_context( - ctx, - idx, - ); + return _duk_get_context(ctx, idx); } late final _duk_get_contextPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_get_context'); - late final _duk_get_context = _duk_get_contextPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_context'); + late final _duk_get_context = + _duk_get_contextPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - ffi.Pointer duk_get_heapptr( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_heapptr( - ctx, - idx, - ); + ffi.Pointer duk_get_heapptr(ffi.Pointer ctx, int idx) { + return _duk_get_heapptr(ctx, idx); } late final _duk_get_heapptrPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_get_heapptr'); - late final _duk_get_heapptr = _duk_get_heapptrPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_get_heapptr'); + late final _duk_get_heapptr = + _duk_get_heapptrPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); /// Get-with-explicit default operations: like get operations but with an /// explicit default value. @@ -2125,96 +1849,95 @@ class DuktapeBindings { int idx, int def_value, ) { - return _duk_get_boolean_default( - ctx, - idx, - def_value, - ); + return _duk_get_boolean_default(ctx, idx, def_value); } late final _duk_get_boolean_defaultPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_bool_t)>>('duk_get_boolean_default'); - late final _duk_get_boolean_default = _duk_get_boolean_defaultPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_bool_t) + > + >('duk_get_boolean_default'); + late final _duk_get_boolean_default = + _duk_get_boolean_defaultPtr + .asFunction, int, int)>(); double duk_get_number_default( ffi.Pointer ctx, int idx, double def_value, ) { - return _duk_get_number_default( - ctx, - idx, - def_value, - ); + return _duk_get_number_default(ctx, idx, def_value); } late final _duk_get_number_defaultPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function(ffi.Pointer, duk_idx_t, - duk_double_t)>>('duk_get_number_default'); - late final _duk_get_number_default = _duk_get_number_defaultPtr - .asFunction, int, double)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t, duk_double_t) + > + >('duk_get_number_default'); + late final _duk_get_number_default = + _duk_get_number_defaultPtr + .asFunction, int, double)>(); int duk_get_int_default( ffi.Pointer ctx, int idx, int def_value, ) { - return _duk_get_int_default( - ctx, - idx, - def_value, - ); + return _duk_get_int_default(ctx, idx, def_value); } late final _duk_get_int_defaultPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, duk_idx_t, - duk_int_t)>>('duk_get_int_default'); - late final _duk_get_int_default = _duk_get_int_defaultPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_int_t Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_get_int_default'); + late final _duk_get_int_default = + _duk_get_int_defaultPtr + .asFunction, int, int)>(); int duk_get_uint_default( ffi.Pointer ctx, int idx, int def_value, ) { - return _duk_get_uint_default( - ctx, - idx, - def_value, - ); + return _duk_get_uint_default(ctx, idx, def_value); } late final _duk_get_uint_defaultPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_get_uint_default'); - late final _duk_get_uint_default = _duk_get_uint_defaultPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_uint_t Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_get_uint_default'); + late final _duk_get_uint_default = + _duk_get_uint_defaultPtr + .asFunction, int, int)>(); ffi.Pointer duk_get_string_default( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_get_string_default( - ctx, - idx, - def_value, - ); + return _duk_get_string_default(ctx, idx, def_value); } late final _duk_get_string_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_string_default'); - late final _duk_get_string_default = _duk_get_string_defaultPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_string_default'); + late final _duk_get_string_default = + _duk_get_string_defaultPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_get_lstring_default( ffi.Pointer ctx, @@ -2223,26 +1946,31 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_len, ) { - return _duk_get_lstring_default( - ctx, - idx, - out_len, - def_ptr, - def_len, - ); + return _duk_get_lstring_default(ctx, idx, out_len, def_ptr, def_len); } late final _duk_get_lstring_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_lstring_default'); + late final _duk_get_lstring_default = + _duk_get_lstring_defaultPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_lstring_default'); - late final _duk_get_lstring_default = _duk_get_lstring_defaultPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_get_buffer_default( ffi.Pointer ctx, @@ -2251,26 +1979,31 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_len, ) { - return _duk_get_buffer_default( - ctx, - idx, - out_size, - def_ptr, - def_len, - ); + return _duk_get_buffer_default(ctx, idx, out_size, def_ptr, def_len); } late final _duk_get_buffer_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_buffer_default'); + late final _duk_get_buffer_default = + _duk_get_buffer_defaultPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_buffer_default'); - late final _duk_get_buffer_default = _duk_get_buffer_defaultPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_get_buffer_data_default( ffi.Pointer ctx, @@ -2279,207 +2012,225 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_len, ) { - return _duk_get_buffer_data_default( - ctx, - idx, - out_size, - def_ptr, - def_len, - ); + return _duk_get_buffer_data_default(ctx, idx, out_size, def_ptr, def_len); } late final _duk_get_buffer_data_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_buffer_data_default'); + late final _duk_get_buffer_data_default = + _duk_get_buffer_data_defaultPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_buffer_data_default'); - late final _duk_get_buffer_data_default = - _duk_get_buffer_data_defaultPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_get_pointer_default( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_get_pointer_default( - ctx, - idx, - def_value, - ); + return _duk_get_pointer_default(ctx, idx, def_value); } late final _duk_get_pointer_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_pointer_default'); - late final _duk_get_pointer_default = _duk_get_pointer_defaultPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_pointer_default'); + late final _duk_get_pointer_default = + _duk_get_pointer_defaultPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); duk_c_function duk_get_c_function_default( ffi.Pointer ctx, int idx, duk_c_function def_value, ) { - return _duk_get_c_function_default( - ctx, - idx, - def_value, - ); + return _duk_get_c_function_default(ctx, idx, def_value); } late final _duk_get_c_function_defaultPtr = _lookup< - ffi.NativeFunction< - duk_c_function Function(ffi.Pointer, duk_idx_t, - duk_c_function)>>('duk_get_c_function_default'); + ffi.NativeFunction< + duk_c_function Function( + ffi.Pointer, + duk_idx_t, + duk_c_function, + ) + > + >('duk_get_c_function_default'); late final _duk_get_c_function_default = - _duk_get_c_function_defaultPtr.asFunction< - duk_c_function Function( - ffi.Pointer, int, duk_c_function)>(); + _duk_get_c_function_defaultPtr + .asFunction< + duk_c_function Function( + ffi.Pointer, + int, + duk_c_function, + ) + >(); ffi.Pointer duk_get_context_default( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_get_context_default( - ctx, - idx, - def_value, - ); + return _duk_get_context_default(ctx, idx, def_value); } late final _duk_get_context_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_context_default'); - late final _duk_get_context_default = _duk_get_context_defaultPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_context_default'); + late final _duk_get_context_default = + _duk_get_context_defaultPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_get_heapptr_default( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_get_heapptr_default( - ctx, - idx, - def_value, - ); + return _duk_get_heapptr_default(ctx, idx, def_value); } late final _duk_get_heapptr_defaultPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_heapptr_default'); - late final _duk_get_heapptr_default = _duk_get_heapptr_defaultPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_heapptr_default'); + late final _duk_get_heapptr_default = + _duk_get_heapptr_defaultPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); /// Opt operations: like require operations but with an explicit default value /// when value is undefined or index is invalid, null and non-matching types /// cause a TypeError. - int duk_opt_boolean( - ffi.Pointer ctx, - int idx, - int def_value, - ) { - return _duk_opt_boolean( - ctx, - idx, - def_value, - ); + int duk_opt_boolean(ffi.Pointer ctx, int idx, int def_value) { + return _duk_opt_boolean(ctx, idx, def_value); } late final _duk_opt_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_bool_t)>>('duk_opt_boolean'); - late final _duk_opt_boolean = _duk_opt_booleanPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_bool_t) + > + >('duk_opt_boolean'); + late final _duk_opt_boolean = + _duk_opt_booleanPtr + .asFunction, int, int)>(); double duk_opt_number( ffi.Pointer ctx, int idx, double def_value, ) { - return _duk_opt_number( - ctx, - idx, - def_value, - ); + return _duk_opt_number(ctx, idx, def_value); } late final _duk_opt_numberPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function(ffi.Pointer, duk_idx_t, - duk_double_t)>>('duk_opt_number'); - late final _duk_opt_number = _duk_opt_numberPtr - .asFunction, int, double)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t, duk_double_t) + > + >('duk_opt_number'); + late final _duk_opt_number = + _duk_opt_numberPtr + .asFunction, int, double)>(); - int duk_opt_int( - ffi.Pointer ctx, - int idx, - int def_value, - ) { - return _duk_opt_int( - ctx, - idx, - def_value, - ); + int duk_opt_int(ffi.Pointer ctx, int idx, int def_value) { + return _duk_opt_int(ctx, idx, def_value); } late final _duk_opt_intPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t, duk_int_t)>>('duk_opt_int'); - late final _duk_opt_int = _duk_opt_intPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_int_t Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_opt_int'); + late final _duk_opt_int = + _duk_opt_intPtr + .asFunction, int, int)>(); - int duk_opt_uint( - ffi.Pointer ctx, - int idx, - int def_value, - ) { - return _duk_opt_uint( - ctx, - idx, - def_value, - ); + int duk_opt_uint(ffi.Pointer ctx, int idx, int def_value) { + return _duk_opt_uint(ctx, idx, def_value); } late final _duk_opt_uintPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_opt_uint'); - late final _duk_opt_uint = _duk_opt_uintPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_uint_t Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_opt_uint'); + late final _duk_opt_uint = + _duk_opt_uintPtr + .asFunction, int, int)>(); ffi.Pointer duk_opt_string( ffi.Pointer ctx, int idx, ffi.Pointer def_ptr, ) { - return _duk_opt_string( - ctx, - idx, - def_ptr, - ); + return _duk_opt_string(ctx, idx, def_ptr); } late final _duk_opt_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_opt_string'); - late final _duk_opt_string = _duk_opt_stringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_opt_string'); + late final _duk_opt_string = + _duk_opt_stringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_opt_lstring( ffi.Pointer ctx, @@ -2488,26 +2239,31 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_len, ) { - return _duk_opt_lstring( - ctx, - idx, - out_len, - def_ptr, - def_len, - ); + return _duk_opt_lstring(ctx, idx, out_len, def_ptr, def_len); } late final _duk_opt_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_opt_lstring'); + late final _duk_opt_lstring = + _duk_opt_lstringPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_opt_lstring'); - late final _duk_opt_lstring = _duk_opt_lstringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_opt_buffer( ffi.Pointer ctx, @@ -2516,26 +2272,31 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_size, ) { - return _duk_opt_buffer( - ctx, - idx, - out_size, - def_ptr, - def_size, - ); + return _duk_opt_buffer(ctx, idx, out_size, def_ptr, def_size); } late final _duk_opt_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_opt_buffer'); + late final _duk_opt_buffer = + _duk_opt_bufferPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_opt_buffer'); - late final _duk_opt_buffer = _duk_opt_bufferPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_opt_buffer_data( ffi.Pointer ctx, @@ -2544,611 +2305,569 @@ class DuktapeBindings { ffi.Pointer def_ptr, int def_size, ) { - return _duk_opt_buffer_data( - ctx, - idx, - out_size, - def_ptr, - def_size, - ); + return _duk_opt_buffer_data(ctx, idx, out_size, def_ptr, def_size); } late final _duk_opt_buffer_dataPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_opt_buffer_data'); + late final _duk_opt_buffer_data = + _duk_opt_buffer_dataPtr + .asFunction< + ffi.Pointer Function( ffi.Pointer, - duk_idx_t, + int, ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_opt_buffer_data'); - late final _duk_opt_buffer_data = _duk_opt_buffer_dataPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, - ffi.Pointer, ffi.Pointer, int)>(); + int, + ) + >(); ffi.Pointer duk_opt_pointer( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_opt_pointer( - ctx, - idx, - def_value, - ); + return _duk_opt_pointer(ctx, idx, def_value); } late final _duk_opt_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_opt_pointer'); - late final _duk_opt_pointer = _duk_opt_pointerPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_opt_pointer'); + late final _duk_opt_pointer = + _duk_opt_pointerPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); duk_c_function duk_opt_c_function( ffi.Pointer ctx, int idx, duk_c_function def_value, ) { - return _duk_opt_c_function( - ctx, - idx, - def_value, - ); + return _duk_opt_c_function(ctx, idx, def_value); } late final _duk_opt_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_c_function Function(ffi.Pointer, duk_idx_t, - duk_c_function)>>('duk_opt_c_function'); - late final _duk_opt_c_function = _duk_opt_c_functionPtr.asFunction< - duk_c_function Function(ffi.Pointer, int, duk_c_function)>(); + ffi.NativeFunction< + duk_c_function Function( + ffi.Pointer, + duk_idx_t, + duk_c_function, + ) + > + >('duk_opt_c_function'); + late final _duk_opt_c_function = + _duk_opt_c_functionPtr + .asFunction< + duk_c_function Function( + ffi.Pointer, + int, + duk_c_function, + ) + >(); ffi.Pointer duk_opt_context( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_opt_context( - ctx, - idx, - def_value, - ); + return _duk_opt_context(ctx, idx, def_value); } late final _duk_opt_contextPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_opt_context'); - late final _duk_opt_context = _duk_opt_contextPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_opt_context'); + late final _duk_opt_context = + _duk_opt_contextPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_opt_heapptr( ffi.Pointer ctx, int idx, ffi.Pointer def_value, ) { - return _duk_opt_heapptr( - ctx, - idx, - def_value, - ); + return _duk_opt_heapptr(ctx, idx, def_value); } late final _duk_opt_heapptrPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_opt_heapptr'); - late final _duk_opt_heapptr = _duk_opt_heapptrPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_opt_heapptr'); + late final _duk_opt_heapptr = + _duk_opt_heapptrPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); - void duk_require_undefined( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_undefined( - ctx, - idx, - ); + void duk_require_undefined(ffi.Pointer ctx, int idx) { + return _duk_require_undefined(ctx, idx); } late final _duk_require_undefinedPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_undefined'); - late final _duk_require_undefined = _duk_require_undefinedPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_undefined'); + late final _duk_require_undefined = + _duk_require_undefinedPtr + .asFunction, int)>(); - void duk_require_null( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_null( - ctx, - idx, - ); + void duk_require_null(ffi.Pointer ctx, int idx) { + return _duk_require_null(ctx, idx); } late final _duk_require_nullPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_null'); - late final _duk_require_null = _duk_require_nullPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_null'); + late final _duk_require_null = + _duk_require_nullPtr + .asFunction, int)>(); - int duk_require_boolean( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_boolean( - ctx, - idx, - ); + int duk_require_boolean(ffi.Pointer ctx, int idx) { + return _duk_require_boolean(ctx, idx); } late final _duk_require_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_require_boolean'); - late final _duk_require_boolean = _duk_require_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_boolean'); + late final _duk_require_boolean = + _duk_require_booleanPtr + .asFunction, int)>(); - double duk_require_number( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_number( - ctx, - idx, - ); + double duk_require_number(ffi.Pointer ctx, int idx) { + return _duk_require_number(ctx, idx); } late final _duk_require_numberPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function( - ffi.Pointer, duk_idx_t)>>('duk_require_number'); - late final _duk_require_number = _duk_require_numberPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_number'); + late final _duk_require_number = + _duk_require_numberPtr + .asFunction, int)>(); - int duk_require_int( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_int( - ctx, - idx, - ); + int duk_require_int(ffi.Pointer ctx, int idx) { + return _duk_require_int(ctx, idx); } late final _duk_require_intPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_require_int'); - late final _duk_require_int = _duk_require_intPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_int'); + late final _duk_require_int = + _duk_require_intPtr + .asFunction, int)>(); - int duk_require_uint( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_uint( - ctx, - idx, - ); + int duk_require_uint(ffi.Pointer ctx, int idx) { + return _duk_require_uint(ctx, idx); } late final _duk_require_uintPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function( - ffi.Pointer, duk_idx_t)>>('duk_require_uint'); - late final _duk_require_uint = _duk_require_uintPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_uint'); + late final _duk_require_uint = + _duk_require_uintPtr + .asFunction, int)>(); ffi.Pointer duk_require_string( ffi.Pointer ctx, int idx, ) { - return _duk_require_string( - ctx, - idx, - ); + return _duk_require_string(ctx, idx); } late final _duk_require_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_require_string'); - late final _duk_require_string = _duk_require_stringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_string'); + late final _duk_require_string = + _duk_require_stringPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); ffi.Pointer duk_require_lstring( ffi.Pointer ctx, int idx, ffi.Pointer out_len, ) { - return _duk_require_lstring( - ctx, - idx, - out_len, - ); + return _duk_require_lstring(ctx, idx, out_len); } late final _duk_require_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_require_lstring'); - late final _duk_require_lstring = _duk_require_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_require_lstring'); + late final _duk_require_lstring = + _duk_require_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); - void duk_require_object( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_object( - ctx, - idx, - ); + void duk_require_object(ffi.Pointer ctx, int idx) { + return _duk_require_object(ctx, idx); } late final _duk_require_objectPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_object'); - late final _duk_require_object = _duk_require_objectPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_object'); + late final _duk_require_object = + _duk_require_objectPtr + .asFunction, int)>(); ffi.Pointer duk_require_buffer( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_require_buffer( - ctx, - idx, - out_size, - ); + return _duk_require_buffer(ctx, idx, out_size); } late final _duk_require_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_require_buffer'); - late final _duk_require_buffer = _duk_require_bufferPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_require_buffer'); + late final _duk_require_buffer = + _duk_require_bufferPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_require_buffer_data( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_require_buffer_data( - ctx, - idx, - out_size, - ); + return _duk_require_buffer_data(ctx, idx, out_size); } late final _duk_require_buffer_dataPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_require_buffer_data'); - late final _duk_require_buffer_data = _duk_require_buffer_dataPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_require_buffer_data'); + late final _duk_require_buffer_data = + _duk_require_buffer_dataPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_require_pointer( ffi.Pointer ctx, int idx, ) { - return _duk_require_pointer( - ctx, - idx, - ); - } - - late final _duk_require_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_require_pointer'); - late final _duk_require_pointer = _duk_require_pointerPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); - - duk_c_function duk_require_c_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_c_function( - ctx, - idx, - ); + return _duk_require_pointer(ctx, idx); + } + + late final _duk_require_pointerPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_pointer'); + late final _duk_require_pointer = + _duk_require_pointerPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); + + duk_c_function duk_require_c_function(ffi.Pointer ctx, int idx) { + return _duk_require_c_function(ctx, idx); } late final _duk_require_c_functionPtr = _lookup< - ffi.NativeFunction< - duk_c_function Function( - ffi.Pointer, duk_idx_t)>>('duk_require_c_function'); - late final _duk_require_c_function = _duk_require_c_functionPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_c_function Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_c_function'); + late final _duk_require_c_function = + _duk_require_c_functionPtr + .asFunction, int)>(); ffi.Pointer duk_require_context( ffi.Pointer ctx, int idx, ) { - return _duk_require_context( - ctx, - idx, - ); + return _duk_require_context(ctx, idx); } late final _duk_require_contextPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_require_context'); - late final _duk_require_context = _duk_require_contextPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_context'); + late final _duk_require_context = + _duk_require_contextPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_require_function( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_function( - ctx, - idx, - ); + void duk_require_function(ffi.Pointer ctx, int idx) { + return _duk_require_function(ctx, idx); } late final _duk_require_functionPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_require_function'); - late final _duk_require_function = _duk_require_functionPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_function'); + late final _duk_require_function = + _duk_require_functionPtr + .asFunction, int)>(); - void duk_require_constructor_call( - ffi.Pointer ctx, - ) { - return _duk_require_constructor_call( - ctx, - ); + void duk_require_constructor_call(ffi.Pointer ctx) { + return _duk_require_constructor_call(ctx); } late final _duk_require_constructor_callPtr = _lookup)>>( - 'duk_require_constructor_call'); - late final _duk_require_constructor_call = _duk_require_constructor_callPtr - .asFunction)>(); + 'duk_require_constructor_call', + ); + late final _duk_require_constructor_call = + _duk_require_constructor_callPtr + .asFunction)>(); - void duk_require_constructable( - ffi.Pointer ctx, - int idx, - ) { - return _duk_require_constructable( - ctx, - idx, - ); + void duk_require_constructable(ffi.Pointer ctx, int idx) { + return _duk_require_constructable(ctx, idx); } late final _duk_require_constructablePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - duk_idx_t)>>('duk_require_constructable'); - late final _duk_require_constructable = _duk_require_constructablePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_require_constructable'); + late final _duk_require_constructable = + _duk_require_constructablePtr + .asFunction, int)>(); ffi.Pointer duk_require_heapptr( ffi.Pointer ctx, int idx, ) { - return _duk_require_heapptr( - ctx, - idx, - ); + return _duk_require_heapptr(ctx, idx); } late final _duk_require_heapptrPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_require_heapptr'); - late final _duk_require_heapptr = _duk_require_heapptrPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_require_heapptr'); + late final _duk_require_heapptr = + _duk_require_heapptrPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); /// Coercion operations: in-place coercion, return coerced value where /// applicable. If index is invalid, throw error. Some coercions may /// throw an expected error (e.g. from a toString() or valueOf() call) /// or an internal error (e.g. from out of memory). - void duk_to_undefined( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_undefined( - ctx, - idx, - ); + void duk_to_undefined(ffi.Pointer ctx, int idx) { + return _duk_to_undefined(ctx, idx); } late final _duk_to_undefinedPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_to_undefined'); - late final _duk_to_undefined = _duk_to_undefinedPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_undefined'); + late final _duk_to_undefined = + _duk_to_undefinedPtr + .asFunction, int)>(); - void duk_to_null( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_null( - ctx, - idx, - ); + void duk_to_null(ffi.Pointer ctx, int idx) { + return _duk_to_null(ctx, idx); } late final _duk_to_nullPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_to_null'); - late final _duk_to_null = _duk_to_nullPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_null'); + late final _duk_to_null = + _duk_to_nullPtr + .asFunction, int)>(); - int duk_to_boolean( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_boolean( - ctx, - idx, - ); + int duk_to_boolean(ffi.Pointer ctx, int idx) { + return _duk_to_boolean(ctx, idx); } late final _duk_to_booleanPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_boolean'); - late final _duk_to_boolean = _duk_to_booleanPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_boolean'); + late final _duk_to_boolean = + _duk_to_booleanPtr + .asFunction, int)>(); - double duk_to_number( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_number( - ctx, - idx, - ); + double duk_to_number(ffi.Pointer ctx, int idx) { + return _duk_to_number(ctx, idx); } late final _duk_to_numberPtr = _lookup< - ffi.NativeFunction< - duk_double_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_number'); - late final _duk_to_number = _duk_to_numberPtr - .asFunction, int)>(); + ffi.NativeFunction< + duk_double_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_number'); + late final _duk_to_number = + _duk_to_numberPtr + .asFunction, int)>(); - int duk_to_int( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_int( - ctx, - idx, - ); + int duk_to_int(ffi.Pointer ctx, int idx) { + return _duk_to_int(ctx, idx); } late final _duk_to_intPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_int'); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_int'); late final _duk_to_int = _duk_to_intPtr.asFunction, int)>(); - int duk_to_uint( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_uint( - ctx, - idx, - ); + int duk_to_uint(ffi.Pointer ctx, int idx) { + return _duk_to_uint(ctx, idx); } late final _duk_to_uintPtr = _lookup< - ffi.NativeFunction< - duk_uint_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_uint'); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_uint'); late final _duk_to_uint = _duk_to_uintPtr.asFunction, int)>(); - int duk_to_int32( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_int32( - ctx, - idx, - ); + int duk_to_int32(ffi.Pointer ctx, int idx) { + return _duk_to_int32(ctx, idx); } late final _duk_to_int32Ptr = _lookup< - ffi.NativeFunction< - duk_int32_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_int32'); - late final _duk_to_int32 = _duk_to_int32Ptr - .asFunction, int)>(); + ffi.NativeFunction< + duk_int32_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_int32'); + late final _duk_to_int32 = + _duk_to_int32Ptr + .asFunction, int)>(); - int duk_to_uint32( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_uint32( - ctx, - idx, - ); + int duk_to_uint32(ffi.Pointer ctx, int idx) { + return _duk_to_uint32(ctx, idx); } late final _duk_to_uint32Ptr = _lookup< - ffi.NativeFunction< - duk_uint32_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_uint32'); - late final _duk_to_uint32 = _duk_to_uint32Ptr - .asFunction, int)>(); + ffi.NativeFunction< + duk_uint32_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_uint32'); + late final _duk_to_uint32 = + _duk_to_uint32Ptr + .asFunction, int)>(); - int duk_to_uint16( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_uint16( - ctx, - idx, - ); + int duk_to_uint16(ffi.Pointer ctx, int idx) { + return _duk_to_uint16(ctx, idx); } late final _duk_to_uint16Ptr = _lookup< - ffi.NativeFunction< - duk_uint16_t Function( - ffi.Pointer, duk_idx_t)>>('duk_to_uint16'); - late final _duk_to_uint16 = _duk_to_uint16Ptr - .asFunction, int)>(); + ffi.NativeFunction< + duk_uint16_t Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_uint16'); + late final _duk_to_uint16 = + _duk_to_uint16Ptr + .asFunction, int)>(); - ffi.Pointer duk_to_string( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_string( - ctx, - idx, - ); + ffi.Pointer duk_to_string(ffi.Pointer ctx, int idx) { + return _duk_to_string(ctx, idx); } late final _duk_to_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_to_string'); - late final _duk_to_string = _duk_to_stringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_string'); + late final _duk_to_string = + _duk_to_stringPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); ffi.Pointer duk_to_lstring( ffi.Pointer ctx, int idx, ffi.Pointer out_len, ) { - return _duk_to_lstring( - ctx, - idx, - out_len, - ); + return _duk_to_lstring(ctx, idx, out_len); } late final _duk_to_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_to_lstring'); - late final _duk_to_lstring = _duk_to_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_to_lstring'); + late final _duk_to_lstring = + _duk_to_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_to_buffer_raw( ffi.Pointer ctx, @@ -3156,74 +2875,68 @@ class DuktapeBindings { ffi.Pointer out_size, int flags, ) { - return _duk_to_buffer_raw( - ctx, - idx, - out_size, - flags, - ); + return _duk_to_buffer_raw(ctx, idx, out_size, flags); } late final _duk_to_buffer_rawPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_uint_t)>>('duk_to_buffer_raw'); - late final _duk_to_buffer_raw = _duk_to_buffer_rawPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_uint_t, + ) + > + >('duk_to_buffer_raw'); + late final _duk_to_buffer_raw = + _duk_to_buffer_rawPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); - ffi.Pointer duk_to_pointer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_pointer( - ctx, - idx, - ); + ffi.Pointer duk_to_pointer(ffi.Pointer ctx, int idx) { + return _duk_to_pointer(ctx, idx); } late final _duk_to_pointerPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_to_pointer'); - late final _duk_to_pointer = _duk_to_pointerPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_pointer'); + late final _duk_to_pointer = + _duk_to_pointerPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_to_object( - ffi.Pointer ctx, - int idx, - ) { - return _duk_to_object( - ctx, - idx, - ); + void duk_to_object(ffi.Pointer ctx, int idx) { + return _duk_to_object(ctx, idx); } late final _duk_to_objectPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_to_object'); - late final _duk_to_object = _duk_to_objectPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_to_object'); + late final _duk_to_object = + _duk_to_objectPtr + .asFunction, int)>(); - void duk_to_primitive( - ffi.Pointer ctx, - int idx, - int hint, - ) { - return _duk_to_primitive( - ctx, - idx, - hint, - ); + void duk_to_primitive(ffi.Pointer ctx, int idx, int hint) { + return _duk_to_primitive(ctx, idx, hint); } late final _duk_to_primitivePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_int_t)>>('duk_to_primitive'); - late final _duk_to_primitive = _duk_to_primitivePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_to_primitive'); + late final _duk_to_primitive = + _duk_to_primitivePtr + .asFunction, int, int)>(); /// safe variants of a few coercion operations ffi.Pointer duk_safe_to_lstring( @@ -3231,249 +2944,222 @@ class DuktapeBindings { int idx, ffi.Pointer out_len, ) { - return _duk_safe_to_lstring( - ctx, - idx, - out_len, - ); + return _duk_safe_to_lstring(ctx, idx, out_len); } late final _duk_safe_to_lstringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_safe_to_lstring'); - late final _duk_safe_to_lstring = _duk_safe_to_lstringPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_safe_to_lstring'); + late final _duk_safe_to_lstring = + _duk_safe_to_lstringPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); ffi.Pointer duk_to_stacktrace( ffi.Pointer ctx, int idx, ) { - return _duk_to_stacktrace( - ctx, - idx, - ); + return _duk_to_stacktrace(ctx, idx); } late final _duk_to_stacktracePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_to_stacktrace'); - late final _duk_to_stacktrace = _duk_to_stacktracePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_to_stacktrace'); + late final _duk_to_stacktrace = + _duk_to_stacktracePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); ffi.Pointer duk_safe_to_stacktrace( ffi.Pointer ctx, int idx, ) { - return _duk_safe_to_stacktrace( - ctx, - idx, - ); + return _duk_safe_to_stacktrace(ctx, idx); } late final _duk_safe_to_stacktracePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_safe_to_stacktrace'); - late final _duk_safe_to_stacktrace = _duk_safe_to_stacktracePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_safe_to_stacktrace'); + late final _duk_safe_to_stacktrace = + _duk_safe_to_stacktracePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); /// Value length - int duk_get_length( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_length( - ctx, - idx, - ); + int duk_get_length(ffi.Pointer ctx, int idx) { + return _duk_get_length(ctx, idx); } late final _duk_get_lengthPtr = _lookup< - ffi.NativeFunction< - duk_size_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_length'); - late final _duk_get_length = _duk_get_lengthPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_length'); + late final _duk_get_length = + _duk_get_lengthPtr + .asFunction, int)>(); - void duk_set_length( - ffi.Pointer ctx, - int idx, - int len, - ) { - return _duk_set_length( - ctx, - idx, - len, - ); + void duk_set_length(ffi.Pointer ctx, int idx, int len) { + return _duk_set_length(ctx, idx, len); } late final _duk_set_lengthPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_size_t)>>('duk_set_length'); - late final _duk_set_length = _duk_set_lengthPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_size_t) + > + >('duk_set_length'); + late final _duk_set_length = + _duk_set_lengthPtr + .asFunction, int, int)>(); /// Misc conversion ffi.Pointer duk_base64_encode( ffi.Pointer ctx, int idx, ) { - return _duk_base64_encode( - ctx, - idx, - ); + return _duk_base64_encode(ctx, idx); } late final _duk_base64_encodePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_base64_encode'); - late final _duk_base64_encode = _duk_base64_encodePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_base64_encode'); + late final _duk_base64_encode = + _duk_base64_encodePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_base64_decode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_base64_decode( - ctx, - idx, - ); + void duk_base64_decode(ffi.Pointer ctx, int idx) { + return _duk_base64_decode(ctx, idx); } late final _duk_base64_decodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_base64_decode'); - late final _duk_base64_decode = _duk_base64_decodePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_base64_decode'); + late final _duk_base64_decode = + _duk_base64_decodePtr + .asFunction, int)>(); - ffi.Pointer duk_hex_encode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_hex_encode( - ctx, - idx, - ); + ffi.Pointer duk_hex_encode(ffi.Pointer ctx, int idx) { + return _duk_hex_encode(ctx, idx); } late final _duk_hex_encodePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_hex_encode'); - late final _duk_hex_encode = _duk_hex_encodePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_hex_encode'); + late final _duk_hex_encode = + _duk_hex_encodePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_hex_decode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_hex_decode( - ctx, - idx, - ); + void duk_hex_decode(ffi.Pointer ctx, int idx) { + return _duk_hex_decode(ctx, idx); } late final _duk_hex_decodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_hex_decode'); - late final _duk_hex_decode = _duk_hex_decodePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_hex_decode'); + late final _duk_hex_decode = + _duk_hex_decodePtr + .asFunction, int)>(); - ffi.Pointer duk_json_encode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_json_encode( - ctx, - idx, - ); + ffi.Pointer duk_json_encode(ffi.Pointer ctx, int idx) { + return _duk_json_encode(ctx, idx); } late final _duk_json_encodePtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_json_encode'); - late final _duk_json_encode = _duk_json_encodePtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_json_encode'); + late final _duk_json_encode = + _duk_json_encodePtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); - void duk_json_decode( - ffi.Pointer ctx, - int idx, - ) { - return _duk_json_decode( - ctx, - idx, - ); + void duk_json_decode(ffi.Pointer ctx, int idx) { + return _duk_json_decode(ctx, idx); } late final _duk_json_decodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_json_decode'); - late final _duk_json_decode = _duk_json_decodePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_json_decode'); + late final _duk_json_decode = + _duk_json_decodePtr + .asFunction, int)>(); void duk_cbor_encode( ffi.Pointer ctx, int idx, int encode_flags, ) { - return _duk_cbor_encode( - ctx, - idx, - encode_flags, - ); + return _duk_cbor_encode(ctx, idx, encode_flags); } late final _duk_cbor_encodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_cbor_encode'); - late final _duk_cbor_encode = _duk_cbor_encodePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_cbor_encode'); + late final _duk_cbor_encode = + _duk_cbor_encodePtr + .asFunction, int, int)>(); void duk_cbor_decode( ffi.Pointer ctx, int idx, int decode_flags, ) { - return _duk_cbor_decode( - ctx, - idx, - decode_flags, - ); + return _duk_cbor_decode(ctx, idx, decode_flags); } late final _duk_cbor_decodePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_cbor_decode'); - late final _duk_cbor_decode = _duk_cbor_decodePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_cbor_decode'); + late final _duk_cbor_decode = + _duk_cbor_decodePtr + .asFunction, int, int)>(); ffi.Pointer duk_buffer_to_string( ffi.Pointer ctx, int idx, ) { - return _duk_buffer_to_string( - ctx, - idx, - ); + return _duk_buffer_to_string(ctx, idx); } late final _duk_buffer_to_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Pointer, duk_idx_t)>>('duk_buffer_to_string'); - late final _duk_buffer_to_string = _duk_buffer_to_stringPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, duk_idx_t) + > + >('duk_buffer_to_string'); + late final _duk_buffer_to_string = + _duk_buffer_to_stringPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int) + >(); /// Buffer ffi.Pointer duk_resize_buffer( @@ -3481,39 +3167,50 @@ class DuktapeBindings { int idx, int new_size, ) { - return _duk_resize_buffer( - ctx, - idx, - new_size, - ); + return _duk_resize_buffer(ctx, idx, new_size); } late final _duk_resize_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - duk_size_t)>>('duk_resize_buffer'); - late final _duk_resize_buffer = _duk_resize_bufferPtr.asFunction< - ffi.Pointer Function(ffi.Pointer, int, int)>(); + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + duk_idx_t, + duk_size_t, + ) + > + >('duk_resize_buffer'); + late final _duk_resize_buffer = + _duk_resize_bufferPtr + .asFunction< + ffi.Pointer Function(ffi.Pointer, int, int) + >(); ffi.Pointer duk_steal_buffer( ffi.Pointer ctx, int idx, ffi.Pointer out_size, ) { - return _duk_steal_buffer( - ctx, - idx, - out_size, - ); + return _duk_steal_buffer(ctx, idx, out_size); } late final _duk_steal_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_steal_buffer'); - late final _duk_steal_buffer = _duk_steal_bufferPtr.asFunction< + ffi.NativeFunction< ffi.Pointer Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_steal_buffer'); + late final _duk_steal_buffer = + _duk_steal_bufferPtr + .asFunction< + ffi.Pointer Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); void duk_config_buffer( ffi.Pointer ctx, @@ -3521,21 +3218,29 @@ class DuktapeBindings { ffi.Pointer ptr, int len, ) { - return _duk_config_buffer( - ctx, - idx, - ptr, - len, - ); + return _duk_config_buffer(ctx, idx, ptr, len); } late final _duk_config_bufferPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_config_buffer'); - late final _duk_config_buffer = _duk_config_bufferPtr.asFunction< - void Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_config_buffer'); + late final _duk_config_buffer = + _duk_config_bufferPtr + .asFunction< + void Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); /// Property access /// @@ -3544,41 +3249,39 @@ class DuktapeBindings { /// The _index variant takes an array index as a property name (e.g. 123 is /// equivalent to the key "123"). The _heapptr variant takes a raw, borrowed /// heap pointer. - int duk_get_prop( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_get_prop( - ctx, - obj_idx, - ); + int duk_get_prop(ffi.Pointer ctx, int obj_idx) { + return _duk_get_prop(ctx, obj_idx); } late final _duk_get_propPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_prop'); - late final _duk_get_prop = _duk_get_propPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_prop'); + late final _duk_get_prop = + _duk_get_propPtr + .asFunction, int)>(); int duk_get_prop_string( ffi.Pointer ctx, int obj_idx, ffi.Pointer key, ) { - return _duk_get_prop_string( - ctx, - obj_idx, - key, - ); + return _duk_get_prop_string(ctx, obj_idx, key); } late final _duk_get_prop_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_prop_string'); - late final _duk_get_prop_string = _duk_get_prop_stringPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_prop_string'); + late final _duk_get_prop_string = + _duk_get_prop_stringPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); int duk_get_prop_lstring( ffi.Pointer ctx, @@ -3586,21 +3289,29 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_get_prop_lstring( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_get_prop_lstring(ctx, obj_idx, key, key_len); } late final _duk_get_prop_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_get_prop_lstring'); - late final _duk_get_prop_lstring = _duk_get_prop_lstringPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_prop_lstring'); + late final _duk_get_prop_lstring = + _duk_get_prop_lstringPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_get_prop_literal_raw( ffi.Pointer ctx, @@ -3608,96 +3319,103 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_get_prop_literal_raw( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_get_prop_literal_raw(ctx, obj_idx, key, key_len); } late final _duk_get_prop_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_get_prop_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_prop_literal_raw'); late final _duk_get_prop_literal_raw = - _duk_get_prop_literal_rawPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + _duk_get_prop_literal_rawPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_get_prop_index( ffi.Pointer ctx, int obj_idx, int arr_idx, ) { - return _duk_get_prop_index( - ctx, - obj_idx, - arr_idx, - ); + return _duk_get_prop_index(ctx, obj_idx, arr_idx); } late final _duk_get_prop_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uarridx_t)>>('duk_get_prop_index'); - late final _duk_get_prop_index = _duk_get_prop_indexPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uarridx_t) + > + >('duk_get_prop_index'); + late final _duk_get_prop_index = + _duk_get_prop_indexPtr + .asFunction, int, int)>(); int duk_get_prop_heapptr( ffi.Pointer ctx, int obj_idx, ffi.Pointer ptr, ) { - return _duk_get_prop_heapptr( - ctx, - obj_idx, - ptr, - ); + return _duk_get_prop_heapptr(ctx, obj_idx, ptr); } late final _duk_get_prop_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_get_prop_heapptr'); - late final _duk_get_prop_heapptr = _duk_get_prop_heapptrPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); - - int duk_put_prop( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_put_prop( - ctx, - obj_idx, - ); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_get_prop_heapptr'); + late final _duk_get_prop_heapptr = + _duk_get_prop_heapptrPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); + + int duk_put_prop(ffi.Pointer ctx, int obj_idx) { + return _duk_put_prop(ctx, obj_idx); } late final _duk_put_propPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_put_prop'); - late final _duk_put_prop = _duk_put_propPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_put_prop'); + late final _duk_put_prop = + _duk_put_propPtr + .asFunction, int)>(); int duk_put_prop_string( ffi.Pointer ctx, int obj_idx, ffi.Pointer key, ) { - return _duk_put_prop_string( - ctx, - obj_idx, - key, - ); + return _duk_put_prop_string(ctx, obj_idx, key); } late final _duk_put_prop_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_put_prop_string'); - late final _duk_put_prop_string = _duk_put_prop_stringPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_put_prop_string'); + late final _duk_put_prop_string = + _duk_put_prop_stringPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); int duk_put_prop_lstring( ffi.Pointer ctx, @@ -3705,21 +3423,29 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_put_prop_lstring( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_put_prop_lstring(ctx, obj_idx, key, key_len); } late final _duk_put_prop_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_put_prop_lstring'); - late final _duk_put_prop_lstring = _duk_put_prop_lstringPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_put_prop_lstring'); + late final _duk_put_prop_lstring = + _duk_put_prop_lstringPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_put_prop_literal_raw( ffi.Pointer ctx, @@ -3727,96 +3453,103 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_put_prop_literal_raw( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_put_prop_literal_raw(ctx, obj_idx, key, key_len); } late final _duk_put_prop_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_put_prop_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_put_prop_literal_raw'); late final _duk_put_prop_literal_raw = - _duk_put_prop_literal_rawPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + _duk_put_prop_literal_rawPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_put_prop_index( ffi.Pointer ctx, int obj_idx, int arr_idx, ) { - return _duk_put_prop_index( - ctx, - obj_idx, - arr_idx, - ); + return _duk_put_prop_index(ctx, obj_idx, arr_idx); } late final _duk_put_prop_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uarridx_t)>>('duk_put_prop_index'); - late final _duk_put_prop_index = _duk_put_prop_indexPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uarridx_t) + > + >('duk_put_prop_index'); + late final _duk_put_prop_index = + _duk_put_prop_indexPtr + .asFunction, int, int)>(); int duk_put_prop_heapptr( ffi.Pointer ctx, int obj_idx, ffi.Pointer ptr, ) { - return _duk_put_prop_heapptr( - ctx, - obj_idx, - ptr, - ); + return _duk_put_prop_heapptr(ctx, obj_idx, ptr); } late final _duk_put_prop_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_put_prop_heapptr'); - late final _duk_put_prop_heapptr = _duk_put_prop_heapptrPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); - - int duk_del_prop( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_del_prop( - ctx, - obj_idx, - ); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_put_prop_heapptr'); + late final _duk_put_prop_heapptr = + _duk_put_prop_heapptrPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); + + int duk_del_prop(ffi.Pointer ctx, int obj_idx) { + return _duk_del_prop(ctx, obj_idx); } late final _duk_del_propPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_del_prop'); - late final _duk_del_prop = _duk_del_propPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_del_prop'); + late final _duk_del_prop = + _duk_del_propPtr + .asFunction, int)>(); int duk_del_prop_string( ffi.Pointer ctx, int obj_idx, ffi.Pointer key, ) { - return _duk_del_prop_string( - ctx, - obj_idx, - key, - ); + return _duk_del_prop_string(ctx, obj_idx, key); } late final _duk_del_prop_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_del_prop_string'); - late final _duk_del_prop_string = _duk_del_prop_stringPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_del_prop_string'); + late final _duk_del_prop_string = + _duk_del_prop_stringPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); int duk_del_prop_lstring( ffi.Pointer ctx, @@ -3824,21 +3557,29 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_del_prop_lstring( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_del_prop_lstring(ctx, obj_idx, key, key_len); } late final _duk_del_prop_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_del_prop_lstring'); - late final _duk_del_prop_lstring = _duk_del_prop_lstringPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_del_prop_lstring'); + late final _duk_del_prop_lstring = + _duk_del_prop_lstringPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_del_prop_literal_raw( ffi.Pointer ctx, @@ -3846,96 +3587,103 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_del_prop_literal_raw( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_del_prop_literal_raw(ctx, obj_idx, key, key_len); } late final _duk_del_prop_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_del_prop_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_del_prop_literal_raw'); late final _duk_del_prop_literal_raw = - _duk_del_prop_literal_rawPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + _duk_del_prop_literal_rawPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_del_prop_index( ffi.Pointer ctx, int obj_idx, int arr_idx, ) { - return _duk_del_prop_index( - ctx, - obj_idx, - arr_idx, - ); + return _duk_del_prop_index(ctx, obj_idx, arr_idx); } late final _duk_del_prop_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uarridx_t)>>('duk_del_prop_index'); - late final _duk_del_prop_index = _duk_del_prop_indexPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uarridx_t) + > + >('duk_del_prop_index'); + late final _duk_del_prop_index = + _duk_del_prop_indexPtr + .asFunction, int, int)>(); int duk_del_prop_heapptr( ffi.Pointer ctx, int obj_idx, ffi.Pointer ptr, ) { - return _duk_del_prop_heapptr( - ctx, - obj_idx, - ptr, - ); + return _duk_del_prop_heapptr(ctx, obj_idx, ptr); } late final _duk_del_prop_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_del_prop_heapptr'); - late final _duk_del_prop_heapptr = _duk_del_prop_heapptrPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); - - int duk_has_prop( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_has_prop( - ctx, - obj_idx, - ); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_del_prop_heapptr'); + late final _duk_del_prop_heapptr = + _duk_del_prop_heapptrPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); + + int duk_has_prop(ffi.Pointer ctx, int obj_idx) { + return _duk_has_prop(ctx, obj_idx); } late final _duk_has_propPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_has_prop'); - late final _duk_has_prop = _duk_has_propPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_has_prop'); + late final _duk_has_prop = + _duk_has_propPtr + .asFunction, int)>(); int duk_has_prop_string( ffi.Pointer ctx, int obj_idx, ffi.Pointer key, ) { - return _duk_has_prop_string( - ctx, - obj_idx, - key, - ); + return _duk_has_prop_string(ctx, obj_idx, key); } late final _duk_has_prop_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_has_prop_string'); - late final _duk_has_prop_string = _duk_has_prop_stringPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_has_prop_string'); + late final _duk_has_prop_string = + _duk_has_prop_stringPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); int duk_has_prop_lstring( ffi.Pointer ctx, @@ -3943,21 +3691,29 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_has_prop_lstring( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_has_prop_lstring(ctx, obj_idx, key, key_len); } late final _duk_has_prop_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_has_prop_lstring'); - late final _duk_has_prop_lstring = _duk_has_prop_lstringPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_has_prop_lstring'); + late final _duk_has_prop_lstring = + _duk_has_prop_lstringPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_has_prop_literal_raw( ffi.Pointer ctx, @@ -3965,415 +3721,378 @@ class DuktapeBindings { ffi.Pointer key, int key_len, ) { - return _duk_has_prop_literal_raw( - ctx, - obj_idx, - key, - key_len, - ); + return _duk_has_prop_literal_raw(ctx, obj_idx, key, key_len); } late final _duk_has_prop_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer, duk_size_t)>>('duk_has_prop_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_has_prop_literal_raw'); late final _duk_has_prop_literal_raw = - _duk_has_prop_literal_rawPtr.asFunction< - int Function( - ffi.Pointer, int, ffi.Pointer, int)>(); + _duk_has_prop_literal_rawPtr + .asFunction< + int Function( + ffi.Pointer, + int, + ffi.Pointer, + int, + ) + >(); int duk_has_prop_index( ffi.Pointer ctx, int obj_idx, int arr_idx, ) { - return _duk_has_prop_index( - ctx, - obj_idx, - arr_idx, - ); + return _duk_has_prop_index(ctx, obj_idx, arr_idx); } late final _duk_has_prop_indexPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_uarridx_t)>>('duk_has_prop_index'); - late final _duk_has_prop_index = _duk_has_prop_indexPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_uarridx_t) + > + >('duk_has_prop_index'); + late final _duk_has_prop_index = + _duk_has_prop_indexPtr + .asFunction, int, int)>(); int duk_has_prop_heapptr( ffi.Pointer ctx, int obj_idx, ffi.Pointer ptr, ) { - return _duk_has_prop_heapptr( - ctx, - obj_idx, - ptr, - ); + return _duk_has_prop_heapptr(ctx, obj_idx, ptr); } late final _duk_has_prop_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_has_prop_heapptr'); - late final _duk_has_prop_heapptr = _duk_has_prop_heapptrPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); - - void duk_get_prop_desc( - ffi.Pointer ctx, - int obj_idx, - int flags, - ) { - return _duk_get_prop_desc( - ctx, - obj_idx, - flags, - ); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_has_prop_heapptr'); + late final _duk_has_prop_heapptr = + _duk_has_prop_heapptrPtr + .asFunction< + int Function(ffi.Pointer, int, ffi.Pointer) + >(); + + void duk_get_prop_desc(ffi.Pointer ctx, int obj_idx, int flags) { + return _duk_get_prop_desc(ctx, obj_idx, flags); } - - late final _duk_get_prop_descPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_get_prop_desc'); - late final _duk_get_prop_desc = _duk_get_prop_descPtr - .asFunction, int, int)>(); - - void duk_def_prop( - ffi.Pointer ctx, - int obj_idx, - int flags, - ) { - return _duk_def_prop( - ctx, - obj_idx, - flags, - ); + + late final _duk_get_prop_descPtr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_get_prop_desc'); + late final _duk_get_prop_desc = + _duk_get_prop_descPtr + .asFunction, int, int)>(); + + void duk_def_prop(ffi.Pointer ctx, int obj_idx, int flags) { + return _duk_def_prop(ctx, obj_idx, flags); } late final _duk_def_propPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_uint_t)>>('duk_def_prop'); - late final _duk_def_prop = _duk_def_propPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_def_prop'); + late final _duk_def_prop = + _duk_def_propPtr + .asFunction, int, int)>(); int duk_get_global_string( ffi.Pointer ctx, ffi.Pointer key, ) { - return _duk_get_global_string( - ctx, - key, - ); + return _duk_get_global_string(ctx, key); } late final _duk_get_global_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_get_global_string'); - late final _duk_get_global_string = _duk_get_global_stringPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_get_global_string'); + late final _duk_get_global_string = + _duk_get_global_stringPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); int duk_get_global_lstring( ffi.Pointer ctx, ffi.Pointer key, int key_len, ) { - return _duk_get_global_lstring( - ctx, - key, - key_len, - ); + return _duk_get_global_lstring(ctx, key, key_len); } late final _duk_get_global_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_global_lstring'); - late final _duk_get_global_lstring = _duk_get_global_lstringPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_global_lstring'); + late final _duk_get_global_lstring = + _duk_get_global_lstringPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer, int) + >(); int duk_get_global_literal_raw( ffi.Pointer ctx, ffi.Pointer key, int key_len, ) { - return _duk_get_global_literal_raw( - ctx, - key, - key_len, - ); + return _duk_get_global_literal_raw(ctx, key, key_len); } late final _duk_get_global_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_get_global_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_get_global_literal_raw'); late final _duk_get_global_literal_raw = - _duk_get_global_literal_rawPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + _duk_get_global_literal_rawPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer, int) + >(); int duk_get_global_heapptr( ffi.Pointer ctx, ffi.Pointer ptr, ) { - return _duk_get_global_heapptr( - ctx, - ptr, - ); + return _duk_get_global_heapptr(ctx, ptr); } late final _duk_get_global_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_get_global_heapptr'); - late final _duk_get_global_heapptr = _duk_get_global_heapptrPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_get_global_heapptr'); + late final _duk_get_global_heapptr = + _duk_get_global_heapptrPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); int duk_put_global_string( ffi.Pointer ctx, ffi.Pointer key, ) { - return _duk_put_global_string( - ctx, - key, - ); + return _duk_put_global_string(ctx, key); } late final _duk_put_global_stringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_put_global_string'); - late final _duk_put_global_string = _duk_put_global_stringPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_put_global_string'); + late final _duk_put_global_string = + _duk_put_global_stringPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); int duk_put_global_lstring( ffi.Pointer ctx, ffi.Pointer key, int key_len, ) { - return _duk_put_global_lstring( - ctx, - key, - key_len, - ); + return _duk_put_global_lstring(ctx, key, key_len); } late final _duk_put_global_lstringPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_put_global_lstring'); - late final _duk_put_global_lstring = _duk_put_global_lstringPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_put_global_lstring'); + late final _duk_put_global_lstring = + _duk_put_global_lstringPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer, int) + >(); int duk_put_global_literal_raw( ffi.Pointer ctx, ffi.Pointer key, int key_len, ) { - return _duk_put_global_literal_raw( - ctx, - key, - key_len, - ); + return _duk_put_global_literal_raw(ctx, key, key_len); } late final _duk_put_global_literal_rawPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t)>>('duk_put_global_literal_raw'); + ffi.NativeFunction< + duk_bool_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + ) + > + >('duk_put_global_literal_raw'); late final _duk_put_global_literal_raw = - _duk_put_global_literal_rawPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + _duk_put_global_literal_rawPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer, int) + >(); int duk_put_global_heapptr( ffi.Pointer ctx, ffi.Pointer ptr, ) { - return _duk_put_global_heapptr( - ctx, - ptr, - ); + return _duk_put_global_heapptr(ctx, ptr); } late final _duk_put_global_heapptrPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_put_global_heapptr'); - late final _duk_put_global_heapptr = _duk_put_global_heapptrPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, ffi.Pointer) + > + >('duk_put_global_heapptr'); + late final _duk_put_global_heapptr = + _duk_put_global_heapptrPtr + .asFunction< + int Function(ffi.Pointer, ffi.Pointer) + >(); /// Inspection - void duk_inspect_value( - ffi.Pointer ctx, - int idx, - ) { - return _duk_inspect_value( - ctx, - idx, - ); + void duk_inspect_value(ffi.Pointer ctx, int idx) { + return _duk_inspect_value(ctx, idx); } late final _duk_inspect_valuePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_inspect_value'); - late final _duk_inspect_value = _duk_inspect_valuePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_inspect_value'); + late final _duk_inspect_value = + _duk_inspect_valuePtr + .asFunction, int)>(); - void duk_inspect_callstack_entry( - ffi.Pointer ctx, - int level, - ) { - return _duk_inspect_callstack_entry( - ctx, - level, - ); + void duk_inspect_callstack_entry(ffi.Pointer ctx, int level) { + return _duk_inspect_callstack_entry(ctx, level); } late final _duk_inspect_callstack_entryPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, - duk_int_t)>>('duk_inspect_callstack_entry'); - late final _duk_inspect_callstack_entry = _duk_inspect_callstack_entryPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_int_t)> + >('duk_inspect_callstack_entry'); + late final _duk_inspect_callstack_entry = + _duk_inspect_callstack_entryPtr + .asFunction, int)>(); /// Object prototype - void duk_get_prototype( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_prototype( - ctx, - idx, - ); + void duk_get_prototype(ffi.Pointer ctx, int idx) { + return _duk_get_prototype(ctx, idx); } late final _duk_get_prototypePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_get_prototype'); - late final _duk_get_prototype = _duk_get_prototypePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_prototype'); + late final _duk_get_prototype = + _duk_get_prototypePtr + .asFunction, int)>(); - void duk_set_prototype( - ffi.Pointer ctx, - int idx, - ) { - return _duk_set_prototype( - ctx, - idx, - ); + void duk_set_prototype(ffi.Pointer ctx, int idx) { + return _duk_set_prototype(ctx, idx); } late final _duk_set_prototypePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_set_prototype'); - late final _duk_set_prototype = _duk_set_prototypePtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_set_prototype'); + late final _duk_set_prototype = + _duk_set_prototypePtr + .asFunction, int)>(); /// Object finalizer - void duk_get_finalizer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_finalizer( - ctx, - idx, - ); + void duk_get_finalizer(ffi.Pointer ctx, int idx) { + return _duk_get_finalizer(ctx, idx); } late final _duk_get_finalizerPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_get_finalizer'); - late final _duk_get_finalizer = _duk_get_finalizerPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_finalizer'); + late final _duk_get_finalizer = + _duk_get_finalizerPtr + .asFunction, int)>(); - void duk_set_finalizer( - ffi.Pointer ctx, - int idx, - ) { - return _duk_set_finalizer( - ctx, - idx, - ); + void duk_set_finalizer(ffi.Pointer ctx, int idx) { + return _duk_set_finalizer(ctx, idx); } late final _duk_set_finalizerPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_set_finalizer'); - late final _duk_set_finalizer = _duk_set_finalizerPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_set_finalizer'); + late final _duk_set_finalizer = + _duk_set_finalizerPtr + .asFunction, int)>(); /// Global object - void duk_set_global_object( - ffi.Pointer ctx, - ) { - return _duk_set_global_object( - ctx, - ); + void duk_set_global_object(ffi.Pointer ctx) { + return _duk_set_global_object(ctx); } late final _duk_set_global_objectPtr = _lookup)>>( - 'duk_set_global_object'); - late final _duk_set_global_object = _duk_set_global_objectPtr - .asFunction)>(); + 'duk_set_global_object', + ); + late final _duk_set_global_object = + _duk_set_global_objectPtr + .asFunction)>(); /// Duktape/C function magic value - int duk_get_magic( - ffi.Pointer ctx, - int idx, - ) { - return _duk_get_magic( - ctx, - idx, - ); + int duk_get_magic(ffi.Pointer ctx, int idx) { + return _duk_get_magic(ctx, idx); } late final _duk_get_magicPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_get_magic'); - late final _duk_get_magic = _duk_get_magicPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_get_magic'); + late final _duk_get_magic = + _duk_get_magicPtr + .asFunction, int)>(); - void duk_set_magic( - ffi.Pointer ctx, - int idx, - int magic, - ) { - return _duk_set_magic( - ctx, - idx, - magic, - ); + void duk_set_magic(ffi.Pointer ctx, int idx, int magic) { + return _duk_set_magic(ctx, idx, magic); } late final _duk_set_magicPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_int_t)>>('duk_set_magic'); - late final _duk_set_magic = _duk_set_magicPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_int_t) + > + >('duk_set_magic'); + late final _duk_set_magic = + _duk_set_magicPtr + .asFunction, int, int)>(); - int duk_get_current_magic( - ffi.Pointer ctx, - ) { - return _duk_get_current_magic( - ctx, - ); + int duk_get_current_magic(ffi.Pointer ctx) { + return _duk_get_current_magic(ctx); } late final _duk_get_current_magicPtr = _lookup)>>( - 'duk_get_current_magic'); - late final _duk_get_current_magic = _duk_get_current_magicPtr - .asFunction)>(); + 'duk_get_current_magic', + ); + late final _duk_get_current_magic = + _duk_get_current_magicPtr + .asFunction)>(); /// Module helpers: put multiple function or constant properties void duk_put_function_list( @@ -4381,161 +4100,131 @@ class DuktapeBindings { int obj_idx, ffi.Pointer funcs, ) { - return _duk_put_function_list( - ctx, - obj_idx, - funcs, - ); + return _duk_put_function_list(ctx, obj_idx, funcs); } late final _duk_put_function_listPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_put_function_list'); - late final _duk_put_function_list = _duk_put_function_listPtr.asFunction< - void Function(ffi.Pointer, int, - ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_put_function_list'); + late final _duk_put_function_list = + _duk_put_function_listPtr + .asFunction< + void Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); void duk_put_number_list( ffi.Pointer ctx, int obj_idx, ffi.Pointer numbers, ) { - return _duk_put_number_list( - ctx, - obj_idx, - numbers, - ); + return _duk_put_number_list(ctx, obj_idx, numbers); } late final _duk_put_number_listPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - ffi.Pointer)>>('duk_put_number_list'); - late final _duk_put_number_list = _duk_put_number_listPtr.asFunction< - void Function( - ffi.Pointer, int, ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + ffi.Pointer, + ) + > + >('duk_put_number_list'); + late final _duk_put_number_list = + _duk_put_number_listPtr + .asFunction< + void Function( + ffi.Pointer, + int, + ffi.Pointer, + ) + >(); /// Object operations - void duk_compact( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_compact( - ctx, - obj_idx, - ); + void duk_compact(ffi.Pointer ctx, int obj_idx) { + return _duk_compact(ctx, obj_idx); } late final _duk_compactPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_compact'); - late final _duk_compact = _duk_compactPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_compact'); + late final _duk_compact = + _duk_compactPtr + .asFunction, int)>(); - void duk_enum( - ffi.Pointer ctx, - int obj_idx, - int enum_flags, - ) { - return _duk_enum( - ctx, - obj_idx, - enum_flags, - ); + void duk_enum(ffi.Pointer ctx, int obj_idx, int enum_flags) { + return _duk_enum(ctx, obj_idx, enum_flags); } late final _duk_enumPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t, duk_uint_t)>>('duk_enum'); - late final _duk_enum = _duk_enumPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_uint_t) + > + >('duk_enum'); + late final _duk_enum = + _duk_enumPtr + .asFunction, int, int)>(); - int duk_next( - ffi.Pointer ctx, - int enum_idx, - int get_value, - ) { - return _duk_next( - ctx, - enum_idx, - get_value, - ); + int duk_next(ffi.Pointer ctx, int enum_idx, int get_value) { + return _duk_next(ctx, enum_idx, get_value); } late final _duk_nextPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t, duk_bool_t)>>('duk_next'); - late final _duk_next = _duk_nextPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_bool_t) + > + >('duk_next'); + late final _duk_next = + _duk_nextPtr + .asFunction, int, int)>(); - void duk_seal( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_seal( - ctx, - obj_idx, - ); + void duk_seal(ffi.Pointer ctx, int obj_idx) { + return _duk_seal(ctx, obj_idx); } late final _duk_sealPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_seal'); + ffi.NativeFunction, duk_idx_t)> + >('duk_seal'); late final _duk_seal = _duk_sealPtr.asFunction, int)>(); - void duk_freeze( - ffi.Pointer ctx, - int obj_idx, - ) { - return _duk_freeze( - ctx, - obj_idx, - ); + void duk_freeze(ffi.Pointer ctx, int obj_idx) { + return _duk_freeze(ctx, obj_idx); } late final _duk_freezePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_freeze'); + ffi.NativeFunction, duk_idx_t)> + >('duk_freeze'); late final _duk_freeze = _duk_freezePtr.asFunction, int)>(); /// String manipulation - void duk_concat( - ffi.Pointer ctx, - int count, - ) { - return _duk_concat( - ctx, - count, - ); + void duk_concat(ffi.Pointer ctx, int count) { + return _duk_concat(ctx, count); } late final _duk_concatPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_concat'); + ffi.NativeFunction, duk_idx_t)> + >('duk_concat'); late final _duk_concat = _duk_concatPtr.asFunction, int)>(); - void duk_join( - ffi.Pointer ctx, - int count, - ) { - return _duk_join( - ctx, - count, - ); + void duk_join(ffi.Pointer ctx, int count) { + return _duk_join(ctx, count); } late final _duk_joinPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_join'); + ffi.NativeFunction, duk_idx_t)> + >('duk_join'); late final _duk_join = _duk_joinPtr.asFunction, int)>(); @@ -4545,24 +4234,29 @@ class DuktapeBindings { duk_decode_char_function callback, ffi.Pointer udata, ) { - return _duk_decode_string( - ctx, - idx, - callback, - udata, - ); + return _duk_decode_string(ctx, idx, callback, udata); } late final _duk_decode_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + duk_decode_char_function, + ffi.Pointer, + ) + > + >('duk_decode_string'); + late final _duk_decode_string = + _duk_decode_stringPtr + .asFunction< + void Function( ffi.Pointer, - duk_idx_t, + int, duk_decode_char_function, - ffi.Pointer)>>('duk_decode_string'); - late final _duk_decode_string = _duk_decode_stringPtr.asFunction< - void Function(ffi.Pointer, int, duk_decode_char_function, - ffi.Pointer)>(); + ffi.Pointer, + ) + >(); void duk_map_string( ffi.Pointer ctx, @@ -4570,21 +4264,29 @@ class DuktapeBindings { duk_map_char_function callback, ffi.Pointer udata, ) { - return _duk_map_string( - ctx, - idx, - callback, - udata, - ); + return _duk_map_string(ctx, idx, callback, udata); } late final _duk_map_stringPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_map_char_function, ffi.Pointer)>>('duk_map_string'); - late final _duk_map_string = _duk_map_stringPtr.asFunction< - void Function(ffi.Pointer, int, duk_map_char_function, - ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + duk_map_char_function, + ffi.Pointer, + ) + > + >('duk_map_string'); + late final _duk_map_string = + _duk_map_stringPtr + .asFunction< + void Function( + ffi.Pointer, + int, + duk_map_char_function, + ffi.Pointer, + ) + >(); void duk_substring( ffi.Pointer ctx, @@ -4592,283 +4294,196 @@ class DuktapeBindings { int start_char_offset, int end_char_offset, ) { - return _duk_substring( - ctx, - idx, - start_char_offset, - end_char_offset, - ); + return _duk_substring(ctx, idx, start_char_offset, end_char_offset); } late final _duk_substringPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, duk_size_t, - duk_size_t)>>('duk_substring'); - late final _duk_substring = _duk_substringPtr - .asFunction, int, int, int)>(); - - void duk_trim( - ffi.Pointer ctx, - int idx, - ) { - return _duk_trim( - ctx, - idx, - ); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_idx_t, + duk_size_t, + duk_size_t, + ) + > + >('duk_substring'); + late final _duk_substring = + _duk_substringPtr + .asFunction, int, int, int)>(); + + void duk_trim(ffi.Pointer ctx, int idx) { + return _duk_trim(ctx, idx); } late final _duk_trimPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_trim'); + ffi.NativeFunction, duk_idx_t)> + >('duk_trim'); late final _duk_trim = _duk_trimPtr.asFunction, int)>(); - int duk_char_code_at( - ffi.Pointer ctx, - int idx, - int char_offset, - ) { - return _duk_char_code_at( - ctx, - idx, - char_offset, - ); + int duk_char_code_at(ffi.Pointer ctx, int idx, int char_offset) { + return _duk_char_code_at(ctx, idx, char_offset); } late final _duk_char_code_atPtr = _lookup< - ffi.NativeFunction< - duk_codepoint_t Function(ffi.Pointer, duk_idx_t, - duk_size_t)>>('duk_char_code_at'); - late final _duk_char_code_at = _duk_char_code_atPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_codepoint_t Function(ffi.Pointer, duk_idx_t, duk_size_t) + > + >('duk_char_code_at'); + late final _duk_char_code_at = + _duk_char_code_atPtr + .asFunction, int, int)>(); /// ECMAScript operators - int duk_equals( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_equals( - ctx, - idx1, - idx2, - ); + int duk_equals(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_equals(ctx, idx1, idx2); } late final _duk_equalsPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t, duk_idx_t)>>('duk_equals'); - late final _duk_equals = _duk_equalsPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_equals'); + late final _duk_equals = + _duk_equalsPtr + .asFunction, int, int)>(); - int duk_strict_equals( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_strict_equals( - ctx, - idx1, - idx2, - ); + int duk_strict_equals(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_strict_equals(ctx, idx1, idx2); } late final _duk_strict_equalsPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_strict_equals'); - late final _duk_strict_equals = _duk_strict_equalsPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_strict_equals'); + late final _duk_strict_equals = + _duk_strict_equalsPtr + .asFunction, int, int)>(); - int duk_samevalue( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_samevalue( - ctx, - idx1, - idx2, - ); + int duk_samevalue(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_samevalue(ctx, idx1, idx2); } late final _duk_samevaluePtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_samevalue'); - late final _duk_samevalue = _duk_samevaluePtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_samevalue'); + late final _duk_samevalue = + _duk_samevaluePtr + .asFunction, int, int)>(); - int duk_instanceof( - ffi.Pointer ctx, - int idx1, - int idx2, - ) { - return _duk_instanceof( - ctx, - idx1, - idx2, - ); + int duk_instanceof(ffi.Pointer ctx, int idx1, int idx2) { + return _duk_instanceof(ctx, idx1, idx2); } late final _duk_instanceofPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_instanceof'); - late final _duk_instanceof = _duk_instanceofPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_bool_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_instanceof'); + late final _duk_instanceof = + _duk_instanceofPtr + .asFunction, int, int)>(); /// Random - double duk_random( - ffi.Pointer ctx, - ) { - return _duk_random( - ctx, - ); + double duk_random(ffi.Pointer ctx) { + return _duk_random(ctx); } late final _duk_randomPtr = _lookup< - ffi.NativeFunction)>>( - 'duk_random'); + ffi.NativeFunction)> + >('duk_random'); late final _duk_random = _duk_randomPtr.asFunction)>(); /// Function (method) calls - void duk_call( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_call( - ctx, - nargs, - ); + void duk_call(ffi.Pointer ctx, int nargs) { + return _duk_call(ctx, nargs); } late final _duk_callPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_call'); + ffi.NativeFunction, duk_idx_t)> + >('duk_call'); late final _duk_call = _duk_callPtr.asFunction, int)>(); - void duk_call_method( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_call_method( - ctx, - nargs, - ); + void duk_call_method(ffi.Pointer ctx, int nargs) { + return _duk_call_method(ctx, nargs); } late final _duk_call_methodPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Pointer, duk_idx_t)>>('duk_call_method'); - late final _duk_call_method = _duk_call_methodPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_call_method'); + late final _duk_call_method = + _duk_call_methodPtr + .asFunction, int)>(); - void duk_call_prop( - ffi.Pointer ctx, - int obj_idx, - int nargs, - ) { - return _duk_call_prop( - ctx, - obj_idx, - nargs, - ); + void duk_call_prop(ffi.Pointer ctx, int obj_idx, int nargs) { + return _duk_call_prop(ctx, obj_idx, nargs); } late final _duk_call_propPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_call_prop'); - late final _duk_call_prop = _duk_call_propPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_call_prop'); + late final _duk_call_prop = + _duk_call_propPtr + .asFunction, int, int)>(); - int duk_pcall( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_pcall( - ctx, - nargs, - ); + int duk_pcall(ffi.Pointer ctx, int nargs) { + return _duk_pcall(ctx, nargs); } late final _duk_pcallPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_pcall'); + ffi.NativeFunction, duk_idx_t)> + >('duk_pcall'); late final _duk_pcall = _duk_pcallPtr.asFunction, int)>(); - int duk_pcall_method( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_pcall_method( - ctx, - nargs, - ); + int duk_pcall_method(ffi.Pointer ctx, int nargs) { + return _duk_pcall_method(ctx, nargs); } late final _duk_pcall_methodPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function( - ffi.Pointer, duk_idx_t)>>('duk_pcall_method'); - late final _duk_pcall_method = _duk_pcall_methodPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_pcall_method'); + late final _duk_pcall_method = + _duk_pcall_methodPtr + .asFunction, int)>(); - int duk_pcall_prop( - ffi.Pointer ctx, - int obj_idx, - int nargs, - ) { - return _duk_pcall_prop( - ctx, - obj_idx, - nargs, - ); + int duk_pcall_prop(ffi.Pointer ctx, int obj_idx, int nargs) { + return _duk_pcall_prop(ctx, obj_idx, nargs); } late final _duk_pcall_propPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, duk_idx_t, - duk_idx_t)>>('duk_pcall_prop'); - late final _duk_pcall_prop = _duk_pcall_propPtr - .asFunction, int, int)>(); + ffi.NativeFunction< + duk_int_t Function(ffi.Pointer, duk_idx_t, duk_idx_t) + > + >('duk_pcall_prop'); + late final _duk_pcall_prop = + _duk_pcall_propPtr + .asFunction, int, int)>(); - void duk_new( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_new( - ctx, - nargs, - ); + void duk_new(ffi.Pointer ctx, int nargs) { + return _duk_new(ctx, nargs); } late final _duk_newPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_idx_t)>>('duk_new'); + ffi.NativeFunction, duk_idx_t)> + >('duk_new'); late final _duk_new = _duk_newPtr.asFunction, int)>(); - int duk_pnew( - ffi.Pointer ctx, - int nargs, - ) { - return _duk_pnew( - ctx, - nargs, - ); + int duk_pnew(ffi.Pointer ctx, int nargs) { + return _duk_pnew(ctx, nargs); } late final _duk_pnewPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, duk_idx_t)>>('duk_pnew'); + ffi.NativeFunction, duk_idx_t)> + >('duk_pnew'); late final _duk_pnew = _duk_pnewPtr.asFunction, int)>(); @@ -4879,22 +4494,31 @@ class DuktapeBindings { int nargs, int nrets, ) { - return _duk_safe_call( - ctx, - func, - udata, - nargs, - nrets, - ); + return _duk_safe_call(ctx, func, udata, nargs, nrets); } late final _duk_safe_callPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, duk_safe_call_function, - ffi.Pointer, duk_idx_t, duk_idx_t)>>('duk_safe_call'); - late final _duk_safe_call = _duk_safe_callPtr.asFunction< - int Function(ffi.Pointer, duk_safe_call_function, - ffi.Pointer, int, int)>(); + ffi.NativeFunction< + duk_int_t Function( + ffi.Pointer, + duk_safe_call_function, + ffi.Pointer, + duk_idx_t, + duk_idx_t, + ) + > + >('duk_safe_call'); + late final _duk_safe_call = + _duk_safe_callPtr + .asFunction< + int Function( + ffi.Pointer, + duk_safe_call_function, + ffi.Pointer, + int, + int, + ) + >(); /// Compilation and evaluation int duk_eval_raw( @@ -4903,21 +4527,29 @@ class DuktapeBindings { int src_length, int flags, ) { - return _duk_eval_raw( - ctx, - src_buffer, - src_length, - flags, - ); + return _duk_eval_raw(ctx, src_buffer, src_length, flags); } late final _duk_eval_rawPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t, duk_uint_t)>>('duk_eval_raw'); - late final _duk_eval_raw = _duk_eval_rawPtr.asFunction< - int Function( - ffi.Pointer, ffi.Pointer, int, int)>(); + ffi.NativeFunction< + duk_int_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + duk_uint_t, + ) + > + >('duk_eval_raw'); + late final _duk_eval_raw = + _duk_eval_rawPtr + .asFunction< + int Function( + ffi.Pointer, + ffi.Pointer, + int, + int, + ) + >(); int duk_compile_raw( ffi.Pointer ctx, @@ -4925,65 +4557,67 @@ class DuktapeBindings { int src_length, int flags, ) { - return _duk_compile_raw( - ctx, - src_buffer, - src_length, - flags, - ); + return _duk_compile_raw(ctx, src_buffer, src_length, flags); } late final _duk_compile_rawPtr = _lookup< - ffi.NativeFunction< - duk_int_t Function(ffi.Pointer, ffi.Pointer, - duk_size_t, duk_uint_t)>>('duk_compile_raw'); - late final _duk_compile_raw = _duk_compile_rawPtr.asFunction< - int Function( - ffi.Pointer, ffi.Pointer, int, int)>(); + ffi.NativeFunction< + duk_int_t Function( + ffi.Pointer, + ffi.Pointer, + duk_size_t, + duk_uint_t, + ) + > + >('duk_compile_raw'); + late final _duk_compile_raw = + _duk_compile_rawPtr + .asFunction< + int Function( + ffi.Pointer, + ffi.Pointer, + int, + int, + ) + >(); /// Bytecode load/dump - void duk_dump_function( - ffi.Pointer ctx, - ) { - return _duk_dump_function( - ctx, - ); + void duk_dump_function(ffi.Pointer ctx) { + return _duk_dump_function(ctx); } late final _duk_dump_functionPtr = _lookup)>>( - 'duk_dump_function'); - late final _duk_dump_function = _duk_dump_functionPtr - .asFunction)>(); + 'duk_dump_function', + ); + late final _duk_dump_function = + _duk_dump_functionPtr + .asFunction)>(); - void duk_load_function( - ffi.Pointer ctx, - ) { - return _duk_load_function( - ctx, - ); + void duk_load_function(ffi.Pointer ctx) { + return _duk_load_function(ctx); } late final _duk_load_functionPtr = _lookup)>>( - 'duk_load_function'); - late final _duk_load_function = _duk_load_functionPtr - .asFunction)>(); + 'duk_load_function', + ); + late final _duk_load_function = + _duk_load_functionPtr + .asFunction)>(); /// Debugging - void duk_push_context_dump( - ffi.Pointer ctx, - ) { - return _duk_push_context_dump( - ctx, - ); + void duk_push_context_dump(ffi.Pointer ctx) { + return _duk_push_context_dump(ctx); } late final _duk_push_context_dumpPtr = _lookup)>>( - 'duk_push_context_dump'); - late final _duk_push_context_dump = _duk_push_context_dumpPtr - .asFunction)>(); + 'duk_push_context_dump', + ); + late final _duk_push_context_dump = + _duk_push_context_dumpPtr + .asFunction)>(); /// Debugger (debug protocol) void duk_debugger_attach( @@ -5011,8 +4645,24 @@ class DuktapeBindings { } late final _duk_debugger_attachPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_debug_read_function, + duk_debug_write_function, + duk_debug_peek_function, + duk_debug_read_flush_function, + duk_debug_write_flush_function, + duk_debug_request_function, + duk_debug_detached_function, + ffi.Pointer, + ) + > + >('duk_debugger_attach'); + late final _duk_debugger_attach = + _duk_debugger_attachPtr + .asFunction< + void Function( ffi.Pointer, duk_debug_read_function, duk_debug_write_function, @@ -5021,90 +4671,65 @@ class DuktapeBindings { duk_debug_write_flush_function, duk_debug_request_function, duk_debug_detached_function, - ffi.Pointer)>>('duk_debugger_attach'); - late final _duk_debugger_attach = _duk_debugger_attachPtr.asFunction< - void Function( - ffi.Pointer, - duk_debug_read_function, - duk_debug_write_function, - duk_debug_peek_function, - duk_debug_read_flush_function, - duk_debug_write_flush_function, - duk_debug_request_function, - duk_debug_detached_function, - ffi.Pointer)>(); - - void duk_debugger_detach( - ffi.Pointer ctx, - ) { - return _duk_debugger_detach( - ctx, - ); + ffi.Pointer, + ) + >(); + + void duk_debugger_detach(ffi.Pointer ctx) { + return _duk_debugger_detach(ctx); } late final _duk_debugger_detachPtr = _lookup)>>( - 'duk_debugger_detach'); - late final _duk_debugger_detach = _duk_debugger_detachPtr - .asFunction)>(); + 'duk_debugger_detach', + ); + late final _duk_debugger_detach = + _duk_debugger_detachPtr + .asFunction)>(); - void duk_debugger_cooperate( - ffi.Pointer ctx, - ) { - return _duk_debugger_cooperate( - ctx, - ); + void duk_debugger_cooperate(ffi.Pointer ctx) { + return _duk_debugger_cooperate(ctx); } late final _duk_debugger_cooperatePtr = _lookup)>>( - 'duk_debugger_cooperate'); - late final _duk_debugger_cooperate = _duk_debugger_cooperatePtr - .asFunction)>(); + 'duk_debugger_cooperate', + ); + late final _duk_debugger_cooperate = + _duk_debugger_cooperatePtr + .asFunction)>(); - int duk_debugger_notify( - ffi.Pointer ctx, - int nvalues, - ) { - return _duk_debugger_notify( - ctx, - nvalues, - ); + int duk_debugger_notify(ffi.Pointer ctx, int nvalues) { + return _duk_debugger_notify(ctx, nvalues); } late final _duk_debugger_notifyPtr = _lookup< - ffi.NativeFunction< - duk_bool_t Function( - ffi.Pointer, duk_idx_t)>>('duk_debugger_notify'); - late final _duk_debugger_notify = _duk_debugger_notifyPtr - .asFunction, int)>(); + ffi.NativeFunction, duk_idx_t)> + >('duk_debugger_notify'); + late final _duk_debugger_notify = + _duk_debugger_notifyPtr + .asFunction, int)>(); - void duk_debugger_pause( - ffi.Pointer ctx, - ) { - return _duk_debugger_pause( - ctx, - ); + void duk_debugger_pause(ffi.Pointer ctx) { + return _duk_debugger_pause(ctx); } late final _duk_debugger_pausePtr = _lookup)>>( - 'duk_debugger_pause'); - late final _duk_debugger_pause = _duk_debugger_pausePtr - .asFunction)>(); + 'duk_debugger_pause', + ); + late final _duk_debugger_pause = + _duk_debugger_pausePtr + .asFunction)>(); /// Time handling - double duk_get_now( - ffi.Pointer ctx, - ) { - return _duk_get_now( - ctx, - ); + double duk_get_now(ffi.Pointer ctx) { + return _duk_get_now(ctx); } late final _duk_get_nowPtr = _lookup< - ffi.NativeFunction)>>( - 'duk_get_now'); + ffi.NativeFunction)> + >('duk_get_now'); late final _duk_get_now = _duk_get_nowPtr.asFunction)>(); @@ -5113,38 +4738,51 @@ class DuktapeBindings { double timeval, ffi.Pointer comp, ) { - return _duk_time_to_components( - ctx, - timeval, - comp, - ); + return _duk_time_to_components(ctx, timeval, comp); } late final _duk_time_to_componentsPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, duk_double_t, - ffi.Pointer)>>('duk_time_to_components'); - late final _duk_time_to_components = _duk_time_to_componentsPtr.asFunction< - void Function(ffi.Pointer, double, - ffi.Pointer)>(); + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + duk_double_t, + ffi.Pointer, + ) + > + >('duk_time_to_components'); + late final _duk_time_to_components = + _duk_time_to_componentsPtr + .asFunction< + void Function( + ffi.Pointer, + double, + ffi.Pointer, + ) + >(); double duk_components_to_time( ffi.Pointer ctx, ffi.Pointer comp, ) { - return _duk_components_to_time( - ctx, - comp, - ); + return _duk_components_to_time(ctx, comp); } late final _duk_components_to_timePtr = _lookup< - ffi.NativeFunction< - duk_double_t Function(ffi.Pointer, - ffi.Pointer)>>('duk_components_to_time'); - late final _duk_components_to_time = _duk_components_to_timePtr.asFunction< - double Function( - ffi.Pointer, ffi.Pointer)>(); + ffi.NativeFunction< + duk_double_t Function( + ffi.Pointer, + ffi.Pointer, + ) + > + >('duk_components_to_time'); + late final _duk_components_to_time = + _duk_components_to_timePtr + .asFunction< + double Function( + ffi.Pointer, + ffi.Pointer, + ) + >(); } /// Public API specific typedefs @@ -5163,26 +4801,38 @@ final class duk_thread_state extends ffi.Struct { /// A few types are assumed to always exist. typedef duk_size_t = ffi.Size; typedef Dartduk_size_t = int; -typedef duk_alloc_functionFunction = ffi.Pointer Function( - ffi.Pointer udata, duk_size_t size); -typedef Dartduk_alloc_functionFunction = ffi.Pointer Function( - ffi.Pointer udata, Dartduk_size_t size); -typedef duk_alloc_function - = ffi.Pointer>; -typedef duk_realloc_functionFunction = ffi.Pointer Function( - ffi.Pointer udata, ffi.Pointer ptr, duk_size_t size); -typedef Dartduk_realloc_functionFunction = ffi.Pointer Function( - ffi.Pointer udata, - ffi.Pointer ptr, - Dartduk_size_t size); -typedef duk_realloc_function - = ffi.Pointer>; -typedef duk_free_functionFunction = ffi.Void Function( - ffi.Pointer udata, ffi.Pointer ptr); -typedef Dartduk_free_functionFunction = void Function( - ffi.Pointer udata, ffi.Pointer ptr); -typedef duk_free_function - = ffi.Pointer>; +typedef duk_alloc_functionFunction = + ffi.Pointer Function( + ffi.Pointer udata, + duk_size_t size, + ); +typedef Dartduk_alloc_functionFunction = + ffi.Pointer Function( + ffi.Pointer udata, + Dartduk_size_t size, + ); +typedef duk_alloc_function = + ffi.Pointer>; +typedef duk_realloc_functionFunction = + ffi.Pointer Function( + ffi.Pointer udata, + ffi.Pointer ptr, + duk_size_t size, + ); +typedef Dartduk_realloc_functionFunction = + ffi.Pointer Function( + ffi.Pointer udata, + ffi.Pointer ptr, + Dartduk_size_t size, + ); +typedef duk_realloc_function = + ffi.Pointer>; +typedef duk_free_functionFunction = + ffi.Void Function(ffi.Pointer udata, ffi.Pointer ptr); +typedef Dartduk_free_functionFunction = + void Function(ffi.Pointer udata, ffi.Pointer ptr); +typedef duk_free_function = + ffi.Pointer>; final class duk_memory_functions extends ffi.Struct { external duk_alloc_function alloc_func; @@ -5210,12 +4860,12 @@ final class duk_hthread extends ffi.Opaque {} /// 'struct duk_hthread' like the 'duk_hthread' typedef which is used /// exclusively in internals. typedef duk_context = duk_hthread; -typedef duk_c_functionFunction = duk_ret_t Function( - ffi.Pointer ctx); -typedef Dartduk_c_functionFunction = Dartduk_small_int_t Function( - ffi.Pointer ctx); -typedef duk_c_function - = ffi.Pointer>; +typedef duk_c_functionFunction = + duk_ret_t Function(ffi.Pointer ctx); +typedef Dartduk_c_functionFunction = + Dartduk_small_int_t Function(ffi.Pointer ctx); +typedef duk_c_function = + ffi.Pointer>; typedef duk_int_t = ffi.Int; typedef Dartduk_int_t = int; @@ -5275,12 +4925,12 @@ final class duk_time_components extends ffi.Struct { external double weekday; } -typedef duk_fatal_functionFunction = ffi.Void Function( - ffi.Pointer udata, ffi.Pointer msg); -typedef Dartduk_fatal_functionFunction = void Function( - ffi.Pointer udata, ffi.Pointer msg); -typedef duk_fatal_function - = ffi.Pointer>; +typedef duk_fatal_functionFunction = + ffi.Void Function(ffi.Pointer udata, ffi.Pointer msg); +typedef Dartduk_fatal_functionFunction = + void Function(ffi.Pointer udata, ffi.Pointer msg); +typedef duk_fatal_function = + ffi.Pointer>; /// Codepoint type. Must be 32 bits or more because it is used also for /// internal codepoints. The type is signed because negative codepoints @@ -5289,78 +4939,105 @@ typedef duk_fatal_function /// ensure duk_uint32_t casts back and forth nicely. Almost everything /// else uses the signed one. typedef duk_codepoint_t = duk_int_t; -typedef duk_decode_char_functionFunction = ffi.Void Function( - ffi.Pointer udata, duk_codepoint_t codepoint); -typedef Dartduk_decode_char_functionFunction = void Function( - ffi.Pointer udata, Dartduk_int_t codepoint); -typedef duk_decode_char_function - = ffi.Pointer>; -typedef duk_map_char_functionFunction = duk_codepoint_t Function( - ffi.Pointer udata, duk_codepoint_t codepoint); -typedef Dartduk_map_char_functionFunction = Dartduk_int_t Function( - ffi.Pointer udata, Dartduk_int_t codepoint); -typedef duk_map_char_function - = ffi.Pointer>; -typedef duk_safe_call_functionFunction = duk_ret_t Function( - ffi.Pointer ctx, ffi.Pointer udata); -typedef Dartduk_safe_call_functionFunction = Dartduk_small_int_t Function( - ffi.Pointer ctx, ffi.Pointer udata); -typedef duk_safe_call_function - = ffi.Pointer>; -typedef duk_debug_read_functionFunction = duk_size_t Function( - ffi.Pointer udata, - ffi.Pointer buffer, - duk_size_t length); -typedef Dartduk_debug_read_functionFunction = Dartduk_size_t Function( - ffi.Pointer udata, - ffi.Pointer buffer, - Dartduk_size_t length); -typedef duk_debug_read_function - = ffi.Pointer>; -typedef duk_debug_write_functionFunction = duk_size_t Function( - ffi.Pointer udata, - ffi.Pointer buffer, - duk_size_t length); -typedef Dartduk_debug_write_functionFunction = Dartduk_size_t Function( - ffi.Pointer udata, - ffi.Pointer buffer, - Dartduk_size_t length); -typedef duk_debug_write_function - = ffi.Pointer>; -typedef duk_debug_peek_functionFunction = duk_size_t Function( - ffi.Pointer udata); -typedef Dartduk_debug_peek_functionFunction = Dartduk_size_t Function( - ffi.Pointer udata); -typedef duk_debug_peek_function - = ffi.Pointer>; -typedef duk_debug_read_flush_functionFunction = ffi.Void Function( - ffi.Pointer udata); -typedef Dartduk_debug_read_flush_functionFunction = void Function( - ffi.Pointer udata); -typedef duk_debug_read_flush_function - = ffi.Pointer>; -typedef duk_debug_write_flush_functionFunction = ffi.Void Function( - ffi.Pointer udata); -typedef Dartduk_debug_write_flush_functionFunction = void Function( - ffi.Pointer udata); -typedef duk_debug_write_flush_function - = ffi.Pointer>; -typedef duk_debug_request_functionFunction = duk_idx_t Function( - ffi.Pointer ctx, - ffi.Pointer udata, - duk_idx_t nvalues); -typedef Dartduk_debug_request_functionFunction = Dartduk_int_t Function( - ffi.Pointer ctx, - ffi.Pointer udata, - Dartduk_int_t nvalues); -typedef duk_debug_request_function - = ffi.Pointer>; -typedef duk_debug_detached_functionFunction = ffi.Void Function( - ffi.Pointer ctx, ffi.Pointer udata); -typedef Dartduk_debug_detached_functionFunction = void Function( - ffi.Pointer ctx, ffi.Pointer udata); -typedef duk_debug_detached_function - = ffi.Pointer>; +typedef duk_decode_char_functionFunction = + ffi.Void Function(ffi.Pointer udata, duk_codepoint_t codepoint); +typedef Dartduk_decode_char_functionFunction = + void Function(ffi.Pointer udata, Dartduk_int_t codepoint); +typedef duk_decode_char_function = + ffi.Pointer>; +typedef duk_map_char_functionFunction = + duk_codepoint_t Function( + ffi.Pointer udata, + duk_codepoint_t codepoint, + ); +typedef Dartduk_map_char_functionFunction = + Dartduk_int_t Function( + ffi.Pointer udata, + Dartduk_int_t codepoint, + ); +typedef duk_map_char_function = + ffi.Pointer>; +typedef duk_safe_call_functionFunction = + duk_ret_t Function( + ffi.Pointer ctx, + ffi.Pointer udata, + ); +typedef Dartduk_safe_call_functionFunction = + Dartduk_small_int_t Function( + ffi.Pointer ctx, + ffi.Pointer udata, + ); +typedef duk_safe_call_function = + ffi.Pointer>; +typedef duk_debug_read_functionFunction = + duk_size_t Function( + ffi.Pointer udata, + ffi.Pointer buffer, + duk_size_t length, + ); +typedef Dartduk_debug_read_functionFunction = + Dartduk_size_t Function( + ffi.Pointer udata, + ffi.Pointer buffer, + Dartduk_size_t length, + ); +typedef duk_debug_read_function = + ffi.Pointer>; +typedef duk_debug_write_functionFunction = + duk_size_t Function( + ffi.Pointer udata, + ffi.Pointer buffer, + duk_size_t length, + ); +typedef Dartduk_debug_write_functionFunction = + Dartduk_size_t Function( + ffi.Pointer udata, + ffi.Pointer buffer, + Dartduk_size_t length, + ); +typedef duk_debug_write_function = + ffi.Pointer>; +typedef duk_debug_peek_functionFunction = + duk_size_t Function(ffi.Pointer udata); +typedef Dartduk_debug_peek_functionFunction = + Dartduk_size_t Function(ffi.Pointer udata); +typedef duk_debug_peek_function = + ffi.Pointer>; +typedef duk_debug_read_flush_functionFunction = + ffi.Void Function(ffi.Pointer udata); +typedef Dartduk_debug_read_flush_functionFunction = + void Function(ffi.Pointer udata); +typedef duk_debug_read_flush_function = + ffi.Pointer>; +typedef duk_debug_write_flush_functionFunction = + ffi.Void Function(ffi.Pointer udata); +typedef Dartduk_debug_write_flush_functionFunction = + void Function(ffi.Pointer udata); +typedef duk_debug_write_flush_function = + ffi.Pointer>; +typedef duk_debug_request_functionFunction = + duk_idx_t Function( + ffi.Pointer ctx, + ffi.Pointer udata, + duk_idx_t nvalues, + ); +typedef Dartduk_debug_request_functionFunction = + Dartduk_int_t Function( + ffi.Pointer ctx, + ffi.Pointer udata, + Dartduk_int_t nvalues, + ); +typedef duk_debug_request_function = + ffi.Pointer>; +typedef duk_debug_detached_functionFunction = + ffi.Void Function( + ffi.Pointer ctx, + ffi.Pointer udata, + ); +typedef Dartduk_debug_detached_functionFunction = + void Function(ffi.Pointer ctx, ffi.Pointer udata); +typedef duk_debug_detached_function = + ffi.Pointer>; typedef duk_uint_t = ffi.UnsignedInt; typedef Dartduk_uint_t = int; diff --git a/ffigen_codelab/step_07/lib/ffigen_app.dart b/ffigen_codelab/step_07/lib/ffigen_app.dart index 22b98dc21a..6e25aaae5b 100644 --- a/ffigen_codelab/step_07/lib/ffigen_app.dart +++ b/ffigen_codelab/step_07/lib/ffigen_app.dart @@ -16,24 +16,32 @@ final DynamicLibrary _dylib = () { if (Platform.isMacOS || Platform.isIOS) { if (Platform.environment.containsKey('FLUTTER_TEST')) { return DynamicLibrary.open( - 'build/macos/Build/Products/Debug/$_libName/$_libName.framework/$_libName'); + 'build/macos/Build/Products/Debug/$_libName/$_libName.framework/$_libName', + ); } return DynamicLibrary.open('$_libName.framework/$_libName'); } if (Platform.isAndroid || Platform.isLinux) { if (Platform.environment.containsKey('FLUTTER_TEST')) { return DynamicLibrary.open( - 'build/linux/x64/debug/bundle/lib/lib$_libName.so'); + 'build/linux/x64/debug/bundle/lib/lib$_libName.so', + ); } return DynamicLibrary.open('lib$_libName.so'); } if (Platform.isWindows) { if (Platform.environment.containsKey('FLUTTER_TEST')) { return switch (Abi.current()) { - Abi.windowsArm64 => DynamicLibrary.open(p.canonicalize( - p.join(r'build\windows\arm64\runner\Debug', '$_libName.dll'))), - Abi.windowsX64 => DynamicLibrary.open(p.canonicalize( - p.join(r'build\windows\x64\runner\Debug', '$_libName.dll'))), + Abi.windowsArm64 => DynamicLibrary.open( + p.canonicalize( + p.join(r'build\windows\arm64\runner\Debug', '$_libName.dll'), + ), + ), + Abi.windowsX64 => DynamicLibrary.open( + p.canonicalize( + p.join(r'build\windows\x64\runner\Debug', '$_libName.dll'), + ), + ), _ => throw 'Unsupported platform', }; } @@ -47,8 +55,13 @@ final DuktapeBindings _bindings = DuktapeBindings(_dylib); class Duktape { Duktape() { - ctx = - _bindings.duk_create_heap(nullptr, nullptr, nullptr, nullptr, nullptr); + ctx = _bindings.duk_create_heap( + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + ); } String evalString(String jsCode) { @@ -58,15 +71,16 @@ class Duktape { var nativeUtf8 = jsCode.toNativeUtf8(); final evalResult = _bindings.duk_eval_raw( - ctx, - nativeUtf8.cast(), - 0, - 0 /*args*/ | - DUK_COMPILE_EVAL | - DUK_COMPILE_SAFE | - DUK_COMPILE_NOSOURCE | - DUK_COMPILE_STRLEN | - DUK_COMPILE_NOFILENAME); + ctx, + nativeUtf8.cast(), + 0, + 0 /*args*/ | + DUK_COMPILE_EVAL | + DUK_COMPILE_SAFE | + DUK_COMPILE_NOSOURCE | + DUK_COMPILE_STRLEN | + DUK_COMPILE_NOFILENAME, + ); ffi.malloc.free(nativeUtf8); if (evalResult != 0) { @@ -79,8 +93,9 @@ class Duktape { String _retrieveTopOfStackAsString() { Pointer outLengthPtr = ffi.calloc(); final errorStrPtr = _bindings.duk_safe_to_lstring(ctx, -1, outLengthPtr); - final returnVal = - errorStrPtr.cast().toDartString(length: outLengthPtr.value); + final returnVal = errorStrPtr.cast().toDartString( + length: outLengthPtr.value, + ); ffi.calloc.free(outLengthPtr); return returnVal; } diff --git a/ffigen_codelab/step_07/lib/ffigen_app_bindings_generated.dart b/ffigen_codelab/step_07/lib/ffigen_app_bindings_generated.dart index 513983bf0c..b91a32288b 100644 --- a/ffigen_codelab/step_07/lib/ffigen_app_bindings_generated.dart +++ b/ffigen_codelab/step_07/lib/ffigen_app_bindings_generated.dart @@ -15,31 +15,24 @@ import 'dart:ffi' as ffi; class FfigenAppBindings { /// Holds the symbol lookup function. final ffi.Pointer Function(String symbolName) - _lookup; + _lookup; /// The symbols are looked up in [dynamicLibrary]. FfigenAppBindings(ffi.DynamicLibrary dynamicLibrary) - : _lookup = dynamicLibrary.lookup; + : _lookup = dynamicLibrary.lookup; /// The symbols are looked up with [lookup]. FfigenAppBindings.fromLookup( - ffi.Pointer Function(String symbolName) - lookup) - : _lookup = lookup; + ffi.Pointer Function(String symbolName) lookup, + ) : _lookup = lookup; /// A very short-lived native function. /// /// For very short-lived functions, it is fine to call them on the main isolate. /// They will block the Dart execution while running the native function, so /// only do this for native functions which are guaranteed to be short-lived. - int sum( - int a, - int b, - ) { - return _sum( - a, - b, - ); + int sum(int a, int b) { + return _sum(a, b); } late final _sumPtr = @@ -51,19 +44,14 @@ class FfigenAppBindings { /// Do not call these kind of native functions in the main isolate. They will /// block Dart execution. This will cause dropped frames in Flutter applications. /// Instead, call these native functions on a separate isolate. - int sum_long_running( - int a, - int b, - ) { - return _sum_long_running( - a, - b, - ); + int sum_long_running(int a, int b) { + return _sum_long_running(a, b); } late final _sum_long_runningPtr = _lookup>( - 'sum_long_running'); + 'sum_long_running', + ); late final _sum_long_running = _sum_long_runningPtr.asFunction(); } diff --git a/ffigen_codelab/step_07/pubspec.yaml b/ffigen_codelab/step_07/pubspec.yaml index 729cd983d1..c2bfb24564 100644 --- a/ffigen_codelab/step_07/pubspec.yaml +++ b/ffigen_codelab/step_07/pubspec.yaml @@ -4,14 +4,14 @@ version: 0.0.1 homepage: environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 flutter: '>=3.3.0' dependencies: ffi: ^2.1.3 flutter: sdk: flutter - path: ^1.9.0 + path: ^1.9.1 plugin_platform_interface: ^2.0.2 dev_dependencies: diff --git a/firebase-auth-flutterfire-ui/codelab_rebuild.yaml b/firebase-auth-flutterfire-ui/codelab_rebuild.yaml index 6b1451e036..2b42c3ed32 100644 --- a/firebase-auth-flutterfire-ui/codelab_rebuild.yaml +++ b/firebase-auth-flutterfire-ui/codelab_rebuild.yaml @@ -93,7 +93,7 @@ steps: import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; import 'package:flutter/foundation.dart' show defaultTargetPlatform, kIsWeb, TargetPlatform; - + /// Default [FirebaseOptions] for use with your Firebase apps. /// /// Example: @@ -119,10 +119,11 @@ steps: return macos; default: throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.'); + 'DefaultFirebaseOptions are not supported for this platform.', + ); } } - + // TODO (codelab user): Replace with your Firebase credentials // Generate this file with credentials with the FlutterFire CLI static const FirebaseOptions web = FirebaseOptions( @@ -134,7 +135,7 @@ steps: storageBucket: 'flutterfire-ui-codelab.appspot.com', measurementId: 'MEASUREMENT ID', ); - + static const FirebaseOptions android = FirebaseOptions( apiKey: 'YOUR API KEY', appId: 'YOUR APP ID', @@ -142,7 +143,7 @@ steps: projectId: 'flutterfire-ui-codelab', storageBucket: 'flutterfire-ui-codelab.appspot.com', ); - + static const FirebaseOptions ios = FirebaseOptions( apiKey: 'YOUR API KEY', appId: 'YOUR APP ID', @@ -152,7 +153,7 @@ steps: iosClientId: 'IOS CLIENT ID', iosBundleId: 'com.example.BUNDLE', ); - + static const FirebaseOptions macos = FirebaseOptions( apiKey: 'YOUR API KEY', appId: 'YOUR APP ID', @@ -167,24 +168,19 @@ steps: path: start/lib/home.dart replace-contents: | import 'package:flutter/material.dart'; - + class HomeScreen extends StatelessWidget { const HomeScreen({super.key}); - + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - automaticallyImplyLeading: false, - ), + appBar: AppBar(automaticallyImplyLeading: false), body: Center( child: Column( children: [ Image.asset('dash.png'), - Text( - 'Welcome!', - style: Theme.of(context).textTheme.displaySmall, - ), + Text('Welcome!', style: Theme.of(context).textTheme.displaySmall), ], ), ), @@ -424,7 +420,6 @@ steps: flutter_additional_macos_build_settings(target) end end - - name: Mkdir assets path: start mkdir: assets @@ -4918,7 +4913,7 @@ steps: patch-u: | --- b/firebase-auth-flutterfire-ui/complete/lib/auth_gate.dart +++ a/firebase-auth-flutterfire-ui/complete/lib/auth_gate.dart - @@ -1,12 +1,56 @@ + @@ -1,12 +1,57 @@ +import 'package:firebase_auth/firebase_auth.dart' hide EmailAuthProvider; +import 'package:firebase_ui_auth/firebase_ui_auth.dart'; +import 'package:firebase_ui_oauth_google/firebase_ui_oauth_google.dart'; @@ -4954,9 +4949,10 @@ steps: + subtitleBuilder: (context, action) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), - + child: action == AuthAction.signIn - + ? const Text('Welcome to FlutterFire, please sign in!') - + : const Text('Welcome to Flutterfire, please sign up!'), + + child: + + action == AuthAction.signIn + + ? const Text('Welcome to FlutterFire, please sign in!') + + : const Text('Welcome to Flutterfire, please sign up!'), + ); + }, + footerBuilder: (context, action) { @@ -4986,10 +4982,12 @@ steps: import 'package:flutter/material.dart'; class HomeScreen extends StatelessWidget { - @@ -7,6 +8,38 @@ class HomeScreen extends StatelessWidget { + @@ -6,12 +7,46 @@ class HomeScreen extends StatelessWidget { + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( + - appBar: AppBar(automaticallyImplyLeading: false), + + appBar: AppBar( + actions: [ + IconButton( + icon: const Icon(Icons.person), @@ -4997,38 +4995,37 @@ steps: + Navigator.push( + context, + MaterialPageRoute( - + builder: (context) => ProfileScreen( - + appBar: AppBar( - + title: const Text('User Profile'), - + ), - + actions: [ - + SignedOutAction((context) { - + Navigator.of(context).pop(); - + }) - + ], - + children: [ - + const Divider(), - + Padding( - + padding: const EdgeInsets.all(2), - + child: AspectRatio( - + aspectRatio: 1, - + child: Image.asset('flutterfire_300x.png'), - + ), + + builder: + + (context) => ProfileScreen( + + appBar: AppBar(title: const Text('User Profile')), + + actions: [ + + SignedOutAction((context) { + + Navigator.of(context).pop(); + + }), + + ], + + children: [ + + const Divider(), + + Padding( + + padding: const EdgeInsets.all(2), + + child: AspectRatio( + + aspectRatio: 1, + + child: Image.asset('flutterfire_300x.png'), + + ), + + ), + + ], + ), - + ], - + ), + ), + ); + }, - + ) + + ), + ], - automaticallyImplyLeading: false, - ), + + automaticallyImplyLeading: false, + + ), body: Center( - @@ -17,6 +50,7 @@ class HomeScreen extends StatelessWidget { - 'Welcome!', - style: Theme.of(context).textTheme.displaySmall, - ), + child: Column( + children: [ + Image.asset('dash.png'), + Text('Welcome!', style: Theme.of(context).textTheme.displaySmall), + const SignOutButton(), ], ), @@ -5038,7 +5035,7 @@ steps: patch-u: | --- b/firebase-auth-flutterfire-ui/complete/lib/main.dart +++ a/firebase-auth-flutterfire-ui/complete/lib/main.dart - @@ -1,10 +1,17 @@ + @@ -1,10 +1,15 @@ +import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; @@ -5050,9 +5047,7 @@ steps: void main() async { + WidgetsFlutterBinding.ensureInitialized(); - + await Firebase.initializeApp( - + options: DefaultFirebaseOptions.currentPlatform, - + ); + + await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); + runApp(const MyApp()); } diff --git a/firebase-auth-flutterfire-ui/complete/android/.gitignore b/firebase-auth-flutterfire-ui/complete/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/firebase-auth-flutterfire-ui/complete/android/.gitignore +++ b/firebase-auth-flutterfire-ui/complete/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/firebase-auth-flutterfire-ui/complete/android/app/build.gradle b/firebase-auth-flutterfire-ui/complete/android/app/build.gradle deleted file mode 100644 index 99b6909075..0000000000 --- a/firebase-auth-flutterfire-ui/complete/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.complete" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.complete" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/firebase-auth-flutterfire-ui/complete/android/app/build.gradle.kts b/firebase-auth-flutterfire-ui/complete/android/app/build.gradle.kts new file mode 100644 index 0000000000..c1a95defad --- /dev/null +++ b/firebase-auth-flutterfire-ui/complete/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.complete" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.complete" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/firebase-auth-flutterfire-ui/complete/android/app/src/main/kotlin/com/example/complete/MainActivity.kt b/firebase-auth-flutterfire-ui/complete/android/app/src/main/kotlin/com/example/complete/MainActivity.kt index ff48ab805a..01345b35bb 100644 --- a/firebase-auth-flutterfire-ui/complete/android/app/src/main/kotlin/com/example/complete/MainActivity.kt +++ b/firebase-auth-flutterfire-ui/complete/android/app/src/main/kotlin/com/example/complete/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.complete import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/firebase-auth-flutterfire-ui/complete/android/build.gradle b/firebase-auth-flutterfire-ui/complete/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/firebase-auth-flutterfire-ui/complete/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/firebase-auth-flutterfire-ui/complete/android/build.gradle.kts b/firebase-auth-flutterfire-ui/complete/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/firebase-auth-flutterfire-ui/complete/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/firebase-auth-flutterfire-ui/complete/android/gradle.properties b/firebase-auth-flutterfire-ui/complete/android/gradle.properties index 2597170821..f018a61817 100644 --- a/firebase-auth-flutterfire-ui/complete/android/gradle.properties +++ b/firebase-auth-flutterfire-ui/complete/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/firebase-auth-flutterfire-ui/complete/android/gradle/wrapper/gradle-wrapper.properties b/firebase-auth-flutterfire-ui/complete/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/firebase-auth-flutterfire-ui/complete/android/gradle/wrapper/gradle-wrapper.properties +++ b/firebase-auth-flutterfire-ui/complete/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/firebase-auth-flutterfire-ui/complete/android/settings.gradle b/firebase-auth-flutterfire-ui/complete/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/firebase-auth-flutterfire-ui/complete/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/firebase-auth-flutterfire-ui/complete/android/settings.gradle.kts b/firebase-auth-flutterfire-ui/complete/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/firebase-auth-flutterfire-ui/complete/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/firebase-auth-flutterfire-ui/complete/ios/Podfile b/firebase-auth-flutterfire-ui/complete/ios/Podfile index 003d660108..a35276b04c 100644 --- a/firebase-auth-flutterfire-ui/complete/ios/Podfile +++ b/firebase-auth-flutterfire-ui/complete/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-auth-flutterfire-ui/complete/ios/Runner.xcodeproj/project.pbxproj b/firebase-auth-flutterfire-ui/complete/ios/Runner.xcodeproj/project.pbxproj index e8615e6630..14ca53b633 100644 --- a/firebase-auth-flutterfire-ui/complete/ios/Runner.xcodeproj/project.pbxproj +++ b/firebase-auth-flutterfire-ui/complete/ios/Runner.xcodeproj/project.pbxproj @@ -7,8 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 0F3803CBCFB391E59ABF9972 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A85F2039BD42A5E5F51AC05 /* Pods_Runner.framework */; }; - 0FA2B638999D351E91D18DEE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77B72BBCAA775A7F6BBF72DF /* Pods_RunnerTests.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; @@ -16,6 +14,8 @@ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + AA3D98888770D59DC39C068B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49B5A9682635CC849A21FD84 /* Pods_RunnerTests.framework */; }; + BB51A04A261F39F260F2B6DB /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7001DA1E0EE628EBA57C3B42 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,18 +44,18 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1AED471B2E9CCCF0EB8197D6 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 37C45BF2081B559B18A30577 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 4F5AB8B3B752D354C9B6F8F7 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 5A85F2039BD42A5E5F51AC05 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 49B5A9682635CC849A21FD84 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 675B4FDDEEA3F4165720A0D7 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 7001DA1E0EE628EBA57C3B42 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 77B72BBCAA775A7F6BBF72DF /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 8EA615C24D71A3196F7EB5F8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 92EDA78007EA9856D0AB8DAB /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 871D561E28E5D3F77993FB08 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 96D4E3429F9E7FED720928BC /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -63,24 +63,24 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - CA75B6341A9654990A97FF96 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - E06213FBD5452C796255640D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + DE571F6CEB3E7CBC17136230 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + E7DF1FB9B499F232DC7AC5F5 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 0B423A337EE5E8AD3E77BF77 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0F3803CBCFB391E59ABF9972 /* Pods_Runner.framework in Frameworks */, + AA3D98888770D59DC39C068B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - B8EA4E4050A9EDF2A2556273 /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0FA2B638999D351E91D18DEE /* Pods_RunnerTests.framework in Frameworks */, + BB51A04A261F39F260F2B6DB /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,6 +95,29 @@ path = RunnerTests; sourceTree = ""; }; + 4E49533827AC8417659F72C4 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 7001DA1E0EE628EBA57C3B42 /* Pods_Runner.framework */, + 49B5A9682635CC849A21FD84 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 551DD74497D0516E40CAF50D /* Pods */ = { + isa = PBXGroup; + children = ( + 871D561E28E5D3F77993FB08 /* Pods-Runner.debug.xcconfig */, + 37C45BF2081B559B18A30577 /* Pods-Runner.release.xcconfig */, + DE571F6CEB3E7CBC17136230 /* Pods-Runner.profile.xcconfig */, + 675B4FDDEEA3F4165720A0D7 /* Pods-RunnerTests.debug.xcconfig */, + 96D4E3429F9E7FED720928BC /* Pods-RunnerTests.release.xcconfig */, + E7DF1FB9B499F232DC7AC5F5 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -113,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - C218C99DCECCDACF552BED6E /* Pods */, - FD55CDA9C334F29576CAE644 /* Frameworks */, + 551DD74497D0516E40CAF50D /* Pods */, + 4E49533827AC8417659F72C4 /* Frameworks */, ); sourceTree = ""; }; @@ -142,29 +165,6 @@ path = Runner; sourceTree = ""; }; - C218C99DCECCDACF552BED6E /* Pods */ = { - isa = PBXGroup; - children = ( - 1AED471B2E9CCCF0EB8197D6 /* Pods-Runner.debug.xcconfig */, - 4F5AB8B3B752D354C9B6F8F7 /* Pods-Runner.release.xcconfig */, - 8EA615C24D71A3196F7EB5F8 /* Pods-Runner.profile.xcconfig */, - E06213FBD5452C796255640D /* Pods-RunnerTests.debug.xcconfig */, - CA75B6341A9654990A97FF96 /* Pods-RunnerTests.release.xcconfig */, - 92EDA78007EA9856D0AB8DAB /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; - FD55CDA9C334F29576CAE644 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 5A85F2039BD42A5E5F51AC05 /* Pods_Runner.framework */, - 77B72BBCAA775A7F6BBF72DF /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 9D60C34552B614C712ADF434 /* [CP] Check Pods Manifest.lock */, + 70AF0CDD90AD671BEEAFDEED /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - B8EA4E4050A9EDF2A2556273 /* Frameworks */, + 0B423A337EE5E8AD3E77BF77 /* Frameworks */, ); buildRules = ( ); @@ -191,15 +191,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 3DDCDB6258D585478885931C /* [CP] Check Pods Manifest.lock */, + D778B4E5085D99F9E06894BE /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 07A16A23920D75ED16FE8468 /* [CP] Embed Pods Frameworks */, - 4DD2C02BA8A36D3079217639 /* [CP] Copy Pods Resources */, + 0E43987324C281F298CBE0AE /* [CP] Embed Pods Frameworks */, + F4F2E7A1DA997BB36E832C55 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -271,7 +271,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 07A16A23920D75ED16FE8468 /* [CP] Embed Pods Frameworks */ = { + 0E43987324C281F298CBE0AE /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -304,7 +304,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 3DDCDB6258D585478885931C /* [CP] Check Pods Manifest.lock */ = { + 70AF0CDD90AD671BEEAFDEED /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -319,30 +319,13 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 4DD2C02BA8A36D3079217639 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -358,7 +341,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9D60C34552B614C712ADF434 /* [CP] Check Pods Manifest.lock */ = { + D778B4E5085D99F9E06894BE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -373,13 +356,30 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + F4F2E7A1DA997BB36E832C55 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -505,7 +505,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E06213FBD5452C796255640D /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 675B4FDDEEA3F4165720A0D7 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -523,7 +523,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CA75B6341A9654990A97FF96 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 96D4E3429F9E7FED720928BC /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -539,7 +539,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 92EDA78007EA9856D0AB8DAB /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = E7DF1FB9B499F232DC7AC5F5 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/firebase-auth-flutterfire-ui/complete/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-auth-flutterfire-ui/complete/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/firebase-auth-flutterfire-ui/complete/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-auth-flutterfire-ui/complete/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-auth-flutterfire-ui/complete/lib/auth_gate.dart b/firebase-auth-flutterfire-ui/complete/lib/auth_gate.dart index faba70f572..595865fb8c 100644 --- a/firebase-auth-flutterfire-ui/complete/lib/auth_gate.dart +++ b/firebase-auth-flutterfire-ui/complete/lib/auth_gate.dart @@ -32,9 +32,10 @@ class AuthGate extends StatelessWidget { subtitleBuilder: (context, action) { return Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), - child: action == AuthAction.signIn - ? const Text('Welcome to FlutterFire, please sign in!') - : const Text('Welcome to Flutterfire, please sign up!'), + child: + action == AuthAction.signIn + ? const Text('Welcome to FlutterFire, please sign in!') + : const Text('Welcome to Flutterfire, please sign up!'), ); }, footerBuilder: (context, action) { diff --git a/firebase-auth-flutterfire-ui/complete/lib/firebase_options.dart b/firebase-auth-flutterfire-ui/complete/lib/firebase_options.dart index 78984d73c8..add28296ca 100644 --- a/firebase-auth-flutterfire-ui/complete/lib/firebase_options.dart +++ b/firebase-auth-flutterfire-ui/complete/lib/firebase_options.dart @@ -29,7 +29,8 @@ class DefaultFirebaseOptions { return macos; default: throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.'); + 'DefaultFirebaseOptions are not supported for this platform.', + ); } } diff --git a/firebase-auth-flutterfire-ui/complete/lib/home.dart b/firebase-auth-flutterfire-ui/complete/lib/home.dart index c41101b04e..fe97eb9158 100644 --- a/firebase-auth-flutterfire-ui/complete/lib/home.dart +++ b/firebase-auth-flutterfire-ui/complete/lib/home.dart @@ -15,30 +15,29 @@ class HomeScreen extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => ProfileScreen( - appBar: AppBar( - title: const Text('User Profile'), - ), - actions: [ - SignedOutAction((context) { - Navigator.of(context).pop(); - }) - ], - children: [ - const Divider(), - Padding( - padding: const EdgeInsets.all(2), - child: AspectRatio( - aspectRatio: 1, - child: Image.asset('flutterfire_300x.png'), - ), + builder: + (context) => ProfileScreen( + appBar: AppBar(title: const Text('User Profile')), + actions: [ + SignedOutAction((context) { + Navigator.of(context).pop(); + }), + ], + children: [ + const Divider(), + Padding( + padding: const EdgeInsets.all(2), + child: AspectRatio( + aspectRatio: 1, + child: Image.asset('flutterfire_300x.png'), + ), + ), + ], ), - ], - ), ), ); }, - ) + ), ], automaticallyImplyLeading: false, ), @@ -46,10 +45,7 @@ class HomeScreen extends StatelessWidget { child: Column( children: [ Image.asset('dash.png'), - Text( - 'Welcome!', - style: Theme.of(context).textTheme.displaySmall, - ), + Text('Welcome!', style: Theme.of(context).textTheme.displaySmall), const SignOutButton(), ], ), diff --git a/firebase-auth-flutterfire-ui/complete/lib/main.dart b/firebase-auth-flutterfire-ui/complete/lib/main.dart index 0c019a7906..a9a99d8ad4 100644 --- a/firebase-auth-flutterfire-ui/complete/lib/main.dart +++ b/firebase-auth-flutterfire-ui/complete/lib/main.dart @@ -9,9 +9,7 @@ const clientId = 'YOUR_CLIENT_ID'; void main() async { WidgetsFlutterBinding.ensureInitialized(); - await Firebase.initializeApp( - options: DefaultFirebaseOptions.currentPlatform, - ); + await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); runApp(const MyApp()); } diff --git a/firebase-auth-flutterfire-ui/complete/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-auth-flutterfire-ui/complete/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 549cf605dd..0387a7a877 100644 --- a/firebase-auth-flutterfire-ui/complete/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-auth-flutterfire-ui/complete/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-auth-flutterfire-ui/complete/pubspec.yaml b/firebase-auth-flutterfire-ui/complete/pubspec.yaml index 0a46d8dbe0..48d1e715e0 100644 --- a/firebase-auth-flutterfire-ui/complete/pubspec.yaml +++ b/firebase-auth-flutterfire-ui/complete/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/firebase-auth-flutterfire-ui/start/android/.gitignore b/firebase-auth-flutterfire-ui/start/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/firebase-auth-flutterfire-ui/start/android/.gitignore +++ b/firebase-auth-flutterfire-ui/start/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/firebase-auth-flutterfire-ui/start/android/app/build.gradle b/firebase-auth-flutterfire-ui/start/android/app/build.gradle deleted file mode 100644 index c739731c4e..0000000000 --- a/firebase-auth-flutterfire-ui/start/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.start" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.start" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/firebase-auth-flutterfire-ui/start/android/app/build.gradle.kts b/firebase-auth-flutterfire-ui/start/android/app/build.gradle.kts new file mode 100644 index 0000000000..79f25c38dc --- /dev/null +++ b/firebase-auth-flutterfire-ui/start/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.start" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.start" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/firebase-auth-flutterfire-ui/start/android/app/src/main/kotlin/com/example/start/MainActivity.kt b/firebase-auth-flutterfire-ui/start/android/app/src/main/kotlin/com/example/start/MainActivity.kt index dd811f6f25..c7b1f64b8d 100644 --- a/firebase-auth-flutterfire-ui/start/android/app/src/main/kotlin/com/example/start/MainActivity.kt +++ b/firebase-auth-flutterfire-ui/start/android/app/src/main/kotlin/com/example/start/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.start import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/firebase-auth-flutterfire-ui/start/android/build.gradle b/firebase-auth-flutterfire-ui/start/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/firebase-auth-flutterfire-ui/start/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/firebase-auth-flutterfire-ui/start/android/build.gradle.kts b/firebase-auth-flutterfire-ui/start/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/firebase-auth-flutterfire-ui/start/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/firebase-auth-flutterfire-ui/start/android/gradle.properties b/firebase-auth-flutterfire-ui/start/android/gradle.properties index 2597170821..f018a61817 100644 --- a/firebase-auth-flutterfire-ui/start/android/gradle.properties +++ b/firebase-auth-flutterfire-ui/start/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/firebase-auth-flutterfire-ui/start/android/gradle/wrapper/gradle-wrapper.properties b/firebase-auth-flutterfire-ui/start/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/firebase-auth-flutterfire-ui/start/android/gradle/wrapper/gradle-wrapper.properties +++ b/firebase-auth-flutterfire-ui/start/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/firebase-auth-flutterfire-ui/start/android/settings.gradle b/firebase-auth-flutterfire-ui/start/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/firebase-auth-flutterfire-ui/start/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/firebase-auth-flutterfire-ui/start/android/settings.gradle.kts b/firebase-auth-flutterfire-ui/start/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/firebase-auth-flutterfire-ui/start/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/firebase-auth-flutterfire-ui/start/ios/Podfile b/firebase-auth-flutterfire-ui/start/ios/Podfile index 003d660108..a35276b04c 100644 --- a/firebase-auth-flutterfire-ui/start/ios/Podfile +++ b/firebase-auth-flutterfire-ui/start/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-auth-flutterfire-ui/start/ios/Runner.xcodeproj/project.pbxproj b/firebase-auth-flutterfire-ui/start/ios/Runner.xcodeproj/project.pbxproj index 5af4a2d817..98f4e570ed 100644 --- a/firebase-auth-flutterfire-ui/start/ios/Runner.xcodeproj/project.pbxproj +++ b/firebase-auth-flutterfire-ui/start/ios/Runner.xcodeproj/project.pbxproj @@ -9,10 +9,10 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; - 3805C7458838208D1BADC879 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D87D08C4BAF2A0B1BB861CC6 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 6FE14386B73B62A1DA91326E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5766D05A755BF7737A9560C3 /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 8550ECA847CC5C764656D222 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA486B6DC467F2363FA361A8 /* Pods_RunnerTests.framework */; }; + 87ABFB11AAC3C19FB69E31DD /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 01F41114B31A3113FAE50B7B /* Pods_Runner.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; @@ -42,15 +42,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 01F41114B31A3113FAE50B7B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0F54A4D49B2EC9810F67917B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2F61EFC04DB64A41945A0E6E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 46F3C75EF91090CFC9A6D3BB /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 4C42277A0D1B8CEFAAB1FEB7 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 5766D05A755BF7737A9560C3 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3C3FA956ABAB30B7474C9B1B /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 470047422798E87BD3C4F1C2 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -61,41 +61,32 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9808575325282A2A134C4B71 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - A59DC163DCB4F4C1916729D6 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - BEA313021469A03C7190F30D /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - D87D08C4BAF2A0B1BB861CC6 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B3E8FFC168F4BAB14391C0D5 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA486B6DC467F2363FA361A8 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EA73C7A669759A200FC1E325 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + F52E732C7220FD9F73DEA508 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 978971ADDDB24FE823840BE1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3805C7458838208D1BADC879 /* Pods_Runner.framework in Frameworks */, + 8550ECA847CC5C764656D222 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9BE64AF22AF34FF2C62BA996 /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6FE14386B73B62A1DA91326E /* Pods_RunnerTests.framework in Frameworks */, + 87ABFB11AAC3C19FB69E31DD /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0F24421E15939D3AB9CA46B2 /* Frameworks */ = { - isa = PBXGroup; - children = ( - D87D08C4BAF2A0B1BB861CC6 /* Pods_Runner.framework */, - 5766D05A755BF7737A9560C3 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,20 +95,6 @@ path = RunnerTests; sourceTree = ""; }; - 85722244E05B87FCFB7232BF /* Pods */ = { - isa = PBXGroup; - children = ( - 46F3C75EF91090CFC9A6D3BB /* Pods-Runner.debug.xcconfig */, - 2F61EFC04DB64A41945A0E6E /* Pods-Runner.release.xcconfig */, - 4C42277A0D1B8CEFAAB1FEB7 /* Pods-Runner.profile.xcconfig */, - A59DC163DCB4F4C1916729D6 /* Pods-RunnerTests.debug.xcconfig */, - BEA313021469A03C7190F30D /* Pods-RunnerTests.release.xcconfig */, - 9808575325282A2A134C4B71 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -136,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 85722244E05B87FCFB7232BF /* Pods */, - 0F24421E15939D3AB9CA46B2 /* Frameworks */, + B7A45FED02235BCA55DBA534 /* Pods */, + C02D4505114CEAB36F6D73D2 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +142,29 @@ path = Runner; sourceTree = ""; }; + B7A45FED02235BCA55DBA534 /* Pods */ = { + isa = PBXGroup; + children = ( + B3E8FFC168F4BAB14391C0D5 /* Pods-Runner.debug.xcconfig */, + 0F54A4D49B2EC9810F67917B /* Pods-Runner.release.xcconfig */, + 3C3FA956ABAB30B7474C9B1B /* Pods-Runner.profile.xcconfig */, + EA73C7A669759A200FC1E325 /* Pods-RunnerTests.debug.xcconfig */, + 470047422798E87BD3C4F1C2 /* Pods-RunnerTests.release.xcconfig */, + F52E732C7220FD9F73DEA508 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + C02D4505114CEAB36F6D73D2 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 01F41114B31A3113FAE50B7B /* Pods_Runner.framework */, + EA486B6DC467F2363FA361A8 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - EFF71E2693ED1555F1F92D14 /* [CP] Check Pods Manifest.lock */, + F6AC9B5E5C8F447C072CB70A /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 9BE64AF22AF34FF2C62BA996 /* Frameworks */, + 978971ADDDB24FE823840BE1 /* Frameworks */, ); buildRules = ( ); @@ -191,15 +191,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 4B81C115DEE1E69ED1E24E82 /* [CP] Check Pods Manifest.lock */, + 0B1D4B3A6A585F8EE84B5CB2 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 2CA3EF9E7A75C0034FA95887 /* [CP] Embed Pods Frameworks */, - DEC331059A87CB91E3E5DCC7 /* [CP] Copy Pods Resources */, + 9E0FE4D742DDB2ABCDEE7670 /* [CP] Embed Pods Frameworks */, + DDB5B0AD2908D95BF90A8E53 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -271,21 +271,26 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 2CA3EF9E7A75C0034FA95887 /* [CP] Embed Pods Frameworks */ = { + 0B1D4B3A6A585F8EE84B5CB2 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { @@ -304,44 +309,39 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 4B81C115DEE1E69ED1E24E82 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 9E0FE4D742DDB2ABCDEE7670 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - DEC331059A87CB91E3E5DCC7 /* [CP] Copy Pods Resources */ = { + DDB5B0AD2908D95BF90A8E53 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -358,7 +358,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; - EFF71E2693ED1555F1F92D14 /* [CP] Check Pods Manifest.lock */ = { + F6AC9B5E5C8F447C072CB70A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -505,7 +505,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A59DC163DCB4F4C1916729D6 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = EA73C7A669759A200FC1E325 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -523,7 +523,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BEA313021469A03C7190F30D /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 470047422798E87BD3C4F1C2 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -539,7 +539,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9808575325282A2A134C4B71 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = F52E732C7220FD9F73DEA508 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/firebase-auth-flutterfire-ui/start/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-auth-flutterfire-ui/start/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/firebase-auth-flutterfire-ui/start/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-auth-flutterfire-ui/start/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-auth-flutterfire-ui/start/lib/firebase_options.dart b/firebase-auth-flutterfire-ui/start/lib/firebase_options.dart index 78984d73c8..add28296ca 100644 --- a/firebase-auth-flutterfire-ui/start/lib/firebase_options.dart +++ b/firebase-auth-flutterfire-ui/start/lib/firebase_options.dart @@ -29,7 +29,8 @@ class DefaultFirebaseOptions { return macos; default: throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.'); + 'DefaultFirebaseOptions are not supported for this platform.', + ); } } diff --git a/firebase-auth-flutterfire-ui/start/lib/home.dart b/firebase-auth-flutterfire-ui/start/lib/home.dart index a42b48244e..a8d492ff23 100644 --- a/firebase-auth-flutterfire-ui/start/lib/home.dart +++ b/firebase-auth-flutterfire-ui/start/lib/home.dart @@ -6,17 +6,12 @@ class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - automaticallyImplyLeading: false, - ), + appBar: AppBar(automaticallyImplyLeading: false), body: Center( child: Column( children: [ Image.asset('dash.png'), - Text( - 'Welcome!', - style: Theme.of(context).textTheme.displaySmall, - ), + Text('Welcome!', style: Theme.of(context).textTheme.displaySmall), ], ), ), diff --git a/firebase-auth-flutterfire-ui/start/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-auth-flutterfire-ui/start/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index bd8beb6f33..8ac7650fb6 100644 --- a/firebase-auth-flutterfire-ui/start/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-auth-flutterfire-ui/start/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-auth-flutterfire-ui/start/pubspec.yaml b/firebase-auth-flutterfire-ui/start/pubspec.yaml index 0018444d70..8b5becedd2 100644 --- a/firebase-auth-flutterfire-ui/start/pubspec.yaml +++ b/firebase-auth-flutterfire-ui/start/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/firebase-emulator-suite/codelab_rebuild.yaml b/firebase-emulator-suite/codelab_rebuild.yaml index 9cfcfa598f..cf133709bb 100644 --- a/firebase-emulator-suite/codelab_rebuild.yaml +++ b/firebase-emulator-suite/codelab_rebuild.yaml @@ -1,7 +1,7 @@ name: Firebase Emulator Suite steps: - - name: complete + - name: start steps: - name: Remove complete rmdir: complete @@ -44,44 +44,46 @@ steps: path: complete/lib/app_state.dart replace-contents: | import 'dart:async'; - + import 'entry.dart'; - + class AppState { AppState() { - _entriesStreamController = StreamController.broadcast(onListen: () { - _entriesStreamController.add([ - Entry( - date: '10/09/2022', - text: lorem, - title: '[Example] My Journal Entry', - ) - ]); - }); + _entriesStreamController = StreamController.broadcast( + onListen: () { + _entriesStreamController.add([ + Entry( + date: '10/09/2022', + text: lorem, + title: '[Example] My Journal Entry', + ), + ]); + }, + ); } - + // This will change to the type User from the Firebase Authentication package // Changing it’s type now would cause the app to throw an error Object? user; late StreamController> _entriesStreamController; Stream> get entries => _entriesStreamController.stream.asBroadcastStream(); - + Future logIn(String email, String password) async { print('TODO: AppState.login'); user = Object(); await _listenForEntries(); } - + void writeEntryToFirebase(Entry entry) { print('TODO: AppState.writeEntryToFirebase'); } - + Future _listenForEntries() async { print('TODO: AppState._listenForEntries'); } } - + const lorem = '''Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum '''; @@ -92,37 +94,33 @@ steps: final String date; final String text; final String title; - - Entry({ - required this.date, - required this.text, - required this.title, - }); + + Entry({required this.date, required this.text, required this.title}); } - name: Add lib/journal_entry_form.dart path: complete/lib/journal_entry_form.dart replace-contents: | import 'package:flutter/material.dart'; - + import 'entry.dart'; - + typedef SubmitCallback = void Function(Entry); - + class EntryForm extends StatefulWidget { final SubmitCallback onSubmit; const EntryForm({super.key, required this.onSubmit}); - + @override State createState() => _EntryFormState(); } - + class _EntryFormState extends State { final _formKey = GlobalKey(); - + late String title; late String text; late String date; - + @override Widget build(BuildContext context) { return Card( @@ -146,8 +144,9 @@ steps: }, ), TextFormField( - decoration: - const InputDecoration(labelText: 'Date (DD/MM/YYYY):'), + decoration: const InputDecoration( + labelText: 'Date (DD/MM/YYYY):', + ), validator: (value) { if (value == null || value.isEmpty) { return 'Please enter some text'; @@ -180,9 +179,9 @@ steps: text: text, date: date, ); - + widget.onSubmit(entry); - + ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Submitting Entry')), ); @@ -203,14 +202,14 @@ steps: path: complete/lib/journal_entry_widget.dart replace-contents: | import 'package:flutter/material.dart'; - + import 'entry.dart'; - + class EntryView extends StatelessWidget { final Entry entry; - + const EntryView({super.key, required this.entry}); - + @override Widget build(BuildContext context) { return Card( @@ -239,10 +238,10 @@ steps: child: Text( entry.text, style: Theme.of(context).textTheme.bodyLarge!.copyWith( - height: 1.3, - wordSpacing: 1.2, - letterSpacing: 1.05, - ), + height: 1.3, + wordSpacing: 1.2, + letterSpacing: 1.05, + ), ), ), ], @@ -255,20 +254,20 @@ steps: path: complete/lib/logged_in_view.dart replace-contents: | import 'dart:math'; - + import 'package:flutter/material.dart'; - + import 'app_state.dart'; import 'entry.dart'; import 'journal_entry_form.dart'; import 'journal_entry_widget.dart'; - + class LoggedInView extends StatelessWidget { final AppState state; LoggedInView({super.key, required this.state}); - + final PageController _controller = PageController(initialPage: 1); - + @override Widget build(BuildContext context) { // TODO: get name from Firebase User @@ -278,9 +277,7 @@ steps: children: [ Center( child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 16.0, - ), + padding: const EdgeInsets.symmetric(vertical: 16.0), child: Text( 'Welcome back, $name!', style: Theme.of(context).textTheme.headlineSmall!.copyWith(), @@ -305,16 +302,13 @@ steps: state.writeEntryToFirebase(e); }, ), - for (var entry in allEntries!) - EntryView( - entry: entry, - ) + for (var entry in allEntries!) EntryView(entry: entry), ], ); }, ), ), - ) + ), ], ), ); @@ -325,18 +319,16 @@ steps: replace-contents: | import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; - + import 'app_state.dart'; - + class LoggedOutView extends StatelessWidget { final AppState state; const LoggedOutView({super.key, required this.state}); @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Firebase Emulator Suite Codelab'), - ), + appBar: AppBar(title: const Text('Firebase Emulator Suite Codelab')), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -372,21 +364,21 @@ steps: import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; - + import 'app_state.dart'; import 'logged_in_view.dart'; import 'logged_out_view.dart'; - + void main() async { // TODO: Initialize Firebase runApp(MyApp()); } - + class MyApp extends StatelessWidget { final state = AppState(); - + MyApp({super.key}); - + @override Widget build(BuildContext context) { return MaterialApp.router( @@ -395,7 +387,7 @@ steps: theme: ThemeData(), ); } - + GoRouter _router() { return GoRouter( redirect: (context, routerState) => state.user == null ? '/login' : null, @@ -412,13 +404,13 @@ steps: ); } } - + class AppScrollBehavior extends MaterialScrollBehavior { @override Set get dragDevices => { - PointerDeviceKind.touch, - PointerDeviceKind.mouse, - }; + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + }; } - name: Build web path: complete @@ -499,8 +491,8 @@ steps: import 'entry.dart'; class AppState { - @@ -15,28 +18,51 @@ class AppState { - }); + @@ -17,28 +20,53 @@ class AppState { + ); } - // This will change to the type User from the Firebase Authentication package @@ -517,8 +509,10 @@ steps: - print('TODO: AppState.login'); - user = Object(); - await _listenForEntries(); - + final credential = await FirebaseAuth.instance - + .signInWithEmailAndPassword(email: email, password: password); + + final credential = await FirebaseAuth.instance.signInWithEmailAndPassword( + + email: email, + + password: password, + + ); + if (credential.user != null) { + user = credential.user!; + _listenForEntries(); @@ -537,18 +531,18 @@ steps: + } + + void _listenForEntries() { - + FirebaseFirestore.instance - + .collection('Entries') - + .snapshots() - + .listen((event) { - + final entries = event.docs.map((doc) { - + final data = doc.data(); - + return Entry( - + date: data['date'] as String, - + text: data['text'] as String, - + title: data['title'] as String, - + ); - + }).toList(); + + FirebaseFirestore.instance.collection('Entries').snapshots().listen(( + + event, + + ) { + + final entries = + + event.docs.map((doc) { + + final data = doc.data(); + + return Entry( + + date: data['date'] as String, + + text: data['text'] as String, + + title: data['title'] as String, + + ); + + }).toList(); + + _entriesStreamController.add(entries); + }); @@ -570,7 +564,7 @@ steps: patch-u: | --- b/firebase-emulator-suite/complete/lib/journal_entry_form.dart +++ a/firebase-emulator-suite/complete/lib/journal_entry_form.dart - @@ -80,7 +80,7 @@ class _EntryFormState extends State { + @@ -81,7 +81,7 @@ class _EntryFormState extends State { widget.onSubmit(entry); ScaffoldMessenger.of(context).showSnackBar( @@ -584,7 +578,7 @@ steps: patch-u: | --- b/firebase-emulator-suite/complete/lib/logged_in_view.dart +++ a/firebase-emulator-suite/complete/lib/logged_in_view.dart - @@ -15,20 +15,14 @@ class LoggedInView extends StatelessWidget { + @@ -15,18 +15,14 @@ class LoggedInView extends StatelessWidget { @override Widget build(BuildContext context) { @@ -596,9 +590,7 @@ steps: children: [ Center( - child: Padding( - - padding: const EdgeInsets.symmetric( - - vertical: 16.0, - - ), + - padding: const EdgeInsets.symmetric(vertical: 16.0), - child: Text( - 'Welcome back, $name!', - style: Theme.of(context).textTheme.headlineSmall!.copyWith(), @@ -609,7 +601,7 @@ steps: ), ), Flexible( - @@ -36,25 +30,29 @@ class LoggedInView extends StatelessWidget { + @@ -34,22 +30,29 @@ class LoggedInView extends StatelessWidget { padding: const EdgeInsets.all(16.0), child: StreamBuilder>( stream: state.entries, @@ -626,10 +618,7 @@ steps: - state.writeEntryToFirebase(e); - }, - ), - - for (var entry in allEntries!) - - EntryView( - - entry: entry, - - ) + - for (var entry in allEntries!) EntryView(entry: entry), - ], - ); + if (snapshot.hasData) { @@ -648,7 +637,7 @@ steps: + EntryView( + key: Key('${Random().nextDouble()}'), + entry: entry, - + ) + + ), + ], + ); + } else { @@ -662,7 +651,7 @@ steps: patch-u: | --- b/firebase-emulator-suite/complete/lib/logged_out_view.dart +++ a/firebase-emulator-suite/complete/lib/logged_out_view.dart - @@ -24,10 +24,8 @@ class LoggedOutView extends StatelessWidget { + @@ -22,10 +22,8 @@ class LoggedOutView extends StatelessWidget { padding: const EdgeInsets.all(8.0), child: FilledButton( onPressed: () async { @@ -680,7 +669,7 @@ steps: patch-u: | --- b/firebase-emulator-suite/complete/lib/main.dart +++ a/firebase-emulator-suite/complete/lib/main.dart - @@ -1,13 +1,32 @@ + @@ -1,13 +1,30 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:firebase_core/firebase_core.dart'; @@ -697,9 +686,7 @@ steps: void main() async { - // TODO: Initialize Firebase + WidgetsFlutterBinding.ensureInitialized(); - + await Firebase.initializeApp( - + options: DefaultFirebaseOptions.currentPlatform, - + ); + + await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); + + if (kDebugMode) { + try { @@ -721,7 +708,7 @@ steps: import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; import 'package:flutter/foundation.dart' show defaultTargetPlatform, kIsWeb, TargetPlatform; - + /// Default [FirebaseOptions] for use with your Firebase apps. /// /// Example: @@ -747,10 +734,11 @@ steps: return macos; default: throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.'); + 'DefaultFirebaseOptions are not supported for this platform.', + ); } } - + static const FirebaseOptions web = FirebaseOptions( apiKey: 'AIzaSyBqTAGMEPyYPrraQColhTWE3gpBCHwBHaY', appId: '1:249605288217:web:f8441e30c5cc335b089588', @@ -759,7 +747,7 @@ steps: authDomain: 'flutter-firebase-codelab-d6b79.firebaseapp.com', storageBucket: 'flutter-firebase-codelab-d6b79.appspot.com', ); - + static const FirebaseOptions android = FirebaseOptions( apiKey: 'AIzaSyDOhizxfIPR8Qs4_isZnE_AnteC0zOxod4', appId: '1:249605288217:android:27c0f0a1ef464773089588', @@ -767,7 +755,7 @@ steps: projectId: 'flutter-firebase-codelab-d6b79', storageBucket: 'flutter-firebase-codelab-d6b79.appspot.com', ); - + static const FirebaseOptions ios = FirebaseOptions( apiKey: 'AIzaSyCvSrqVklmfWxE_SM8HNHvxqOLZTQCsUtk', appId: '1:249605288217:ios:ef9f4946a0d08a35089588', @@ -778,7 +766,7 @@ steps: '249605288217-9sn136tgsd0vg7nae831gahubpoph3ih.apps.googleusercontent.com', iosBundleId: 'com.example.complete', ); - + static const FirebaseOptions macos = FirebaseOptions( apiKey: 'AIzaSyCvSrqVklmfWxE_SM8HNHvxqOLZTQCsUtk', appId: '1:249605288217:ios:ef9f4946a0d08a35089588', diff --git a/firebase-emulator-suite/complete/android/app/build.gradle b/firebase-emulator-suite/complete/android/app/build.gradle deleted file mode 100644 index 99b6909075..0000000000 --- a/firebase-emulator-suite/complete/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.complete" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.complete" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/firebase-emulator-suite/complete/android/app/build.gradle.kts b/firebase-emulator-suite/complete/android/app/build.gradle.kts new file mode 100644 index 0000000000..801dcf1d58 --- /dev/null +++ b/firebase-emulator-suite/complete/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.complete" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.complete" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/firebase-emulator-suite/complete/android/build.gradle b/firebase-emulator-suite/complete/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/firebase-emulator-suite/complete/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/firebase-emulator-suite/complete/android/build.gradle.kts b/firebase-emulator-suite/complete/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/firebase-emulator-suite/complete/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/firebase-emulator-suite/complete/android/gradle.properties b/firebase-emulator-suite/complete/android/gradle.properties index 2597170821..f018a61817 100644 --- a/firebase-emulator-suite/complete/android/gradle.properties +++ b/firebase-emulator-suite/complete/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/firebase-emulator-suite/complete/android/gradle/wrapper/gradle-wrapper.properties b/firebase-emulator-suite/complete/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/firebase-emulator-suite/complete/android/gradle/wrapper/gradle-wrapper.properties +++ b/firebase-emulator-suite/complete/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/firebase-emulator-suite/complete/android/settings.gradle b/firebase-emulator-suite/complete/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/firebase-emulator-suite/complete/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/firebase-emulator-suite/complete/android/settings.gradle.kts b/firebase-emulator-suite/complete/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/firebase-emulator-suite/complete/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/firebase-emulator-suite/complete/ios/Podfile b/firebase-emulator-suite/complete/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/firebase-emulator-suite/complete/ios/Podfile +++ b/firebase-emulator-suite/complete/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-emulator-suite/complete/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-emulator-suite/complete/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/firebase-emulator-suite/complete/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-emulator-suite/complete/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-emulator-suite/complete/lib/app_state.dart b/firebase-emulator-suite/complete/lib/app_state.dart index 6ce7858482..913dc04cfe 100644 --- a/firebase-emulator-suite/complete/lib/app_state.dart +++ b/firebase-emulator-suite/complete/lib/app_state.dart @@ -7,15 +7,17 @@ import 'entry.dart'; class AppState { AppState() { - _entriesStreamController = StreamController.broadcast(onListen: () { - _entriesStreamController.add([ - Entry( - date: '10/09/2022', - text: lorem, - title: '[Example] My Journal Entry', - ) - ]); - }); + _entriesStreamController = StreamController.broadcast( + onListen: () { + _entriesStreamController.add([ + Entry( + date: '10/09/2022', + text: lorem, + title: '[Example] My Journal Entry', + ), + ]); + }, + ); } User? user; @@ -23,8 +25,10 @@ class AppState { late final StreamController> _entriesStreamController; Future logIn(String email, String password) async { - final credential = await FirebaseAuth.instance - .signInWithEmailAndPassword(email: email, password: password); + final credential = await FirebaseAuth.instance.signInWithEmailAndPassword( + email: email, + password: password, + ); if (credential.user != null) { user = credential.user!; _listenForEntries(); @@ -42,18 +46,18 @@ class AppState { } void _listenForEntries() { - FirebaseFirestore.instance - .collection('Entries') - .snapshots() - .listen((event) { - final entries = event.docs.map((doc) { - final data = doc.data(); - return Entry( - date: data['date'] as String, - text: data['text'] as String, - title: data['title'] as String, - ); - }).toList(); + FirebaseFirestore.instance.collection('Entries').snapshots().listen(( + event, + ) { + final entries = + event.docs.map((doc) { + final data = doc.data(); + return Entry( + date: data['date'] as String, + text: data['text'] as String, + title: data['title'] as String, + ); + }).toList(); _entriesStreamController.add(entries); }); diff --git a/firebase-emulator-suite/complete/lib/entry.dart b/firebase-emulator-suite/complete/lib/entry.dart index f293b0f0e7..102349f8ff 100644 --- a/firebase-emulator-suite/complete/lib/entry.dart +++ b/firebase-emulator-suite/complete/lib/entry.dart @@ -3,9 +3,5 @@ class Entry { final String text; final String title; - Entry({ - required this.date, - required this.text, - required this.title, - }); + Entry({required this.date, required this.text, required this.title}); } diff --git a/firebase-emulator-suite/complete/lib/firebase_options.dart b/firebase-emulator-suite/complete/lib/firebase_options.dart index 2f512ff291..6ff0e4997e 100644 --- a/firebase-emulator-suite/complete/lib/firebase_options.dart +++ b/firebase-emulator-suite/complete/lib/firebase_options.dart @@ -29,7 +29,8 @@ class DefaultFirebaseOptions { return macos; default: throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.'); + 'DefaultFirebaseOptions are not supported for this platform.', + ); } } diff --git a/firebase-emulator-suite/complete/lib/journal_entry_form.dart b/firebase-emulator-suite/complete/lib/journal_entry_form.dart index 7a37dd69e1..751198e342 100644 --- a/firebase-emulator-suite/complete/lib/journal_entry_form.dart +++ b/firebase-emulator-suite/complete/lib/journal_entry_form.dart @@ -42,8 +42,9 @@ class _EntryFormState extends State { }, ), TextFormField( - decoration: - const InputDecoration(labelText: 'Date (DD/MM/YYYY):'), + decoration: const InputDecoration( + labelText: 'Date (DD/MM/YYYY):', + ), validator: (value) { if (value == null || value.isEmpty) { return 'Please enter some text'; diff --git a/firebase-emulator-suite/complete/lib/journal_entry_widget.dart b/firebase-emulator-suite/complete/lib/journal_entry_widget.dart index 4dcb2e3460..de7ffad460 100644 --- a/firebase-emulator-suite/complete/lib/journal_entry_widget.dart +++ b/firebase-emulator-suite/complete/lib/journal_entry_widget.dart @@ -35,10 +35,10 @@ class EntryView extends StatelessWidget { child: Text( entry.text, style: Theme.of(context).textTheme.bodyLarge!.copyWith( - height: 1.3, - wordSpacing: 1.2, - letterSpacing: 1.05, - ), + height: 1.3, + wordSpacing: 1.2, + letterSpacing: 1.05, + ), ), ), ], diff --git a/firebase-emulator-suite/complete/lib/logged_in_view.dart b/firebase-emulator-suite/complete/lib/logged_in_view.dart index 8e1d207dd7..1169916503 100644 --- a/firebase-emulator-suite/complete/lib/logged_in_view.dart +++ b/firebase-emulator-suite/complete/lib/logged_in_view.dart @@ -47,7 +47,7 @@ class LoggedInView extends StatelessWidget { EntryView( key: Key('${Random().nextDouble()}'), entry: entry, - ) + ), ], ); } else { @@ -56,7 +56,7 @@ class LoggedInView extends StatelessWidget { }, ), ), - ) + ), ], ), ); diff --git a/firebase-emulator-suite/complete/lib/logged_out_view.dart b/firebase-emulator-suite/complete/lib/logged_out_view.dart index 3221128d72..56588145e4 100644 --- a/firebase-emulator-suite/complete/lib/logged_out_view.dart +++ b/firebase-emulator-suite/complete/lib/logged_out_view.dart @@ -9,9 +9,7 @@ class LoggedOutView extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Firebase Emulator Suite Codelab'), - ), + appBar: AppBar(title: const Text('Firebase Emulator Suite Codelab')), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, diff --git a/firebase-emulator-suite/complete/lib/main.dart b/firebase-emulator-suite/complete/lib/main.dart index 4e119ff0c2..744a21252e 100644 --- a/firebase-emulator-suite/complete/lib/main.dart +++ b/firebase-emulator-suite/complete/lib/main.dart @@ -13,9 +13,7 @@ import 'logged_out_view.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); - await Firebase.initializeApp( - options: DefaultFirebaseOptions.currentPlatform, - ); + await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); if (kDebugMode) { try { @@ -64,7 +62,7 @@ class MyApp extends StatelessWidget { class AppScrollBehavior extends MaterialScrollBehavior { @override Set get dragDevices => { - PointerDeviceKind.touch, - PointerDeviceKind.mouse, - }; + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + }; } diff --git a/firebase-emulator-suite/complete/macos/Podfile b/firebase-emulator-suite/complete/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/firebase-emulator-suite/complete/macos/Podfile +++ b/firebase-emulator-suite/complete/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-emulator-suite/complete/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-emulator-suite/complete/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 549cf605dd..0387a7a877 100644 --- a/firebase-emulator-suite/complete/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-emulator-suite/complete/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-emulator-suite/complete/pubspec.yaml b/firebase-emulator-suite/complete/pubspec.yaml index d33fa1660d..8c442e77dd 100644 --- a/firebase-emulator-suite/complete/pubspec.yaml +++ b/firebase-emulator-suite/complete/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/firebase-emulator-suite/start/android/app/build.gradle b/firebase-emulator-suite/start/android/app/build.gradle deleted file mode 100644 index 99b6909075..0000000000 --- a/firebase-emulator-suite/start/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.complete" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.complete" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/firebase-emulator-suite/start/android/app/build.gradle.kts b/firebase-emulator-suite/start/android/app/build.gradle.kts new file mode 100644 index 0000000000..801dcf1d58 --- /dev/null +++ b/firebase-emulator-suite/start/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.complete" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.complete" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/firebase-emulator-suite/start/android/build.gradle b/firebase-emulator-suite/start/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/firebase-emulator-suite/start/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/firebase-emulator-suite/start/android/build.gradle.kts b/firebase-emulator-suite/start/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/firebase-emulator-suite/start/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/firebase-emulator-suite/start/android/gradle.properties b/firebase-emulator-suite/start/android/gradle.properties index 2597170821..f018a61817 100644 --- a/firebase-emulator-suite/start/android/gradle.properties +++ b/firebase-emulator-suite/start/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/firebase-emulator-suite/start/android/gradle/wrapper/gradle-wrapper.properties b/firebase-emulator-suite/start/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/firebase-emulator-suite/start/android/gradle/wrapper/gradle-wrapper.properties +++ b/firebase-emulator-suite/start/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/firebase-emulator-suite/start/android/settings.gradle b/firebase-emulator-suite/start/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/firebase-emulator-suite/start/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/firebase-emulator-suite/start/android/settings.gradle.kts b/firebase-emulator-suite/start/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/firebase-emulator-suite/start/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/firebase-emulator-suite/start/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-emulator-suite/start/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/firebase-emulator-suite/start/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-emulator-suite/start/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-emulator-suite/start/lib/app_state.dart b/firebase-emulator-suite/start/lib/app_state.dart index 8c3aee9b06..3ae95b39e8 100644 --- a/firebase-emulator-suite/start/lib/app_state.dart +++ b/firebase-emulator-suite/start/lib/app_state.dart @@ -4,15 +4,17 @@ import 'entry.dart'; class AppState { AppState() { - _entriesStreamController = StreamController.broadcast(onListen: () { - _entriesStreamController.add([ - Entry( - date: '10/09/2022', - text: lorem, - title: '[Example] My Journal Entry', - ) - ]); - }); + _entriesStreamController = StreamController.broadcast( + onListen: () { + _entriesStreamController.add([ + Entry( + date: '10/09/2022', + text: lorem, + title: '[Example] My Journal Entry', + ), + ]); + }, + ); } // This will change to the type User from the Firebase Authentication package diff --git a/firebase-emulator-suite/start/lib/entry.dart b/firebase-emulator-suite/start/lib/entry.dart index f293b0f0e7..102349f8ff 100644 --- a/firebase-emulator-suite/start/lib/entry.dart +++ b/firebase-emulator-suite/start/lib/entry.dart @@ -3,9 +3,5 @@ class Entry { final String text; final String title; - Entry({ - required this.date, - required this.text, - required this.title, - }); + Entry({required this.date, required this.text, required this.title}); } diff --git a/firebase-emulator-suite/start/lib/journal_entry_form.dart b/firebase-emulator-suite/start/lib/journal_entry_form.dart index 1c4761bee5..2d5c97ff0c 100644 --- a/firebase-emulator-suite/start/lib/journal_entry_form.dart +++ b/firebase-emulator-suite/start/lib/journal_entry_form.dart @@ -42,8 +42,9 @@ class _EntryFormState extends State { }, ), TextFormField( - decoration: - const InputDecoration(labelText: 'Date (DD/MM/YYYY):'), + decoration: const InputDecoration( + labelText: 'Date (DD/MM/YYYY):', + ), validator: (value) { if (value == null || value.isEmpty) { return 'Please enter some text'; diff --git a/firebase-emulator-suite/start/lib/journal_entry_widget.dart b/firebase-emulator-suite/start/lib/journal_entry_widget.dart index 4dcb2e3460..de7ffad460 100644 --- a/firebase-emulator-suite/start/lib/journal_entry_widget.dart +++ b/firebase-emulator-suite/start/lib/journal_entry_widget.dart @@ -35,10 +35,10 @@ class EntryView extends StatelessWidget { child: Text( entry.text, style: Theme.of(context).textTheme.bodyLarge!.copyWith( - height: 1.3, - wordSpacing: 1.2, - letterSpacing: 1.05, - ), + height: 1.3, + wordSpacing: 1.2, + letterSpacing: 1.05, + ), ), ), ], diff --git a/firebase-emulator-suite/start/lib/logged_in_view.dart b/firebase-emulator-suite/start/lib/logged_in_view.dart index 0aedad1798..c339abcc4e 100644 --- a/firebase-emulator-suite/start/lib/logged_in_view.dart +++ b/firebase-emulator-suite/start/lib/logged_in_view.dart @@ -22,9 +22,7 @@ class LoggedInView extends StatelessWidget { children: [ Center( child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 16.0, - ), + padding: const EdgeInsets.symmetric(vertical: 16.0), child: Text( 'Welcome back, $name!', style: Theme.of(context).textTheme.headlineSmall!.copyWith(), @@ -49,16 +47,13 @@ class LoggedInView extends StatelessWidget { state.writeEntryToFirebase(e); }, ), - for (var entry in allEntries!) - EntryView( - entry: entry, - ) + for (var entry in allEntries!) EntryView(entry: entry), ], ); }, ), ), - ) + ), ], ), ); diff --git a/firebase-emulator-suite/start/lib/logged_out_view.dart b/firebase-emulator-suite/start/lib/logged_out_view.dart index 61004d98c5..04a6504d7d 100644 --- a/firebase-emulator-suite/start/lib/logged_out_view.dart +++ b/firebase-emulator-suite/start/lib/logged_out_view.dart @@ -9,9 +9,7 @@ class LoggedOutView extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Firebase Emulator Suite Codelab'), - ), + appBar: AppBar(title: const Text('Firebase Emulator Suite Codelab')), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, diff --git a/firebase-emulator-suite/start/lib/main.dart b/firebase-emulator-suite/start/lib/main.dart index cb74a9bb15..97da7805d4 100644 --- a/firebase-emulator-suite/start/lib/main.dart +++ b/firebase-emulator-suite/start/lib/main.dart @@ -45,7 +45,7 @@ class MyApp extends StatelessWidget { class AppScrollBehavior extends MaterialScrollBehavior { @override Set get dragDevices => { - PointerDeviceKind.touch, - PointerDeviceKind.mouse, - }; + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + }; } diff --git a/firebase-emulator-suite/start/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-emulator-suite/start/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 549cf605dd..0387a7a877 100644 --- a/firebase-emulator-suite/start/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-emulator-suite/start/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-emulator-suite/start/pubspec.yaml b/firebase-emulator-suite/start/pubspec.yaml index f1d44b1abe..2bd3538657 100644 --- a/firebase-emulator-suite/start/pubspec.yaml +++ b/firebase-emulator-suite/start/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/firebase-get-to-know-flutter/codelab_rebuild.yaml b/firebase-get-to-know-flutter/codelab_rebuild.yaml index 2c0daa78c8..38a12ecdb7 100644 --- a/firebase-get-to-know-flutter/codelab_rebuild.yaml +++ b/firebase-get-to-know-flutter/codelab_rebuild.yaml @@ -41,8 +41,8 @@ steps: # To add assets to your application, add an assets section, like this: # assets: - - name: Patch android/app/build.gradle - path: gtk_flutter/android/app/build.gradle + - name: Patch android/app/build.gradle.kts + path: gtk_flutter/android/app/build.gradle.kts patch-u: | --- b/firebase-get-to-know-flutter/step_02/android/app/build.gradle +++ a/firebase-get-to-know-flutter/step_02/android/app/build.gradle @@ -111,31 +111,29 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; - + import 'home_page.dart'; - + void main() { runApp(const App()); } - + class App extends StatelessWidget { const App({super.key}); - + @override Widget build(BuildContext context) { return MaterialApp( title: 'Firebase Meetup', theme: ThemeData( - buttonTheme: Theme.of(context).buttonTheme.copyWith( - highlightColor: Colors.deepPurple, - ), + buttonTheme: Theme.of( + context, + ).buttonTheme.copyWith(highlightColor: Colors.deepPurple), colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - textTheme: GoogleFonts.robotoTextTheme( - Theme.of(context).textTheme, - ), + textTheme: GoogleFonts.robotoTextTheme(Theme.of(context).textTheme), visualDensity: VisualDensity.adaptivePlatformDensity, ), home: const HomePage(), @@ -148,20 +146,18 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import 'src/widgets.dart'; - + class HomePage extends StatelessWidget { const HomePage({super.key}); - + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Firebase Meetup'), - ), + appBar: AppBar(title: const Text('Firebase Meetup')), body: ListView( children: [ Image.asset('assets/codelab.png'), @@ -193,22 +189,18 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; - + import 'widgets.dart'; - + class AuthFunc extends StatelessWidget { - const AuthFunc({ - super.key, - required this.loggedIn, - required this.signOut, - }); - + const AuthFunc({super.key, required this.loggedIn, required this.signOut}); + final bool loggedIn; final void Function() signOut; - + @override Widget build(BuildContext context) { return Row( @@ -216,22 +208,24 @@ steps: Padding( padding: const EdgeInsets.only(left: 24, bottom: 8), child: StyledButton( - onPressed: () { - !loggedIn ? context.push('/sign-in') : signOut(); - }, - child: !loggedIn ? const Text('RSVP') : const Text('Logout')), + onPressed: () { + !loggedIn ? context.push('/sign-in') : signOut(); + }, + child: !loggedIn ? const Text('RSVP') : const Text('Logout'), + ), ), Visibility( visible: loggedIn, child: Padding( padding: const EdgeInsets.only(left: 24, bottom: 8), child: StyledButton( - onPressed: () { - context.push('/profile'); - }, - child: const Text('Profile')), + onPressed: () { + context.push('/profile'); + }, + child: const Text('Profile'), + ), ), - ) + ), ], ); } @@ -242,7 +236,7 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; class Header extends StatelessWidget { @@ -251,12 +245,9 @@ steps: @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - heading, - style: const TextStyle(fontSize: 24), - ), - ); + padding: const EdgeInsets.all(8.0), + child: Text(heading, style: const TextStyle(fontSize: 24)), + ); } class Paragraph extends StatelessWidget { @@ -264,12 +255,9 @@ steps: final String content; @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - content, - style: const TextStyle(fontSize: 18), - ), - ); + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Text(content, style: const TextStyle(fontSize: 18)), + ); } class IconAndDetail extends StatelessWidget { @@ -279,18 +267,15 @@ steps: @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - Icon(icon), - const SizedBox(width: 8), - Text( - detail, - style: const TextStyle(fontSize: 18), - ) - ], - ), - ); + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Icon(icon), + const SizedBox(width: 8), + Text(detail, style: const TextStyle(fontSize: 18)), + ], + ), + ); } class StyledButton extends StatelessWidget { @@ -300,11 +285,12 @@ steps: @override Widget build(BuildContext context) => OutlinedButton( - style: OutlinedButton.styleFrom( - side: const BorderSide(color: Colors.deepPurple)), - onPressed: onPressed, - child: child, - ); + style: OutlinedButton.styleFrom( + side: const BorderSide(color: Colors.deepPurple), + ), + onPressed: onPressed, + child: child, + ); } - name: Replace test/widget_test.dart path: gtk_flutter/test/widget_test.dart @@ -1690,30 +1676,6 @@ steps: AAAAWBEAAAAAAKwIAAAAAABWBAAAAAAAKwIAAAAAgBUBAAAAAMCKAAAAAABgRQAAAAAAsCIAAAAAAFgR AAAAAACsCAAAAAAAVgQAAAAAACsCAAAAAIAVAQAAAADAigAAAAAAYEUAAAAAALAiAAAAAABYEQAAAAAA rAgAAAAAAFYEAAAAAAArAgAAAACAFQEAAAAA3G78fwEGAOYQ2S/g6/WJAAAAAElFTkSuQmCC - - name: Patch android/settings.gradle - path: gtk_flutter/android/settings.gradle - patch-u: | - --- b/boring_to_beautiful/step_01/android/settings.gradle - +++ a/boring_to_beautiful/step_01/android/settings.gradle - @@ -18,7 +18,7 @@ pluginManagement { - - plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - - id "com.android.application" version "8.1.0" apply false - + id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false - } - - name: Patch - path: gtk_flutter/android/gradle/wrapper/gradle-wrapper.properties - patch-u: | - --- b/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties - +++ a/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties - @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME - distributionPath=wrapper/dists - zipStoreBase=GRADLE_USER_HOME - zipStorePath=wrapper/dists - -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip - +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip - name: Build for iOS platforms: [ macos ] path: gtk_flutter @@ -1776,7 +1738,8 @@ steps: return macos; default: throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.'); + 'DefaultFirebaseOptions are not supported for this platform.', + ); } } @@ -1864,7 +1827,7 @@ steps: patch-u: | --- b/firebase-get-to-know-flutter/step_05/lib/main.dart +++ a/firebase-get-to-know-flutter/step_05/lib/main.dart - @@ -2,21 +2,105 @@ + @@ -2,21 +2,107 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -1881,10 +1844,12 @@ steps: - runApp(const App()); + WidgetsFlutterBinding.ensureInitialized(); + - + runApp(ChangeNotifierProvider( - + create: (context) => ApplicationState(), - + builder: ((context, child) => const App()), - + )); + + runApp( + + ChangeNotifierProvider( + + create: (context) => ApplicationState(), + + builder: ((context, child) => const App()), + + ), + + ); } +final _router = GoRouter( @@ -1901,9 +1866,7 @@ steps: + ForgotPasswordAction(((context, email) { + final uri = Uri( + path: '/sign-in/forgot-password', - + queryParameters: { - + 'email': email, - + }, + + queryParameters: {'email': email}, + ); + context.push(uri.toString()); + })), @@ -1911,7 +1874,7 @@ steps: + final user = switch (state) { + SignedIn state => state.user, + UserCreated state => state.credential.user, - + _ => null + + _ => null, + }; + if (user == null) { + return; @@ -1922,8 +1885,10 @@ steps: + if (!user.emailVerified) { + user.sendEmailVerification(); + const snackBar = SnackBar( - + content: Text( - + 'Please check your email to verify your email address')); + + content: Text( + + 'Please check your email to verify your email address', + + ), + + ); + ScaffoldMessenger.of(context).showSnackBar(snackBar); + } + context.pushReplacement('/'); @@ -1971,9 +1936,9 @@ steps: + return MaterialApp.router( title: 'Firebase Meetup', theme: ThemeData( - buttonTheme: Theme.of(context).buttonTheme.copyWith( - @@ -28,7 +112,7 @@ class App extends StatelessWidget { - ), + buttonTheme: Theme.of( + @@ -26,7 +112,7 @@ class App extends StatelessWidget { + textTheme: GoogleFonts.robotoTextTheme(Theme.of(context).textTheme), visualDensity: VisualDensity.adaptivePlatformDensity, ), - home: const HomePage(), @@ -2013,31 +1978,30 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:firebase_auth/firebase_auth.dart' hide EmailAuthProvider, PhoneAuthProvider; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_ui_auth/firebase_ui_auth.dart'; import 'package:flutter/material.dart'; - + import 'firebase_options.dart'; - + class ApplicationState extends ChangeNotifier { ApplicationState() { init(); } - + bool _loggedIn = false; bool get loggedIn => _loggedIn; - + Future init() async { await Firebase.initializeApp( - options: DefaultFirebaseOptions.currentPlatform); - - FirebaseUIAuth.configureProviders([ - EmailAuthProvider(), - ]); - + options: DefaultFirebaseOptions.currentPlatform, + ); + + FirebaseUIAuth.configureProviders([EmailAuthProvider()]); + FirebaseAuth.instance.userChanges().listen((user) { if (user != null) { _loggedIn = true; @@ -2067,51 +2031,22 @@ steps: import 'src/widgets.dart'; class HomePage extends StatelessWidget { - @@ -21,6 +26,13 @@ class HomePage extends StatelessWidget { + @@ -19,6 +24,15 @@ class HomePage extends StatelessWidget { const SizedBox(height: 8), const IconAndDetail(Icons.calendar_today, 'October 30'), const IconAndDetail(Icons.location_city, 'San Francisco'), + Consumer( - + builder: (context, appState, _) => AuthFunc( - + loggedIn: appState.loggedIn, - + signOut: () { - + FirebaseAuth.instance.signOut(); - + }), + + builder: + + (context, appState, _) => AuthFunc( + + loggedIn: appState.loggedIn, + + signOut: () { + + FirebaseAuth.instance.signOut(); + + }, + + ), + ), const Divider( height: 8, thickness: 1, - - name: Patch lib/src/authentication.dart - path: gtk_flutter/lib/src/authentication.dart - patch-u: | - --- b/firebase-get-to-know-flutter/step_05/lib/src/authentication.dart - +++ a/firebase-get-to-know-flutter/step_05/lib/src/authentication.dart - @@ -30,16 +30,15 @@ class AuthFunc extends StatelessWidget { - child: !loggedIn ? const Text('RSVP') : const Text('Logout')), - ), - Visibility( - - visible: loggedIn, - - child: Padding( - - padding: const EdgeInsets.only(left: 24, bottom: 8), - - child: StyledButton( - - onPressed: () { - - context.push('/profile'); - - }, - - child: const Text('Profile')), - - ), - - ) - + visible: loggedIn, - + child: Padding( - + padding: const EdgeInsets.only(left: 24, bottom: 8), - + child: StyledButton( - + onPressed: () { - + context.push('/profile'); - + }, - + child: const Text('Profile')), - + )) - ], - ); - } - name: Copy step_05 copydir: from: gtk_flutter @@ -2141,7 +2076,7 @@ steps: bool get loggedIn => _loggedIn; Future init() async { - @@ -35,4 +37,19 @@ class ApplicationState extends ChangeNotifier { + @@ -34,4 +36,19 @@ class ApplicationState extends ChangeNotifier { notifyListeners(); }); } @@ -2154,11 +2089,11 @@ steps: + return FirebaseFirestore.instance + .collection('guestbook') + .add({ - + 'text': message, - + 'timestamp': DateTime.now().millisecondsSinceEpoch, - + 'name': FirebaseAuth.instance.currentUser!.displayName, - + 'userId': FirebaseAuth.instance.currentUser!.uid, - + }); + + 'text': message, + + 'timestamp': DateTime.now().millisecondsSinceEpoch, + + 'name': FirebaseAuth.instance.currentUser!.displayName, + + 'userId': FirebaseAuth.instance.currentUser!.uid, + + }); + } } - name: Add lib/guest_book.dart @@ -2167,26 +2102,26 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:async'; - + import 'package:flutter/material.dart'; - + import 'src/widgets.dart'; - + class GuestBook extends StatefulWidget { const GuestBook({required this.addMessage, super.key}); - + final FutureOr Function(String message) addMessage; - + @override State createState() => _GuestBookState(); } - + class _GuestBookState extends State { final _formKey = GlobalKey(debugLabel: '_GuestBookState'); final _controller = TextEditingController(); - + @override Widget build(BuildContext context) { return Padding( @@ -2198,9 +2133,7 @@ steps: Expanded( child: TextFormField( controller: _controller, - decoration: const InputDecoration( - hintText: 'Leave a message', - ), + decoration: const InputDecoration(hintText: 'Leave a message'), validator: (value) { if (value == null || value.isEmpty) { return 'Enter your message to continue'; @@ -2218,11 +2151,7 @@ steps: } }, child: const Row( - children: [ - Icon(Icons.send), - SizedBox(width: 4), - Text('SEND'), - ], + children: [Icon(Icons.send), SizedBox(width: 4), Text('SEND')], ), ), ], @@ -2230,7 +2159,7 @@ steps: ), ); } - + @override void dispose() { _controller.dispose(); @@ -2250,23 +2179,25 @@ steps: import 'src/authentication.dart'; import 'src/widgets.dart'; - @@ -44,6 +45,20 @@ class HomePage extends StatelessWidget { + @@ -44,6 +45,22 @@ class HomePage extends StatelessWidget { const Paragraph( 'Join us for a day full of Firebase Workshops and Pizza!', ), + Consumer( - + builder: (context, appState, _) => Column( - + crossAxisAlignment: CrossAxisAlignment.start, - + children: [ - + if (appState.loggedIn) ...[ - + const Header('Discussion'), - + GuestBook( - + addMessage: (message) => - + appState.addMessageToGuestBook(message), - + ), - + ], - + ], - + ), + + builder: + + (context, appState, _) => Column( + + crossAxisAlignment: CrossAxisAlignment.start, + + children: [ + + if (appState.loggedIn) ...[ + + const Header('Discussion'), + + GuestBook( + + addMessage: + + (message) => + + appState.addMessageToGuestBook(message), + + ), + + ], + + ], + + ), + ), ], ), @@ -2314,8 +2245,8 @@ steps: + Future init() async { await Firebase.initializeApp( - options: DefaultFirebaseOptions.currentPlatform); - @@ -31,8 +37,26 @@ class ApplicationState extends ChangeNotifier { + options: DefaultFirebaseOptions.currentPlatform, + @@ -30,8 +36,26 @@ class ApplicationState extends ChangeNotifier { FirebaseAuth.instance.userChanges().listen((user) { if (user != null) { _loggedIn = true; @@ -2324,17 +2255,17 @@ steps: + .orderBy('timestamp', descending: true) + .snapshots() + .listen((snapshot) { - + _guestBookMessages = []; - + for (final document in snapshot.docs) { - + _guestBookMessages.add( - + GuestBookMessage( - + name: document.data()['name'] as String, - + message: document.data()['text'] as String, - + ), - + ); - + } - + notifyListeners(); - + }); + + _guestBookMessages = []; + + for (final document in snapshot.docs) { + + _guestBookMessages.add( + + GuestBookMessage( + + name: document.data()['name'] as String, + + message: document.data()['text'] as String, + + ), + + ); + + } + + notifyListeners(); + + }); } else { _loggedIn = false; + _guestBookMessages = []; @@ -2380,7 +2311,7 @@ steps: @override State createState() => _GuestBookState(); - @@ -23,45 +29,54 @@ class _GuestBookState extends State { + @@ -23,39 +29,54 @@ class _GuestBookState extends State { @override Widget build(BuildContext context) { @@ -2393,8 +2324,14 @@ steps: - Expanded( - child: TextFormField( - controller: _controller, - - decoration: const InputDecoration( - - hintText: 'Leave a message', + - decoration: const InputDecoration(hintText: 'Leave a message'), + - validator: (value) { + - if (value == null || value.isEmpty) { + - return 'Enter your message to continue'; + - } + - return null; + - }, + - ), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ @@ -2417,30 +2354,7 @@ steps: + return null; + }, + ), - ), - - validator: (value) { - - if (value == null || value.isEmpty) { - - return 'Enter your message to continue'; - - } - - return null; - - }, - - ), - - ), - - const SizedBox(width: 8), - - StyledButton( - - onPressed: () async { - - if (_formKey.currentState!.validate()) { - - await widget.addMessage(_controller.text); - - _controller.clear(); - - } - - }, - - child: const Row( - - children: [ - - Icon(Icons.send), - - SizedBox(width: 4), - - Text('SEND'), - - ], - - ), + + ), + const SizedBox(width: 8), + StyledButton( + onPressed: () async { @@ -2459,6 +2373,18 @@ steps: + ), + ], ), + - const SizedBox(width: 8), + - StyledButton( + - onPressed: () async { + - if (_formKey.currentState!.validate()) { + - await widget.addMessage(_controller.text); + - _controller.clear(); + - } + - }, + - child: const Row( + - children: [Icon(Icons.send), SizedBox(width: 4), Text('SEND')], + - ), + - ), - ], + ), ), @@ -2475,14 +2401,14 @@ steps: patch-u: | --- b/firebase-get-to-know-flutter/step_07/lib/home_page.dart +++ a/firebase-get-to-know-flutter/step_07/lib/home_page.dart - @@ -54,6 +54,7 @@ class HomePage extends StatelessWidget { - GuestBook( - addMessage: (message) => - appState.addMessageToGuestBook(message), - + messages: appState.guestBookMessages, - ), - ], - ], + @@ -56,6 +56,7 @@ class HomePage extends StatelessWidget { + addMessage: + (message) => + appState.addMessageToGuestBook(message), + + messages: appState.guestBookMessages, + ), + ], + ], - name: Copy step_07 copydir: from: gtk_flutter @@ -2496,12 +2422,17 @@ steps: patch-u: | --- b/firebase-get-to-know-flutter/step_09/lib/src/authentication.dart +++ a/firebase-get-to-know-flutter/step_09/lib/src/authentication.dart - @@ -12,10 +12,12 @@ class AuthFunc extends StatelessWidget { - super.key, - required this.loggedIn, - required this.signOut, + @@ -8,10 +8,16 @@ import 'package:go_router/go_router.dart'; + import 'widgets.dart'; + + class AuthFunc extends StatelessWidget { + - const AuthFunc({super.key, required this.loggedIn, required this.signOut}); + + const AuthFunc({ + + super.key, + + required this.loggedIn, + + required this.signOut, + this.enableFreeSwag = false, - }); + + }); final bool loggedIn; final void Function() signOut; @@ -2509,22 +2440,22 @@ steps: @override Widget build(BuildContext context) { - @@ -38,7 +40,17 @@ class AuthFunc extends StatelessWidget { - context.push('/profile'); - }, - child: const Text('Profile')), - - )) - + )), + @@ -38,6 +44,18 @@ class AuthFunc extends StatelessWidget { + ), + ), + ), + Visibility( - + visible: enableFreeSwag, - + child: Padding( - + padding: const EdgeInsets.only(left: 24, bottom: 8), - + child: StyledButton( - + onPressed: () { - + throw Exception('free swag unimplemented'); - + }, - + child: const Text('Free swag!')), - + )), + + visible: enableFreeSwag, + + child: Padding( + + padding: const EdgeInsets.only(left: 24, bottom: 8), + + child: StyledButton( + + onPressed: () { + + throw Exception('free swag unimplemented'); + + }, + + child: const Text('Free swag!'), + + ), + + ), + + ), ], ); } @@ -2602,19 +2533,19 @@ steps: + Future init() async { await Firebase.initializeApp( - options: DefaultFirebaseOptions.currentPlatform); - @@ -34,9 +85,19 @@ class ApplicationState extends ChangeNotifier { - EmailAuthProvider(), - ]); + options: DefaultFirebaseOptions.currentPlatform, + @@ -33,9 +84,19 @@ class ApplicationState extends ChangeNotifier { + + FirebaseUIAuth.configureProviders([EmailAuthProvider()]); + FirebaseFirestore.instance + .collection('attendees') + .where('attending', isEqualTo: true) + .snapshots() + .listen((snapshot) { - + _attendees = snapshot.docs.length; - + notifyListeners(); - + }); + + _attendees = snapshot.docs.length; + + notifyListeners(); + + }); + FirebaseAuth.instance.userChanges().listen((user) { if (user != null) { @@ -2623,26 +2554,26 @@ steps: _guestBookSubscription = FirebaseFirestore.instance .collection('guestbook') .orderBy('timestamp', descending: true) - @@ -53,15 +114,43 @@ class ApplicationState extends ChangeNotifier { - } - notifyListeners(); - }); + @@ -52,15 +113,43 @@ class ApplicationState extends ChangeNotifier { + } + notifyListeners(); + }); + _attendingSubscription = FirebaseFirestore.instance + .collection('attendees') + .doc(user.uid) + .snapshots() + .listen((snapshot) { - + if (snapshot.data() != null) { - + if (snapshot.data()!['attending'] as bool) { - + _attending = Attending.yes; - + } else { - + _attending = Attending.no; - + } - + } else { - + _attending = Attending.unknown; - + } - + notifyListeners(); - + }); + + if (snapshot.data() != null) { + + if (snapshot.data()!['attending'] as bool) { + + _attending = Attending.yes; + + } else { + + _attending = Attending.no; + + } + + } else { + + _attending = Attending.unknown; + + } + + notifyListeners(); + + }); } else { _loggedIn = false; + _emailVerified = false; @@ -2680,65 +2611,61 @@ steps: class HomePage extends StatelessWidget { const HomePage({super.key}); - @@ -25,14 +26,19 @@ class HomePage extends StatelessWidget { + @@ -23,7 +24,11 @@ class HomePage extends StatelessWidget { children: [ Image.asset('assets/codelab.png'), const SizedBox(height: 8), - const IconAndDetail(Icons.calendar_today, 'October 30'), + Consumer( - + builder: (context, appState, _) => - + IconAndDetail(Icons.calendar_today, appState.eventDate), + + builder: + + (context, appState, _) => + + IconAndDetail(Icons.calendar_today, appState.eventDate), + ), const IconAndDetail(Icons.location_city, 'San Francisco'), Consumer( - builder: (context, appState, _) => AuthFunc( - - loggedIn: appState.loggedIn, - - signOut: () { - - FirebaseAuth.instance.signOut(); - - }), - + loggedIn: appState.loggedIn, - + signOut: () { - + FirebaseAuth.instance.signOut(); - + }, - + enableFreeSwag: appState.enableFreeSwag, - + ), + builder: + @@ -32,6 +37,7 @@ class HomePage extends StatelessWidget { + signOut: () { + FirebaseAuth.instance.signOut(); + }, + + enableFreeSwag: appState.enableFreeSwag, + ), ), const Divider( - height: 8, - @@ -42,14 +48,25 @@ class HomePage extends StatelessWidget { + @@ -42,15 +48,25 @@ class HomePage extends StatelessWidget { color: Colors.grey, ), const Header("What we'll be doing"), - const Paragraph( - 'Join us for a day full of Firebase Workshops and Pizza!', + Consumer( - + builder: (context, appState, _) => Paragraph( - + appState.callToAction, - + ), + + builder: (context, appState, _) => Paragraph(appState.callToAction), ), Consumer( - builder: (context, appState, _) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - + switch (appState.attendees) { - + 1 => const Paragraph('1 person going'), - + >= 2 => Paragraph('${appState.attendees} people going'), - + _ => const Paragraph('No one going'), - + }, - if (appState.loggedIn) ...[ - + YesNoSelection( - + state: appState.attending, - + onSelection: (attending) => appState.attending = attending, - + ), - const Header('Discussion'), - GuestBook( - addMessage: (message) => + builder: + (context, appState, _) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + switch (appState.attendees) { + + 1 => const Paragraph('1 person going'), + + >= 2 => Paragraph('${appState.attendees} people going'), + + _ => const Paragraph('No one going'), + + }, + if (appState.loggedIn) ...[ + + YesNoSelection( + + state: appState.attending, + + onSelection: + + (attending) => appState.attending = attending, + + ), + const Header('Discussion'), + GuestBook( + addMessage: - name: Patch lib/main.dart path: gtk_flutter/lib/main.dart patch-u: | --- b/firebase-get-to-know-flutter/step_09/lib/main.dart +++ a/firebase-get-to-know-flutter/step_09/lib/main.dart - @@ -80,13 +80,28 @@ final _router = GoRouter( + @@ -82,13 +82,28 @@ final _router = GoRouter( GoRoute( path: 'profile', builder: (context, state) { @@ -2750,27 +2677,27 @@ steps: - }), - ], + return Consumer( - + builder: (context, appState, _) => ProfileScreen( - + key: ValueKey(appState.emailVerified), - + providers: const [], - + actions: [ - + SignedOutAction( - + ((context) { - + context.pushReplacement('/'); - + }), + + builder: + + (context, appState, _) => ProfileScreen( + + key: ValueKey(appState.emailVerified), + + providers: const [], + + actions: [ + + SignedOutAction(((context) { + + context.pushReplacement('/'); + + })), + + ], + + children: [ + + Visibility( + + visible: !appState.emailVerified, + + child: OutlinedButton( + + child: const Text('Recheck Verification State'), + + onPressed: () { + + appState.refreshLoggedInUser(); + + }, + + ), + + ), + + ], + ), - + ], - + children: [ - + Visibility( - + visible: !appState.emailVerified, - + child: OutlinedButton( - + child: const Text('Recheck Verification State'), - + onPressed: () { - + appState.refreshLoggedInUser(); - + }, - + )) - + ], - + ), ); }, ), @@ -2780,22 +2707,22 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import 'app_state.dart'; import 'src/widgets.dart'; - + class YesNoSelection extends StatelessWidget { const YesNoSelection({ super.key, required this.state, required this.onSelection, }); - + final Attending state; final void Function(Attending selection) onSelection; - + @override Widget build(BuildContext context) { switch (state) { diff --git a/firebase-get-to-know-flutter/step_02/android/.gitignore b/firebase-get-to-know-flutter/step_02/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/firebase-get-to-know-flutter/step_02/android/.gitignore +++ b/firebase-get-to-know-flutter/step_02/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/firebase-get-to-know-flutter/step_02/android/app/build.gradle b/firebase-get-to-know-flutter/step_02/android/app/build.gradle deleted file mode 100644 index ad5859ad24..0000000000 --- a/firebase-get-to-know-flutter/step_02/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.gtk_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.gtk_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/firebase-get-to-know-flutter/step_02/android/app/build.gradle.kts b/firebase-get-to-know-flutter/step_02/android/app/build.gradle.kts new file mode 100644 index 0000000000..3e28d8bd44 --- /dev/null +++ b/firebase-get-to-know-flutter/step_02/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.gtk_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.gtk_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/firebase-get-to-know-flutter/step_02/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt b/firebase-get-to-know-flutter/step_02/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt index 039c1b0e7d..2ea667c39a 100644 --- a/firebase-get-to-know-flutter/step_02/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt +++ b/firebase-get-to-know-flutter/step_02/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.gtk_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/firebase-get-to-know-flutter/step_02/android/build.gradle b/firebase-get-to-know-flutter/step_02/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/firebase-get-to-know-flutter/step_02/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/firebase-get-to-know-flutter/step_02/android/build.gradle.kts b/firebase-get-to-know-flutter/step_02/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/firebase-get-to-know-flutter/step_02/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/firebase-get-to-know-flutter/step_02/android/gradle.properties b/firebase-get-to-know-flutter/step_02/android/gradle.properties index 2597170821..f018a61817 100644 --- a/firebase-get-to-know-flutter/step_02/android/gradle.properties +++ b/firebase-get-to-know-flutter/step_02/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/firebase-get-to-know-flutter/step_02/android/gradle/wrapper/gradle-wrapper.properties b/firebase-get-to-know-flutter/step_02/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/firebase-get-to-know-flutter/step_02/android/gradle/wrapper/gradle-wrapper.properties +++ b/firebase-get-to-know-flutter/step_02/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/firebase-get-to-know-flutter/step_02/android/settings.gradle b/firebase-get-to-know-flutter/step_02/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/firebase-get-to-know-flutter/step_02/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/firebase-get-to-know-flutter/step_02/android/settings.gradle.kts b/firebase-get-to-know-flutter/step_02/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/firebase-get-to-know-flutter/step_02/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/firebase-get-to-know-flutter/step_02/ios/Podfile b/firebase-get-to-know-flutter/step_02/ios/Podfile index 3e44f9c6f7..2dbf7d728d 100644 --- a/firebase-get-to-know-flutter/step_02/ios/Podfile +++ b/firebase-get-to-know-flutter/step_02/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-get-to-know-flutter/step_02/ios/Runner.xcodeproj/project.pbxproj b/firebase-get-to-know-flutter/step_02/ios/Runner.xcodeproj/project.pbxproj index 7de6133685..6524717597 100644 --- a/firebase-get-to-know-flutter/step_02/ios/Runner.xcodeproj/project.pbxproj +++ b/firebase-get-to-know-flutter/step_02/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 589C772495F1143748C4F157 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */; }; + 422628136E756BE6071BD78F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */; }; + 71C9017C3DA1BF2CEDF82DE6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCB85976CEA915945B149712 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - 986CD7DB5F34CF090EF2CA52 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,15 +42,17 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B6B2D1AE9EAE20F1711B98A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 688971683DC7106866C0B9B0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 4BF614354AD511BA2AFD0A33 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 5B1DBDDE848E285604ECAD29 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -61,10 +63,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - CB59B2D1DA8BEEC0BCC77043 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F72D6E3E97FAA258CE871A41 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + FCB85976CEA915945B149712 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,30 +72,30 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 589C772495F1143748C4F157 /* Pods_Runner.framework in Frameworks */, + 71C9017C3DA1BF2CEDF82DE6 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A3DC8A1C5C668494C6834378 /* Frameworks */ = { + EA3C2372CF052533C13FFE27 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 986CD7DB5F34CF090EF2CA52 /* Pods_RunnerTests.framework in Frameworks */, + 422628136E756BE6071BD78F /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 105CD1738BF7F7E97BE8A3B6 /* Pods */ = { + 22E12961F927A9582D4F680E /* Pods */ = { isa = PBXGroup; children = ( - 688971683DC7106866C0B9B0 /* Pods-Runner.debug.xcconfig */, - 1B6B2D1AE9EAE20F1711B98A /* Pods-Runner.release.xcconfig */, - CB59B2D1DA8BEEC0BCC77043 /* Pods-Runner.profile.xcconfig */, - 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */, - D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */, - BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */, + F72D6E3E97FAA258CE871A41 /* Pods-Runner.debug.xcconfig */, + 5B1DBDDE848E285604ECAD29 /* Pods-Runner.release.xcconfig */, + 4BF614354AD511BA2AFD0A33 /* Pods-Runner.profile.xcconfig */, + 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */, + 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */, + 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 105CD1738BF7F7E97BE8A3B6 /* Pods */, - C9654424345AAECD8C097359 /* Frameworks */, + 22E12961F927A9582D4F680E /* Pods */, + 9AFF92BC7EC70A109D78E215 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - C9654424345AAECD8C097359 /* Frameworks */ = { + 9AFF92BC7EC70A109D78E215 /* Frameworks */ = { isa = PBXGroup; children = ( - E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */, - 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */, + FCB85976CEA915945B149712 /* Pods_Runner.framework */, + 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 952BE0E434084B7B6FF4F686 /* [CP] Check Pods Manifest.lock */, + 1EE5AFBFD2FA841E4055FF63 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - A3DC8A1C5C668494C6834378 /* Frameworks */, + EA3C2372CF052533C13FFE27 /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 39A46715CA44AAF4EEC59A33 /* [CP] Check Pods Manifest.lock */, + E702E5CD2507380B5798BE83 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - B615B10C2DC1A5339BE2BBB2 /* [CP] Embed Pods Frameworks */, + DE18B35D8F83EFC2C7F04DD0 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 39A46715CA44AAF4EEC59A33 /* [CP] Check Pods Manifest.lock */ = { + 1EE5AFBFD2FA841E4055FF63 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,7 +285,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 952BE0E434084B7B6FF4F686 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + DE18B35D8F83EFC2C7F04DD0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - B615B10C2DC1A5339BE2BBB2 /* [CP] Embed Pods Frameworks */ = { + E702E5CD2507380B5798BE83 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -488,7 +488,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -507,7 +507,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -524,7 +524,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/firebase-get-to-know-flutter/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-get-to-know-flutter/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/firebase-get-to-know-flutter/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-get-to-know-flutter/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-get-to-know-flutter/step_02/lib/home_page.dart b/firebase-get-to-know-flutter/step_02/lib/home_page.dart index e7d8d12123..ecc3c6be3d 100644 --- a/firebase-get-to-know-flutter/step_02/lib/home_page.dart +++ b/firebase-get-to-know-flutter/step_02/lib/home_page.dart @@ -12,9 +12,7 @@ class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Firebase Meetup'), - ), + appBar: AppBar(title: const Text('Firebase Meetup')), body: ListView( children: [ Image.asset('assets/codelab.png'), diff --git a/firebase-get-to-know-flutter/step_02/lib/main.dart b/firebase-get-to-know-flutter/step_02/lib/main.dart index 8d2ba90ce8..4934427def 100644 --- a/firebase-get-to-know-flutter/step_02/lib/main.dart +++ b/firebase-get-to-know-flutter/step_02/lib/main.dart @@ -19,13 +19,11 @@ class App extends StatelessWidget { return MaterialApp( title: 'Firebase Meetup', theme: ThemeData( - buttonTheme: Theme.of(context).buttonTheme.copyWith( - highlightColor: Colors.deepPurple, - ), + buttonTheme: Theme.of( + context, + ).buttonTheme.copyWith(highlightColor: Colors.deepPurple), colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - textTheme: GoogleFonts.robotoTextTheme( - Theme.of(context).textTheme, - ), + textTheme: GoogleFonts.robotoTextTheme(Theme.of(context).textTheme), visualDensity: VisualDensity.adaptivePlatformDensity, ), home: const HomePage(), diff --git a/firebase-get-to-know-flutter/step_02/lib/src/authentication.dart b/firebase-get-to-know-flutter/step_02/lib/src/authentication.dart index 7a40546f94..a094b484b8 100644 --- a/firebase-get-to-know-flutter/step_02/lib/src/authentication.dart +++ b/firebase-get-to-know-flutter/step_02/lib/src/authentication.dart @@ -8,11 +8,7 @@ import 'package:go_router/go_router.dart'; import 'widgets.dart'; class AuthFunc extends StatelessWidget { - const AuthFunc({ - super.key, - required this.loggedIn, - required this.signOut, - }); + const AuthFunc({super.key, required this.loggedIn, required this.signOut}); final bool loggedIn; final void Function() signOut; @@ -24,22 +20,24 @@ class AuthFunc extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 24, bottom: 8), child: StyledButton( - onPressed: () { - !loggedIn ? context.push('/sign-in') : signOut(); - }, - child: !loggedIn ? const Text('RSVP') : const Text('Logout')), + onPressed: () { + !loggedIn ? context.push('/sign-in') : signOut(); + }, + child: !loggedIn ? const Text('RSVP') : const Text('Logout'), + ), ), Visibility( visible: loggedIn, child: Padding( padding: const EdgeInsets.only(left: 24, bottom: 8), child: StyledButton( - onPressed: () { - context.push('/profile'); - }, - child: const Text('Profile')), + onPressed: () { + context.push('/profile'); + }, + child: const Text('Profile'), + ), ), - ) + ), ], ); } diff --git a/firebase-get-to-know-flutter/step_02/lib/src/widgets.dart b/firebase-get-to-know-flutter/step_02/lib/src/widgets.dart index 29886a3802..3f89c9d797 100644 --- a/firebase-get-to-know-flutter/step_02/lib/src/widgets.dart +++ b/firebase-get-to-know-flutter/step_02/lib/src/widgets.dart @@ -10,12 +10,9 @@ class Header extends StatelessWidget { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - heading, - style: const TextStyle(fontSize: 24), - ), - ); + padding: const EdgeInsets.all(8.0), + child: Text(heading, style: const TextStyle(fontSize: 24)), + ); } class Paragraph extends StatelessWidget { @@ -23,12 +20,9 @@ class Paragraph extends StatelessWidget { final String content; @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - content, - style: const TextStyle(fontSize: 18), - ), - ); + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Text(content, style: const TextStyle(fontSize: 18)), + ); } class IconAndDetail extends StatelessWidget { @@ -38,18 +32,15 @@ class IconAndDetail extends StatelessWidget { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - Icon(icon), - const SizedBox(width: 8), - Text( - detail, - style: const TextStyle(fontSize: 18), - ) - ], - ), - ); + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Icon(icon), + const SizedBox(width: 8), + Text(detail, style: const TextStyle(fontSize: 18)), + ], + ), + ); } class StyledButton extends StatelessWidget { @@ -59,9 +50,10 @@ class StyledButton extends StatelessWidget { @override Widget build(BuildContext context) => OutlinedButton( - style: OutlinedButton.styleFrom( - side: const BorderSide(color: Colors.deepPurple)), - onPressed: onPressed, - child: child, - ); + style: OutlinedButton.styleFrom( + side: const BorderSide(color: Colors.deepPurple), + ), + onPressed: onPressed, + child: child, + ); } diff --git a/firebase-get-to-know-flutter/step_02/macos/Podfile b/firebase-get-to-know-flutter/step_02/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/firebase-get-to-know-flutter/step_02/macos/Podfile +++ b/firebase-get-to-know-flutter/step_02/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-get-to-know-flutter/step_02/macos/Runner.xcodeproj/project.pbxproj b/firebase-get-to-know-flutter/step_02/macos/Runner.xcodeproj/project.pbxproj index fb0fd3bdda..9bc0a35357 100644 --- a/firebase-get-to-know-flutter/step_02/macos/Runner.xcodeproj/project.pbxproj +++ b/firebase-get-to-know-flutter/step_02/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 0DA8E7B8BBE6C967EE273C73 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */; }; + 0F7CAD0D7A868D800C3BC513 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 861888475ACBDFC19581A0BE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */; }; - BF47E961A040868CE445556F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,9 +62,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 12EB594E522C70C2DC1D73D7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2D983AC4D530A30FD0FD7562 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -81,13 +81,13 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8712FD9EDF1BB663BBEFE247 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 818641D5131FCBD6E653AC27 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A32E8B517B4C27ACE370E88D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9FF3F59EF1584722C34252E8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 861888475ACBDFC19581A0BE /* Pods_RunnerTests.framework in Frameworks */, + 0F7CAD0D7A868D800C3BC513 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF47E961A040868CE445556F /* Pods_Runner.framework in Frameworks */, + 0DA8E7B8BBE6C967EE273C73 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - B983F0D55574110AFA4B1FDE /* Pods */, + BDC8D1065892FABF50206535 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - B983F0D55574110AFA4B1FDE /* Pods */ = { + BDC8D1065892FABF50206535 /* Pods */ = { isa = PBXGroup; children = ( - 12EB594E522C70C2DC1D73D7 /* Pods-Runner.debug.xcconfig */, - A32E8B517B4C27ACE370E88D /* Pods-Runner.release.xcconfig */, - 8712FD9EDF1BB663BBEFE247 /* Pods-Runner.profile.xcconfig */, - 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */, - 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */, - 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */, + 818641D5131FCBD6E653AC27 /* Pods-Runner.debug.xcconfig */, + 9FF3F59EF1584722C34252E8 /* Pods-Runner.release.xcconfig */, + 2D983AC4D530A30FD0FD7562 /* Pods-Runner.profile.xcconfig */, + 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */, + 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */, + F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */, - 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */, + 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */, + 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 9E1E48E79D5F3FA67D4ECFC0 /* [CP] Check Pods Manifest.lock */, + 063F0C8571D4FB451EEF9465 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8A277401736D674439F93FC9 /* [CP] Check Pods Manifest.lock */, + C3ACE1D312FF874DC9DEA790 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 40538D587193E4AA10BF0D34 /* [CP] Embed Pods Frameworks */, + F0F1606EF6F9A64751A4FA46 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,62 +323,67 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 063F0C8571D4FB451EEF9465 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, ); outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 40538D587193E4AA10BF0D34 /* [CP] Embed Pods Frameworks */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, ); - name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 8A277401736D674439F93FC9 /* [CP] Check Pods Manifest.lock */ = { + C3ACE1D312FF874DC9DEA790 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -400,26 +405,21 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 9E1E48E79D5F3FA67D4ECFC0 /* [CP] Check Pods Manifest.lock */ = { + F0F1606EF6F9A64751A4FA46 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -489,7 +489,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -505,7 +505,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/firebase-get-to-know-flutter/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-get-to-know-flutter/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3613032c84..7edb7743f9 100644 --- a/firebase-get-to-know-flutter/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-get-to-know-flutter/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-get-to-know-flutter/step_02/pubspec.yaml b/firebase-get-to-know-flutter/step_02/pubspec.yaml index 282a308d69..4fcf3cc43b 100644 --- a/firebase-get-to-know-flutter/step_02/pubspec.yaml +++ b/firebase-get-to-know-flutter/step_02/pubspec.yaml @@ -20,7 +20,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -36,7 +36,7 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 google_fonts: ^6.2.1 - go_router: ^14.7.2 + go_router: ^14.8.0 dev_dependencies: flutter_test: diff --git a/firebase-get-to-know-flutter/step_04/android/.gitignore b/firebase-get-to-know-flutter/step_04/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/firebase-get-to-know-flutter/step_04/android/.gitignore +++ b/firebase-get-to-know-flutter/step_04/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/firebase-get-to-know-flutter/step_04/android/app/build.gradle b/firebase-get-to-know-flutter/step_04/android/app/build.gradle deleted file mode 100644 index ad5859ad24..0000000000 --- a/firebase-get-to-know-flutter/step_04/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.gtk_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.gtk_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/firebase-get-to-know-flutter/step_04/android/app/build.gradle.kts b/firebase-get-to-know-flutter/step_04/android/app/build.gradle.kts new file mode 100644 index 0000000000..3e28d8bd44 --- /dev/null +++ b/firebase-get-to-know-flutter/step_04/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.gtk_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.gtk_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/firebase-get-to-know-flutter/step_04/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt b/firebase-get-to-know-flutter/step_04/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt index 039c1b0e7d..2ea667c39a 100644 --- a/firebase-get-to-know-flutter/step_04/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt +++ b/firebase-get-to-know-flutter/step_04/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.gtk_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/firebase-get-to-know-flutter/step_04/android/build.gradle b/firebase-get-to-know-flutter/step_04/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/firebase-get-to-know-flutter/step_04/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/firebase-get-to-know-flutter/step_04/android/build.gradle.kts b/firebase-get-to-know-flutter/step_04/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/firebase-get-to-know-flutter/step_04/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/firebase-get-to-know-flutter/step_04/android/gradle.properties b/firebase-get-to-know-flutter/step_04/android/gradle.properties index 2597170821..f018a61817 100644 --- a/firebase-get-to-know-flutter/step_04/android/gradle.properties +++ b/firebase-get-to-know-flutter/step_04/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/firebase-get-to-know-flutter/step_04/android/gradle/wrapper/gradle-wrapper.properties b/firebase-get-to-know-flutter/step_04/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/firebase-get-to-know-flutter/step_04/android/gradle/wrapper/gradle-wrapper.properties +++ b/firebase-get-to-know-flutter/step_04/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/firebase-get-to-know-flutter/step_04/android/settings.gradle b/firebase-get-to-know-flutter/step_04/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/firebase-get-to-know-flutter/step_04/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/firebase-get-to-know-flutter/step_04/android/settings.gradle.kts b/firebase-get-to-know-flutter/step_04/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/firebase-get-to-know-flutter/step_04/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/firebase-get-to-know-flutter/step_04/ios/Podfile b/firebase-get-to-know-flutter/step_04/ios/Podfile index 3e44f9c6f7..2dbf7d728d 100644 --- a/firebase-get-to-know-flutter/step_04/ios/Podfile +++ b/firebase-get-to-know-flutter/step_04/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-get-to-know-flutter/step_04/ios/Runner.xcodeproj/project.pbxproj b/firebase-get-to-know-flutter/step_04/ios/Runner.xcodeproj/project.pbxproj index 7de6133685..6524717597 100644 --- a/firebase-get-to-know-flutter/step_04/ios/Runner.xcodeproj/project.pbxproj +++ b/firebase-get-to-know-flutter/step_04/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 589C772495F1143748C4F157 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */; }; + 422628136E756BE6071BD78F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */; }; + 71C9017C3DA1BF2CEDF82DE6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCB85976CEA915945B149712 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - 986CD7DB5F34CF090EF2CA52 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,15 +42,17 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B6B2D1AE9EAE20F1711B98A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 688971683DC7106866C0B9B0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 4BF614354AD511BA2AFD0A33 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 5B1DBDDE848E285604ECAD29 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -61,10 +63,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - CB59B2D1DA8BEEC0BCC77043 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F72D6E3E97FAA258CE871A41 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + FCB85976CEA915945B149712 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,30 +72,30 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 589C772495F1143748C4F157 /* Pods_Runner.framework in Frameworks */, + 71C9017C3DA1BF2CEDF82DE6 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A3DC8A1C5C668494C6834378 /* Frameworks */ = { + EA3C2372CF052533C13FFE27 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 986CD7DB5F34CF090EF2CA52 /* Pods_RunnerTests.framework in Frameworks */, + 422628136E756BE6071BD78F /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 105CD1738BF7F7E97BE8A3B6 /* Pods */ = { + 22E12961F927A9582D4F680E /* Pods */ = { isa = PBXGroup; children = ( - 688971683DC7106866C0B9B0 /* Pods-Runner.debug.xcconfig */, - 1B6B2D1AE9EAE20F1711B98A /* Pods-Runner.release.xcconfig */, - CB59B2D1DA8BEEC0BCC77043 /* Pods-Runner.profile.xcconfig */, - 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */, - D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */, - BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */, + F72D6E3E97FAA258CE871A41 /* Pods-Runner.debug.xcconfig */, + 5B1DBDDE848E285604ECAD29 /* Pods-Runner.release.xcconfig */, + 4BF614354AD511BA2AFD0A33 /* Pods-Runner.profile.xcconfig */, + 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */, + 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */, + 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 105CD1738BF7F7E97BE8A3B6 /* Pods */, - C9654424345AAECD8C097359 /* Frameworks */, + 22E12961F927A9582D4F680E /* Pods */, + 9AFF92BC7EC70A109D78E215 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - C9654424345AAECD8C097359 /* Frameworks */ = { + 9AFF92BC7EC70A109D78E215 /* Frameworks */ = { isa = PBXGroup; children = ( - E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */, - 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */, + FCB85976CEA915945B149712 /* Pods_Runner.framework */, + 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 952BE0E434084B7B6FF4F686 /* [CP] Check Pods Manifest.lock */, + 1EE5AFBFD2FA841E4055FF63 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - A3DC8A1C5C668494C6834378 /* Frameworks */, + EA3C2372CF052533C13FFE27 /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 39A46715CA44AAF4EEC59A33 /* [CP] Check Pods Manifest.lock */, + E702E5CD2507380B5798BE83 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - B615B10C2DC1A5339BE2BBB2 /* [CP] Embed Pods Frameworks */, + DE18B35D8F83EFC2C7F04DD0 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 39A46715CA44AAF4EEC59A33 /* [CP] Check Pods Manifest.lock */ = { + 1EE5AFBFD2FA841E4055FF63 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,7 +285,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 952BE0E434084B7B6FF4F686 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + DE18B35D8F83EFC2C7F04DD0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - B615B10C2DC1A5339BE2BBB2 /* [CP] Embed Pods Frameworks */ = { + E702E5CD2507380B5798BE83 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -488,7 +488,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -507,7 +507,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -524,7 +524,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/firebase-get-to-know-flutter/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-get-to-know-flutter/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/firebase-get-to-know-flutter/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-get-to-know-flutter/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-get-to-know-flutter/step_04/lib/firebase_options.dart b/firebase-get-to-know-flutter/step_04/lib/firebase_options.dart index a070833f2c..d2ab5def55 100644 --- a/firebase-get-to-know-flutter/step_04/lib/firebase_options.dart +++ b/firebase-get-to-know-flutter/step_04/lib/firebase_options.dart @@ -29,7 +29,8 @@ class DefaultFirebaseOptions { return macos; default: throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.'); + 'DefaultFirebaseOptions are not supported for this platform.', + ); } } diff --git a/firebase-get-to-know-flutter/step_04/lib/home_page.dart b/firebase-get-to-know-flutter/step_04/lib/home_page.dart index e7d8d12123..ecc3c6be3d 100644 --- a/firebase-get-to-know-flutter/step_04/lib/home_page.dart +++ b/firebase-get-to-know-flutter/step_04/lib/home_page.dart @@ -12,9 +12,7 @@ class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Firebase Meetup'), - ), + appBar: AppBar(title: const Text('Firebase Meetup')), body: ListView( children: [ Image.asset('assets/codelab.png'), diff --git a/firebase-get-to-know-flutter/step_04/lib/main.dart b/firebase-get-to-know-flutter/step_04/lib/main.dart index 8d2ba90ce8..4934427def 100644 --- a/firebase-get-to-know-flutter/step_04/lib/main.dart +++ b/firebase-get-to-know-flutter/step_04/lib/main.dart @@ -19,13 +19,11 @@ class App extends StatelessWidget { return MaterialApp( title: 'Firebase Meetup', theme: ThemeData( - buttonTheme: Theme.of(context).buttonTheme.copyWith( - highlightColor: Colors.deepPurple, - ), + buttonTheme: Theme.of( + context, + ).buttonTheme.copyWith(highlightColor: Colors.deepPurple), colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - textTheme: GoogleFonts.robotoTextTheme( - Theme.of(context).textTheme, - ), + textTheme: GoogleFonts.robotoTextTheme(Theme.of(context).textTheme), visualDensity: VisualDensity.adaptivePlatformDensity, ), home: const HomePage(), diff --git a/firebase-get-to-know-flutter/step_04/lib/src/authentication.dart b/firebase-get-to-know-flutter/step_04/lib/src/authentication.dart index 7a40546f94..a094b484b8 100644 --- a/firebase-get-to-know-flutter/step_04/lib/src/authentication.dart +++ b/firebase-get-to-know-flutter/step_04/lib/src/authentication.dart @@ -8,11 +8,7 @@ import 'package:go_router/go_router.dart'; import 'widgets.dart'; class AuthFunc extends StatelessWidget { - const AuthFunc({ - super.key, - required this.loggedIn, - required this.signOut, - }); + const AuthFunc({super.key, required this.loggedIn, required this.signOut}); final bool loggedIn; final void Function() signOut; @@ -24,22 +20,24 @@ class AuthFunc extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 24, bottom: 8), child: StyledButton( - onPressed: () { - !loggedIn ? context.push('/sign-in') : signOut(); - }, - child: !loggedIn ? const Text('RSVP') : const Text('Logout')), + onPressed: () { + !loggedIn ? context.push('/sign-in') : signOut(); + }, + child: !loggedIn ? const Text('RSVP') : const Text('Logout'), + ), ), Visibility( visible: loggedIn, child: Padding( padding: const EdgeInsets.only(left: 24, bottom: 8), child: StyledButton( - onPressed: () { - context.push('/profile'); - }, - child: const Text('Profile')), + onPressed: () { + context.push('/profile'); + }, + child: const Text('Profile'), + ), ), - ) + ), ], ); } diff --git a/firebase-get-to-know-flutter/step_04/lib/src/widgets.dart b/firebase-get-to-know-flutter/step_04/lib/src/widgets.dart index 29886a3802..3f89c9d797 100644 --- a/firebase-get-to-know-flutter/step_04/lib/src/widgets.dart +++ b/firebase-get-to-know-flutter/step_04/lib/src/widgets.dart @@ -10,12 +10,9 @@ class Header extends StatelessWidget { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - heading, - style: const TextStyle(fontSize: 24), - ), - ); + padding: const EdgeInsets.all(8.0), + child: Text(heading, style: const TextStyle(fontSize: 24)), + ); } class Paragraph extends StatelessWidget { @@ -23,12 +20,9 @@ class Paragraph extends StatelessWidget { final String content; @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - content, - style: const TextStyle(fontSize: 18), - ), - ); + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Text(content, style: const TextStyle(fontSize: 18)), + ); } class IconAndDetail extends StatelessWidget { @@ -38,18 +32,15 @@ class IconAndDetail extends StatelessWidget { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - Icon(icon), - const SizedBox(width: 8), - Text( - detail, - style: const TextStyle(fontSize: 18), - ) - ], - ), - ); + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Icon(icon), + const SizedBox(width: 8), + Text(detail, style: const TextStyle(fontSize: 18)), + ], + ), + ); } class StyledButton extends StatelessWidget { @@ -59,9 +50,10 @@ class StyledButton extends StatelessWidget { @override Widget build(BuildContext context) => OutlinedButton( - style: OutlinedButton.styleFrom( - side: const BorderSide(color: Colors.deepPurple)), - onPressed: onPressed, - child: child, - ); + style: OutlinedButton.styleFrom( + side: const BorderSide(color: Colors.deepPurple), + ), + onPressed: onPressed, + child: child, + ); } diff --git a/firebase-get-to-know-flutter/step_04/macos/Podfile b/firebase-get-to-know-flutter/step_04/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/firebase-get-to-know-flutter/step_04/macos/Podfile +++ b/firebase-get-to-know-flutter/step_04/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-get-to-know-flutter/step_04/macos/Runner.xcodeproj/project.pbxproj b/firebase-get-to-know-flutter/step_04/macos/Runner.xcodeproj/project.pbxproj index fb0fd3bdda..9bc0a35357 100644 --- a/firebase-get-to-know-flutter/step_04/macos/Runner.xcodeproj/project.pbxproj +++ b/firebase-get-to-know-flutter/step_04/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 0DA8E7B8BBE6C967EE273C73 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */; }; + 0F7CAD0D7A868D800C3BC513 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 861888475ACBDFC19581A0BE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */; }; - BF47E961A040868CE445556F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,9 +62,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 12EB594E522C70C2DC1D73D7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2D983AC4D530A30FD0FD7562 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -81,13 +81,13 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8712FD9EDF1BB663BBEFE247 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 818641D5131FCBD6E653AC27 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A32E8B517B4C27ACE370E88D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9FF3F59EF1584722C34252E8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 861888475ACBDFC19581A0BE /* Pods_RunnerTests.framework in Frameworks */, + 0F7CAD0D7A868D800C3BC513 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF47E961A040868CE445556F /* Pods_Runner.framework in Frameworks */, + 0DA8E7B8BBE6C967EE273C73 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - B983F0D55574110AFA4B1FDE /* Pods */, + BDC8D1065892FABF50206535 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - B983F0D55574110AFA4B1FDE /* Pods */ = { + BDC8D1065892FABF50206535 /* Pods */ = { isa = PBXGroup; children = ( - 12EB594E522C70C2DC1D73D7 /* Pods-Runner.debug.xcconfig */, - A32E8B517B4C27ACE370E88D /* Pods-Runner.release.xcconfig */, - 8712FD9EDF1BB663BBEFE247 /* Pods-Runner.profile.xcconfig */, - 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */, - 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */, - 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */, + 818641D5131FCBD6E653AC27 /* Pods-Runner.debug.xcconfig */, + 9FF3F59EF1584722C34252E8 /* Pods-Runner.release.xcconfig */, + 2D983AC4D530A30FD0FD7562 /* Pods-Runner.profile.xcconfig */, + 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */, + 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */, + F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */, - 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */, + 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */, + 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 9E1E48E79D5F3FA67D4ECFC0 /* [CP] Check Pods Manifest.lock */, + 063F0C8571D4FB451EEF9465 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8A277401736D674439F93FC9 /* [CP] Check Pods Manifest.lock */, + C3ACE1D312FF874DC9DEA790 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 40538D587193E4AA10BF0D34 /* [CP] Embed Pods Frameworks */, + F0F1606EF6F9A64751A4FA46 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,62 +323,67 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 063F0C8571D4FB451EEF9465 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, ); outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 40538D587193E4AA10BF0D34 /* [CP] Embed Pods Frameworks */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, ); - name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 8A277401736D674439F93FC9 /* [CP] Check Pods Manifest.lock */ = { + C3ACE1D312FF874DC9DEA790 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -400,26 +405,21 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 9E1E48E79D5F3FA67D4ECFC0 /* [CP] Check Pods Manifest.lock */ = { + F0F1606EF6F9A64751A4FA46 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -489,7 +489,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -505,7 +505,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/firebase-get-to-know-flutter/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-get-to-know-flutter/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3613032c84..7edb7743f9 100644 --- a/firebase-get-to-know-flutter/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-get-to-know-flutter/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-get-to-know-flutter/step_04/pubspec.yaml b/firebase-get-to-know-flutter/step_04/pubspec.yaml index 6c4b7aa7cd..d82cfb1a27 100644 --- a/firebase-get-to-know-flutter/step_04/pubspec.yaml +++ b/firebase-get-to-know-flutter/step_04/pubspec.yaml @@ -20,7 +20,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -36,7 +36,7 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 google_fonts: ^6.2.1 - go_router: ^14.7.2 + go_router: ^14.8.0 cloud_firestore: ^5.6.3 firebase_auth: ^5.4.2 firebase_core: ^3.11.0 diff --git a/firebase-get-to-know-flutter/step_05/android/.gitignore b/firebase-get-to-know-flutter/step_05/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/firebase-get-to-know-flutter/step_05/android/.gitignore +++ b/firebase-get-to-know-flutter/step_05/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/firebase-get-to-know-flutter/step_05/android/app/build.gradle b/firebase-get-to-know-flutter/step_05/android/app/build.gradle deleted file mode 100644 index ad5859ad24..0000000000 --- a/firebase-get-to-know-flutter/step_05/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.gtk_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.gtk_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/firebase-get-to-know-flutter/step_05/android/app/build.gradle.kts b/firebase-get-to-know-flutter/step_05/android/app/build.gradle.kts new file mode 100644 index 0000000000..3e28d8bd44 --- /dev/null +++ b/firebase-get-to-know-flutter/step_05/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.gtk_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.gtk_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/firebase-get-to-know-flutter/step_05/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt b/firebase-get-to-know-flutter/step_05/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt index 039c1b0e7d..2ea667c39a 100644 --- a/firebase-get-to-know-flutter/step_05/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt +++ b/firebase-get-to-know-flutter/step_05/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.gtk_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/firebase-get-to-know-flutter/step_05/android/build.gradle b/firebase-get-to-know-flutter/step_05/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/firebase-get-to-know-flutter/step_05/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/firebase-get-to-know-flutter/step_05/android/build.gradle.kts b/firebase-get-to-know-flutter/step_05/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/firebase-get-to-know-flutter/step_05/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/firebase-get-to-know-flutter/step_05/android/gradle.properties b/firebase-get-to-know-flutter/step_05/android/gradle.properties index 2597170821..f018a61817 100644 --- a/firebase-get-to-know-flutter/step_05/android/gradle.properties +++ b/firebase-get-to-know-flutter/step_05/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/firebase-get-to-know-flutter/step_05/android/gradle/wrapper/gradle-wrapper.properties b/firebase-get-to-know-flutter/step_05/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/firebase-get-to-know-flutter/step_05/android/gradle/wrapper/gradle-wrapper.properties +++ b/firebase-get-to-know-flutter/step_05/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/firebase-get-to-know-flutter/step_05/android/settings.gradle b/firebase-get-to-know-flutter/step_05/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/firebase-get-to-know-flutter/step_05/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/firebase-get-to-know-flutter/step_05/android/settings.gradle.kts b/firebase-get-to-know-flutter/step_05/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/firebase-get-to-know-flutter/step_05/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/firebase-get-to-know-flutter/step_05/ios/Podfile b/firebase-get-to-know-flutter/step_05/ios/Podfile index 3e44f9c6f7..2dbf7d728d 100644 --- a/firebase-get-to-know-flutter/step_05/ios/Podfile +++ b/firebase-get-to-know-flutter/step_05/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-get-to-know-flutter/step_05/ios/Runner.xcodeproj/project.pbxproj b/firebase-get-to-know-flutter/step_05/ios/Runner.xcodeproj/project.pbxproj index 7de6133685..6524717597 100644 --- a/firebase-get-to-know-flutter/step_05/ios/Runner.xcodeproj/project.pbxproj +++ b/firebase-get-to-know-flutter/step_05/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 589C772495F1143748C4F157 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */; }; + 422628136E756BE6071BD78F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */; }; + 71C9017C3DA1BF2CEDF82DE6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCB85976CEA915945B149712 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - 986CD7DB5F34CF090EF2CA52 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,15 +42,17 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B6B2D1AE9EAE20F1711B98A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 688971683DC7106866C0B9B0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 4BF614354AD511BA2AFD0A33 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 5B1DBDDE848E285604ECAD29 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -61,10 +63,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - CB59B2D1DA8BEEC0BCC77043 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F72D6E3E97FAA258CE871A41 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + FCB85976CEA915945B149712 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,30 +72,30 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 589C772495F1143748C4F157 /* Pods_Runner.framework in Frameworks */, + 71C9017C3DA1BF2CEDF82DE6 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A3DC8A1C5C668494C6834378 /* Frameworks */ = { + EA3C2372CF052533C13FFE27 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 986CD7DB5F34CF090EF2CA52 /* Pods_RunnerTests.framework in Frameworks */, + 422628136E756BE6071BD78F /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 105CD1738BF7F7E97BE8A3B6 /* Pods */ = { + 22E12961F927A9582D4F680E /* Pods */ = { isa = PBXGroup; children = ( - 688971683DC7106866C0B9B0 /* Pods-Runner.debug.xcconfig */, - 1B6B2D1AE9EAE20F1711B98A /* Pods-Runner.release.xcconfig */, - CB59B2D1DA8BEEC0BCC77043 /* Pods-Runner.profile.xcconfig */, - 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */, - D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */, - BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */, + F72D6E3E97FAA258CE871A41 /* Pods-Runner.debug.xcconfig */, + 5B1DBDDE848E285604ECAD29 /* Pods-Runner.release.xcconfig */, + 4BF614354AD511BA2AFD0A33 /* Pods-Runner.profile.xcconfig */, + 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */, + 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */, + 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 105CD1738BF7F7E97BE8A3B6 /* Pods */, - C9654424345AAECD8C097359 /* Frameworks */, + 22E12961F927A9582D4F680E /* Pods */, + 9AFF92BC7EC70A109D78E215 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - C9654424345AAECD8C097359 /* Frameworks */ = { + 9AFF92BC7EC70A109D78E215 /* Frameworks */ = { isa = PBXGroup; children = ( - E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */, - 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */, + FCB85976CEA915945B149712 /* Pods_Runner.framework */, + 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 952BE0E434084B7B6FF4F686 /* [CP] Check Pods Manifest.lock */, + 1EE5AFBFD2FA841E4055FF63 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - A3DC8A1C5C668494C6834378 /* Frameworks */, + EA3C2372CF052533C13FFE27 /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 39A46715CA44AAF4EEC59A33 /* [CP] Check Pods Manifest.lock */, + E702E5CD2507380B5798BE83 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - B615B10C2DC1A5339BE2BBB2 /* [CP] Embed Pods Frameworks */, + DE18B35D8F83EFC2C7F04DD0 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 39A46715CA44AAF4EEC59A33 /* [CP] Check Pods Manifest.lock */ = { + 1EE5AFBFD2FA841E4055FF63 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,7 +285,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 952BE0E434084B7B6FF4F686 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + DE18B35D8F83EFC2C7F04DD0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - B615B10C2DC1A5339BE2BBB2 /* [CP] Embed Pods Frameworks */ = { + E702E5CD2507380B5798BE83 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -488,7 +488,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -507,7 +507,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -524,7 +524,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/firebase-get-to-know-flutter/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-get-to-know-flutter/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/firebase-get-to-know-flutter/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-get-to-know-flutter/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-get-to-know-flutter/step_05/lib/app_state.dart b/firebase-get-to-know-flutter/step_05/lib/app_state.dart index 0acaf3eee1..996eefb229 100644 --- a/firebase-get-to-know-flutter/step_05/lib/app_state.dart +++ b/firebase-get-to-know-flutter/step_05/lib/app_state.dart @@ -20,11 +20,10 @@ class ApplicationState extends ChangeNotifier { Future init() async { await Firebase.initializeApp( - options: DefaultFirebaseOptions.currentPlatform); + options: DefaultFirebaseOptions.currentPlatform, + ); - FirebaseUIAuth.configureProviders([ - EmailAuthProvider(), - ]); + FirebaseUIAuth.configureProviders([EmailAuthProvider()]); FirebaseAuth.instance.userChanges().listen((user) { if (user != null) { diff --git a/firebase-get-to-know-flutter/step_05/lib/firebase_options.dart b/firebase-get-to-know-flutter/step_05/lib/firebase_options.dart index a070833f2c..d2ab5def55 100644 --- a/firebase-get-to-know-flutter/step_05/lib/firebase_options.dart +++ b/firebase-get-to-know-flutter/step_05/lib/firebase_options.dart @@ -29,7 +29,8 @@ class DefaultFirebaseOptions { return macos; default: throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.'); + 'DefaultFirebaseOptions are not supported for this platform.', + ); } } diff --git a/firebase-get-to-know-flutter/step_05/lib/home_page.dart b/firebase-get-to-know-flutter/step_05/lib/home_page.dart index 49da5c20ca..f483ae6f5a 100644 --- a/firebase-get-to-know-flutter/step_05/lib/home_page.dart +++ b/firebase-get-to-know-flutter/step_05/lib/home_page.dart @@ -17,9 +17,7 @@ class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Firebase Meetup'), - ), + appBar: AppBar(title: const Text('Firebase Meetup')), body: ListView( children: [ Image.asset('assets/codelab.png'), @@ -27,11 +25,13 @@ class HomePage extends StatelessWidget { const IconAndDetail(Icons.calendar_today, 'October 30'), const IconAndDetail(Icons.location_city, 'San Francisco'), Consumer( - builder: (context, appState, _) => AuthFunc( - loggedIn: appState.loggedIn, - signOut: () { - FirebaseAuth.instance.signOut(); - }), + builder: + (context, appState, _) => AuthFunc( + loggedIn: appState.loggedIn, + signOut: () { + FirebaseAuth.instance.signOut(); + }, + ), ), const Divider( height: 8, diff --git a/firebase-get-to-know-flutter/step_05/lib/main.dart b/firebase-get-to-know-flutter/step_05/lib/main.dart index 7d5b3fe47c..408f70ee1a 100644 --- a/firebase-get-to-know-flutter/step_05/lib/main.dart +++ b/firebase-get-to-know-flutter/step_05/lib/main.dart @@ -14,10 +14,12 @@ import 'home_page.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); - runApp(ChangeNotifierProvider( - create: (context) => ApplicationState(), - builder: ((context, child) => const App()), - )); + runApp( + ChangeNotifierProvider( + create: (context) => ApplicationState(), + builder: ((context, child) => const App()), + ), + ); } final _router = GoRouter( @@ -34,9 +36,7 @@ final _router = GoRouter( ForgotPasswordAction(((context, email) { final uri = Uri( path: '/sign-in/forgot-password', - queryParameters: { - 'email': email, - }, + queryParameters: {'email': email}, ); context.push(uri.toString()); })), @@ -44,7 +44,7 @@ final _router = GoRouter( final user = switch (state) { SignedIn state => state.user, UserCreated state => state.credential.user, - _ => null + _ => null, }; if (user == null) { return; @@ -55,8 +55,10 @@ final _router = GoRouter( if (!user.emailVerified) { user.sendEmailVerification(); const snackBar = SnackBar( - content: Text( - 'Please check your email to verify your email address')); + content: Text( + 'Please check your email to verify your email address', + ), + ); ScaffoldMessenger.of(context).showSnackBar(snackBar); } context.pushReplacement('/'); @@ -103,13 +105,11 @@ class App extends StatelessWidget { return MaterialApp.router( title: 'Firebase Meetup', theme: ThemeData( - buttonTheme: Theme.of(context).buttonTheme.copyWith( - highlightColor: Colors.deepPurple, - ), + buttonTheme: Theme.of( + context, + ).buttonTheme.copyWith(highlightColor: Colors.deepPurple), colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - textTheme: GoogleFonts.robotoTextTheme( - Theme.of(context).textTheme, - ), + textTheme: GoogleFonts.robotoTextTheme(Theme.of(context).textTheme), visualDensity: VisualDensity.adaptivePlatformDensity, ), routerConfig: _router, diff --git a/firebase-get-to-know-flutter/step_05/lib/src/authentication.dart b/firebase-get-to-know-flutter/step_05/lib/src/authentication.dart index 89ad31ba22..a094b484b8 100644 --- a/firebase-get-to-know-flutter/step_05/lib/src/authentication.dart +++ b/firebase-get-to-know-flutter/step_05/lib/src/authentication.dart @@ -8,11 +8,7 @@ import 'package:go_router/go_router.dart'; import 'widgets.dart'; class AuthFunc extends StatelessWidget { - const AuthFunc({ - super.key, - required this.loggedIn, - required this.signOut, - }); + const AuthFunc({super.key, required this.loggedIn, required this.signOut}); final bool loggedIn; final void Function() signOut; @@ -24,21 +20,24 @@ class AuthFunc extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 24, bottom: 8), child: StyledButton( + onPressed: () { + !loggedIn ? context.push('/sign-in') : signOut(); + }, + child: !loggedIn ? const Text('RSVP') : const Text('Logout'), + ), + ), + Visibility( + visible: loggedIn, + child: Padding( + padding: const EdgeInsets.only(left: 24, bottom: 8), + child: StyledButton( onPressed: () { - !loggedIn ? context.push('/sign-in') : signOut(); + context.push('/profile'); }, - child: !loggedIn ? const Text('RSVP') : const Text('Logout')), + child: const Text('Profile'), + ), + ), ), - Visibility( - visible: loggedIn, - child: Padding( - padding: const EdgeInsets.only(left: 24, bottom: 8), - child: StyledButton( - onPressed: () { - context.push('/profile'); - }, - child: const Text('Profile')), - )) ], ); } diff --git a/firebase-get-to-know-flutter/step_05/lib/src/widgets.dart b/firebase-get-to-know-flutter/step_05/lib/src/widgets.dart index 29886a3802..3f89c9d797 100644 --- a/firebase-get-to-know-flutter/step_05/lib/src/widgets.dart +++ b/firebase-get-to-know-flutter/step_05/lib/src/widgets.dart @@ -10,12 +10,9 @@ class Header extends StatelessWidget { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - heading, - style: const TextStyle(fontSize: 24), - ), - ); + padding: const EdgeInsets.all(8.0), + child: Text(heading, style: const TextStyle(fontSize: 24)), + ); } class Paragraph extends StatelessWidget { @@ -23,12 +20,9 @@ class Paragraph extends StatelessWidget { final String content; @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - content, - style: const TextStyle(fontSize: 18), - ), - ); + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Text(content, style: const TextStyle(fontSize: 18)), + ); } class IconAndDetail extends StatelessWidget { @@ -38,18 +32,15 @@ class IconAndDetail extends StatelessWidget { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - Icon(icon), - const SizedBox(width: 8), - Text( - detail, - style: const TextStyle(fontSize: 18), - ) - ], - ), - ); + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Icon(icon), + const SizedBox(width: 8), + Text(detail, style: const TextStyle(fontSize: 18)), + ], + ), + ); } class StyledButton extends StatelessWidget { @@ -59,9 +50,10 @@ class StyledButton extends StatelessWidget { @override Widget build(BuildContext context) => OutlinedButton( - style: OutlinedButton.styleFrom( - side: const BorderSide(color: Colors.deepPurple)), - onPressed: onPressed, - child: child, - ); + style: OutlinedButton.styleFrom( + side: const BorderSide(color: Colors.deepPurple), + ), + onPressed: onPressed, + child: child, + ); } diff --git a/firebase-get-to-know-flutter/step_05/macos/Podfile b/firebase-get-to-know-flutter/step_05/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/firebase-get-to-know-flutter/step_05/macos/Podfile +++ b/firebase-get-to-know-flutter/step_05/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-get-to-know-flutter/step_05/macos/Runner.xcodeproj/project.pbxproj b/firebase-get-to-know-flutter/step_05/macos/Runner.xcodeproj/project.pbxproj index fb0fd3bdda..9bc0a35357 100644 --- a/firebase-get-to-know-flutter/step_05/macos/Runner.xcodeproj/project.pbxproj +++ b/firebase-get-to-know-flutter/step_05/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 0DA8E7B8BBE6C967EE273C73 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */; }; + 0F7CAD0D7A868D800C3BC513 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 861888475ACBDFC19581A0BE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */; }; - BF47E961A040868CE445556F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,9 +62,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 12EB594E522C70C2DC1D73D7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2D983AC4D530A30FD0FD7562 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -81,13 +81,13 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8712FD9EDF1BB663BBEFE247 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 818641D5131FCBD6E653AC27 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A32E8B517B4C27ACE370E88D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9FF3F59EF1584722C34252E8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 861888475ACBDFC19581A0BE /* Pods_RunnerTests.framework in Frameworks */, + 0F7CAD0D7A868D800C3BC513 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF47E961A040868CE445556F /* Pods_Runner.framework in Frameworks */, + 0DA8E7B8BBE6C967EE273C73 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - B983F0D55574110AFA4B1FDE /* Pods */, + BDC8D1065892FABF50206535 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - B983F0D55574110AFA4B1FDE /* Pods */ = { + BDC8D1065892FABF50206535 /* Pods */ = { isa = PBXGroup; children = ( - 12EB594E522C70C2DC1D73D7 /* Pods-Runner.debug.xcconfig */, - A32E8B517B4C27ACE370E88D /* Pods-Runner.release.xcconfig */, - 8712FD9EDF1BB663BBEFE247 /* Pods-Runner.profile.xcconfig */, - 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */, - 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */, - 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */, + 818641D5131FCBD6E653AC27 /* Pods-Runner.debug.xcconfig */, + 9FF3F59EF1584722C34252E8 /* Pods-Runner.release.xcconfig */, + 2D983AC4D530A30FD0FD7562 /* Pods-Runner.profile.xcconfig */, + 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */, + 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */, + F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */, - 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */, + 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */, + 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 9E1E48E79D5F3FA67D4ECFC0 /* [CP] Check Pods Manifest.lock */, + 063F0C8571D4FB451EEF9465 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8A277401736D674439F93FC9 /* [CP] Check Pods Manifest.lock */, + C3ACE1D312FF874DC9DEA790 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 40538D587193E4AA10BF0D34 /* [CP] Embed Pods Frameworks */, + F0F1606EF6F9A64751A4FA46 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,62 +323,67 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 063F0C8571D4FB451EEF9465 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, ); outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 40538D587193E4AA10BF0D34 /* [CP] Embed Pods Frameworks */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, ); - name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 8A277401736D674439F93FC9 /* [CP] Check Pods Manifest.lock */ = { + C3ACE1D312FF874DC9DEA790 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -400,26 +405,21 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 9E1E48E79D5F3FA67D4ECFC0 /* [CP] Check Pods Manifest.lock */ = { + F0F1606EF6F9A64751A4FA46 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -489,7 +489,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -505,7 +505,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/firebase-get-to-know-flutter/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-get-to-know-flutter/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3613032c84..7edb7743f9 100644 --- a/firebase-get-to-know-flutter/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-get-to-know-flutter/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-get-to-know-flutter/step_05/pubspec.yaml b/firebase-get-to-know-flutter/step_05/pubspec.yaml index 6c4b7aa7cd..d82cfb1a27 100644 --- a/firebase-get-to-know-flutter/step_05/pubspec.yaml +++ b/firebase-get-to-know-flutter/step_05/pubspec.yaml @@ -20,7 +20,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -36,7 +36,7 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 google_fonts: ^6.2.1 - go_router: ^14.7.2 + go_router: ^14.8.0 cloud_firestore: ^5.6.3 firebase_auth: ^5.4.2 firebase_core: ^3.11.0 diff --git a/firebase-get-to-know-flutter/step_06/android/.gitignore b/firebase-get-to-know-flutter/step_06/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/firebase-get-to-know-flutter/step_06/android/.gitignore +++ b/firebase-get-to-know-flutter/step_06/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/firebase-get-to-know-flutter/step_06/android/app/build.gradle b/firebase-get-to-know-flutter/step_06/android/app/build.gradle deleted file mode 100644 index ad5859ad24..0000000000 --- a/firebase-get-to-know-flutter/step_06/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.gtk_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.gtk_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/firebase-get-to-know-flutter/step_06/android/app/build.gradle.kts b/firebase-get-to-know-flutter/step_06/android/app/build.gradle.kts new file mode 100644 index 0000000000..3e28d8bd44 --- /dev/null +++ b/firebase-get-to-know-flutter/step_06/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.gtk_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.gtk_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/firebase-get-to-know-flutter/step_06/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt b/firebase-get-to-know-flutter/step_06/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt index 039c1b0e7d..2ea667c39a 100644 --- a/firebase-get-to-know-flutter/step_06/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt +++ b/firebase-get-to-know-flutter/step_06/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.gtk_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/firebase-get-to-know-flutter/step_06/android/build.gradle b/firebase-get-to-know-flutter/step_06/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/firebase-get-to-know-flutter/step_06/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/firebase-get-to-know-flutter/step_06/android/build.gradle.kts b/firebase-get-to-know-flutter/step_06/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/firebase-get-to-know-flutter/step_06/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/firebase-get-to-know-flutter/step_06/android/gradle.properties b/firebase-get-to-know-flutter/step_06/android/gradle.properties index 2597170821..f018a61817 100644 --- a/firebase-get-to-know-flutter/step_06/android/gradle.properties +++ b/firebase-get-to-know-flutter/step_06/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/firebase-get-to-know-flutter/step_06/android/gradle/wrapper/gradle-wrapper.properties b/firebase-get-to-know-flutter/step_06/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/firebase-get-to-know-flutter/step_06/android/gradle/wrapper/gradle-wrapper.properties +++ b/firebase-get-to-know-flutter/step_06/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/firebase-get-to-know-flutter/step_06/android/settings.gradle b/firebase-get-to-know-flutter/step_06/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/firebase-get-to-know-flutter/step_06/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/firebase-get-to-know-flutter/step_06/android/settings.gradle.kts b/firebase-get-to-know-flutter/step_06/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/firebase-get-to-know-flutter/step_06/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/firebase-get-to-know-flutter/step_06/ios/Podfile b/firebase-get-to-know-flutter/step_06/ios/Podfile index 3e44f9c6f7..2dbf7d728d 100644 --- a/firebase-get-to-know-flutter/step_06/ios/Podfile +++ b/firebase-get-to-know-flutter/step_06/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-get-to-know-flutter/step_06/ios/Runner.xcodeproj/project.pbxproj b/firebase-get-to-know-flutter/step_06/ios/Runner.xcodeproj/project.pbxproj index 7de6133685..6524717597 100644 --- a/firebase-get-to-know-flutter/step_06/ios/Runner.xcodeproj/project.pbxproj +++ b/firebase-get-to-know-flutter/step_06/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 589C772495F1143748C4F157 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */; }; + 422628136E756BE6071BD78F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */; }; + 71C9017C3DA1BF2CEDF82DE6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCB85976CEA915945B149712 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - 986CD7DB5F34CF090EF2CA52 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,15 +42,17 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B6B2D1AE9EAE20F1711B98A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 688971683DC7106866C0B9B0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 4BF614354AD511BA2AFD0A33 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 5B1DBDDE848E285604ECAD29 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -61,10 +63,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - CB59B2D1DA8BEEC0BCC77043 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F72D6E3E97FAA258CE871A41 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + FCB85976CEA915945B149712 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,30 +72,30 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 589C772495F1143748C4F157 /* Pods_Runner.framework in Frameworks */, + 71C9017C3DA1BF2CEDF82DE6 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A3DC8A1C5C668494C6834378 /* Frameworks */ = { + EA3C2372CF052533C13FFE27 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 986CD7DB5F34CF090EF2CA52 /* Pods_RunnerTests.framework in Frameworks */, + 422628136E756BE6071BD78F /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 105CD1738BF7F7E97BE8A3B6 /* Pods */ = { + 22E12961F927A9582D4F680E /* Pods */ = { isa = PBXGroup; children = ( - 688971683DC7106866C0B9B0 /* Pods-Runner.debug.xcconfig */, - 1B6B2D1AE9EAE20F1711B98A /* Pods-Runner.release.xcconfig */, - CB59B2D1DA8BEEC0BCC77043 /* Pods-Runner.profile.xcconfig */, - 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */, - D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */, - BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */, + F72D6E3E97FAA258CE871A41 /* Pods-Runner.debug.xcconfig */, + 5B1DBDDE848E285604ECAD29 /* Pods-Runner.release.xcconfig */, + 4BF614354AD511BA2AFD0A33 /* Pods-Runner.profile.xcconfig */, + 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */, + 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */, + 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 105CD1738BF7F7E97BE8A3B6 /* Pods */, - C9654424345AAECD8C097359 /* Frameworks */, + 22E12961F927A9582D4F680E /* Pods */, + 9AFF92BC7EC70A109D78E215 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - C9654424345AAECD8C097359 /* Frameworks */ = { + 9AFF92BC7EC70A109D78E215 /* Frameworks */ = { isa = PBXGroup; children = ( - E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */, - 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */, + FCB85976CEA915945B149712 /* Pods_Runner.framework */, + 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 952BE0E434084B7B6FF4F686 /* [CP] Check Pods Manifest.lock */, + 1EE5AFBFD2FA841E4055FF63 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - A3DC8A1C5C668494C6834378 /* Frameworks */, + EA3C2372CF052533C13FFE27 /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 39A46715CA44AAF4EEC59A33 /* [CP] Check Pods Manifest.lock */, + E702E5CD2507380B5798BE83 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - B615B10C2DC1A5339BE2BBB2 /* [CP] Embed Pods Frameworks */, + DE18B35D8F83EFC2C7F04DD0 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 39A46715CA44AAF4EEC59A33 /* [CP] Check Pods Manifest.lock */ = { + 1EE5AFBFD2FA841E4055FF63 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,7 +285,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 952BE0E434084B7B6FF4F686 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + DE18B35D8F83EFC2C7F04DD0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - B615B10C2DC1A5339BE2BBB2 /* [CP] Embed Pods Frameworks */ = { + E702E5CD2507380B5798BE83 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -488,7 +488,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -507,7 +507,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -524,7 +524,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/firebase-get-to-know-flutter/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-get-to-know-flutter/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/firebase-get-to-know-flutter/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-get-to-know-flutter/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-get-to-know-flutter/step_06/lib/app_state.dart b/firebase-get-to-know-flutter/step_06/lib/app_state.dart index 6ab66b6021..76bbc05acc 100644 --- a/firebase-get-to-know-flutter/step_06/lib/app_state.dart +++ b/firebase-get-to-know-flutter/step_06/lib/app_state.dart @@ -22,11 +22,10 @@ class ApplicationState extends ChangeNotifier { Future init() async { await Firebase.initializeApp( - options: DefaultFirebaseOptions.currentPlatform); + options: DefaultFirebaseOptions.currentPlatform, + ); - FirebaseUIAuth.configureProviders([ - EmailAuthProvider(), - ]); + FirebaseUIAuth.configureProviders([EmailAuthProvider()]); FirebaseAuth.instance.userChanges().listen((user) { if (user != null) { @@ -46,10 +45,10 @@ class ApplicationState extends ChangeNotifier { return FirebaseFirestore.instance .collection('guestbook') .add({ - 'text': message, - 'timestamp': DateTime.now().millisecondsSinceEpoch, - 'name': FirebaseAuth.instance.currentUser!.displayName, - 'userId': FirebaseAuth.instance.currentUser!.uid, - }); + 'text': message, + 'timestamp': DateTime.now().millisecondsSinceEpoch, + 'name': FirebaseAuth.instance.currentUser!.displayName, + 'userId': FirebaseAuth.instance.currentUser!.uid, + }); } } diff --git a/firebase-get-to-know-flutter/step_06/lib/firebase_options.dart b/firebase-get-to-know-flutter/step_06/lib/firebase_options.dart index a070833f2c..d2ab5def55 100644 --- a/firebase-get-to-know-flutter/step_06/lib/firebase_options.dart +++ b/firebase-get-to-know-flutter/step_06/lib/firebase_options.dart @@ -29,7 +29,8 @@ class DefaultFirebaseOptions { return macos; default: throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.'); + 'DefaultFirebaseOptions are not supported for this platform.', + ); } } diff --git a/firebase-get-to-know-flutter/step_06/lib/guest_book.dart b/firebase-get-to-know-flutter/step_06/lib/guest_book.dart index 1a06c48abe..2eea500651 100644 --- a/firebase-get-to-know-flutter/step_06/lib/guest_book.dart +++ b/firebase-get-to-know-flutter/step_06/lib/guest_book.dart @@ -32,9 +32,7 @@ class _GuestBookState extends State { Expanded( child: TextFormField( controller: _controller, - decoration: const InputDecoration( - hintText: 'Leave a message', - ), + decoration: const InputDecoration(hintText: 'Leave a message'), validator: (value) { if (value == null || value.isEmpty) { return 'Enter your message to continue'; @@ -52,11 +50,7 @@ class _GuestBookState extends State { } }, child: const Row( - children: [ - Icon(Icons.send), - SizedBox(width: 4), - Text('SEND'), - ], + children: [Icon(Icons.send), SizedBox(width: 4), Text('SEND')], ), ), ], diff --git a/firebase-get-to-know-flutter/step_06/lib/home_page.dart b/firebase-get-to-know-flutter/step_06/lib/home_page.dart index 50844a7ed7..de63313c75 100644 --- a/firebase-get-to-know-flutter/step_06/lib/home_page.dart +++ b/firebase-get-to-know-flutter/step_06/lib/home_page.dart @@ -18,9 +18,7 @@ class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Firebase Meetup'), - ), + appBar: AppBar(title: const Text('Firebase Meetup')), body: ListView( children: [ Image.asset('assets/codelab.png'), @@ -28,11 +26,13 @@ class HomePage extends StatelessWidget { const IconAndDetail(Icons.calendar_today, 'October 30'), const IconAndDetail(Icons.location_city, 'San Francisco'), Consumer( - builder: (context, appState, _) => AuthFunc( - loggedIn: appState.loggedIn, - signOut: () { - FirebaseAuth.instance.signOut(); - }), + builder: + (context, appState, _) => AuthFunc( + loggedIn: appState.loggedIn, + signOut: () { + FirebaseAuth.instance.signOut(); + }, + ), ), const Divider( height: 8, @@ -46,18 +46,20 @@ class HomePage extends StatelessWidget { 'Join us for a day full of Firebase Workshops and Pizza!', ), Consumer( - builder: (context, appState, _) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (appState.loggedIn) ...[ - const Header('Discussion'), - GuestBook( - addMessage: (message) => - appState.addMessageToGuestBook(message), - ), - ], - ], - ), + builder: + (context, appState, _) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (appState.loggedIn) ...[ + const Header('Discussion'), + GuestBook( + addMessage: + (message) => + appState.addMessageToGuestBook(message), + ), + ], + ], + ), ), ], ), diff --git a/firebase-get-to-know-flutter/step_06/lib/main.dart b/firebase-get-to-know-flutter/step_06/lib/main.dart index 7d5b3fe47c..408f70ee1a 100644 --- a/firebase-get-to-know-flutter/step_06/lib/main.dart +++ b/firebase-get-to-know-flutter/step_06/lib/main.dart @@ -14,10 +14,12 @@ import 'home_page.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); - runApp(ChangeNotifierProvider( - create: (context) => ApplicationState(), - builder: ((context, child) => const App()), - )); + runApp( + ChangeNotifierProvider( + create: (context) => ApplicationState(), + builder: ((context, child) => const App()), + ), + ); } final _router = GoRouter( @@ -34,9 +36,7 @@ final _router = GoRouter( ForgotPasswordAction(((context, email) { final uri = Uri( path: '/sign-in/forgot-password', - queryParameters: { - 'email': email, - }, + queryParameters: {'email': email}, ); context.push(uri.toString()); })), @@ -44,7 +44,7 @@ final _router = GoRouter( final user = switch (state) { SignedIn state => state.user, UserCreated state => state.credential.user, - _ => null + _ => null, }; if (user == null) { return; @@ -55,8 +55,10 @@ final _router = GoRouter( if (!user.emailVerified) { user.sendEmailVerification(); const snackBar = SnackBar( - content: Text( - 'Please check your email to verify your email address')); + content: Text( + 'Please check your email to verify your email address', + ), + ); ScaffoldMessenger.of(context).showSnackBar(snackBar); } context.pushReplacement('/'); @@ -103,13 +105,11 @@ class App extends StatelessWidget { return MaterialApp.router( title: 'Firebase Meetup', theme: ThemeData( - buttonTheme: Theme.of(context).buttonTheme.copyWith( - highlightColor: Colors.deepPurple, - ), + buttonTheme: Theme.of( + context, + ).buttonTheme.copyWith(highlightColor: Colors.deepPurple), colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - textTheme: GoogleFonts.robotoTextTheme( - Theme.of(context).textTheme, - ), + textTheme: GoogleFonts.robotoTextTheme(Theme.of(context).textTheme), visualDensity: VisualDensity.adaptivePlatformDensity, ), routerConfig: _router, diff --git a/firebase-get-to-know-flutter/step_06/lib/src/authentication.dart b/firebase-get-to-know-flutter/step_06/lib/src/authentication.dart index 89ad31ba22..a094b484b8 100644 --- a/firebase-get-to-know-flutter/step_06/lib/src/authentication.dart +++ b/firebase-get-to-know-flutter/step_06/lib/src/authentication.dart @@ -8,11 +8,7 @@ import 'package:go_router/go_router.dart'; import 'widgets.dart'; class AuthFunc extends StatelessWidget { - const AuthFunc({ - super.key, - required this.loggedIn, - required this.signOut, - }); + const AuthFunc({super.key, required this.loggedIn, required this.signOut}); final bool loggedIn; final void Function() signOut; @@ -24,21 +20,24 @@ class AuthFunc extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 24, bottom: 8), child: StyledButton( + onPressed: () { + !loggedIn ? context.push('/sign-in') : signOut(); + }, + child: !loggedIn ? const Text('RSVP') : const Text('Logout'), + ), + ), + Visibility( + visible: loggedIn, + child: Padding( + padding: const EdgeInsets.only(left: 24, bottom: 8), + child: StyledButton( onPressed: () { - !loggedIn ? context.push('/sign-in') : signOut(); + context.push('/profile'); }, - child: !loggedIn ? const Text('RSVP') : const Text('Logout')), + child: const Text('Profile'), + ), + ), ), - Visibility( - visible: loggedIn, - child: Padding( - padding: const EdgeInsets.only(left: 24, bottom: 8), - child: StyledButton( - onPressed: () { - context.push('/profile'); - }, - child: const Text('Profile')), - )) ], ); } diff --git a/firebase-get-to-know-flutter/step_06/lib/src/widgets.dart b/firebase-get-to-know-flutter/step_06/lib/src/widgets.dart index 29886a3802..3f89c9d797 100644 --- a/firebase-get-to-know-flutter/step_06/lib/src/widgets.dart +++ b/firebase-get-to-know-flutter/step_06/lib/src/widgets.dart @@ -10,12 +10,9 @@ class Header extends StatelessWidget { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - heading, - style: const TextStyle(fontSize: 24), - ), - ); + padding: const EdgeInsets.all(8.0), + child: Text(heading, style: const TextStyle(fontSize: 24)), + ); } class Paragraph extends StatelessWidget { @@ -23,12 +20,9 @@ class Paragraph extends StatelessWidget { final String content; @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - content, - style: const TextStyle(fontSize: 18), - ), - ); + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Text(content, style: const TextStyle(fontSize: 18)), + ); } class IconAndDetail extends StatelessWidget { @@ -38,18 +32,15 @@ class IconAndDetail extends StatelessWidget { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - Icon(icon), - const SizedBox(width: 8), - Text( - detail, - style: const TextStyle(fontSize: 18), - ) - ], - ), - ); + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Icon(icon), + const SizedBox(width: 8), + Text(detail, style: const TextStyle(fontSize: 18)), + ], + ), + ); } class StyledButton extends StatelessWidget { @@ -59,9 +50,10 @@ class StyledButton extends StatelessWidget { @override Widget build(BuildContext context) => OutlinedButton( - style: OutlinedButton.styleFrom( - side: const BorderSide(color: Colors.deepPurple)), - onPressed: onPressed, - child: child, - ); + style: OutlinedButton.styleFrom( + side: const BorderSide(color: Colors.deepPurple), + ), + onPressed: onPressed, + child: child, + ); } diff --git a/firebase-get-to-know-flutter/step_06/macos/Podfile b/firebase-get-to-know-flutter/step_06/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/firebase-get-to-know-flutter/step_06/macos/Podfile +++ b/firebase-get-to-know-flutter/step_06/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-get-to-know-flutter/step_06/macos/Runner.xcodeproj/project.pbxproj b/firebase-get-to-know-flutter/step_06/macos/Runner.xcodeproj/project.pbxproj index fb0fd3bdda..9bc0a35357 100644 --- a/firebase-get-to-know-flutter/step_06/macos/Runner.xcodeproj/project.pbxproj +++ b/firebase-get-to-know-flutter/step_06/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 0DA8E7B8BBE6C967EE273C73 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */; }; + 0F7CAD0D7A868D800C3BC513 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 861888475ACBDFC19581A0BE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */; }; - BF47E961A040868CE445556F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,9 +62,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 12EB594E522C70C2DC1D73D7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2D983AC4D530A30FD0FD7562 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -81,13 +81,13 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8712FD9EDF1BB663BBEFE247 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 818641D5131FCBD6E653AC27 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A32E8B517B4C27ACE370E88D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9FF3F59EF1584722C34252E8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 861888475ACBDFC19581A0BE /* Pods_RunnerTests.framework in Frameworks */, + 0F7CAD0D7A868D800C3BC513 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF47E961A040868CE445556F /* Pods_Runner.framework in Frameworks */, + 0DA8E7B8BBE6C967EE273C73 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - B983F0D55574110AFA4B1FDE /* Pods */, + BDC8D1065892FABF50206535 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - B983F0D55574110AFA4B1FDE /* Pods */ = { + BDC8D1065892FABF50206535 /* Pods */ = { isa = PBXGroup; children = ( - 12EB594E522C70C2DC1D73D7 /* Pods-Runner.debug.xcconfig */, - A32E8B517B4C27ACE370E88D /* Pods-Runner.release.xcconfig */, - 8712FD9EDF1BB663BBEFE247 /* Pods-Runner.profile.xcconfig */, - 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */, - 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */, - 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */, + 818641D5131FCBD6E653AC27 /* Pods-Runner.debug.xcconfig */, + 9FF3F59EF1584722C34252E8 /* Pods-Runner.release.xcconfig */, + 2D983AC4D530A30FD0FD7562 /* Pods-Runner.profile.xcconfig */, + 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */, + 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */, + F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */, - 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */, + 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */, + 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 9E1E48E79D5F3FA67D4ECFC0 /* [CP] Check Pods Manifest.lock */, + 063F0C8571D4FB451EEF9465 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8A277401736D674439F93FC9 /* [CP] Check Pods Manifest.lock */, + C3ACE1D312FF874DC9DEA790 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 40538D587193E4AA10BF0D34 /* [CP] Embed Pods Frameworks */, + F0F1606EF6F9A64751A4FA46 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,62 +323,67 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 063F0C8571D4FB451EEF9465 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, ); outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 40538D587193E4AA10BF0D34 /* [CP] Embed Pods Frameworks */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, ); - name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 8A277401736D674439F93FC9 /* [CP] Check Pods Manifest.lock */ = { + C3ACE1D312FF874DC9DEA790 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -400,26 +405,21 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 9E1E48E79D5F3FA67D4ECFC0 /* [CP] Check Pods Manifest.lock */ = { + F0F1606EF6F9A64751A4FA46 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -489,7 +489,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -505,7 +505,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/firebase-get-to-know-flutter/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-get-to-know-flutter/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3613032c84..7edb7743f9 100644 --- a/firebase-get-to-know-flutter/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-get-to-know-flutter/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-get-to-know-flutter/step_06/pubspec.yaml b/firebase-get-to-know-flutter/step_06/pubspec.yaml index 6c4b7aa7cd..d82cfb1a27 100644 --- a/firebase-get-to-know-flutter/step_06/pubspec.yaml +++ b/firebase-get-to-know-flutter/step_06/pubspec.yaml @@ -20,7 +20,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -36,7 +36,7 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 google_fonts: ^6.2.1 - go_router: ^14.7.2 + go_router: ^14.8.0 cloud_firestore: ^5.6.3 firebase_auth: ^5.4.2 firebase_core: ^3.11.0 diff --git a/firebase-get-to-know-flutter/step_07/android/.gitignore b/firebase-get-to-know-flutter/step_07/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/firebase-get-to-know-flutter/step_07/android/.gitignore +++ b/firebase-get-to-know-flutter/step_07/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/firebase-get-to-know-flutter/step_07/android/app/build.gradle b/firebase-get-to-know-flutter/step_07/android/app/build.gradle deleted file mode 100644 index ad5859ad24..0000000000 --- a/firebase-get-to-know-flutter/step_07/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.gtk_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.gtk_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/firebase-get-to-know-flutter/step_07/android/app/build.gradle.kts b/firebase-get-to-know-flutter/step_07/android/app/build.gradle.kts new file mode 100644 index 0000000000..3e28d8bd44 --- /dev/null +++ b/firebase-get-to-know-flutter/step_07/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.gtk_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.gtk_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/firebase-get-to-know-flutter/step_07/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt b/firebase-get-to-know-flutter/step_07/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt index 039c1b0e7d..2ea667c39a 100644 --- a/firebase-get-to-know-flutter/step_07/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt +++ b/firebase-get-to-know-flutter/step_07/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.gtk_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/firebase-get-to-know-flutter/step_07/android/build.gradle b/firebase-get-to-know-flutter/step_07/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/firebase-get-to-know-flutter/step_07/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/firebase-get-to-know-flutter/step_07/android/build.gradle.kts b/firebase-get-to-know-flutter/step_07/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/firebase-get-to-know-flutter/step_07/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/firebase-get-to-know-flutter/step_07/android/gradle.properties b/firebase-get-to-know-flutter/step_07/android/gradle.properties index 2597170821..f018a61817 100644 --- a/firebase-get-to-know-flutter/step_07/android/gradle.properties +++ b/firebase-get-to-know-flutter/step_07/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/firebase-get-to-know-flutter/step_07/android/gradle/wrapper/gradle-wrapper.properties b/firebase-get-to-know-flutter/step_07/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/firebase-get-to-know-flutter/step_07/android/gradle/wrapper/gradle-wrapper.properties +++ b/firebase-get-to-know-flutter/step_07/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/firebase-get-to-know-flutter/step_07/android/settings.gradle b/firebase-get-to-know-flutter/step_07/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/firebase-get-to-know-flutter/step_07/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/firebase-get-to-know-flutter/step_07/android/settings.gradle.kts b/firebase-get-to-know-flutter/step_07/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/firebase-get-to-know-flutter/step_07/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/firebase-get-to-know-flutter/step_07/ios/Podfile b/firebase-get-to-know-flutter/step_07/ios/Podfile index 3e44f9c6f7..2dbf7d728d 100644 --- a/firebase-get-to-know-flutter/step_07/ios/Podfile +++ b/firebase-get-to-know-flutter/step_07/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-get-to-know-flutter/step_07/ios/Runner.xcodeproj/project.pbxproj b/firebase-get-to-know-flutter/step_07/ios/Runner.xcodeproj/project.pbxproj index 7de6133685..6524717597 100644 --- a/firebase-get-to-know-flutter/step_07/ios/Runner.xcodeproj/project.pbxproj +++ b/firebase-get-to-know-flutter/step_07/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 589C772495F1143748C4F157 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */; }; + 422628136E756BE6071BD78F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */; }; + 71C9017C3DA1BF2CEDF82DE6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCB85976CEA915945B149712 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - 986CD7DB5F34CF090EF2CA52 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,15 +42,17 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B6B2D1AE9EAE20F1711B98A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 688971683DC7106866C0B9B0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 4BF614354AD511BA2AFD0A33 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 5B1DBDDE848E285604ECAD29 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -61,10 +63,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - CB59B2D1DA8BEEC0BCC77043 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F72D6E3E97FAA258CE871A41 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + FCB85976CEA915945B149712 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,30 +72,30 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 589C772495F1143748C4F157 /* Pods_Runner.framework in Frameworks */, + 71C9017C3DA1BF2CEDF82DE6 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A3DC8A1C5C668494C6834378 /* Frameworks */ = { + EA3C2372CF052533C13FFE27 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 986CD7DB5F34CF090EF2CA52 /* Pods_RunnerTests.framework in Frameworks */, + 422628136E756BE6071BD78F /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 105CD1738BF7F7E97BE8A3B6 /* Pods */ = { + 22E12961F927A9582D4F680E /* Pods */ = { isa = PBXGroup; children = ( - 688971683DC7106866C0B9B0 /* Pods-Runner.debug.xcconfig */, - 1B6B2D1AE9EAE20F1711B98A /* Pods-Runner.release.xcconfig */, - CB59B2D1DA8BEEC0BCC77043 /* Pods-Runner.profile.xcconfig */, - 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */, - D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */, - BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */, + F72D6E3E97FAA258CE871A41 /* Pods-Runner.debug.xcconfig */, + 5B1DBDDE848E285604ECAD29 /* Pods-Runner.release.xcconfig */, + 4BF614354AD511BA2AFD0A33 /* Pods-Runner.profile.xcconfig */, + 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */, + 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */, + 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 105CD1738BF7F7E97BE8A3B6 /* Pods */, - C9654424345AAECD8C097359 /* Frameworks */, + 22E12961F927A9582D4F680E /* Pods */, + 9AFF92BC7EC70A109D78E215 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - C9654424345AAECD8C097359 /* Frameworks */ = { + 9AFF92BC7EC70A109D78E215 /* Frameworks */ = { isa = PBXGroup; children = ( - E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */, - 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */, + FCB85976CEA915945B149712 /* Pods_Runner.framework */, + 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 952BE0E434084B7B6FF4F686 /* [CP] Check Pods Manifest.lock */, + 1EE5AFBFD2FA841E4055FF63 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - A3DC8A1C5C668494C6834378 /* Frameworks */, + EA3C2372CF052533C13FFE27 /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 39A46715CA44AAF4EEC59A33 /* [CP] Check Pods Manifest.lock */, + E702E5CD2507380B5798BE83 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - B615B10C2DC1A5339BE2BBB2 /* [CP] Embed Pods Frameworks */, + DE18B35D8F83EFC2C7F04DD0 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 39A46715CA44AAF4EEC59A33 /* [CP] Check Pods Manifest.lock */ = { + 1EE5AFBFD2FA841E4055FF63 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,7 +285,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 952BE0E434084B7B6FF4F686 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + DE18B35D8F83EFC2C7F04DD0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - B615B10C2DC1A5339BE2BBB2 /* [CP] Embed Pods Frameworks */ = { + E702E5CD2507380B5798BE83 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -488,7 +488,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -507,7 +507,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -524,7 +524,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/firebase-get-to-know-flutter/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-get-to-know-flutter/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/firebase-get-to-know-flutter/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-get-to-know-flutter/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-get-to-know-flutter/step_07/lib/app_state.dart b/firebase-get-to-know-flutter/step_07/lib/app_state.dart index f010be4c00..b554e953bf 100644 --- a/firebase-get-to-know-flutter/step_07/lib/app_state.dart +++ b/firebase-get-to-know-flutter/step_07/lib/app_state.dart @@ -28,11 +28,10 @@ class ApplicationState extends ChangeNotifier { Future init() async { await Firebase.initializeApp( - options: DefaultFirebaseOptions.currentPlatform); + options: DefaultFirebaseOptions.currentPlatform, + ); - FirebaseUIAuth.configureProviders([ - EmailAuthProvider(), - ]); + FirebaseUIAuth.configureProviders([EmailAuthProvider()]); FirebaseAuth.instance.userChanges().listen((user) { if (user != null) { @@ -42,17 +41,17 @@ class ApplicationState extends ChangeNotifier { .orderBy('timestamp', descending: true) .snapshots() .listen((snapshot) { - _guestBookMessages = []; - for (final document in snapshot.docs) { - _guestBookMessages.add( - GuestBookMessage( - name: document.data()['name'] as String, - message: document.data()['text'] as String, - ), - ); - } - notifyListeners(); - }); + _guestBookMessages = []; + for (final document in snapshot.docs) { + _guestBookMessages.add( + GuestBookMessage( + name: document.data()['name'] as String, + message: document.data()['text'] as String, + ), + ); + } + notifyListeners(); + }); } else { _loggedIn = false; _guestBookMessages = []; @@ -70,10 +69,10 @@ class ApplicationState extends ChangeNotifier { return FirebaseFirestore.instance .collection('guestbook') .add({ - 'text': message, - 'timestamp': DateTime.now().millisecondsSinceEpoch, - 'name': FirebaseAuth.instance.currentUser!.displayName, - 'userId': FirebaseAuth.instance.currentUser!.uid, - }); + 'text': message, + 'timestamp': DateTime.now().millisecondsSinceEpoch, + 'name': FirebaseAuth.instance.currentUser!.displayName, + 'userId': FirebaseAuth.instance.currentUser!.uid, + }); } } diff --git a/firebase-get-to-know-flutter/step_07/lib/firebase_options.dart b/firebase-get-to-know-flutter/step_07/lib/firebase_options.dart index a070833f2c..d2ab5def55 100644 --- a/firebase-get-to-know-flutter/step_07/lib/firebase_options.dart +++ b/firebase-get-to-know-flutter/step_07/lib/firebase_options.dart @@ -29,7 +29,8 @@ class DefaultFirebaseOptions { return macos; default: throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.'); + 'DefaultFirebaseOptions are not supported for this platform.', + ); } } diff --git a/firebase-get-to-know-flutter/step_07/lib/home_page.dart b/firebase-get-to-know-flutter/step_07/lib/home_page.dart index 2f861a5a05..6e51de8a87 100644 --- a/firebase-get-to-know-flutter/step_07/lib/home_page.dart +++ b/firebase-get-to-know-flutter/step_07/lib/home_page.dart @@ -18,9 +18,7 @@ class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Firebase Meetup'), - ), + appBar: AppBar(title: const Text('Firebase Meetup')), body: ListView( children: [ Image.asset('assets/codelab.png'), @@ -28,11 +26,13 @@ class HomePage extends StatelessWidget { const IconAndDetail(Icons.calendar_today, 'October 30'), const IconAndDetail(Icons.location_city, 'San Francisco'), Consumer( - builder: (context, appState, _) => AuthFunc( - loggedIn: appState.loggedIn, - signOut: () { - FirebaseAuth.instance.signOut(); - }), + builder: + (context, appState, _) => AuthFunc( + loggedIn: appState.loggedIn, + signOut: () { + FirebaseAuth.instance.signOut(); + }, + ), ), const Divider( height: 8, @@ -46,19 +46,21 @@ class HomePage extends StatelessWidget { 'Join us for a day full of Firebase Workshops and Pizza!', ), Consumer( - builder: (context, appState, _) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (appState.loggedIn) ...[ - const Header('Discussion'), - GuestBook( - addMessage: (message) => - appState.addMessageToGuestBook(message), - messages: appState.guestBookMessages, - ), - ], - ], - ), + builder: + (context, appState, _) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (appState.loggedIn) ...[ + const Header('Discussion'), + GuestBook( + addMessage: + (message) => + appState.addMessageToGuestBook(message), + messages: appState.guestBookMessages, + ), + ], + ], + ), ), ], ), diff --git a/firebase-get-to-know-flutter/step_07/lib/main.dart b/firebase-get-to-know-flutter/step_07/lib/main.dart index 7d5b3fe47c..408f70ee1a 100644 --- a/firebase-get-to-know-flutter/step_07/lib/main.dart +++ b/firebase-get-to-know-flutter/step_07/lib/main.dart @@ -14,10 +14,12 @@ import 'home_page.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); - runApp(ChangeNotifierProvider( - create: (context) => ApplicationState(), - builder: ((context, child) => const App()), - )); + runApp( + ChangeNotifierProvider( + create: (context) => ApplicationState(), + builder: ((context, child) => const App()), + ), + ); } final _router = GoRouter( @@ -34,9 +36,7 @@ final _router = GoRouter( ForgotPasswordAction(((context, email) { final uri = Uri( path: '/sign-in/forgot-password', - queryParameters: { - 'email': email, - }, + queryParameters: {'email': email}, ); context.push(uri.toString()); })), @@ -44,7 +44,7 @@ final _router = GoRouter( final user = switch (state) { SignedIn state => state.user, UserCreated state => state.credential.user, - _ => null + _ => null, }; if (user == null) { return; @@ -55,8 +55,10 @@ final _router = GoRouter( if (!user.emailVerified) { user.sendEmailVerification(); const snackBar = SnackBar( - content: Text( - 'Please check your email to verify your email address')); + content: Text( + 'Please check your email to verify your email address', + ), + ); ScaffoldMessenger.of(context).showSnackBar(snackBar); } context.pushReplacement('/'); @@ -103,13 +105,11 @@ class App extends StatelessWidget { return MaterialApp.router( title: 'Firebase Meetup', theme: ThemeData( - buttonTheme: Theme.of(context).buttonTheme.copyWith( - highlightColor: Colors.deepPurple, - ), + buttonTheme: Theme.of( + context, + ).buttonTheme.copyWith(highlightColor: Colors.deepPurple), colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - textTheme: GoogleFonts.robotoTextTheme( - Theme.of(context).textTheme, - ), + textTheme: GoogleFonts.robotoTextTheme(Theme.of(context).textTheme), visualDensity: VisualDensity.adaptivePlatformDensity, ), routerConfig: _router, diff --git a/firebase-get-to-know-flutter/step_07/lib/src/authentication.dart b/firebase-get-to-know-flutter/step_07/lib/src/authentication.dart index 89ad31ba22..a094b484b8 100644 --- a/firebase-get-to-know-flutter/step_07/lib/src/authentication.dart +++ b/firebase-get-to-know-flutter/step_07/lib/src/authentication.dart @@ -8,11 +8,7 @@ import 'package:go_router/go_router.dart'; import 'widgets.dart'; class AuthFunc extends StatelessWidget { - const AuthFunc({ - super.key, - required this.loggedIn, - required this.signOut, - }); + const AuthFunc({super.key, required this.loggedIn, required this.signOut}); final bool loggedIn; final void Function() signOut; @@ -24,21 +20,24 @@ class AuthFunc extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 24, bottom: 8), child: StyledButton( + onPressed: () { + !loggedIn ? context.push('/sign-in') : signOut(); + }, + child: !loggedIn ? const Text('RSVP') : const Text('Logout'), + ), + ), + Visibility( + visible: loggedIn, + child: Padding( + padding: const EdgeInsets.only(left: 24, bottom: 8), + child: StyledButton( onPressed: () { - !loggedIn ? context.push('/sign-in') : signOut(); + context.push('/profile'); }, - child: !loggedIn ? const Text('RSVP') : const Text('Logout')), + child: const Text('Profile'), + ), + ), ), - Visibility( - visible: loggedIn, - child: Padding( - padding: const EdgeInsets.only(left: 24, bottom: 8), - child: StyledButton( - onPressed: () { - context.push('/profile'); - }, - child: const Text('Profile')), - )) ], ); } diff --git a/firebase-get-to-know-flutter/step_07/lib/src/widgets.dart b/firebase-get-to-know-flutter/step_07/lib/src/widgets.dart index 29886a3802..3f89c9d797 100644 --- a/firebase-get-to-know-flutter/step_07/lib/src/widgets.dart +++ b/firebase-get-to-know-flutter/step_07/lib/src/widgets.dart @@ -10,12 +10,9 @@ class Header extends StatelessWidget { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - heading, - style: const TextStyle(fontSize: 24), - ), - ); + padding: const EdgeInsets.all(8.0), + child: Text(heading, style: const TextStyle(fontSize: 24)), + ); } class Paragraph extends StatelessWidget { @@ -23,12 +20,9 @@ class Paragraph extends StatelessWidget { final String content; @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - content, - style: const TextStyle(fontSize: 18), - ), - ); + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Text(content, style: const TextStyle(fontSize: 18)), + ); } class IconAndDetail extends StatelessWidget { @@ -38,18 +32,15 @@ class IconAndDetail extends StatelessWidget { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - Icon(icon), - const SizedBox(width: 8), - Text( - detail, - style: const TextStyle(fontSize: 18), - ) - ], - ), - ); + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Icon(icon), + const SizedBox(width: 8), + Text(detail, style: const TextStyle(fontSize: 18)), + ], + ), + ); } class StyledButton extends StatelessWidget { @@ -59,9 +50,10 @@ class StyledButton extends StatelessWidget { @override Widget build(BuildContext context) => OutlinedButton( - style: OutlinedButton.styleFrom( - side: const BorderSide(color: Colors.deepPurple)), - onPressed: onPressed, - child: child, - ); + style: OutlinedButton.styleFrom( + side: const BorderSide(color: Colors.deepPurple), + ), + onPressed: onPressed, + child: child, + ); } diff --git a/firebase-get-to-know-flutter/step_07/macos/Podfile b/firebase-get-to-know-flutter/step_07/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/firebase-get-to-know-flutter/step_07/macos/Podfile +++ b/firebase-get-to-know-flutter/step_07/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-get-to-know-flutter/step_07/macos/Runner.xcodeproj/project.pbxproj b/firebase-get-to-know-flutter/step_07/macos/Runner.xcodeproj/project.pbxproj index fb0fd3bdda..9bc0a35357 100644 --- a/firebase-get-to-know-flutter/step_07/macos/Runner.xcodeproj/project.pbxproj +++ b/firebase-get-to-know-flutter/step_07/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 0DA8E7B8BBE6C967EE273C73 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */; }; + 0F7CAD0D7A868D800C3BC513 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 861888475ACBDFC19581A0BE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */; }; - BF47E961A040868CE445556F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,9 +62,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 12EB594E522C70C2DC1D73D7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2D983AC4D530A30FD0FD7562 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -81,13 +81,13 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8712FD9EDF1BB663BBEFE247 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 818641D5131FCBD6E653AC27 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A32E8B517B4C27ACE370E88D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9FF3F59EF1584722C34252E8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 861888475ACBDFC19581A0BE /* Pods_RunnerTests.framework in Frameworks */, + 0F7CAD0D7A868D800C3BC513 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF47E961A040868CE445556F /* Pods_Runner.framework in Frameworks */, + 0DA8E7B8BBE6C967EE273C73 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - B983F0D55574110AFA4B1FDE /* Pods */, + BDC8D1065892FABF50206535 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - B983F0D55574110AFA4B1FDE /* Pods */ = { + BDC8D1065892FABF50206535 /* Pods */ = { isa = PBXGroup; children = ( - 12EB594E522C70C2DC1D73D7 /* Pods-Runner.debug.xcconfig */, - A32E8B517B4C27ACE370E88D /* Pods-Runner.release.xcconfig */, - 8712FD9EDF1BB663BBEFE247 /* Pods-Runner.profile.xcconfig */, - 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */, - 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */, - 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */, + 818641D5131FCBD6E653AC27 /* Pods-Runner.debug.xcconfig */, + 9FF3F59EF1584722C34252E8 /* Pods-Runner.release.xcconfig */, + 2D983AC4D530A30FD0FD7562 /* Pods-Runner.profile.xcconfig */, + 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */, + 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */, + F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */, - 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */, + 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */, + 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 9E1E48E79D5F3FA67D4ECFC0 /* [CP] Check Pods Manifest.lock */, + 063F0C8571D4FB451EEF9465 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8A277401736D674439F93FC9 /* [CP] Check Pods Manifest.lock */, + C3ACE1D312FF874DC9DEA790 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 40538D587193E4AA10BF0D34 /* [CP] Embed Pods Frameworks */, + F0F1606EF6F9A64751A4FA46 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,62 +323,67 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 063F0C8571D4FB451EEF9465 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, ); outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 40538D587193E4AA10BF0D34 /* [CP] Embed Pods Frameworks */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, ); - name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 8A277401736D674439F93FC9 /* [CP] Check Pods Manifest.lock */ = { + C3ACE1D312FF874DC9DEA790 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -400,26 +405,21 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 9E1E48E79D5F3FA67D4ECFC0 /* [CP] Check Pods Manifest.lock */ = { + F0F1606EF6F9A64751A4FA46 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -489,7 +489,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -505,7 +505,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/firebase-get-to-know-flutter/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-get-to-know-flutter/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3613032c84..7edb7743f9 100644 --- a/firebase-get-to-know-flutter/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-get-to-know-flutter/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-get-to-know-flutter/step_07/pubspec.yaml b/firebase-get-to-know-flutter/step_07/pubspec.yaml index 6c4b7aa7cd..d82cfb1a27 100644 --- a/firebase-get-to-know-flutter/step_07/pubspec.yaml +++ b/firebase-get-to-know-flutter/step_07/pubspec.yaml @@ -20,7 +20,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -36,7 +36,7 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 google_fonts: ^6.2.1 - go_router: ^14.7.2 + go_router: ^14.8.0 cloud_firestore: ^5.6.3 firebase_auth: ^5.4.2 firebase_core: ^3.11.0 diff --git a/firebase-get-to-know-flutter/step_09/android/.gitignore b/firebase-get-to-know-flutter/step_09/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/firebase-get-to-know-flutter/step_09/android/.gitignore +++ b/firebase-get-to-know-flutter/step_09/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/firebase-get-to-know-flutter/step_09/android/app/build.gradle b/firebase-get-to-know-flutter/step_09/android/app/build.gradle deleted file mode 100644 index ad5859ad24..0000000000 --- a/firebase-get-to-know-flutter/step_09/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.gtk_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.gtk_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/firebase-get-to-know-flutter/step_09/android/app/build.gradle.kts b/firebase-get-to-know-flutter/step_09/android/app/build.gradle.kts new file mode 100644 index 0000000000..3e28d8bd44 --- /dev/null +++ b/firebase-get-to-know-flutter/step_09/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.gtk_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.gtk_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/firebase-get-to-know-flutter/step_09/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt b/firebase-get-to-know-flutter/step_09/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt index 039c1b0e7d..2ea667c39a 100644 --- a/firebase-get-to-know-flutter/step_09/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt +++ b/firebase-get-to-know-flutter/step_09/android/app/src/main/kotlin/com/example/gtk_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.gtk_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/firebase-get-to-know-flutter/step_09/android/build.gradle b/firebase-get-to-know-flutter/step_09/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/firebase-get-to-know-flutter/step_09/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/firebase-get-to-know-flutter/step_09/android/build.gradle.kts b/firebase-get-to-know-flutter/step_09/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/firebase-get-to-know-flutter/step_09/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/firebase-get-to-know-flutter/step_09/android/gradle.properties b/firebase-get-to-know-flutter/step_09/android/gradle.properties index 2597170821..f018a61817 100644 --- a/firebase-get-to-know-flutter/step_09/android/gradle.properties +++ b/firebase-get-to-know-flutter/step_09/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/firebase-get-to-know-flutter/step_09/android/gradle/wrapper/gradle-wrapper.properties b/firebase-get-to-know-flutter/step_09/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/firebase-get-to-know-flutter/step_09/android/gradle/wrapper/gradle-wrapper.properties +++ b/firebase-get-to-know-flutter/step_09/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/firebase-get-to-know-flutter/step_09/android/settings.gradle b/firebase-get-to-know-flutter/step_09/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/firebase-get-to-know-flutter/step_09/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/firebase-get-to-know-flutter/step_09/android/settings.gradle.kts b/firebase-get-to-know-flutter/step_09/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/firebase-get-to-know-flutter/step_09/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/firebase-get-to-know-flutter/step_09/ios/Podfile b/firebase-get-to-know-flutter/step_09/ios/Podfile index 3e44f9c6f7..2dbf7d728d 100644 --- a/firebase-get-to-know-flutter/step_09/ios/Podfile +++ b/firebase-get-to-know-flutter/step_09/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-get-to-know-flutter/step_09/ios/Runner.xcodeproj/project.pbxproj b/firebase-get-to-know-flutter/step_09/ios/Runner.xcodeproj/project.pbxproj index 7de6133685..6524717597 100644 --- a/firebase-get-to-know-flutter/step_09/ios/Runner.xcodeproj/project.pbxproj +++ b/firebase-get-to-know-flutter/step_09/ios/Runner.xcodeproj/project.pbxproj @@ -10,12 +10,12 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 589C772495F1143748C4F157 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */; }; + 422628136E756BE6071BD78F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */; }; + 71C9017C3DA1BF2CEDF82DE6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCB85976CEA915945B149712 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - 986CD7DB5F34CF090EF2CA52 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,15 +42,17 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B6B2D1AE9EAE20F1711B98A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 688971683DC7106866C0B9B0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 4BF614354AD511BA2AFD0A33 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 5B1DBDDE848E285604ECAD29 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -61,10 +63,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - CB59B2D1DA8BEEC0BCC77043 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F72D6E3E97FAA258CE871A41 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + FCB85976CEA915945B149712 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,30 +72,30 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 589C772495F1143748C4F157 /* Pods_Runner.framework in Frameworks */, + 71C9017C3DA1BF2CEDF82DE6 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A3DC8A1C5C668494C6834378 /* Frameworks */ = { + EA3C2372CF052533C13FFE27 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 986CD7DB5F34CF090EF2CA52 /* Pods_RunnerTests.framework in Frameworks */, + 422628136E756BE6071BD78F /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 105CD1738BF7F7E97BE8A3B6 /* Pods */ = { + 22E12961F927A9582D4F680E /* Pods */ = { isa = PBXGroup; children = ( - 688971683DC7106866C0B9B0 /* Pods-Runner.debug.xcconfig */, - 1B6B2D1AE9EAE20F1711B98A /* Pods-Runner.release.xcconfig */, - CB59B2D1DA8BEEC0BCC77043 /* Pods-Runner.profile.xcconfig */, - 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */, - D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */, - BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */, + F72D6E3E97FAA258CE871A41 /* Pods-Runner.debug.xcconfig */, + 5B1DBDDE848E285604ECAD29 /* Pods-Runner.release.xcconfig */, + 4BF614354AD511BA2AFD0A33 /* Pods-Runner.profile.xcconfig */, + 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */, + 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */, + 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -127,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 105CD1738BF7F7E97BE8A3B6 /* Pods */, - C9654424345AAECD8C097359 /* Frameworks */, + 22E12961F927A9582D4F680E /* Pods */, + 9AFF92BC7EC70A109D78E215 /* Frameworks */, ); sourceTree = ""; }; @@ -156,11 +156,11 @@ path = Runner; sourceTree = ""; }; - C9654424345AAECD8C097359 /* Frameworks */ = { + 9AFF92BC7EC70A109D78E215 /* Frameworks */ = { isa = PBXGroup; children = ( - E32DBC48B1B8EF568BCB03DA /* Pods_Runner.framework */, - 1DA7FB426C2955604E23B568 /* Pods_RunnerTests.framework */, + FCB85976CEA915945B149712 /* Pods_Runner.framework */, + 1FD2261CED21855E49CB2FBA /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 952BE0E434084B7B6FF4F686 /* [CP] Check Pods Manifest.lock */, + 1EE5AFBFD2FA841E4055FF63 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - A3DC8A1C5C668494C6834378 /* Frameworks */, + EA3C2372CF052533C13FFE27 /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 39A46715CA44AAF4EEC59A33 /* [CP] Check Pods Manifest.lock */, + E702E5CD2507380B5798BE83 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - B615B10C2DC1A5339BE2BBB2 /* [CP] Embed Pods Frameworks */, + DE18B35D8F83EFC2C7F04DD0 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 39A46715CA44AAF4EEC59A33 /* [CP] Check Pods Manifest.lock */ = { + 1EE5AFBFD2FA841E4055FF63 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -285,7 +285,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 952BE0E434084B7B6FF4F686 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + DE18B35D8F83EFC2C7F04DD0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - B615B10C2DC1A5339BE2BBB2 /* [CP] Embed Pods Frameworks */ = { + E702E5CD2507380B5798BE83 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -488,7 +488,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 44136ADFC4E322936A6A4C89 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 0C21175A3C60A8D4EB683057 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -507,7 +507,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D44338E085F4D4E00F208201 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 3FF072F43AC079B6BB790BAE /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -524,7 +524,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BA744A96D9908F50BE03AFDD /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 70EB57050DE8D15DA0FBB437 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/firebase-get-to-know-flutter/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-get-to-know-flutter/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/firebase-get-to-know-flutter/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-get-to-know-flutter/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-get-to-know-flutter/step_09/lib/app_state.dart b/firebase-get-to-know-flutter/step_09/lib/app_state.dart index c15d361a79..29c576a330 100644 --- a/firebase-get-to-know-flutter/step_09/lib/app_state.dart +++ b/firebase-get-to-know-flutter/step_09/lib/app_state.dart @@ -79,20 +79,19 @@ class ApplicationState extends ChangeNotifier { Future init() async { await Firebase.initializeApp( - options: DefaultFirebaseOptions.currentPlatform); + options: DefaultFirebaseOptions.currentPlatform, + ); - FirebaseUIAuth.configureProviders([ - EmailAuthProvider(), - ]); + FirebaseUIAuth.configureProviders([EmailAuthProvider()]); FirebaseFirestore.instance .collection('attendees') .where('attending', isEqualTo: true) .snapshots() .listen((snapshot) { - _attendees = snapshot.docs.length; - notifyListeners(); - }); + _attendees = snapshot.docs.length; + notifyListeners(); + }); FirebaseAuth.instance.userChanges().listen((user) { if (user != null) { @@ -103,33 +102,33 @@ class ApplicationState extends ChangeNotifier { .orderBy('timestamp', descending: true) .snapshots() .listen((snapshot) { - _guestBookMessages = []; - for (final document in snapshot.docs) { - _guestBookMessages.add( - GuestBookMessage( - name: document.data()['name'] as String, - message: document.data()['text'] as String, - ), - ); - } - notifyListeners(); - }); + _guestBookMessages = []; + for (final document in snapshot.docs) { + _guestBookMessages.add( + GuestBookMessage( + name: document.data()['name'] as String, + message: document.data()['text'] as String, + ), + ); + } + notifyListeners(); + }); _attendingSubscription = FirebaseFirestore.instance .collection('attendees') .doc(user.uid) .snapshots() .listen((snapshot) { - if (snapshot.data() != null) { - if (snapshot.data()!['attending'] as bool) { - _attending = Attending.yes; - } else { - _attending = Attending.no; - } - } else { - _attending = Attending.unknown; - } - notifyListeners(); - }); + if (snapshot.data() != null) { + if (snapshot.data()!['attending'] as bool) { + _attending = Attending.yes; + } else { + _attending = Attending.no; + } + } else { + _attending = Attending.unknown; + } + notifyListeners(); + }); } else { _loggedIn = false; _emailVerified = false; @@ -159,10 +158,10 @@ class ApplicationState extends ChangeNotifier { return FirebaseFirestore.instance .collection('guestbook') .add({ - 'text': message, - 'timestamp': DateTime.now().millisecondsSinceEpoch, - 'name': FirebaseAuth.instance.currentUser!.displayName, - 'userId': FirebaseAuth.instance.currentUser!.uid, - }); + 'text': message, + 'timestamp': DateTime.now().millisecondsSinceEpoch, + 'name': FirebaseAuth.instance.currentUser!.displayName, + 'userId': FirebaseAuth.instance.currentUser!.uid, + }); } } diff --git a/firebase-get-to-know-flutter/step_09/lib/firebase_options.dart b/firebase-get-to-know-flutter/step_09/lib/firebase_options.dart index a070833f2c..d2ab5def55 100644 --- a/firebase-get-to-know-flutter/step_09/lib/firebase_options.dart +++ b/firebase-get-to-know-flutter/step_09/lib/firebase_options.dart @@ -29,7 +29,8 @@ class DefaultFirebaseOptions { return macos; default: throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.'); + 'DefaultFirebaseOptions are not supported for this platform.', + ); } } diff --git a/firebase-get-to-know-flutter/step_09/lib/home_page.dart b/firebase-get-to-know-flutter/step_09/lib/home_page.dart index d8669bf845..5e90d6ed86 100644 --- a/firebase-get-to-know-flutter/step_09/lib/home_page.dart +++ b/firebase-get-to-know-flutter/step_09/lib/home_page.dart @@ -19,26 +19,26 @@ class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Firebase Meetup'), - ), + appBar: AppBar(title: const Text('Firebase Meetup')), body: ListView( children: [ Image.asset('assets/codelab.png'), const SizedBox(height: 8), Consumer( - builder: (context, appState, _) => - IconAndDetail(Icons.calendar_today, appState.eventDate), + builder: + (context, appState, _) => + IconAndDetail(Icons.calendar_today, appState.eventDate), ), const IconAndDetail(Icons.location_city, 'San Francisco'), Consumer( - builder: (context, appState, _) => AuthFunc( - loggedIn: appState.loggedIn, - signOut: () { - FirebaseAuth.instance.signOut(); - }, - enableFreeSwag: appState.enableFreeSwag, - ), + builder: + (context, appState, _) => AuthFunc( + loggedIn: appState.loggedIn, + signOut: () { + FirebaseAuth.instance.signOut(); + }, + enableFreeSwag: appState.enableFreeSwag, + ), ), const Divider( height: 8, @@ -49,33 +49,34 @@ class HomePage extends StatelessWidget { ), const Header("What we'll be doing"), Consumer( - builder: (context, appState, _) => Paragraph( - appState.callToAction, - ), + builder: (context, appState, _) => Paragraph(appState.callToAction), ), Consumer( - builder: (context, appState, _) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - switch (appState.attendees) { - 1 => const Paragraph('1 person going'), - >= 2 => Paragraph('${appState.attendees} people going'), - _ => const Paragraph('No one going'), - }, - if (appState.loggedIn) ...[ - YesNoSelection( - state: appState.attending, - onSelection: (attending) => appState.attending = attending, - ), - const Header('Discussion'), - GuestBook( - addMessage: (message) => - appState.addMessageToGuestBook(message), - messages: appState.guestBookMessages, - ), - ], - ], - ), + builder: + (context, appState, _) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + switch (appState.attendees) { + 1 => const Paragraph('1 person going'), + >= 2 => Paragraph('${appState.attendees} people going'), + _ => const Paragraph('No one going'), + }, + if (appState.loggedIn) ...[ + YesNoSelection( + state: appState.attending, + onSelection: + (attending) => appState.attending = attending, + ), + const Header('Discussion'), + GuestBook( + addMessage: + (message) => + appState.addMessageToGuestBook(message), + messages: appState.guestBookMessages, + ), + ], + ], + ), ), ], ), diff --git a/firebase-get-to-know-flutter/step_09/lib/main.dart b/firebase-get-to-know-flutter/step_09/lib/main.dart index 8eb886377c..1a21dc5f4a 100644 --- a/firebase-get-to-know-flutter/step_09/lib/main.dart +++ b/firebase-get-to-know-flutter/step_09/lib/main.dart @@ -14,10 +14,12 @@ import 'home_page.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); - runApp(ChangeNotifierProvider( - create: (context) => ApplicationState(), - builder: ((context, child) => const App()), - )); + runApp( + ChangeNotifierProvider( + create: (context) => ApplicationState(), + builder: ((context, child) => const App()), + ), + ); } final _router = GoRouter( @@ -34,9 +36,7 @@ final _router = GoRouter( ForgotPasswordAction(((context, email) { final uri = Uri( path: '/sign-in/forgot-password', - queryParameters: { - 'email': email, - }, + queryParameters: {'email': email}, ); context.push(uri.toString()); })), @@ -44,7 +44,7 @@ final _router = GoRouter( final user = switch (state) { SignedIn state => state.user, UserCreated state => state.credential.user, - _ => null + _ => null, }; if (user == null) { return; @@ -55,8 +55,10 @@ final _router = GoRouter( if (!user.emailVerified) { user.sendEmailVerification(); const snackBar = SnackBar( - content: Text( - 'Please check your email to verify your email address')); + content: Text( + 'Please check your email to verify your email address', + ), + ); ScaffoldMessenger.of(context).showSnackBar(snackBar); } context.pushReplacement('/'); @@ -81,27 +83,27 @@ final _router = GoRouter( path: 'profile', builder: (context, state) { return Consumer( - builder: (context, appState, _) => ProfileScreen( - key: ValueKey(appState.emailVerified), - providers: const [], - actions: [ - SignedOutAction( - ((context) { - context.pushReplacement('/'); - }), + builder: + (context, appState, _) => ProfileScreen( + key: ValueKey(appState.emailVerified), + providers: const [], + actions: [ + SignedOutAction(((context) { + context.pushReplacement('/'); + })), + ], + children: [ + Visibility( + visible: !appState.emailVerified, + child: OutlinedButton( + child: const Text('Recheck Verification State'), + onPressed: () { + appState.refreshLoggedInUser(); + }, + ), + ), + ], ), - ], - children: [ - Visibility( - visible: !appState.emailVerified, - child: OutlinedButton( - child: const Text('Recheck Verification State'), - onPressed: () { - appState.refreshLoggedInUser(); - }, - )) - ], - ), ); }, ), @@ -118,13 +120,11 @@ class App extends StatelessWidget { return MaterialApp.router( title: 'Firebase Meetup', theme: ThemeData( - buttonTheme: Theme.of(context).buttonTheme.copyWith( - highlightColor: Colors.deepPurple, - ), + buttonTheme: Theme.of( + context, + ).buttonTheme.copyWith(highlightColor: Colors.deepPurple), colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - textTheme: GoogleFonts.robotoTextTheme( - Theme.of(context).textTheme, - ), + textTheme: GoogleFonts.robotoTextTheme(Theme.of(context).textTheme), visualDensity: VisualDensity.adaptivePlatformDensity, ), routerConfig: _router, diff --git a/firebase-get-to-know-flutter/step_09/lib/src/authentication.dart b/firebase-get-to-know-flutter/step_09/lib/src/authentication.dart index fd1b97a65a..651f765836 100644 --- a/firebase-get-to-know-flutter/step_09/lib/src/authentication.dart +++ b/firebase-get-to-know-flutter/step_09/lib/src/authentication.dart @@ -26,31 +26,36 @@ class AuthFunc extends StatelessWidget { Padding( padding: const EdgeInsets.only(left: 24, bottom: 8), child: StyledButton( + onPressed: () { + !loggedIn ? context.push('/sign-in') : signOut(); + }, + child: !loggedIn ? const Text('RSVP') : const Text('Logout'), + ), + ), + Visibility( + visible: loggedIn, + child: Padding( + padding: const EdgeInsets.only(left: 24, bottom: 8), + child: StyledButton( onPressed: () { - !loggedIn ? context.push('/sign-in') : signOut(); + context.push('/profile'); }, - child: !loggedIn ? const Text('RSVP') : const Text('Logout')), + child: const Text('Profile'), + ), + ), ), Visibility( - visible: loggedIn, - child: Padding( - padding: const EdgeInsets.only(left: 24, bottom: 8), - child: StyledButton( - onPressed: () { - context.push('/profile'); - }, - child: const Text('Profile')), - )), - Visibility( - visible: enableFreeSwag, - child: Padding( - padding: const EdgeInsets.only(left: 24, bottom: 8), - child: StyledButton( - onPressed: () { - throw Exception('free swag unimplemented'); - }, - child: const Text('Free swag!')), - )), + visible: enableFreeSwag, + child: Padding( + padding: const EdgeInsets.only(left: 24, bottom: 8), + child: StyledButton( + onPressed: () { + throw Exception('free swag unimplemented'); + }, + child: const Text('Free swag!'), + ), + ), + ), ], ); } diff --git a/firebase-get-to-know-flutter/step_09/lib/src/widgets.dart b/firebase-get-to-know-flutter/step_09/lib/src/widgets.dart index 29886a3802..3f89c9d797 100644 --- a/firebase-get-to-know-flutter/step_09/lib/src/widgets.dart +++ b/firebase-get-to-know-flutter/step_09/lib/src/widgets.dart @@ -10,12 +10,9 @@ class Header extends StatelessWidget { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - heading, - style: const TextStyle(fontSize: 24), - ), - ); + padding: const EdgeInsets.all(8.0), + child: Text(heading, style: const TextStyle(fontSize: 24)), + ); } class Paragraph extends StatelessWidget { @@ -23,12 +20,9 @@ class Paragraph extends StatelessWidget { final String content; @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), - child: Text( - content, - style: const TextStyle(fontSize: 18), - ), - ); + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Text(content, style: const TextStyle(fontSize: 18)), + ); } class IconAndDetail extends StatelessWidget { @@ -38,18 +32,15 @@ class IconAndDetail extends StatelessWidget { @override Widget build(BuildContext context) => Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - Icon(icon), - const SizedBox(width: 8), - Text( - detail, - style: const TextStyle(fontSize: 18), - ) - ], - ), - ); + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Icon(icon), + const SizedBox(width: 8), + Text(detail, style: const TextStyle(fontSize: 18)), + ], + ), + ); } class StyledButton extends StatelessWidget { @@ -59,9 +50,10 @@ class StyledButton extends StatelessWidget { @override Widget build(BuildContext context) => OutlinedButton( - style: OutlinedButton.styleFrom( - side: const BorderSide(color: Colors.deepPurple)), - onPressed: onPressed, - child: child, - ); + style: OutlinedButton.styleFrom( + side: const BorderSide(color: Colors.deepPurple), + ), + onPressed: onPressed, + child: child, + ); } diff --git a/firebase-get-to-know-flutter/step_09/macos/Podfile b/firebase-get-to-know-flutter/step_09/macos/Podfile index b52666a103..ff5ddb3b8b 100644 --- a/firebase-get-to-know-flutter/step_09/macos/Podfile +++ b/firebase-get-to-know-flutter/step_09/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/firebase-get-to-know-flutter/step_09/macos/Runner.xcodeproj/project.pbxproj b/firebase-get-to-know-flutter/step_09/macos/Runner.xcodeproj/project.pbxproj index fb0fd3bdda..9bc0a35357 100644 --- a/firebase-get-to-know-flutter/step_09/macos/Runner.xcodeproj/project.pbxproj +++ b/firebase-get-to-know-flutter/step_09/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 0DA8E7B8BBE6C967EE273C73 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */; }; + 0F7CAD0D7A868D800C3BC513 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 861888475ACBDFC19581A0BE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */; }; - BF47E961A040868CE445556F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,9 +62,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 12EB594E522C70C2DC1D73D7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2D983AC4D530A30FD0FD7562 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -81,13 +81,13 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8712FD9EDF1BB663BBEFE247 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 818641D5131FCBD6E653AC27 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A32E8B517B4C27ACE370E88D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9FF3F59EF1584722C34252E8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 861888475ACBDFC19581A0BE /* Pods_RunnerTests.framework in Frameworks */, + 0F7CAD0D7A868D800C3BC513 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF47E961A040868CE445556F /* Pods_Runner.framework in Frameworks */, + 0DA8E7B8BBE6C967EE273C73 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - B983F0D55574110AFA4B1FDE /* Pods */, + BDC8D1065892FABF50206535 /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - B983F0D55574110AFA4B1FDE /* Pods */ = { + BDC8D1065892FABF50206535 /* Pods */ = { isa = PBXGroup; children = ( - 12EB594E522C70C2DC1D73D7 /* Pods-Runner.debug.xcconfig */, - A32E8B517B4C27ACE370E88D /* Pods-Runner.release.xcconfig */, - 8712FD9EDF1BB663BBEFE247 /* Pods-Runner.profile.xcconfig */, - 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */, - 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */, - 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */, + 818641D5131FCBD6E653AC27 /* Pods-Runner.debug.xcconfig */, + 9FF3F59EF1584722C34252E8 /* Pods-Runner.release.xcconfig */, + 2D983AC4D530A30FD0FD7562 /* Pods-Runner.profile.xcconfig */, + 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */, + 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */, + F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - CC5DB7D50F267A7CAD4EE74D /* Pods_Runner.framework */, - 50FCC2F468BEF195CFA2DA49 /* Pods_RunnerTests.framework */, + 1EE33D50C676BA4EA414F93F /* Pods_Runner.framework */, + 79A1FB4E133E789C8358A833 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 9E1E48E79D5F3FA67D4ECFC0 /* [CP] Check Pods Manifest.lock */, + 063F0C8571D4FB451EEF9465 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8A277401736D674439F93FC9 /* [CP] Check Pods Manifest.lock */, + C3ACE1D312FF874DC9DEA790 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 40538D587193E4AA10BF0D34 /* [CP] Embed Pods Frameworks */, + F0F1606EF6F9A64751A4FA46 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,62 +323,67 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 063F0C8571D4FB451EEF9465 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, ); outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 40538D587193E4AA10BF0D34 /* [CP] Embed Pods Frameworks */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, ); - name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 8A277401736D674439F93FC9 /* [CP] Check Pods Manifest.lock */ = { + C3ACE1D312FF874DC9DEA790 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -400,26 +405,21 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 9E1E48E79D5F3FA67D4ECFC0 /* [CP] Check Pods Manifest.lock */ = { + F0F1606EF6F9A64751A4FA46 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 307D67E568788FA3734F1399 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 10C5FE516155F7B5C783577A /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -489,7 +489,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2D9F26BE5DB90C1AEA7E502B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 83F355323915AAC38814F1CF /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -505,7 +505,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 71D5B83DD144FEADA41FFBEE /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = F8544A0F1A5885AF0DEE3E7A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/firebase-get-to-know-flutter/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase-get-to-know-flutter/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3613032c84..7edb7743f9 100644 --- a/firebase-get-to-know-flutter/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/firebase-get-to-know-flutter/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/firebase-get-to-know-flutter/step_09/pubspec.yaml b/firebase-get-to-know-flutter/step_09/pubspec.yaml index 6c4b7aa7cd..d82cfb1a27 100644 --- a/firebase-get-to-know-flutter/step_09/pubspec.yaml +++ b/firebase-get-to-know-flutter/step_09/pubspec.yaml @@ -20,7 +20,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -36,7 +36,7 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 google_fonts: ^6.2.1 - go_router: ^14.7.2 + go_router: ^14.8.0 cloud_firestore: ^5.6.3 firebase_auth: ^5.4.2 firebase_core: ^3.11.0 diff --git a/forge2d_game/codelab_rebuild.yaml b/forge2d_game/codelab_rebuild.yaml index 693b3acacd..4854ea303f 100644 --- a/forge2d_game/codelab_rebuild.yaml +++ b/forge2d_game/codelab_rebuild.yaml @@ -65,11 +65,7 @@ steps: import 'package:flutter/material.dart'; void main() { - runApp( - GameWidget.controlled( - gameFactory: FlameGame.new, - ), - ); + runApp(GameWidget.controlled(gameFactory: FlameGame.new)); } - name: mkdir bin mkdir: forge2d_game/bin @@ -11676,19 +11672,18 @@ steps: class Background extends SpriteComponent with HasGameReference { Background({required super.sprite}) - : super( - anchor: Anchor.center, - position: Vector2(0, 0), - ); + : super(anchor: Anchor.center, position: Vector2(0, 0)); @override void onMount() { super.onMount(); - size = Vector2.all(max( - game.camera.visibleWorldRect.width, - game.camera.visibleWorldRect.height, - )); + size = Vector2.all( + max( + game.camera.visibleWorldRect.width, + game.camera.visibleWorldRect.height, + ), + ); } } - name: Add lib/components/game.dart @@ -11697,26 +11692,26 @@ steps: // Copyright 2024 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:async'; - + import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_kenney_xml/flame_kenney_xml.dart'; - + import 'background.dart'; - + class MyPhysicsGame extends Forge2DGame { MyPhysicsGame() - : super( - gravity: Vector2(0, 10), - camera: CameraComponent.withFixedResolution(width: 800, height: 600), - ); - + : super( + gravity: Vector2(0, 10), + camera: CameraComponent.withFixedResolution(width: 800, height: 600), + ); + late final XmlSpriteSheet aliens; late final XmlSpriteSheet elements; late final XmlSpriteSheet tiles; - + @override FutureOr onLoad() async { final backgroundImage = await images.load('colored_grass.png'); @@ -11734,13 +11729,13 @@ steps: xmlPath: 'spritesheet_tiles.xml', ), ]); - + aliens = spriteSheets[0]; elements = spriteSheets[1]; tiles = spriteSheets[2]; - + await world.add(Background(sprite: Sprite(backgroundImage))); - + return super.onLoad(); } } @@ -11749,19 +11744,15 @@ steps: patch: | --- b/forge2d_game/step_03/lib/main.dart +++ a/forge2d_game/step_03/lib/main.dart - @@ -5,10 +5,12 @@ + @@ -5,6 +5,8 @@ import 'package:flame/game.dart'; import 'package:flutter/material.dart'; +import 'components/game.dart'; + void main() { - runApp( - GameWidget.controlled( - - gameFactory: FlameGame.new, - + gameFactory: MyPhysicsGame.new, - ), - ); + - runApp(GameWidget.controlled(gameFactory: FlameGame.new)); + + runApp(GameWidget.controlled(gameFactory: MyPhysicsGame.new)); } - name: Build web app path: forge2d_game @@ -11791,26 +11782,27 @@ steps: class Ground extends BodyComponent { Ground(Vector2 position, Sprite sprite) - : super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.static, - fixtureDefs: [ - FixtureDef( - PolygonShape()..setAsBoxXY(groundSize / 2, groundSize / 2), - friction: 0.3, - ) - ], - children: [ - SpriteComponent( - anchor: Anchor.center, - sprite: sprite, - size: Vector2.all(groundSize), - position: Vector2(0, 0), - ), - ], - ); + : super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.static, + fixtureDefs: [ + FixtureDef( + PolygonShape()..setAsBoxXY(groundSize / 2, groundSize / 2), + friction: 0.3, + ), + ], + children: [ + SpriteComponent( + anchor: Anchor.center, + sprite: sprite, + size: Vector2.all(groundSize), + position: Vector2(0, 0), + ), + ], + ); } - name: Patch lib/components/game.dart path: forge2d_game/lib/components/game.dart @@ -11825,7 +11817,7 @@ steps: class MyPhysicsGame extends Forge2DGame { MyPhysicsGame() - @@ -44,7 +45,20 @@ class MyPhysicsGame extends Forge2DGame { + @@ -44,7 +45,22 @@ class MyPhysicsGame extends Forge2DGame { tiles = spriteSheets[2]; await world.add(Background(sprite: Sprite(backgroundImage))); @@ -11836,9 +11828,11 @@ steps: + + Future addGround() { + return world.addAll([ - + for (var x = camera.visibleWorldRect.left; - + x < camera.visibleWorldRect.right + groundSize; - + x += groundSize) + + for ( + + var x = camera.visibleWorldRect.left; + + x < camera.visibleWorldRect.right + groundSize; + + x += groundSize + + ) + Ground( + Vector2(x, (camera.visibleWorldRect.height - groundSize) / 2), + tiles.getSprite('grass.png'), @@ -11898,11 +11892,12 @@ steps: final int y; final int width; final int height; - const Rect( - {required this.x, - required this.y, - required this.width, - required this.height}); + const Rect({ + required this.x, + required this.y, + required this.width, + required this.height, + }); Size get size => Size(width, height); @@ -11975,30 +11970,30 @@ steps: // Copyright 2024 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:math'; import 'dart:ui' as ui; - + import 'package:flame/components.dart'; import 'package:flame/extensions.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; - + const brickScale = 0.5; - + enum BrickType { explosive(density: 1, friction: 0.5), glass(density: 0.5, friction: 0.2), metal(density: 1, friction: 0.4), stone(density: 2, friction: 1), wood(density: 0.25, friction: 0.6); - + final double density; final double friction; - + const BrickType({required this.density, required this.friction}); static BrickType get randomType => values[Random().nextInt(values.length)]; } - + enum BrickSize { size70x70(ui.Size(70, 70)), size140x70(ui.Size(140, 70)), @@ -12008,221 +12003,221 @@ steps: size220x140(ui.Size(220, 140)), size140x220(ui.Size(140, 220)), size70x220(ui.Size(70, 220)); - + final ui.Size size; - + const BrickSize(this.size); - + static BrickSize get randomSize => values[Random().nextInt(values.length)]; } - + enum BrickDamage { none, some, lots } - + Map brickFileNames(BrickType type, BrickSize size) { return switch ((type, size)) { (BrickType.explosive, BrickSize.size140x70) => { - BrickDamage.none: 'elementExplosive009.png', - BrickDamage.some: 'elementExplosive012.png', - BrickDamage.lots: 'elementExplosive050.png', - }, + BrickDamage.none: 'elementExplosive009.png', + BrickDamage.some: 'elementExplosive012.png', + BrickDamage.lots: 'elementExplosive050.png', + }, (BrickType.glass, BrickSize.size140x70) => { - BrickDamage.none: 'elementGlass010.png', - BrickDamage.some: 'elementGlass013.png', - BrickDamage.lots: 'elementGlass048.png', - }, + BrickDamage.none: 'elementGlass010.png', + BrickDamage.some: 'elementGlass013.png', + BrickDamage.lots: 'elementGlass048.png', + }, (BrickType.metal, BrickSize.size140x70) => { - BrickDamage.none: 'elementMetal009.png', - BrickDamage.some: 'elementMetal012.png', - BrickDamage.lots: 'elementMetal050.png', - }, + BrickDamage.none: 'elementMetal009.png', + BrickDamage.some: 'elementMetal012.png', + BrickDamage.lots: 'elementMetal050.png', + }, (BrickType.stone, BrickSize.size140x70) => { - BrickDamage.none: 'elementStone009.png', - BrickDamage.some: 'elementStone012.png', - BrickDamage.lots: 'elementStone047.png', - }, + BrickDamage.none: 'elementStone009.png', + BrickDamage.some: 'elementStone012.png', + BrickDamage.lots: 'elementStone047.png', + }, (BrickType.wood, BrickSize.size140x70) => { - BrickDamage.none: 'elementWood011.png', - BrickDamage.some: 'elementWood014.png', - BrickDamage.lots: 'elementWood054.png', - }, + BrickDamage.none: 'elementWood011.png', + BrickDamage.some: 'elementWood014.png', + BrickDamage.lots: 'elementWood054.png', + }, (BrickType.explosive, BrickSize.size70x70) => { - BrickDamage.none: 'elementExplosive011.png', - BrickDamage.some: 'elementExplosive014.png', - BrickDamage.lots: 'elementExplosive049.png', - }, + BrickDamage.none: 'elementExplosive011.png', + BrickDamage.some: 'elementExplosive014.png', + BrickDamage.lots: 'elementExplosive049.png', + }, (BrickType.glass, BrickSize.size70x70) => { - BrickDamage.none: 'elementGlass011.png', - BrickDamage.some: 'elementGlass012.png', - BrickDamage.lots: 'elementGlass046.png', - }, + BrickDamage.none: 'elementGlass011.png', + BrickDamage.some: 'elementGlass012.png', + BrickDamage.lots: 'elementGlass046.png', + }, (BrickType.metal, BrickSize.size70x70) => { - BrickDamage.none: 'elementMetal011.png', - BrickDamage.some: 'elementMetal014.png', - BrickDamage.lots: 'elementMetal049.png', - }, + BrickDamage.none: 'elementMetal011.png', + BrickDamage.some: 'elementMetal014.png', + BrickDamage.lots: 'elementMetal049.png', + }, (BrickType.stone, BrickSize.size70x70) => { - BrickDamage.none: 'elementStone011.png', - BrickDamage.some: 'elementStone014.png', - BrickDamage.lots: 'elementStone046.png', - }, + BrickDamage.none: 'elementStone011.png', + BrickDamage.some: 'elementStone014.png', + BrickDamage.lots: 'elementStone046.png', + }, (BrickType.wood, BrickSize.size70x70) => { - BrickDamage.none: 'elementWood010.png', - BrickDamage.some: 'elementWood013.png', - BrickDamage.lots: 'elementWood045.png', - }, + BrickDamage.none: 'elementWood010.png', + BrickDamage.some: 'elementWood013.png', + BrickDamage.lots: 'elementWood045.png', + }, (BrickType.explosive, BrickSize.size220x70) => { - BrickDamage.none: 'elementExplosive013.png', - BrickDamage.some: 'elementExplosive016.png', - BrickDamage.lots: 'elementExplosive051.png', - }, + BrickDamage.none: 'elementExplosive013.png', + BrickDamage.some: 'elementExplosive016.png', + BrickDamage.lots: 'elementExplosive051.png', + }, (BrickType.glass, BrickSize.size220x70) => { - BrickDamage.none: 'elementGlass014.png', - BrickDamage.some: 'elementGlass017.png', - BrickDamage.lots: 'elementGlass049.png', - }, + BrickDamage.none: 'elementGlass014.png', + BrickDamage.some: 'elementGlass017.png', + BrickDamage.lots: 'elementGlass049.png', + }, (BrickType.metal, BrickSize.size220x70) => { - BrickDamage.none: 'elementMetal013.png', - BrickDamage.some: 'elementMetal016.png', - BrickDamage.lots: 'elementMetal051.png', - }, + BrickDamage.none: 'elementMetal013.png', + BrickDamage.some: 'elementMetal016.png', + BrickDamage.lots: 'elementMetal051.png', + }, (BrickType.stone, BrickSize.size220x70) => { - BrickDamage.none: 'elementStone013.png', - BrickDamage.some: 'elementStone016.png', - BrickDamage.lots: 'elementStone048.png', - }, + BrickDamage.none: 'elementStone013.png', + BrickDamage.some: 'elementStone016.png', + BrickDamage.lots: 'elementStone048.png', + }, (BrickType.wood, BrickSize.size220x70) => { - BrickDamage.none: 'elementWood012.png', - BrickDamage.some: 'elementWood015.png', - BrickDamage.lots: 'elementWood047.png', - }, + BrickDamage.none: 'elementWood012.png', + BrickDamage.some: 'elementWood015.png', + BrickDamage.lots: 'elementWood047.png', + }, (BrickType.explosive, BrickSize.size70x140) => { - BrickDamage.none: 'elementExplosive017.png', - BrickDamage.some: 'elementExplosive022.png', - BrickDamage.lots: 'elementExplosive052.png', - }, + BrickDamage.none: 'elementExplosive017.png', + BrickDamage.some: 'elementExplosive022.png', + BrickDamage.lots: 'elementExplosive052.png', + }, (BrickType.glass, BrickSize.size70x140) => { - BrickDamage.none: 'elementGlass018.png', - BrickDamage.some: 'elementGlass023.png', - BrickDamage.lots: 'elementGlass050.png', - }, + BrickDamage.none: 'elementGlass018.png', + BrickDamage.some: 'elementGlass023.png', + BrickDamage.lots: 'elementGlass050.png', + }, (BrickType.metal, BrickSize.size70x140) => { - BrickDamage.none: 'elementMetal017.png', - BrickDamage.some: 'elementMetal022.png', - BrickDamage.lots: 'elementMetal052.png', - }, + BrickDamage.none: 'elementMetal017.png', + BrickDamage.some: 'elementMetal022.png', + BrickDamage.lots: 'elementMetal052.png', + }, (BrickType.stone, BrickSize.size70x140) => { - BrickDamage.none: 'elementStone017.png', - BrickDamage.some: 'elementStone022.png', - BrickDamage.lots: 'elementStone049.png', - }, + BrickDamage.none: 'elementStone017.png', + BrickDamage.some: 'elementStone022.png', + BrickDamage.lots: 'elementStone049.png', + }, (BrickType.wood, BrickSize.size70x140) => { - BrickDamage.none: 'elementWood016.png', - BrickDamage.some: 'elementWood021.png', - BrickDamage.lots: 'elementWood048.png', - }, + BrickDamage.none: 'elementWood016.png', + BrickDamage.some: 'elementWood021.png', + BrickDamage.lots: 'elementWood048.png', + }, (BrickType.explosive, BrickSize.size140x140) => { - BrickDamage.none: 'elementExplosive018.png', - BrickDamage.some: 'elementExplosive023.png', - BrickDamage.lots: 'elementExplosive053.png', - }, + BrickDamage.none: 'elementExplosive018.png', + BrickDamage.some: 'elementExplosive023.png', + BrickDamage.lots: 'elementExplosive053.png', + }, (BrickType.glass, BrickSize.size140x140) => { - BrickDamage.none: 'elementGlass019.png', - BrickDamage.some: 'elementGlass024.png', - BrickDamage.lots: 'elementGlass051.png', - }, + BrickDamage.none: 'elementGlass019.png', + BrickDamage.some: 'elementGlass024.png', + BrickDamage.lots: 'elementGlass051.png', + }, (BrickType.metal, BrickSize.size140x140) => { - BrickDamage.none: 'elementMetal018.png', - BrickDamage.some: 'elementMetal023.png', - BrickDamage.lots: 'elementMetal053.png', - }, + BrickDamage.none: 'elementMetal018.png', + BrickDamage.some: 'elementMetal023.png', + BrickDamage.lots: 'elementMetal053.png', + }, (BrickType.stone, BrickSize.size140x140) => { - BrickDamage.none: 'elementStone018.png', - BrickDamage.some: 'elementStone023.png', - BrickDamage.lots: 'elementStone050.png', - }, + BrickDamage.none: 'elementStone018.png', + BrickDamage.some: 'elementStone023.png', + BrickDamage.lots: 'elementStone050.png', + }, (BrickType.wood, BrickSize.size140x140) => { - BrickDamage.none: 'elementWood017.png', - BrickDamage.some: 'elementWood022.png', - BrickDamage.lots: 'elementWood049.png', - }, + BrickDamage.none: 'elementWood017.png', + BrickDamage.some: 'elementWood022.png', + BrickDamage.lots: 'elementWood049.png', + }, (BrickType.explosive, BrickSize.size220x140) => { - BrickDamage.none: 'elementExplosive019.png', - BrickDamage.some: 'elementExplosive024.png', - BrickDamage.lots: 'elementExplosive054.png', - }, + BrickDamage.none: 'elementExplosive019.png', + BrickDamage.some: 'elementExplosive024.png', + BrickDamage.lots: 'elementExplosive054.png', + }, (BrickType.glass, BrickSize.size220x140) => { - BrickDamage.none: 'elementGlass020.png', - BrickDamage.some: 'elementGlass025.png', - BrickDamage.lots: 'elementGlass052.png', - }, + BrickDamage.none: 'elementGlass020.png', + BrickDamage.some: 'elementGlass025.png', + BrickDamage.lots: 'elementGlass052.png', + }, (BrickType.metal, BrickSize.size220x140) => { - BrickDamage.none: 'elementMetal019.png', - BrickDamage.some: 'elementMetal024.png', - BrickDamage.lots: 'elementMetal054.png', - }, + BrickDamage.none: 'elementMetal019.png', + BrickDamage.some: 'elementMetal024.png', + BrickDamage.lots: 'elementMetal054.png', + }, (BrickType.stone, BrickSize.size220x140) => { - BrickDamage.none: 'elementStone019.png', - BrickDamage.some: 'elementStone024.png', - BrickDamage.lots: 'elementStone051.png', - }, + BrickDamage.none: 'elementStone019.png', + BrickDamage.some: 'elementStone024.png', + BrickDamage.lots: 'elementStone051.png', + }, (BrickType.wood, BrickSize.size220x140) => { - BrickDamage.none: 'elementWood018.png', - BrickDamage.some: 'elementWood023.png', - BrickDamage.lots: 'elementWood050.png', - }, + BrickDamage.none: 'elementWood018.png', + BrickDamage.some: 'elementWood023.png', + BrickDamage.lots: 'elementWood050.png', + }, (BrickType.explosive, BrickSize.size70x220) => { - BrickDamage.none: 'elementExplosive020.png', - BrickDamage.some: 'elementExplosive025.png', - BrickDamage.lots: 'elementExplosive055.png', - }, + BrickDamage.none: 'elementExplosive020.png', + BrickDamage.some: 'elementExplosive025.png', + BrickDamage.lots: 'elementExplosive055.png', + }, (BrickType.glass, BrickSize.size70x220) => { - BrickDamage.none: 'elementGlass021.png', - BrickDamage.some: 'elementGlass026.png', - BrickDamage.lots: 'elementGlass053.png', - }, + BrickDamage.none: 'elementGlass021.png', + BrickDamage.some: 'elementGlass026.png', + BrickDamage.lots: 'elementGlass053.png', + }, (BrickType.metal, BrickSize.size70x220) => { - BrickDamage.none: 'elementMetal020.png', - BrickDamage.some: 'elementMetal025.png', - BrickDamage.lots: 'elementMetal055.png', - }, + BrickDamage.none: 'elementMetal020.png', + BrickDamage.some: 'elementMetal025.png', + BrickDamage.lots: 'elementMetal055.png', + }, (BrickType.stone, BrickSize.size70x220) => { - BrickDamage.none: 'elementStone020.png', - BrickDamage.some: 'elementStone025.png', - BrickDamage.lots: 'elementStone052.png', - }, + BrickDamage.none: 'elementStone020.png', + BrickDamage.some: 'elementStone025.png', + BrickDamage.lots: 'elementStone052.png', + }, (BrickType.wood, BrickSize.size70x220) => { - BrickDamage.none: 'elementWood019.png', - BrickDamage.some: 'elementWood024.png', - BrickDamage.lots: 'elementWood051.png', - }, + BrickDamage.none: 'elementWood019.png', + BrickDamage.some: 'elementWood024.png', + BrickDamage.lots: 'elementWood051.png', + }, (BrickType.explosive, BrickSize.size140x220) => { - BrickDamage.none: 'elementExplosive021.png', - BrickDamage.some: 'elementExplosive026.png', - BrickDamage.lots: 'elementExplosive056.png', - }, + BrickDamage.none: 'elementExplosive021.png', + BrickDamage.some: 'elementExplosive026.png', + BrickDamage.lots: 'elementExplosive056.png', + }, (BrickType.glass, BrickSize.size140x220) => { - BrickDamage.none: 'elementGlass022.png', - BrickDamage.some: 'elementGlass027.png', - BrickDamage.lots: 'elementGlass054.png', - }, + BrickDamage.none: 'elementGlass022.png', + BrickDamage.some: 'elementGlass027.png', + BrickDamage.lots: 'elementGlass054.png', + }, (BrickType.metal, BrickSize.size140x220) => { - BrickDamage.none: 'elementMetal021.png', - BrickDamage.some: 'elementMetal026.png', - BrickDamage.lots: 'elementMetal056.png', - }, + BrickDamage.none: 'elementMetal021.png', + BrickDamage.some: 'elementMetal026.png', + BrickDamage.lots: 'elementMetal056.png', + }, (BrickType.stone, BrickSize.size140x220) => { - BrickDamage.none: 'elementStone021.png', - BrickDamage.some: 'elementStone026.png', - BrickDamage.lots: 'elementStone053.png', - }, + BrickDamage.none: 'elementStone021.png', + BrickDamage.some: 'elementStone026.png', + BrickDamage.lots: 'elementStone053.png', + }, (BrickType.wood, BrickSize.size140x220) => { - BrickDamage.none: 'elementWood020.png', - BrickDamage.some: 'elementWood025.png', - BrickDamage.lots: 'elementWood052.png', - }, + BrickDamage.none: 'elementWood020.png', + BrickDamage.some: 'elementWood025.png', + BrickDamage.lots: 'elementWood052.png', + }, }; } - + class Brick extends BodyComponent { Brick({ required this.type, @@ -12230,39 +12225,40 @@ steps: required BrickDamage damage, required Vector2 position, required Map sprites, - }) : _damage = damage, - _sprites = sprites, - super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.dynamic, - fixtureDefs: [ - FixtureDef( - PolygonShape() - ..setAsBoxXY( - size.size.width / 20 * brickScale, - size.size.height / 20 * brickScale, - ), - ) - ..restitution = 0.4 - ..density = type.density - ..friction = type.friction - ]); - + }) : _damage = damage, + _sprites = sprites, + super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.dynamic, + fixtureDefs: [ + FixtureDef( + PolygonShape()..setAsBoxXY( + size.size.width / 20 * brickScale, + size.size.height / 20 * brickScale, + ), + ) + ..restitution = 0.4 + ..density = type.density + ..friction = type.friction, + ], + ); + late final SpriteComponent _spriteComponent; - + final BrickType type; final BrickSize size; final Map _sprites; - + BrickDamage _damage; BrickDamage get damage => _damage; set damage(BrickDamage value) { _damage = value; _spriteComponent.sprite = _sprites[value]; } - + @override Future onLoad() { _spriteComponent = SpriteComponent( @@ -12304,7 +12300,7 @@ steps: return super.onLoad(); } - @@ -61,4 +64,31 @@ class MyPhysicsGame extends Forge2DGame { + @@ -63,4 +66,30 @@ class MyPhysicsGame extends Forge2DGame { ), ]); } @@ -12321,21 +12317,23 @@ steps: + size: size, + damage: BrickDamage.some, + position: Vector2( - + camera.visibleWorldRect.right / 3 + - + (_random.nextDouble() * 5 - 2.5), - + 0), - + sprites: brickFileNames(type, size).map( - + (key, filename) => MapEntry( - + key, - + elements.getSprite(filename), - + ), + + camera.visibleWorldRect.right / 3 + + + (_random.nextDouble() * 5 - 2.5), + + 0, + ), + + sprites: brickFileNames( + + type, + + size, + + ).map((key, filename) => MapEntry(key, elements.getSprite(filename))), + ), + ); + await Future.delayed(const Duration(milliseconds: 500)); + } + } } + - name: Format lib/components/game.dart + path: forge2d_game + dart: format lib/components/game.dart - name: Build web app path: forge2d_game flutter: build web @@ -12382,21 +12380,22 @@ steps: class Player extends BodyComponent with DragCallbacks { Player(Vector2 position, Sprite sprite) - : _sprite = sprite, - super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.static - ..angularDamping = 0.1 - ..linearDamping = 0.1, - fixtureDefs: [ - FixtureDef(CircleShape()..radius = playerSize / 2) - ..restitution = 0.4 - ..density = 0.75 - ..friction = 0.5 - ], - ); + : _sprite = sprite, + super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.static + ..angularDamping = 0.1 + ..linearDamping = 0.1, + fixtureDefs: [ + FixtureDef(CircleShape()..radius = playerSize / 2) + ..restitution = 0.4 + ..density = 0.75 + ..friction = 0.5, + ], + ); final Sprite _sprite; @@ -12414,7 +12413,7 @@ steps: sprite: _sprite, size: Vector2(playerSize, playerSize), position: Vector2(0, 0), - ) + ), ]); return super.onLoad(); } @@ -12462,9 +12461,7 @@ steps: ?.removeFromParent(); body.setType(BodyType.dynamic); body.applyLinearImpulse(_dragDelta * -50); - add(RemoveEffect( - delay: 5.0, - )); + add(RemoveEffect(delay: 5.0)); } } } @@ -12484,12 +12481,13 @@ steps: if (player.dragDelta != Vector2.zero()) { var center = size.center(Offset.zero); canvas.drawLine( - center, - center + (player.dragDelta * -1).toOffset(), - Paint() - ..color = Colors.orange.withAlpha(180) - ..strokeWidth = 0.4 - ..strokeCap = StrokeCap.round); + center, + center + (player.dragDelta * -1).toOffset(), + Paint() + ..color = Colors.orange.withAlpha(180) + ..strokeWidth = 0.4 + ..strokeCap = StrokeCap.round, + ); } } @@ -12517,17 +12515,17 @@ steps: return super.onLoad(); } - @@ -91,4 +93,19 @@ class MyPhysicsGame extends Forge2DGame { + @@ -92,4 +94,19 @@ class MyPhysicsGame extends Forge2DGame { await Future.delayed(const Duration(milliseconds: 500)); } } + + Future addPlayer() async => world.add( - + Player( - + Vector2(camera.visibleWorldRect.left * 2 / 3, 0), - + aliens.getSprite(PlayerColor.randomColor.fileName), - + ), - + ); + + Player( + + Vector2(camera.visibleWorldRect.left * 2 / 3, 0), + + aliens.getSprite(PlayerColor.randomColor.fileName), + + ), + + ); + + @override + void update(double dt) { @@ -12617,8 +12615,8 @@ steps: -class Ground extends BodyComponent { +class Ground extends BodyComponentWithUserData { Ground(Vector2 position, Sprite sprite) - : super( - renderBody: false, + : super( + renderBody: false, - name: Patch lib/components/player.dart path: forge2d_game/lib/components/player.dart patch: | @@ -12640,8 +12638,8 @@ steps: -class Player extends BodyComponent with DragCallbacks { +class Player extends BodyComponentWithUserData with DragCallbacks { Player(Vector2 position, Sprite sprite) - : _sprite = sprite, - super( + : _sprite = sprite, + super( - name: Add lib/components/enemy.dart path: forge2d_game/lib/components/enemy.dart replace-contents: | @@ -12683,32 +12681,32 @@ steps: class Enemy extends BodyComponentWithUserData with ContactCallbacks { Enemy(Vector2 position, Sprite sprite) - : super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.dynamic, - fixtureDefs: [ - FixtureDef( - PolygonShape()..setAsBoxXY(enemySize / 2, enemySize / 2), - friction: 0.3, - ) - ], - children: [ - SpriteComponent( - anchor: Anchor.center, - sprite: sprite, - size: Vector2.all(enemySize), - position: Vector2(0, 0), - ), - ], - ); + : super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.dynamic, + fixtureDefs: [ + FixtureDef( + PolygonShape()..setAsBoxXY(enemySize / 2, enemySize / 2), + friction: 0.3, + ), + ], + children: [ + SpriteComponent( + anchor: Anchor.center, + sprite: sprite, + size: Vector2.all(enemySize), + position: Vector2(0, 0), + ), + ], + ); @override void beginContact(Object other, Contact contact) { var interceptVelocity = - (contact.bodyA.linearVelocity - contact.bodyB.linearVelocity) - .length + (contact.bodyA.linearVelocity - contact.bodyB.linearVelocity).length .abs(); if (interceptVelocity > 35) { removeFromParent(); @@ -12758,7 +12756,7 @@ steps: await addPlayer(); return super.onLoad(); - @@ -104,8 +106,49 @@ class MyPhysicsGame extends Forge2DGame { + @@ -105,8 +107,50 @@ class MyPhysicsGame extends Forge2DGame { @override void update(double dt) { super.update(dt); @@ -12798,9 +12796,10 @@ steps: + await world.add( + Enemy( + Vector2( - + camera.visibleWorldRect.right / 3 + - + (_random.nextDouble() * 7 - 3.5), - + (_random.nextDouble() * 3)), + + camera.visibleWorldRect.right / 3 + + + (_random.nextDouble() * 7 - 3.5), + + (_random.nextDouble() * 3), + + ), + aliens.getSprite(EnemyColor.randomColor.fileName), + ), + ); diff --git a/forge2d_game/step_02/android/.gitignore b/forge2d_game/step_02/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/forge2d_game/step_02/android/.gitignore +++ b/forge2d_game/step_02/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/forge2d_game/step_02/android/app/build.gradle b/forge2d_game/step_02/android/app/build.gradle deleted file mode 100644 index b365ef7190..0000000000 --- a/forge2d_game/step_02/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.forge2d_game" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.forge2d_game" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/forge2d_game/step_02/android/app/build.gradle.kts b/forge2d_game/step_02/android/app/build.gradle.kts new file mode 100644 index 0000000000..278549b682 --- /dev/null +++ b/forge2d_game/step_02/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.forge2d_game" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.forge2d_game" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/forge2d_game/step_02/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt b/forge2d_game/step_02/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt index 459f03328b..e9323498dd 100644 --- a/forge2d_game/step_02/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt +++ b/forge2d_game/step_02/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.forge2d_game import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/forge2d_game/step_02/android/build.gradle b/forge2d_game/step_02/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/forge2d_game/step_02/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/forge2d_game/step_02/android/build.gradle.kts b/forge2d_game/step_02/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/forge2d_game/step_02/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/forge2d_game/step_02/android/gradle.properties b/forge2d_game/step_02/android/gradle.properties index 2597170821..f018a61817 100644 --- a/forge2d_game/step_02/android/gradle.properties +++ b/forge2d_game/step_02/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/forge2d_game/step_02/android/gradle/wrapper/gradle-wrapper.properties b/forge2d_game/step_02/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/forge2d_game/step_02/android/gradle/wrapper/gradle-wrapper.properties +++ b/forge2d_game/step_02/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/forge2d_game/step_02/android/settings.gradle b/forge2d_game/step_02/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/forge2d_game/step_02/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/forge2d_game/step_02/android/settings.gradle.kts b/forge2d_game/step_02/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/forge2d_game/step_02/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/forge2d_game/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/forge2d_game/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/forge2d_game/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/forge2d_game/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/forge2d_game/step_02/lib/main.dart b/forge2d_game/step_02/lib/main.dart index e1b05964ed..ce03c23777 100644 --- a/forge2d_game/step_02/lib/main.dart +++ b/forge2d_game/step_02/lib/main.dart @@ -6,9 +6,5 @@ import 'package:flame/game.dart'; import 'package:flutter/material.dart'; void main() { - runApp( - GameWidget.controlled( - gameFactory: FlameGame.new, - ), - ); + runApp(GameWidget.controlled(gameFactory: FlameGame.new)); } diff --git a/forge2d_game/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/forge2d_game/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d0625c3fca..5fb87637db 100644 --- a/forge2d_game/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/forge2d_game/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/forge2d_game/step_02/pubspec.yaml b/forge2d_game/step_02/pubspec.yaml index 7bbb8d0ab4..645699a822 100644 --- a/forge2d_game/step_02/pubspec.yaml +++ b/forge2d_game/step_02/pubspec.yaml @@ -4,12 +4,12 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter - characters: ^1.3.0 + characters: ^1.4.0 flame: ^1.24.0 flame_forge2d: ^0.18.2+5 flame_kenney_xml: ^0.1.1+5 diff --git a/forge2d_game/step_03/android/.gitignore b/forge2d_game/step_03/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/forge2d_game/step_03/android/.gitignore +++ b/forge2d_game/step_03/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/forge2d_game/step_03/android/app/build.gradle b/forge2d_game/step_03/android/app/build.gradle deleted file mode 100644 index b365ef7190..0000000000 --- a/forge2d_game/step_03/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.forge2d_game" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.forge2d_game" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/forge2d_game/step_03/android/app/build.gradle.kts b/forge2d_game/step_03/android/app/build.gradle.kts new file mode 100644 index 0000000000..278549b682 --- /dev/null +++ b/forge2d_game/step_03/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.forge2d_game" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.forge2d_game" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/forge2d_game/step_03/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt b/forge2d_game/step_03/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt index 459f03328b..e9323498dd 100644 --- a/forge2d_game/step_03/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt +++ b/forge2d_game/step_03/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.forge2d_game import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/forge2d_game/step_03/android/build.gradle b/forge2d_game/step_03/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/forge2d_game/step_03/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/forge2d_game/step_03/android/build.gradle.kts b/forge2d_game/step_03/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/forge2d_game/step_03/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/forge2d_game/step_03/android/gradle.properties b/forge2d_game/step_03/android/gradle.properties index 2597170821..f018a61817 100644 --- a/forge2d_game/step_03/android/gradle.properties +++ b/forge2d_game/step_03/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/forge2d_game/step_03/android/gradle/wrapper/gradle-wrapper.properties b/forge2d_game/step_03/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/forge2d_game/step_03/android/gradle/wrapper/gradle-wrapper.properties +++ b/forge2d_game/step_03/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/forge2d_game/step_03/android/settings.gradle b/forge2d_game/step_03/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/forge2d_game/step_03/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/forge2d_game/step_03/android/settings.gradle.kts b/forge2d_game/step_03/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/forge2d_game/step_03/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/forge2d_game/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/forge2d_game/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/forge2d_game/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/forge2d_game/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/forge2d_game/step_03/lib/components/background.dart b/forge2d_game/step_03/lib/components/background.dart index 2263d589c2..d61d4635c2 100644 --- a/forge2d_game/step_03/lib/components/background.dart +++ b/forge2d_game/step_03/lib/components/background.dart @@ -8,18 +8,17 @@ import 'game.dart'; class Background extends SpriteComponent with HasGameReference { Background({required super.sprite}) - : super( - anchor: Anchor.center, - position: Vector2(0, 0), - ); + : super(anchor: Anchor.center, position: Vector2(0, 0)); @override void onMount() { super.onMount(); - size = Vector2.all(max( - game.camera.visibleWorldRect.width, - game.camera.visibleWorldRect.height, - )); + size = Vector2.all( + max( + game.camera.visibleWorldRect.width, + game.camera.visibleWorldRect.height, + ), + ); } } diff --git a/forge2d_game/step_03/lib/components/game.dart b/forge2d_game/step_03/lib/components/game.dart index 1698a4a2fb..5747f72b64 100644 --- a/forge2d_game/step_03/lib/components/game.dart +++ b/forge2d_game/step_03/lib/components/game.dart @@ -12,10 +12,10 @@ import 'background.dart'; class MyPhysicsGame extends Forge2DGame { MyPhysicsGame() - : super( - gravity: Vector2(0, 10), - camera: CameraComponent.withFixedResolution(width: 800, height: 600), - ); + : super( + gravity: Vector2(0, 10), + camera: CameraComponent.withFixedResolution(width: 800, height: 600), + ); late final XmlSpriteSheet aliens; late final XmlSpriteSheet elements; diff --git a/forge2d_game/step_03/lib/main.dart b/forge2d_game/step_03/lib/main.dart index 8e82ff7fb6..37929857ee 100644 --- a/forge2d_game/step_03/lib/main.dart +++ b/forge2d_game/step_03/lib/main.dart @@ -8,9 +8,5 @@ import 'package:flutter/material.dart'; import 'components/game.dart'; void main() { - runApp( - GameWidget.controlled( - gameFactory: MyPhysicsGame.new, - ), - ); + runApp(GameWidget.controlled(gameFactory: MyPhysicsGame.new)); } diff --git a/forge2d_game/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/forge2d_game/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d0625c3fca..5fb87637db 100644 --- a/forge2d_game/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/forge2d_game/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/forge2d_game/step_03/pubspec.yaml b/forge2d_game/step_03/pubspec.yaml index 4a432aed73..7f4dda718b 100644 --- a/forge2d_game/step_03/pubspec.yaml +++ b/forge2d_game/step_03/pubspec.yaml @@ -4,12 +4,12 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter - characters: ^1.3.0 + characters: ^1.4.0 flame: ^1.24.0 flame_forge2d: ^0.18.2+5 flame_kenney_xml: ^0.1.1+5 diff --git a/forge2d_game/step_04/android/.gitignore b/forge2d_game/step_04/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/forge2d_game/step_04/android/.gitignore +++ b/forge2d_game/step_04/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/forge2d_game/step_04/android/app/build.gradle b/forge2d_game/step_04/android/app/build.gradle deleted file mode 100644 index b365ef7190..0000000000 --- a/forge2d_game/step_04/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.forge2d_game" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.forge2d_game" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/forge2d_game/step_04/android/app/build.gradle.kts b/forge2d_game/step_04/android/app/build.gradle.kts new file mode 100644 index 0000000000..278549b682 --- /dev/null +++ b/forge2d_game/step_04/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.forge2d_game" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.forge2d_game" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/forge2d_game/step_04/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt b/forge2d_game/step_04/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt index 459f03328b..e9323498dd 100644 --- a/forge2d_game/step_04/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt +++ b/forge2d_game/step_04/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.forge2d_game import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/forge2d_game/step_04/android/build.gradle b/forge2d_game/step_04/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/forge2d_game/step_04/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/forge2d_game/step_04/android/build.gradle.kts b/forge2d_game/step_04/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/forge2d_game/step_04/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/forge2d_game/step_04/android/gradle.properties b/forge2d_game/step_04/android/gradle.properties index 2597170821..f018a61817 100644 --- a/forge2d_game/step_04/android/gradle.properties +++ b/forge2d_game/step_04/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/forge2d_game/step_04/android/gradle/wrapper/gradle-wrapper.properties b/forge2d_game/step_04/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/forge2d_game/step_04/android/gradle/wrapper/gradle-wrapper.properties +++ b/forge2d_game/step_04/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/forge2d_game/step_04/android/settings.gradle b/forge2d_game/step_04/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/forge2d_game/step_04/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/forge2d_game/step_04/android/settings.gradle.kts b/forge2d_game/step_04/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/forge2d_game/step_04/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/forge2d_game/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/forge2d_game/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/forge2d_game/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/forge2d_game/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/forge2d_game/step_04/lib/components/background.dart b/forge2d_game/step_04/lib/components/background.dart index 2263d589c2..d61d4635c2 100644 --- a/forge2d_game/step_04/lib/components/background.dart +++ b/forge2d_game/step_04/lib/components/background.dart @@ -8,18 +8,17 @@ import 'game.dart'; class Background extends SpriteComponent with HasGameReference { Background({required super.sprite}) - : super( - anchor: Anchor.center, - position: Vector2(0, 0), - ); + : super(anchor: Anchor.center, position: Vector2(0, 0)); @override void onMount() { super.onMount(); - size = Vector2.all(max( - game.camera.visibleWorldRect.width, - game.camera.visibleWorldRect.height, - )); + size = Vector2.all( + max( + game.camera.visibleWorldRect.width, + game.camera.visibleWorldRect.height, + ), + ); } } diff --git a/forge2d_game/step_04/lib/components/game.dart b/forge2d_game/step_04/lib/components/game.dart index 2e66855871..0dc2806902 100644 --- a/forge2d_game/step_04/lib/components/game.dart +++ b/forge2d_game/step_04/lib/components/game.dart @@ -13,10 +13,10 @@ import 'ground.dart'; class MyPhysicsGame extends Forge2DGame { MyPhysicsGame() - : super( - gravity: Vector2(0, 10), - camera: CameraComponent.withFixedResolution(width: 800, height: 600), - ); + : super( + gravity: Vector2(0, 10), + camera: CameraComponent.withFixedResolution(width: 800, height: 600), + ); late final XmlSpriteSheet aliens; late final XmlSpriteSheet elements; @@ -52,9 +52,11 @@ class MyPhysicsGame extends Forge2DGame { Future addGround() { return world.addAll([ - for (var x = camera.visibleWorldRect.left; - x < camera.visibleWorldRect.right + groundSize; - x += groundSize) + for ( + var x = camera.visibleWorldRect.left; + x < camera.visibleWorldRect.right + groundSize; + x += groundSize + ) Ground( Vector2(x, (camera.visibleWorldRect.height - groundSize) / 2), tiles.getSprite('grass.png'), diff --git a/forge2d_game/step_04/lib/components/ground.dart b/forge2d_game/step_04/lib/components/ground.dart index c1346bf788..2a4fef62e4 100644 --- a/forge2d_game/step_04/lib/components/ground.dart +++ b/forge2d_game/step_04/lib/components/ground.dart @@ -9,24 +9,25 @@ const groundSize = 7.0; class Ground extends BodyComponent { Ground(Vector2 position, Sprite sprite) - : super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.static, - fixtureDefs: [ - FixtureDef( - PolygonShape()..setAsBoxXY(groundSize / 2, groundSize / 2), - friction: 0.3, - ) - ], - children: [ - SpriteComponent( - anchor: Anchor.center, - sprite: sprite, - size: Vector2.all(groundSize), - position: Vector2(0, 0), - ), - ], - ); + : super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.static, + fixtureDefs: [ + FixtureDef( + PolygonShape()..setAsBoxXY(groundSize / 2, groundSize / 2), + friction: 0.3, + ), + ], + children: [ + SpriteComponent( + anchor: Anchor.center, + sprite: sprite, + size: Vector2.all(groundSize), + position: Vector2(0, 0), + ), + ], + ); } diff --git a/forge2d_game/step_04/lib/main.dart b/forge2d_game/step_04/lib/main.dart index 8e82ff7fb6..37929857ee 100644 --- a/forge2d_game/step_04/lib/main.dart +++ b/forge2d_game/step_04/lib/main.dart @@ -8,9 +8,5 @@ import 'package:flutter/material.dart'; import 'components/game.dart'; void main() { - runApp( - GameWidget.controlled( - gameFactory: MyPhysicsGame.new, - ), - ); + runApp(GameWidget.controlled(gameFactory: MyPhysicsGame.new)); } diff --git a/forge2d_game/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/forge2d_game/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d0625c3fca..5fb87637db 100644 --- a/forge2d_game/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/forge2d_game/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/forge2d_game/step_04/pubspec.yaml b/forge2d_game/step_04/pubspec.yaml index 4a432aed73..7f4dda718b 100644 --- a/forge2d_game/step_04/pubspec.yaml +++ b/forge2d_game/step_04/pubspec.yaml @@ -4,12 +4,12 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter - characters: ^1.3.0 + characters: ^1.4.0 flame: ^1.24.0 flame_forge2d: ^0.18.2+5 flame_kenney_xml: ^0.1.1+5 diff --git a/forge2d_game/step_05/android/.gitignore b/forge2d_game/step_05/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/forge2d_game/step_05/android/.gitignore +++ b/forge2d_game/step_05/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/forge2d_game/step_05/android/app/build.gradle b/forge2d_game/step_05/android/app/build.gradle deleted file mode 100644 index b365ef7190..0000000000 --- a/forge2d_game/step_05/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.forge2d_game" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.forge2d_game" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/forge2d_game/step_05/android/app/build.gradle.kts b/forge2d_game/step_05/android/app/build.gradle.kts new file mode 100644 index 0000000000..278549b682 --- /dev/null +++ b/forge2d_game/step_05/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.forge2d_game" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.forge2d_game" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/forge2d_game/step_05/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt b/forge2d_game/step_05/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt index 459f03328b..e9323498dd 100644 --- a/forge2d_game/step_05/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt +++ b/forge2d_game/step_05/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.forge2d_game import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/forge2d_game/step_05/android/build.gradle b/forge2d_game/step_05/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/forge2d_game/step_05/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/forge2d_game/step_05/android/build.gradle.kts b/forge2d_game/step_05/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/forge2d_game/step_05/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/forge2d_game/step_05/android/gradle.properties b/forge2d_game/step_05/android/gradle.properties index 2597170821..f018a61817 100644 --- a/forge2d_game/step_05/android/gradle.properties +++ b/forge2d_game/step_05/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/forge2d_game/step_05/android/gradle/wrapper/gradle-wrapper.properties b/forge2d_game/step_05/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/forge2d_game/step_05/android/gradle/wrapper/gradle-wrapper.properties +++ b/forge2d_game/step_05/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/forge2d_game/step_05/android/settings.gradle b/forge2d_game/step_05/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/forge2d_game/step_05/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/forge2d_game/step_05/android/settings.gradle.kts b/forge2d_game/step_05/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/forge2d_game/step_05/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/forge2d_game/step_05/bin/generate_brick_file_names.dart b/forge2d_game/step_05/bin/generate_brick_file_names.dart index e315ec899a..ba1ad0af27 100644 --- a/forge2d_game/step_05/bin/generate_brick_file_names.dart +++ b/forge2d_game/step_05/bin/generate_brick_file_names.dart @@ -30,11 +30,12 @@ class Rect extends Equatable { final int y; final int width; final int height; - const Rect( - {required this.x, - required this.y, - required this.width, - required this.height}); + const Rect({ + required this.x, + required this.y, + required this.width, + required this.height, + }); Size get size => Size(width, height); diff --git a/forge2d_game/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/forge2d_game/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/forge2d_game/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/forge2d_game/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/forge2d_game/step_05/lib/components/background.dart b/forge2d_game/step_05/lib/components/background.dart index 2263d589c2..d61d4635c2 100644 --- a/forge2d_game/step_05/lib/components/background.dart +++ b/forge2d_game/step_05/lib/components/background.dart @@ -8,18 +8,17 @@ import 'game.dart'; class Background extends SpriteComponent with HasGameReference { Background({required super.sprite}) - : super( - anchor: Anchor.center, - position: Vector2(0, 0), - ); + : super(anchor: Anchor.center, position: Vector2(0, 0)); @override void onMount() { super.onMount(); - size = Vector2.all(max( - game.camera.visibleWorldRect.width, - game.camera.visibleWorldRect.height, - )); + size = Vector2.all( + max( + game.camera.visibleWorldRect.width, + game.camera.visibleWorldRect.height, + ), + ); } } diff --git a/forge2d_game/step_05/lib/components/brick.dart b/forge2d_game/step_05/lib/components/brick.dart index 4f460405c4..123bcf2065 100644 --- a/forge2d_game/step_05/lib/components/brick.dart +++ b/forge2d_game/step_05/lib/components/brick.dart @@ -47,205 +47,205 @@ enum BrickDamage { none, some, lots } Map brickFileNames(BrickType type, BrickSize size) { return switch ((type, size)) { (BrickType.explosive, BrickSize.size140x70) => { - BrickDamage.none: 'elementExplosive009.png', - BrickDamage.some: 'elementExplosive012.png', - BrickDamage.lots: 'elementExplosive050.png', - }, + BrickDamage.none: 'elementExplosive009.png', + BrickDamage.some: 'elementExplosive012.png', + BrickDamage.lots: 'elementExplosive050.png', + }, (BrickType.glass, BrickSize.size140x70) => { - BrickDamage.none: 'elementGlass010.png', - BrickDamage.some: 'elementGlass013.png', - BrickDamage.lots: 'elementGlass048.png', - }, + BrickDamage.none: 'elementGlass010.png', + BrickDamage.some: 'elementGlass013.png', + BrickDamage.lots: 'elementGlass048.png', + }, (BrickType.metal, BrickSize.size140x70) => { - BrickDamage.none: 'elementMetal009.png', - BrickDamage.some: 'elementMetal012.png', - BrickDamage.lots: 'elementMetal050.png', - }, + BrickDamage.none: 'elementMetal009.png', + BrickDamage.some: 'elementMetal012.png', + BrickDamage.lots: 'elementMetal050.png', + }, (BrickType.stone, BrickSize.size140x70) => { - BrickDamage.none: 'elementStone009.png', - BrickDamage.some: 'elementStone012.png', - BrickDamage.lots: 'elementStone047.png', - }, + BrickDamage.none: 'elementStone009.png', + BrickDamage.some: 'elementStone012.png', + BrickDamage.lots: 'elementStone047.png', + }, (BrickType.wood, BrickSize.size140x70) => { - BrickDamage.none: 'elementWood011.png', - BrickDamage.some: 'elementWood014.png', - BrickDamage.lots: 'elementWood054.png', - }, + BrickDamage.none: 'elementWood011.png', + BrickDamage.some: 'elementWood014.png', + BrickDamage.lots: 'elementWood054.png', + }, (BrickType.explosive, BrickSize.size70x70) => { - BrickDamage.none: 'elementExplosive011.png', - BrickDamage.some: 'elementExplosive014.png', - BrickDamage.lots: 'elementExplosive049.png', - }, + BrickDamage.none: 'elementExplosive011.png', + BrickDamage.some: 'elementExplosive014.png', + BrickDamage.lots: 'elementExplosive049.png', + }, (BrickType.glass, BrickSize.size70x70) => { - BrickDamage.none: 'elementGlass011.png', - BrickDamage.some: 'elementGlass012.png', - BrickDamage.lots: 'elementGlass046.png', - }, + BrickDamage.none: 'elementGlass011.png', + BrickDamage.some: 'elementGlass012.png', + BrickDamage.lots: 'elementGlass046.png', + }, (BrickType.metal, BrickSize.size70x70) => { - BrickDamage.none: 'elementMetal011.png', - BrickDamage.some: 'elementMetal014.png', - BrickDamage.lots: 'elementMetal049.png', - }, + BrickDamage.none: 'elementMetal011.png', + BrickDamage.some: 'elementMetal014.png', + BrickDamage.lots: 'elementMetal049.png', + }, (BrickType.stone, BrickSize.size70x70) => { - BrickDamage.none: 'elementStone011.png', - BrickDamage.some: 'elementStone014.png', - BrickDamage.lots: 'elementStone046.png', - }, + BrickDamage.none: 'elementStone011.png', + BrickDamage.some: 'elementStone014.png', + BrickDamage.lots: 'elementStone046.png', + }, (BrickType.wood, BrickSize.size70x70) => { - BrickDamage.none: 'elementWood010.png', - BrickDamage.some: 'elementWood013.png', - BrickDamage.lots: 'elementWood045.png', - }, + BrickDamage.none: 'elementWood010.png', + BrickDamage.some: 'elementWood013.png', + BrickDamage.lots: 'elementWood045.png', + }, (BrickType.explosive, BrickSize.size220x70) => { - BrickDamage.none: 'elementExplosive013.png', - BrickDamage.some: 'elementExplosive016.png', - BrickDamage.lots: 'elementExplosive051.png', - }, + BrickDamage.none: 'elementExplosive013.png', + BrickDamage.some: 'elementExplosive016.png', + BrickDamage.lots: 'elementExplosive051.png', + }, (BrickType.glass, BrickSize.size220x70) => { - BrickDamage.none: 'elementGlass014.png', - BrickDamage.some: 'elementGlass017.png', - BrickDamage.lots: 'elementGlass049.png', - }, + BrickDamage.none: 'elementGlass014.png', + BrickDamage.some: 'elementGlass017.png', + BrickDamage.lots: 'elementGlass049.png', + }, (BrickType.metal, BrickSize.size220x70) => { - BrickDamage.none: 'elementMetal013.png', - BrickDamage.some: 'elementMetal016.png', - BrickDamage.lots: 'elementMetal051.png', - }, + BrickDamage.none: 'elementMetal013.png', + BrickDamage.some: 'elementMetal016.png', + BrickDamage.lots: 'elementMetal051.png', + }, (BrickType.stone, BrickSize.size220x70) => { - BrickDamage.none: 'elementStone013.png', - BrickDamage.some: 'elementStone016.png', - BrickDamage.lots: 'elementStone048.png', - }, + BrickDamage.none: 'elementStone013.png', + BrickDamage.some: 'elementStone016.png', + BrickDamage.lots: 'elementStone048.png', + }, (BrickType.wood, BrickSize.size220x70) => { - BrickDamage.none: 'elementWood012.png', - BrickDamage.some: 'elementWood015.png', - BrickDamage.lots: 'elementWood047.png', - }, + BrickDamage.none: 'elementWood012.png', + BrickDamage.some: 'elementWood015.png', + BrickDamage.lots: 'elementWood047.png', + }, (BrickType.explosive, BrickSize.size70x140) => { - BrickDamage.none: 'elementExplosive017.png', - BrickDamage.some: 'elementExplosive022.png', - BrickDamage.lots: 'elementExplosive052.png', - }, + BrickDamage.none: 'elementExplosive017.png', + BrickDamage.some: 'elementExplosive022.png', + BrickDamage.lots: 'elementExplosive052.png', + }, (BrickType.glass, BrickSize.size70x140) => { - BrickDamage.none: 'elementGlass018.png', - BrickDamage.some: 'elementGlass023.png', - BrickDamage.lots: 'elementGlass050.png', - }, + BrickDamage.none: 'elementGlass018.png', + BrickDamage.some: 'elementGlass023.png', + BrickDamage.lots: 'elementGlass050.png', + }, (BrickType.metal, BrickSize.size70x140) => { - BrickDamage.none: 'elementMetal017.png', - BrickDamage.some: 'elementMetal022.png', - BrickDamage.lots: 'elementMetal052.png', - }, + BrickDamage.none: 'elementMetal017.png', + BrickDamage.some: 'elementMetal022.png', + BrickDamage.lots: 'elementMetal052.png', + }, (BrickType.stone, BrickSize.size70x140) => { - BrickDamage.none: 'elementStone017.png', - BrickDamage.some: 'elementStone022.png', - BrickDamage.lots: 'elementStone049.png', - }, + BrickDamage.none: 'elementStone017.png', + BrickDamage.some: 'elementStone022.png', + BrickDamage.lots: 'elementStone049.png', + }, (BrickType.wood, BrickSize.size70x140) => { - BrickDamage.none: 'elementWood016.png', - BrickDamage.some: 'elementWood021.png', - BrickDamage.lots: 'elementWood048.png', - }, + BrickDamage.none: 'elementWood016.png', + BrickDamage.some: 'elementWood021.png', + BrickDamage.lots: 'elementWood048.png', + }, (BrickType.explosive, BrickSize.size140x140) => { - BrickDamage.none: 'elementExplosive018.png', - BrickDamage.some: 'elementExplosive023.png', - BrickDamage.lots: 'elementExplosive053.png', - }, + BrickDamage.none: 'elementExplosive018.png', + BrickDamage.some: 'elementExplosive023.png', + BrickDamage.lots: 'elementExplosive053.png', + }, (BrickType.glass, BrickSize.size140x140) => { - BrickDamage.none: 'elementGlass019.png', - BrickDamage.some: 'elementGlass024.png', - BrickDamage.lots: 'elementGlass051.png', - }, + BrickDamage.none: 'elementGlass019.png', + BrickDamage.some: 'elementGlass024.png', + BrickDamage.lots: 'elementGlass051.png', + }, (BrickType.metal, BrickSize.size140x140) => { - BrickDamage.none: 'elementMetal018.png', - BrickDamage.some: 'elementMetal023.png', - BrickDamage.lots: 'elementMetal053.png', - }, + BrickDamage.none: 'elementMetal018.png', + BrickDamage.some: 'elementMetal023.png', + BrickDamage.lots: 'elementMetal053.png', + }, (BrickType.stone, BrickSize.size140x140) => { - BrickDamage.none: 'elementStone018.png', - BrickDamage.some: 'elementStone023.png', - BrickDamage.lots: 'elementStone050.png', - }, + BrickDamage.none: 'elementStone018.png', + BrickDamage.some: 'elementStone023.png', + BrickDamage.lots: 'elementStone050.png', + }, (BrickType.wood, BrickSize.size140x140) => { - BrickDamage.none: 'elementWood017.png', - BrickDamage.some: 'elementWood022.png', - BrickDamage.lots: 'elementWood049.png', - }, + BrickDamage.none: 'elementWood017.png', + BrickDamage.some: 'elementWood022.png', + BrickDamage.lots: 'elementWood049.png', + }, (BrickType.explosive, BrickSize.size220x140) => { - BrickDamage.none: 'elementExplosive019.png', - BrickDamage.some: 'elementExplosive024.png', - BrickDamage.lots: 'elementExplosive054.png', - }, + BrickDamage.none: 'elementExplosive019.png', + BrickDamage.some: 'elementExplosive024.png', + BrickDamage.lots: 'elementExplosive054.png', + }, (BrickType.glass, BrickSize.size220x140) => { - BrickDamage.none: 'elementGlass020.png', - BrickDamage.some: 'elementGlass025.png', - BrickDamage.lots: 'elementGlass052.png', - }, + BrickDamage.none: 'elementGlass020.png', + BrickDamage.some: 'elementGlass025.png', + BrickDamage.lots: 'elementGlass052.png', + }, (BrickType.metal, BrickSize.size220x140) => { - BrickDamage.none: 'elementMetal019.png', - BrickDamage.some: 'elementMetal024.png', - BrickDamage.lots: 'elementMetal054.png', - }, + BrickDamage.none: 'elementMetal019.png', + BrickDamage.some: 'elementMetal024.png', + BrickDamage.lots: 'elementMetal054.png', + }, (BrickType.stone, BrickSize.size220x140) => { - BrickDamage.none: 'elementStone019.png', - BrickDamage.some: 'elementStone024.png', - BrickDamage.lots: 'elementStone051.png', - }, + BrickDamage.none: 'elementStone019.png', + BrickDamage.some: 'elementStone024.png', + BrickDamage.lots: 'elementStone051.png', + }, (BrickType.wood, BrickSize.size220x140) => { - BrickDamage.none: 'elementWood018.png', - BrickDamage.some: 'elementWood023.png', - BrickDamage.lots: 'elementWood050.png', - }, + BrickDamage.none: 'elementWood018.png', + BrickDamage.some: 'elementWood023.png', + BrickDamage.lots: 'elementWood050.png', + }, (BrickType.explosive, BrickSize.size70x220) => { - BrickDamage.none: 'elementExplosive020.png', - BrickDamage.some: 'elementExplosive025.png', - BrickDamage.lots: 'elementExplosive055.png', - }, + BrickDamage.none: 'elementExplosive020.png', + BrickDamage.some: 'elementExplosive025.png', + BrickDamage.lots: 'elementExplosive055.png', + }, (BrickType.glass, BrickSize.size70x220) => { - BrickDamage.none: 'elementGlass021.png', - BrickDamage.some: 'elementGlass026.png', - BrickDamage.lots: 'elementGlass053.png', - }, + BrickDamage.none: 'elementGlass021.png', + BrickDamage.some: 'elementGlass026.png', + BrickDamage.lots: 'elementGlass053.png', + }, (BrickType.metal, BrickSize.size70x220) => { - BrickDamage.none: 'elementMetal020.png', - BrickDamage.some: 'elementMetal025.png', - BrickDamage.lots: 'elementMetal055.png', - }, + BrickDamage.none: 'elementMetal020.png', + BrickDamage.some: 'elementMetal025.png', + BrickDamage.lots: 'elementMetal055.png', + }, (BrickType.stone, BrickSize.size70x220) => { - BrickDamage.none: 'elementStone020.png', - BrickDamage.some: 'elementStone025.png', - BrickDamage.lots: 'elementStone052.png', - }, + BrickDamage.none: 'elementStone020.png', + BrickDamage.some: 'elementStone025.png', + BrickDamage.lots: 'elementStone052.png', + }, (BrickType.wood, BrickSize.size70x220) => { - BrickDamage.none: 'elementWood019.png', - BrickDamage.some: 'elementWood024.png', - BrickDamage.lots: 'elementWood051.png', - }, + BrickDamage.none: 'elementWood019.png', + BrickDamage.some: 'elementWood024.png', + BrickDamage.lots: 'elementWood051.png', + }, (BrickType.explosive, BrickSize.size140x220) => { - BrickDamage.none: 'elementExplosive021.png', - BrickDamage.some: 'elementExplosive026.png', - BrickDamage.lots: 'elementExplosive056.png', - }, + BrickDamage.none: 'elementExplosive021.png', + BrickDamage.some: 'elementExplosive026.png', + BrickDamage.lots: 'elementExplosive056.png', + }, (BrickType.glass, BrickSize.size140x220) => { - BrickDamage.none: 'elementGlass022.png', - BrickDamage.some: 'elementGlass027.png', - BrickDamage.lots: 'elementGlass054.png', - }, + BrickDamage.none: 'elementGlass022.png', + BrickDamage.some: 'elementGlass027.png', + BrickDamage.lots: 'elementGlass054.png', + }, (BrickType.metal, BrickSize.size140x220) => { - BrickDamage.none: 'elementMetal021.png', - BrickDamage.some: 'elementMetal026.png', - BrickDamage.lots: 'elementMetal056.png', - }, + BrickDamage.none: 'elementMetal021.png', + BrickDamage.some: 'elementMetal026.png', + BrickDamage.lots: 'elementMetal056.png', + }, (BrickType.stone, BrickSize.size140x220) => { - BrickDamage.none: 'elementStone021.png', - BrickDamage.some: 'elementStone026.png', - BrickDamage.lots: 'elementStone053.png', - }, + BrickDamage.none: 'elementStone021.png', + BrickDamage.some: 'elementStone026.png', + BrickDamage.lots: 'elementStone053.png', + }, (BrickType.wood, BrickSize.size140x220) => { - BrickDamage.none: 'elementWood020.png', - BrickDamage.some: 'elementWood025.png', - BrickDamage.lots: 'elementWood052.png', - }, + BrickDamage.none: 'elementWood020.png', + BrickDamage.some: 'elementWood025.png', + BrickDamage.lots: 'elementWood052.png', + }, }; } @@ -256,25 +256,26 @@ class Brick extends BodyComponent { required BrickDamage damage, required Vector2 position, required Map sprites, - }) : _damage = damage, - _sprites = sprites, - super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.dynamic, - fixtureDefs: [ - FixtureDef( - PolygonShape() - ..setAsBoxXY( - size.size.width / 20 * brickScale, - size.size.height / 20 * brickScale, - ), - ) - ..restitution = 0.4 - ..density = type.density - ..friction = type.friction - ]); + }) : _damage = damage, + _sprites = sprites, + super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.dynamic, + fixtureDefs: [ + FixtureDef( + PolygonShape()..setAsBoxXY( + size.size.width / 20 * brickScale, + size.size.height / 20 * brickScale, + ), + ) + ..restitution = 0.4 + ..density = type.density + ..friction = type.friction, + ], + ); late final SpriteComponent _spriteComponent; diff --git a/forge2d_game/step_05/lib/components/game.dart b/forge2d_game/step_05/lib/components/game.dart index 4642e7d2a1..36f2c247d5 100644 --- a/forge2d_game/step_05/lib/components/game.dart +++ b/forge2d_game/step_05/lib/components/game.dart @@ -15,10 +15,10 @@ import 'ground.dart'; class MyPhysicsGame extends Forge2DGame { MyPhysicsGame() - : super( - gravity: Vector2(0, 10), - camera: CameraComponent.withFixedResolution(width: 800, height: 600), - ); + : super( + gravity: Vector2(0, 10), + camera: CameraComponent.withFixedResolution(width: 800, height: 600), + ); late final XmlSpriteSheet aliens; late final XmlSpriteSheet elements; @@ -55,9 +55,11 @@ class MyPhysicsGame extends Forge2DGame { Future addGround() { return world.addAll([ - for (var x = camera.visibleWorldRect.left; - x < camera.visibleWorldRect.right + groundSize; - x += groundSize) + for ( + var x = camera.visibleWorldRect.left; + x < camera.visibleWorldRect.right + groundSize; + x += groundSize + ) Ground( Vector2(x, (camera.visibleWorldRect.height - groundSize) / 2), tiles.getSprite('grass.png'), @@ -77,15 +79,14 @@ class MyPhysicsGame extends Forge2DGame { size: size, damage: BrickDamage.some, position: Vector2( - camera.visibleWorldRect.right / 3 + - (_random.nextDouble() * 5 - 2.5), - 0), - sprites: brickFileNames(type, size).map( - (key, filename) => MapEntry( - key, - elements.getSprite(filename), - ), + camera.visibleWorldRect.right / 3 + + (_random.nextDouble() * 5 - 2.5), + 0, ), + sprites: brickFileNames( + type, + size, + ).map((key, filename) => MapEntry(key, elements.getSprite(filename))), ), ); await Future.delayed(const Duration(milliseconds: 500)); diff --git a/forge2d_game/step_05/lib/components/ground.dart b/forge2d_game/step_05/lib/components/ground.dart index c1346bf788..2a4fef62e4 100644 --- a/forge2d_game/step_05/lib/components/ground.dart +++ b/forge2d_game/step_05/lib/components/ground.dart @@ -9,24 +9,25 @@ const groundSize = 7.0; class Ground extends BodyComponent { Ground(Vector2 position, Sprite sprite) - : super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.static, - fixtureDefs: [ - FixtureDef( - PolygonShape()..setAsBoxXY(groundSize / 2, groundSize / 2), - friction: 0.3, - ) - ], - children: [ - SpriteComponent( - anchor: Anchor.center, - sprite: sprite, - size: Vector2.all(groundSize), - position: Vector2(0, 0), - ), - ], - ); + : super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.static, + fixtureDefs: [ + FixtureDef( + PolygonShape()..setAsBoxXY(groundSize / 2, groundSize / 2), + friction: 0.3, + ), + ], + children: [ + SpriteComponent( + anchor: Anchor.center, + sprite: sprite, + size: Vector2.all(groundSize), + position: Vector2(0, 0), + ), + ], + ); } diff --git a/forge2d_game/step_05/lib/main.dart b/forge2d_game/step_05/lib/main.dart index 8e82ff7fb6..37929857ee 100644 --- a/forge2d_game/step_05/lib/main.dart +++ b/forge2d_game/step_05/lib/main.dart @@ -8,9 +8,5 @@ import 'package:flutter/material.dart'; import 'components/game.dart'; void main() { - runApp( - GameWidget.controlled( - gameFactory: MyPhysicsGame.new, - ), - ); + runApp(GameWidget.controlled(gameFactory: MyPhysicsGame.new)); } diff --git a/forge2d_game/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/forge2d_game/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d0625c3fca..5fb87637db 100644 --- a/forge2d_game/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/forge2d_game/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/forge2d_game/step_05/pubspec.yaml b/forge2d_game/step_05/pubspec.yaml index e1cb03eee2..c9bd4375cd 100644 --- a/forge2d_game/step_05/pubspec.yaml +++ b/forge2d_game/step_05/pubspec.yaml @@ -4,12 +4,12 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter - characters: ^1.3.0 + characters: ^1.4.0 flame: ^1.24.0 flame_forge2d: ^0.18.2+5 flame_kenney_xml: ^0.1.1+5 diff --git a/forge2d_game/step_06/android/.gitignore b/forge2d_game/step_06/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/forge2d_game/step_06/android/.gitignore +++ b/forge2d_game/step_06/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/forge2d_game/step_06/android/app/build.gradle b/forge2d_game/step_06/android/app/build.gradle deleted file mode 100644 index b365ef7190..0000000000 --- a/forge2d_game/step_06/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.forge2d_game" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.forge2d_game" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/forge2d_game/step_06/android/app/build.gradle.kts b/forge2d_game/step_06/android/app/build.gradle.kts new file mode 100644 index 0000000000..278549b682 --- /dev/null +++ b/forge2d_game/step_06/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.forge2d_game" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.forge2d_game" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/forge2d_game/step_06/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt b/forge2d_game/step_06/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt index 459f03328b..e9323498dd 100644 --- a/forge2d_game/step_06/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt +++ b/forge2d_game/step_06/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.forge2d_game import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/forge2d_game/step_06/android/build.gradle b/forge2d_game/step_06/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/forge2d_game/step_06/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/forge2d_game/step_06/android/build.gradle.kts b/forge2d_game/step_06/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/forge2d_game/step_06/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/forge2d_game/step_06/android/gradle.properties b/forge2d_game/step_06/android/gradle.properties index 2597170821..f018a61817 100644 --- a/forge2d_game/step_06/android/gradle.properties +++ b/forge2d_game/step_06/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/forge2d_game/step_06/android/gradle/wrapper/gradle-wrapper.properties b/forge2d_game/step_06/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/forge2d_game/step_06/android/gradle/wrapper/gradle-wrapper.properties +++ b/forge2d_game/step_06/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/forge2d_game/step_06/android/settings.gradle b/forge2d_game/step_06/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/forge2d_game/step_06/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/forge2d_game/step_06/android/settings.gradle.kts b/forge2d_game/step_06/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/forge2d_game/step_06/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/forge2d_game/step_06/bin/generate_brick_file_names.dart b/forge2d_game/step_06/bin/generate_brick_file_names.dart index e315ec899a..ba1ad0af27 100644 --- a/forge2d_game/step_06/bin/generate_brick_file_names.dart +++ b/forge2d_game/step_06/bin/generate_brick_file_names.dart @@ -30,11 +30,12 @@ class Rect extends Equatable { final int y; final int width; final int height; - const Rect( - {required this.x, - required this.y, - required this.width, - required this.height}); + const Rect({ + required this.x, + required this.y, + required this.width, + required this.height, + }); Size get size => Size(width, height); diff --git a/forge2d_game/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/forge2d_game/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/forge2d_game/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/forge2d_game/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/forge2d_game/step_06/lib/components/background.dart b/forge2d_game/step_06/lib/components/background.dart index 2263d589c2..d61d4635c2 100644 --- a/forge2d_game/step_06/lib/components/background.dart +++ b/forge2d_game/step_06/lib/components/background.dart @@ -8,18 +8,17 @@ import 'game.dart'; class Background extends SpriteComponent with HasGameReference { Background({required super.sprite}) - : super( - anchor: Anchor.center, - position: Vector2(0, 0), - ); + : super(anchor: Anchor.center, position: Vector2(0, 0)); @override void onMount() { super.onMount(); - size = Vector2.all(max( - game.camera.visibleWorldRect.width, - game.camera.visibleWorldRect.height, - )); + size = Vector2.all( + max( + game.camera.visibleWorldRect.width, + game.camera.visibleWorldRect.height, + ), + ); } } diff --git a/forge2d_game/step_06/lib/components/brick.dart b/forge2d_game/step_06/lib/components/brick.dart index 4f460405c4..123bcf2065 100644 --- a/forge2d_game/step_06/lib/components/brick.dart +++ b/forge2d_game/step_06/lib/components/brick.dart @@ -47,205 +47,205 @@ enum BrickDamage { none, some, lots } Map brickFileNames(BrickType type, BrickSize size) { return switch ((type, size)) { (BrickType.explosive, BrickSize.size140x70) => { - BrickDamage.none: 'elementExplosive009.png', - BrickDamage.some: 'elementExplosive012.png', - BrickDamage.lots: 'elementExplosive050.png', - }, + BrickDamage.none: 'elementExplosive009.png', + BrickDamage.some: 'elementExplosive012.png', + BrickDamage.lots: 'elementExplosive050.png', + }, (BrickType.glass, BrickSize.size140x70) => { - BrickDamage.none: 'elementGlass010.png', - BrickDamage.some: 'elementGlass013.png', - BrickDamage.lots: 'elementGlass048.png', - }, + BrickDamage.none: 'elementGlass010.png', + BrickDamage.some: 'elementGlass013.png', + BrickDamage.lots: 'elementGlass048.png', + }, (BrickType.metal, BrickSize.size140x70) => { - BrickDamage.none: 'elementMetal009.png', - BrickDamage.some: 'elementMetal012.png', - BrickDamage.lots: 'elementMetal050.png', - }, + BrickDamage.none: 'elementMetal009.png', + BrickDamage.some: 'elementMetal012.png', + BrickDamage.lots: 'elementMetal050.png', + }, (BrickType.stone, BrickSize.size140x70) => { - BrickDamage.none: 'elementStone009.png', - BrickDamage.some: 'elementStone012.png', - BrickDamage.lots: 'elementStone047.png', - }, + BrickDamage.none: 'elementStone009.png', + BrickDamage.some: 'elementStone012.png', + BrickDamage.lots: 'elementStone047.png', + }, (BrickType.wood, BrickSize.size140x70) => { - BrickDamage.none: 'elementWood011.png', - BrickDamage.some: 'elementWood014.png', - BrickDamage.lots: 'elementWood054.png', - }, + BrickDamage.none: 'elementWood011.png', + BrickDamage.some: 'elementWood014.png', + BrickDamage.lots: 'elementWood054.png', + }, (BrickType.explosive, BrickSize.size70x70) => { - BrickDamage.none: 'elementExplosive011.png', - BrickDamage.some: 'elementExplosive014.png', - BrickDamage.lots: 'elementExplosive049.png', - }, + BrickDamage.none: 'elementExplosive011.png', + BrickDamage.some: 'elementExplosive014.png', + BrickDamage.lots: 'elementExplosive049.png', + }, (BrickType.glass, BrickSize.size70x70) => { - BrickDamage.none: 'elementGlass011.png', - BrickDamage.some: 'elementGlass012.png', - BrickDamage.lots: 'elementGlass046.png', - }, + BrickDamage.none: 'elementGlass011.png', + BrickDamage.some: 'elementGlass012.png', + BrickDamage.lots: 'elementGlass046.png', + }, (BrickType.metal, BrickSize.size70x70) => { - BrickDamage.none: 'elementMetal011.png', - BrickDamage.some: 'elementMetal014.png', - BrickDamage.lots: 'elementMetal049.png', - }, + BrickDamage.none: 'elementMetal011.png', + BrickDamage.some: 'elementMetal014.png', + BrickDamage.lots: 'elementMetal049.png', + }, (BrickType.stone, BrickSize.size70x70) => { - BrickDamage.none: 'elementStone011.png', - BrickDamage.some: 'elementStone014.png', - BrickDamage.lots: 'elementStone046.png', - }, + BrickDamage.none: 'elementStone011.png', + BrickDamage.some: 'elementStone014.png', + BrickDamage.lots: 'elementStone046.png', + }, (BrickType.wood, BrickSize.size70x70) => { - BrickDamage.none: 'elementWood010.png', - BrickDamage.some: 'elementWood013.png', - BrickDamage.lots: 'elementWood045.png', - }, + BrickDamage.none: 'elementWood010.png', + BrickDamage.some: 'elementWood013.png', + BrickDamage.lots: 'elementWood045.png', + }, (BrickType.explosive, BrickSize.size220x70) => { - BrickDamage.none: 'elementExplosive013.png', - BrickDamage.some: 'elementExplosive016.png', - BrickDamage.lots: 'elementExplosive051.png', - }, + BrickDamage.none: 'elementExplosive013.png', + BrickDamage.some: 'elementExplosive016.png', + BrickDamage.lots: 'elementExplosive051.png', + }, (BrickType.glass, BrickSize.size220x70) => { - BrickDamage.none: 'elementGlass014.png', - BrickDamage.some: 'elementGlass017.png', - BrickDamage.lots: 'elementGlass049.png', - }, + BrickDamage.none: 'elementGlass014.png', + BrickDamage.some: 'elementGlass017.png', + BrickDamage.lots: 'elementGlass049.png', + }, (BrickType.metal, BrickSize.size220x70) => { - BrickDamage.none: 'elementMetal013.png', - BrickDamage.some: 'elementMetal016.png', - BrickDamage.lots: 'elementMetal051.png', - }, + BrickDamage.none: 'elementMetal013.png', + BrickDamage.some: 'elementMetal016.png', + BrickDamage.lots: 'elementMetal051.png', + }, (BrickType.stone, BrickSize.size220x70) => { - BrickDamage.none: 'elementStone013.png', - BrickDamage.some: 'elementStone016.png', - BrickDamage.lots: 'elementStone048.png', - }, + BrickDamage.none: 'elementStone013.png', + BrickDamage.some: 'elementStone016.png', + BrickDamage.lots: 'elementStone048.png', + }, (BrickType.wood, BrickSize.size220x70) => { - BrickDamage.none: 'elementWood012.png', - BrickDamage.some: 'elementWood015.png', - BrickDamage.lots: 'elementWood047.png', - }, + BrickDamage.none: 'elementWood012.png', + BrickDamage.some: 'elementWood015.png', + BrickDamage.lots: 'elementWood047.png', + }, (BrickType.explosive, BrickSize.size70x140) => { - BrickDamage.none: 'elementExplosive017.png', - BrickDamage.some: 'elementExplosive022.png', - BrickDamage.lots: 'elementExplosive052.png', - }, + BrickDamage.none: 'elementExplosive017.png', + BrickDamage.some: 'elementExplosive022.png', + BrickDamage.lots: 'elementExplosive052.png', + }, (BrickType.glass, BrickSize.size70x140) => { - BrickDamage.none: 'elementGlass018.png', - BrickDamage.some: 'elementGlass023.png', - BrickDamage.lots: 'elementGlass050.png', - }, + BrickDamage.none: 'elementGlass018.png', + BrickDamage.some: 'elementGlass023.png', + BrickDamage.lots: 'elementGlass050.png', + }, (BrickType.metal, BrickSize.size70x140) => { - BrickDamage.none: 'elementMetal017.png', - BrickDamage.some: 'elementMetal022.png', - BrickDamage.lots: 'elementMetal052.png', - }, + BrickDamage.none: 'elementMetal017.png', + BrickDamage.some: 'elementMetal022.png', + BrickDamage.lots: 'elementMetal052.png', + }, (BrickType.stone, BrickSize.size70x140) => { - BrickDamage.none: 'elementStone017.png', - BrickDamage.some: 'elementStone022.png', - BrickDamage.lots: 'elementStone049.png', - }, + BrickDamage.none: 'elementStone017.png', + BrickDamage.some: 'elementStone022.png', + BrickDamage.lots: 'elementStone049.png', + }, (BrickType.wood, BrickSize.size70x140) => { - BrickDamage.none: 'elementWood016.png', - BrickDamage.some: 'elementWood021.png', - BrickDamage.lots: 'elementWood048.png', - }, + BrickDamage.none: 'elementWood016.png', + BrickDamage.some: 'elementWood021.png', + BrickDamage.lots: 'elementWood048.png', + }, (BrickType.explosive, BrickSize.size140x140) => { - BrickDamage.none: 'elementExplosive018.png', - BrickDamage.some: 'elementExplosive023.png', - BrickDamage.lots: 'elementExplosive053.png', - }, + BrickDamage.none: 'elementExplosive018.png', + BrickDamage.some: 'elementExplosive023.png', + BrickDamage.lots: 'elementExplosive053.png', + }, (BrickType.glass, BrickSize.size140x140) => { - BrickDamage.none: 'elementGlass019.png', - BrickDamage.some: 'elementGlass024.png', - BrickDamage.lots: 'elementGlass051.png', - }, + BrickDamage.none: 'elementGlass019.png', + BrickDamage.some: 'elementGlass024.png', + BrickDamage.lots: 'elementGlass051.png', + }, (BrickType.metal, BrickSize.size140x140) => { - BrickDamage.none: 'elementMetal018.png', - BrickDamage.some: 'elementMetal023.png', - BrickDamage.lots: 'elementMetal053.png', - }, + BrickDamage.none: 'elementMetal018.png', + BrickDamage.some: 'elementMetal023.png', + BrickDamage.lots: 'elementMetal053.png', + }, (BrickType.stone, BrickSize.size140x140) => { - BrickDamage.none: 'elementStone018.png', - BrickDamage.some: 'elementStone023.png', - BrickDamage.lots: 'elementStone050.png', - }, + BrickDamage.none: 'elementStone018.png', + BrickDamage.some: 'elementStone023.png', + BrickDamage.lots: 'elementStone050.png', + }, (BrickType.wood, BrickSize.size140x140) => { - BrickDamage.none: 'elementWood017.png', - BrickDamage.some: 'elementWood022.png', - BrickDamage.lots: 'elementWood049.png', - }, + BrickDamage.none: 'elementWood017.png', + BrickDamage.some: 'elementWood022.png', + BrickDamage.lots: 'elementWood049.png', + }, (BrickType.explosive, BrickSize.size220x140) => { - BrickDamage.none: 'elementExplosive019.png', - BrickDamage.some: 'elementExplosive024.png', - BrickDamage.lots: 'elementExplosive054.png', - }, + BrickDamage.none: 'elementExplosive019.png', + BrickDamage.some: 'elementExplosive024.png', + BrickDamage.lots: 'elementExplosive054.png', + }, (BrickType.glass, BrickSize.size220x140) => { - BrickDamage.none: 'elementGlass020.png', - BrickDamage.some: 'elementGlass025.png', - BrickDamage.lots: 'elementGlass052.png', - }, + BrickDamage.none: 'elementGlass020.png', + BrickDamage.some: 'elementGlass025.png', + BrickDamage.lots: 'elementGlass052.png', + }, (BrickType.metal, BrickSize.size220x140) => { - BrickDamage.none: 'elementMetal019.png', - BrickDamage.some: 'elementMetal024.png', - BrickDamage.lots: 'elementMetal054.png', - }, + BrickDamage.none: 'elementMetal019.png', + BrickDamage.some: 'elementMetal024.png', + BrickDamage.lots: 'elementMetal054.png', + }, (BrickType.stone, BrickSize.size220x140) => { - BrickDamage.none: 'elementStone019.png', - BrickDamage.some: 'elementStone024.png', - BrickDamage.lots: 'elementStone051.png', - }, + BrickDamage.none: 'elementStone019.png', + BrickDamage.some: 'elementStone024.png', + BrickDamage.lots: 'elementStone051.png', + }, (BrickType.wood, BrickSize.size220x140) => { - BrickDamage.none: 'elementWood018.png', - BrickDamage.some: 'elementWood023.png', - BrickDamage.lots: 'elementWood050.png', - }, + BrickDamage.none: 'elementWood018.png', + BrickDamage.some: 'elementWood023.png', + BrickDamage.lots: 'elementWood050.png', + }, (BrickType.explosive, BrickSize.size70x220) => { - BrickDamage.none: 'elementExplosive020.png', - BrickDamage.some: 'elementExplosive025.png', - BrickDamage.lots: 'elementExplosive055.png', - }, + BrickDamage.none: 'elementExplosive020.png', + BrickDamage.some: 'elementExplosive025.png', + BrickDamage.lots: 'elementExplosive055.png', + }, (BrickType.glass, BrickSize.size70x220) => { - BrickDamage.none: 'elementGlass021.png', - BrickDamage.some: 'elementGlass026.png', - BrickDamage.lots: 'elementGlass053.png', - }, + BrickDamage.none: 'elementGlass021.png', + BrickDamage.some: 'elementGlass026.png', + BrickDamage.lots: 'elementGlass053.png', + }, (BrickType.metal, BrickSize.size70x220) => { - BrickDamage.none: 'elementMetal020.png', - BrickDamage.some: 'elementMetal025.png', - BrickDamage.lots: 'elementMetal055.png', - }, + BrickDamage.none: 'elementMetal020.png', + BrickDamage.some: 'elementMetal025.png', + BrickDamage.lots: 'elementMetal055.png', + }, (BrickType.stone, BrickSize.size70x220) => { - BrickDamage.none: 'elementStone020.png', - BrickDamage.some: 'elementStone025.png', - BrickDamage.lots: 'elementStone052.png', - }, + BrickDamage.none: 'elementStone020.png', + BrickDamage.some: 'elementStone025.png', + BrickDamage.lots: 'elementStone052.png', + }, (BrickType.wood, BrickSize.size70x220) => { - BrickDamage.none: 'elementWood019.png', - BrickDamage.some: 'elementWood024.png', - BrickDamage.lots: 'elementWood051.png', - }, + BrickDamage.none: 'elementWood019.png', + BrickDamage.some: 'elementWood024.png', + BrickDamage.lots: 'elementWood051.png', + }, (BrickType.explosive, BrickSize.size140x220) => { - BrickDamage.none: 'elementExplosive021.png', - BrickDamage.some: 'elementExplosive026.png', - BrickDamage.lots: 'elementExplosive056.png', - }, + BrickDamage.none: 'elementExplosive021.png', + BrickDamage.some: 'elementExplosive026.png', + BrickDamage.lots: 'elementExplosive056.png', + }, (BrickType.glass, BrickSize.size140x220) => { - BrickDamage.none: 'elementGlass022.png', - BrickDamage.some: 'elementGlass027.png', - BrickDamage.lots: 'elementGlass054.png', - }, + BrickDamage.none: 'elementGlass022.png', + BrickDamage.some: 'elementGlass027.png', + BrickDamage.lots: 'elementGlass054.png', + }, (BrickType.metal, BrickSize.size140x220) => { - BrickDamage.none: 'elementMetal021.png', - BrickDamage.some: 'elementMetal026.png', - BrickDamage.lots: 'elementMetal056.png', - }, + BrickDamage.none: 'elementMetal021.png', + BrickDamage.some: 'elementMetal026.png', + BrickDamage.lots: 'elementMetal056.png', + }, (BrickType.stone, BrickSize.size140x220) => { - BrickDamage.none: 'elementStone021.png', - BrickDamage.some: 'elementStone026.png', - BrickDamage.lots: 'elementStone053.png', - }, + BrickDamage.none: 'elementStone021.png', + BrickDamage.some: 'elementStone026.png', + BrickDamage.lots: 'elementStone053.png', + }, (BrickType.wood, BrickSize.size140x220) => { - BrickDamage.none: 'elementWood020.png', - BrickDamage.some: 'elementWood025.png', - BrickDamage.lots: 'elementWood052.png', - }, + BrickDamage.none: 'elementWood020.png', + BrickDamage.some: 'elementWood025.png', + BrickDamage.lots: 'elementWood052.png', + }, }; } @@ -256,25 +256,26 @@ class Brick extends BodyComponent { required BrickDamage damage, required Vector2 position, required Map sprites, - }) : _damage = damage, - _sprites = sprites, - super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.dynamic, - fixtureDefs: [ - FixtureDef( - PolygonShape() - ..setAsBoxXY( - size.size.width / 20 * brickScale, - size.size.height / 20 * brickScale, - ), - ) - ..restitution = 0.4 - ..density = type.density - ..friction = type.friction - ]); + }) : _damage = damage, + _sprites = sprites, + super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.dynamic, + fixtureDefs: [ + FixtureDef( + PolygonShape()..setAsBoxXY( + size.size.width / 20 * brickScale, + size.size.height / 20 * brickScale, + ), + ) + ..restitution = 0.4 + ..density = type.density + ..friction = type.friction, + ], + ); late final SpriteComponent _spriteComponent; diff --git a/forge2d_game/step_06/lib/components/game.dart b/forge2d_game/step_06/lib/components/game.dart index 20c1f31597..e6e29439e3 100644 --- a/forge2d_game/step_06/lib/components/game.dart +++ b/forge2d_game/step_06/lib/components/game.dart @@ -16,10 +16,10 @@ import 'player.dart'; class MyPhysicsGame extends Forge2DGame { MyPhysicsGame() - : super( - gravity: Vector2(0, 10), - camera: CameraComponent.withFixedResolution(width: 800, height: 600), - ); + : super( + gravity: Vector2(0, 10), + camera: CameraComponent.withFixedResolution(width: 800, height: 600), + ); late final XmlSpriteSheet aliens; late final XmlSpriteSheet elements; @@ -57,9 +57,11 @@ class MyPhysicsGame extends Forge2DGame { Future addGround() { return world.addAll([ - for (var x = camera.visibleWorldRect.left; - x < camera.visibleWorldRect.right + groundSize; - x += groundSize) + for ( + var x = camera.visibleWorldRect.left; + x < camera.visibleWorldRect.right + groundSize; + x += groundSize + ) Ground( Vector2(x, (camera.visibleWorldRect.height - groundSize) / 2), tiles.getSprite('grass.png'), @@ -79,15 +81,14 @@ class MyPhysicsGame extends Forge2DGame { size: size, damage: BrickDamage.some, position: Vector2( - camera.visibleWorldRect.right / 3 + - (_random.nextDouble() * 5 - 2.5), - 0), - sprites: brickFileNames(type, size).map( - (key, filename) => MapEntry( - key, - elements.getSprite(filename), - ), + camera.visibleWorldRect.right / 3 + + (_random.nextDouble() * 5 - 2.5), + 0, ), + sprites: brickFileNames( + type, + size, + ).map((key, filename) => MapEntry(key, elements.getSprite(filename))), ), ); await Future.delayed(const Duration(milliseconds: 500)); @@ -95,11 +96,11 @@ class MyPhysicsGame extends Forge2DGame { } Future addPlayer() async => world.add( - Player( - Vector2(camera.visibleWorldRect.left * 2 / 3, 0), - aliens.getSprite(PlayerColor.randomColor.fileName), - ), - ); + Player( + Vector2(camera.visibleWorldRect.left * 2 / 3, 0), + aliens.getSprite(PlayerColor.randomColor.fileName), + ), + ); @override void update(double dt) { diff --git a/forge2d_game/step_06/lib/components/ground.dart b/forge2d_game/step_06/lib/components/ground.dart index c1346bf788..2a4fef62e4 100644 --- a/forge2d_game/step_06/lib/components/ground.dart +++ b/forge2d_game/step_06/lib/components/ground.dart @@ -9,24 +9,25 @@ const groundSize = 7.0; class Ground extends BodyComponent { Ground(Vector2 position, Sprite sprite) - : super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.static, - fixtureDefs: [ - FixtureDef( - PolygonShape()..setAsBoxXY(groundSize / 2, groundSize / 2), - friction: 0.3, - ) - ], - children: [ - SpriteComponent( - anchor: Anchor.center, - sprite: sprite, - size: Vector2.all(groundSize), - position: Vector2(0, 0), - ), - ], - ); + : super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.static, + fixtureDefs: [ + FixtureDef( + PolygonShape()..setAsBoxXY(groundSize / 2, groundSize / 2), + friction: 0.3, + ), + ], + children: [ + SpriteComponent( + anchor: Anchor.center, + sprite: sprite, + size: Vector2.all(groundSize), + position: Vector2(0, 0), + ), + ], + ); } diff --git a/forge2d_game/step_06/lib/components/player.dart b/forge2d_game/step_06/lib/components/player.dart index b53002b11e..c7b0ad3f56 100644 --- a/forge2d_game/step_06/lib/components/player.dart +++ b/forge2d_game/step_06/lib/components/player.dart @@ -27,21 +27,22 @@ enum PlayerColor { class Player extends BodyComponent with DragCallbacks { Player(Vector2 position, Sprite sprite) - : _sprite = sprite, - super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.static - ..angularDamping = 0.1 - ..linearDamping = 0.1, - fixtureDefs: [ - FixtureDef(CircleShape()..radius = playerSize / 2) - ..restitution = 0.4 - ..density = 0.75 - ..friction = 0.5 - ], - ); + : _sprite = sprite, + super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.static + ..angularDamping = 0.1 + ..linearDamping = 0.1, + fixtureDefs: [ + FixtureDef(CircleShape()..radius = playerSize / 2) + ..restitution = 0.4 + ..density = 0.75 + ..friction = 0.5, + ], + ); final Sprite _sprite; @@ -59,7 +60,7 @@ class Player extends BodyComponent with DragCallbacks { sprite: _sprite, size: Vector2(playerSize, playerSize), position: Vector2(0, 0), - ) + ), ]); return super.onLoad(); } @@ -107,9 +108,7 @@ class Player extends BodyComponent with DragCallbacks { ?.removeFromParent(); body.setType(BodyType.dynamic); body.applyLinearImpulse(_dragDelta * -50); - add(RemoveEffect( - delay: 5.0, - )); + add(RemoveEffect(delay: 5.0)); } } } @@ -129,12 +128,13 @@ class _DragPainter extends CustomPainter { if (player.dragDelta != Vector2.zero()) { var center = size.center(Offset.zero); canvas.drawLine( - center, - center + (player.dragDelta * -1).toOffset(), - Paint() - ..color = Colors.orange.withAlpha(180) - ..strokeWidth = 0.4 - ..strokeCap = StrokeCap.round); + center, + center + (player.dragDelta * -1).toOffset(), + Paint() + ..color = Colors.orange.withAlpha(180) + ..strokeWidth = 0.4 + ..strokeCap = StrokeCap.round, + ); } } diff --git a/forge2d_game/step_06/lib/main.dart b/forge2d_game/step_06/lib/main.dart index 8e82ff7fb6..37929857ee 100644 --- a/forge2d_game/step_06/lib/main.dart +++ b/forge2d_game/step_06/lib/main.dart @@ -8,9 +8,5 @@ import 'package:flutter/material.dart'; import 'components/game.dart'; void main() { - runApp( - GameWidget.controlled( - gameFactory: MyPhysicsGame.new, - ), - ); + runApp(GameWidget.controlled(gameFactory: MyPhysicsGame.new)); } diff --git a/forge2d_game/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/forge2d_game/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d0625c3fca..5fb87637db 100644 --- a/forge2d_game/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/forge2d_game/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/forge2d_game/step_06/pubspec.yaml b/forge2d_game/step_06/pubspec.yaml index e1cb03eee2..c9bd4375cd 100644 --- a/forge2d_game/step_06/pubspec.yaml +++ b/forge2d_game/step_06/pubspec.yaml @@ -4,12 +4,12 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter - characters: ^1.3.0 + characters: ^1.4.0 flame: ^1.24.0 flame_forge2d: ^0.18.2+5 flame_kenney_xml: ^0.1.1+5 diff --git a/forge2d_game/step_07/android/.gitignore b/forge2d_game/step_07/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/forge2d_game/step_07/android/.gitignore +++ b/forge2d_game/step_07/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/forge2d_game/step_07/android/app/build.gradle b/forge2d_game/step_07/android/app/build.gradle deleted file mode 100644 index b365ef7190..0000000000 --- a/forge2d_game/step_07/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.forge2d_game" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.forge2d_game" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/forge2d_game/step_07/android/app/build.gradle.kts b/forge2d_game/step_07/android/app/build.gradle.kts new file mode 100644 index 0000000000..278549b682 --- /dev/null +++ b/forge2d_game/step_07/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.forge2d_game" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.forge2d_game" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/forge2d_game/step_07/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt b/forge2d_game/step_07/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt index 459f03328b..e9323498dd 100644 --- a/forge2d_game/step_07/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt +++ b/forge2d_game/step_07/android/app/src/main/kotlin/com/example/forge2d_game/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.forge2d_game import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/forge2d_game/step_07/android/build.gradle b/forge2d_game/step_07/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/forge2d_game/step_07/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/forge2d_game/step_07/android/build.gradle.kts b/forge2d_game/step_07/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/forge2d_game/step_07/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/forge2d_game/step_07/android/gradle.properties b/forge2d_game/step_07/android/gradle.properties index 2597170821..f018a61817 100644 --- a/forge2d_game/step_07/android/gradle.properties +++ b/forge2d_game/step_07/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/forge2d_game/step_07/android/gradle/wrapper/gradle-wrapper.properties b/forge2d_game/step_07/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/forge2d_game/step_07/android/gradle/wrapper/gradle-wrapper.properties +++ b/forge2d_game/step_07/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/forge2d_game/step_07/android/settings.gradle b/forge2d_game/step_07/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/forge2d_game/step_07/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/forge2d_game/step_07/android/settings.gradle.kts b/forge2d_game/step_07/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/forge2d_game/step_07/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/forge2d_game/step_07/bin/generate_brick_file_names.dart b/forge2d_game/step_07/bin/generate_brick_file_names.dart index e315ec899a..ba1ad0af27 100644 --- a/forge2d_game/step_07/bin/generate_brick_file_names.dart +++ b/forge2d_game/step_07/bin/generate_brick_file_names.dart @@ -30,11 +30,12 @@ class Rect extends Equatable { final int y; final int width; final int height; - const Rect( - {required this.x, - required this.y, - required this.width, - required this.height}); + const Rect({ + required this.x, + required this.y, + required this.width, + required this.height, + }); Size get size => Size(width, height); diff --git a/forge2d_game/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/forge2d_game/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/forge2d_game/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/forge2d_game/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/forge2d_game/step_07/lib/components/background.dart b/forge2d_game/step_07/lib/components/background.dart index 2263d589c2..d61d4635c2 100644 --- a/forge2d_game/step_07/lib/components/background.dart +++ b/forge2d_game/step_07/lib/components/background.dart @@ -8,18 +8,17 @@ import 'game.dart'; class Background extends SpriteComponent with HasGameReference { Background({required super.sprite}) - : super( - anchor: Anchor.center, - position: Vector2(0, 0), - ); + : super(anchor: Anchor.center, position: Vector2(0, 0)); @override void onMount() { super.onMount(); - size = Vector2.all(max( - game.camera.visibleWorldRect.width, - game.camera.visibleWorldRect.height, - )); + size = Vector2.all( + max( + game.camera.visibleWorldRect.width, + game.camera.visibleWorldRect.height, + ), + ); } } diff --git a/forge2d_game/step_07/lib/components/brick.dart b/forge2d_game/step_07/lib/components/brick.dart index 34c1c1d3e9..296d94b186 100644 --- a/forge2d_game/step_07/lib/components/brick.dart +++ b/forge2d_game/step_07/lib/components/brick.dart @@ -49,205 +49,205 @@ enum BrickDamage { none, some, lots } Map brickFileNames(BrickType type, BrickSize size) { return switch ((type, size)) { (BrickType.explosive, BrickSize.size140x70) => { - BrickDamage.none: 'elementExplosive009.png', - BrickDamage.some: 'elementExplosive012.png', - BrickDamage.lots: 'elementExplosive050.png', - }, + BrickDamage.none: 'elementExplosive009.png', + BrickDamage.some: 'elementExplosive012.png', + BrickDamage.lots: 'elementExplosive050.png', + }, (BrickType.glass, BrickSize.size140x70) => { - BrickDamage.none: 'elementGlass010.png', - BrickDamage.some: 'elementGlass013.png', - BrickDamage.lots: 'elementGlass048.png', - }, + BrickDamage.none: 'elementGlass010.png', + BrickDamage.some: 'elementGlass013.png', + BrickDamage.lots: 'elementGlass048.png', + }, (BrickType.metal, BrickSize.size140x70) => { - BrickDamage.none: 'elementMetal009.png', - BrickDamage.some: 'elementMetal012.png', - BrickDamage.lots: 'elementMetal050.png', - }, + BrickDamage.none: 'elementMetal009.png', + BrickDamage.some: 'elementMetal012.png', + BrickDamage.lots: 'elementMetal050.png', + }, (BrickType.stone, BrickSize.size140x70) => { - BrickDamage.none: 'elementStone009.png', - BrickDamage.some: 'elementStone012.png', - BrickDamage.lots: 'elementStone047.png', - }, + BrickDamage.none: 'elementStone009.png', + BrickDamage.some: 'elementStone012.png', + BrickDamage.lots: 'elementStone047.png', + }, (BrickType.wood, BrickSize.size140x70) => { - BrickDamage.none: 'elementWood011.png', - BrickDamage.some: 'elementWood014.png', - BrickDamage.lots: 'elementWood054.png', - }, + BrickDamage.none: 'elementWood011.png', + BrickDamage.some: 'elementWood014.png', + BrickDamage.lots: 'elementWood054.png', + }, (BrickType.explosive, BrickSize.size70x70) => { - BrickDamage.none: 'elementExplosive011.png', - BrickDamage.some: 'elementExplosive014.png', - BrickDamage.lots: 'elementExplosive049.png', - }, + BrickDamage.none: 'elementExplosive011.png', + BrickDamage.some: 'elementExplosive014.png', + BrickDamage.lots: 'elementExplosive049.png', + }, (BrickType.glass, BrickSize.size70x70) => { - BrickDamage.none: 'elementGlass011.png', - BrickDamage.some: 'elementGlass012.png', - BrickDamage.lots: 'elementGlass046.png', - }, + BrickDamage.none: 'elementGlass011.png', + BrickDamage.some: 'elementGlass012.png', + BrickDamage.lots: 'elementGlass046.png', + }, (BrickType.metal, BrickSize.size70x70) => { - BrickDamage.none: 'elementMetal011.png', - BrickDamage.some: 'elementMetal014.png', - BrickDamage.lots: 'elementMetal049.png', - }, + BrickDamage.none: 'elementMetal011.png', + BrickDamage.some: 'elementMetal014.png', + BrickDamage.lots: 'elementMetal049.png', + }, (BrickType.stone, BrickSize.size70x70) => { - BrickDamage.none: 'elementStone011.png', - BrickDamage.some: 'elementStone014.png', - BrickDamage.lots: 'elementStone046.png', - }, + BrickDamage.none: 'elementStone011.png', + BrickDamage.some: 'elementStone014.png', + BrickDamage.lots: 'elementStone046.png', + }, (BrickType.wood, BrickSize.size70x70) => { - BrickDamage.none: 'elementWood010.png', - BrickDamage.some: 'elementWood013.png', - BrickDamage.lots: 'elementWood045.png', - }, + BrickDamage.none: 'elementWood010.png', + BrickDamage.some: 'elementWood013.png', + BrickDamage.lots: 'elementWood045.png', + }, (BrickType.explosive, BrickSize.size220x70) => { - BrickDamage.none: 'elementExplosive013.png', - BrickDamage.some: 'elementExplosive016.png', - BrickDamage.lots: 'elementExplosive051.png', - }, + BrickDamage.none: 'elementExplosive013.png', + BrickDamage.some: 'elementExplosive016.png', + BrickDamage.lots: 'elementExplosive051.png', + }, (BrickType.glass, BrickSize.size220x70) => { - BrickDamage.none: 'elementGlass014.png', - BrickDamage.some: 'elementGlass017.png', - BrickDamage.lots: 'elementGlass049.png', - }, + BrickDamage.none: 'elementGlass014.png', + BrickDamage.some: 'elementGlass017.png', + BrickDamage.lots: 'elementGlass049.png', + }, (BrickType.metal, BrickSize.size220x70) => { - BrickDamage.none: 'elementMetal013.png', - BrickDamage.some: 'elementMetal016.png', - BrickDamage.lots: 'elementMetal051.png', - }, + BrickDamage.none: 'elementMetal013.png', + BrickDamage.some: 'elementMetal016.png', + BrickDamage.lots: 'elementMetal051.png', + }, (BrickType.stone, BrickSize.size220x70) => { - BrickDamage.none: 'elementStone013.png', - BrickDamage.some: 'elementStone016.png', - BrickDamage.lots: 'elementStone048.png', - }, + BrickDamage.none: 'elementStone013.png', + BrickDamage.some: 'elementStone016.png', + BrickDamage.lots: 'elementStone048.png', + }, (BrickType.wood, BrickSize.size220x70) => { - BrickDamage.none: 'elementWood012.png', - BrickDamage.some: 'elementWood015.png', - BrickDamage.lots: 'elementWood047.png', - }, + BrickDamage.none: 'elementWood012.png', + BrickDamage.some: 'elementWood015.png', + BrickDamage.lots: 'elementWood047.png', + }, (BrickType.explosive, BrickSize.size70x140) => { - BrickDamage.none: 'elementExplosive017.png', - BrickDamage.some: 'elementExplosive022.png', - BrickDamage.lots: 'elementExplosive052.png', - }, + BrickDamage.none: 'elementExplosive017.png', + BrickDamage.some: 'elementExplosive022.png', + BrickDamage.lots: 'elementExplosive052.png', + }, (BrickType.glass, BrickSize.size70x140) => { - BrickDamage.none: 'elementGlass018.png', - BrickDamage.some: 'elementGlass023.png', - BrickDamage.lots: 'elementGlass050.png', - }, + BrickDamage.none: 'elementGlass018.png', + BrickDamage.some: 'elementGlass023.png', + BrickDamage.lots: 'elementGlass050.png', + }, (BrickType.metal, BrickSize.size70x140) => { - BrickDamage.none: 'elementMetal017.png', - BrickDamage.some: 'elementMetal022.png', - BrickDamage.lots: 'elementMetal052.png', - }, + BrickDamage.none: 'elementMetal017.png', + BrickDamage.some: 'elementMetal022.png', + BrickDamage.lots: 'elementMetal052.png', + }, (BrickType.stone, BrickSize.size70x140) => { - BrickDamage.none: 'elementStone017.png', - BrickDamage.some: 'elementStone022.png', - BrickDamage.lots: 'elementStone049.png', - }, + BrickDamage.none: 'elementStone017.png', + BrickDamage.some: 'elementStone022.png', + BrickDamage.lots: 'elementStone049.png', + }, (BrickType.wood, BrickSize.size70x140) => { - BrickDamage.none: 'elementWood016.png', - BrickDamage.some: 'elementWood021.png', - BrickDamage.lots: 'elementWood048.png', - }, + BrickDamage.none: 'elementWood016.png', + BrickDamage.some: 'elementWood021.png', + BrickDamage.lots: 'elementWood048.png', + }, (BrickType.explosive, BrickSize.size140x140) => { - BrickDamage.none: 'elementExplosive018.png', - BrickDamage.some: 'elementExplosive023.png', - BrickDamage.lots: 'elementExplosive053.png', - }, + BrickDamage.none: 'elementExplosive018.png', + BrickDamage.some: 'elementExplosive023.png', + BrickDamage.lots: 'elementExplosive053.png', + }, (BrickType.glass, BrickSize.size140x140) => { - BrickDamage.none: 'elementGlass019.png', - BrickDamage.some: 'elementGlass024.png', - BrickDamage.lots: 'elementGlass051.png', - }, + BrickDamage.none: 'elementGlass019.png', + BrickDamage.some: 'elementGlass024.png', + BrickDamage.lots: 'elementGlass051.png', + }, (BrickType.metal, BrickSize.size140x140) => { - BrickDamage.none: 'elementMetal018.png', - BrickDamage.some: 'elementMetal023.png', - BrickDamage.lots: 'elementMetal053.png', - }, + BrickDamage.none: 'elementMetal018.png', + BrickDamage.some: 'elementMetal023.png', + BrickDamage.lots: 'elementMetal053.png', + }, (BrickType.stone, BrickSize.size140x140) => { - BrickDamage.none: 'elementStone018.png', - BrickDamage.some: 'elementStone023.png', - BrickDamage.lots: 'elementStone050.png', - }, + BrickDamage.none: 'elementStone018.png', + BrickDamage.some: 'elementStone023.png', + BrickDamage.lots: 'elementStone050.png', + }, (BrickType.wood, BrickSize.size140x140) => { - BrickDamage.none: 'elementWood017.png', - BrickDamage.some: 'elementWood022.png', - BrickDamage.lots: 'elementWood049.png', - }, + BrickDamage.none: 'elementWood017.png', + BrickDamage.some: 'elementWood022.png', + BrickDamage.lots: 'elementWood049.png', + }, (BrickType.explosive, BrickSize.size220x140) => { - BrickDamage.none: 'elementExplosive019.png', - BrickDamage.some: 'elementExplosive024.png', - BrickDamage.lots: 'elementExplosive054.png', - }, + BrickDamage.none: 'elementExplosive019.png', + BrickDamage.some: 'elementExplosive024.png', + BrickDamage.lots: 'elementExplosive054.png', + }, (BrickType.glass, BrickSize.size220x140) => { - BrickDamage.none: 'elementGlass020.png', - BrickDamage.some: 'elementGlass025.png', - BrickDamage.lots: 'elementGlass052.png', - }, + BrickDamage.none: 'elementGlass020.png', + BrickDamage.some: 'elementGlass025.png', + BrickDamage.lots: 'elementGlass052.png', + }, (BrickType.metal, BrickSize.size220x140) => { - BrickDamage.none: 'elementMetal019.png', - BrickDamage.some: 'elementMetal024.png', - BrickDamage.lots: 'elementMetal054.png', - }, + BrickDamage.none: 'elementMetal019.png', + BrickDamage.some: 'elementMetal024.png', + BrickDamage.lots: 'elementMetal054.png', + }, (BrickType.stone, BrickSize.size220x140) => { - BrickDamage.none: 'elementStone019.png', - BrickDamage.some: 'elementStone024.png', - BrickDamage.lots: 'elementStone051.png', - }, + BrickDamage.none: 'elementStone019.png', + BrickDamage.some: 'elementStone024.png', + BrickDamage.lots: 'elementStone051.png', + }, (BrickType.wood, BrickSize.size220x140) => { - BrickDamage.none: 'elementWood018.png', - BrickDamage.some: 'elementWood023.png', - BrickDamage.lots: 'elementWood050.png', - }, + BrickDamage.none: 'elementWood018.png', + BrickDamage.some: 'elementWood023.png', + BrickDamage.lots: 'elementWood050.png', + }, (BrickType.explosive, BrickSize.size70x220) => { - BrickDamage.none: 'elementExplosive020.png', - BrickDamage.some: 'elementExplosive025.png', - BrickDamage.lots: 'elementExplosive055.png', - }, + BrickDamage.none: 'elementExplosive020.png', + BrickDamage.some: 'elementExplosive025.png', + BrickDamage.lots: 'elementExplosive055.png', + }, (BrickType.glass, BrickSize.size70x220) => { - BrickDamage.none: 'elementGlass021.png', - BrickDamage.some: 'elementGlass026.png', - BrickDamage.lots: 'elementGlass053.png', - }, + BrickDamage.none: 'elementGlass021.png', + BrickDamage.some: 'elementGlass026.png', + BrickDamage.lots: 'elementGlass053.png', + }, (BrickType.metal, BrickSize.size70x220) => { - BrickDamage.none: 'elementMetal020.png', - BrickDamage.some: 'elementMetal025.png', - BrickDamage.lots: 'elementMetal055.png', - }, + BrickDamage.none: 'elementMetal020.png', + BrickDamage.some: 'elementMetal025.png', + BrickDamage.lots: 'elementMetal055.png', + }, (BrickType.stone, BrickSize.size70x220) => { - BrickDamage.none: 'elementStone020.png', - BrickDamage.some: 'elementStone025.png', - BrickDamage.lots: 'elementStone052.png', - }, + BrickDamage.none: 'elementStone020.png', + BrickDamage.some: 'elementStone025.png', + BrickDamage.lots: 'elementStone052.png', + }, (BrickType.wood, BrickSize.size70x220) => { - BrickDamage.none: 'elementWood019.png', - BrickDamage.some: 'elementWood024.png', - BrickDamage.lots: 'elementWood051.png', - }, + BrickDamage.none: 'elementWood019.png', + BrickDamage.some: 'elementWood024.png', + BrickDamage.lots: 'elementWood051.png', + }, (BrickType.explosive, BrickSize.size140x220) => { - BrickDamage.none: 'elementExplosive021.png', - BrickDamage.some: 'elementExplosive026.png', - BrickDamage.lots: 'elementExplosive056.png', - }, + BrickDamage.none: 'elementExplosive021.png', + BrickDamage.some: 'elementExplosive026.png', + BrickDamage.lots: 'elementExplosive056.png', + }, (BrickType.glass, BrickSize.size140x220) => { - BrickDamage.none: 'elementGlass022.png', - BrickDamage.some: 'elementGlass027.png', - BrickDamage.lots: 'elementGlass054.png', - }, + BrickDamage.none: 'elementGlass022.png', + BrickDamage.some: 'elementGlass027.png', + BrickDamage.lots: 'elementGlass054.png', + }, (BrickType.metal, BrickSize.size140x220) => { - BrickDamage.none: 'elementMetal021.png', - BrickDamage.some: 'elementMetal026.png', - BrickDamage.lots: 'elementMetal056.png', - }, + BrickDamage.none: 'elementMetal021.png', + BrickDamage.some: 'elementMetal026.png', + BrickDamage.lots: 'elementMetal056.png', + }, (BrickType.stone, BrickSize.size140x220) => { - BrickDamage.none: 'elementStone021.png', - BrickDamage.some: 'elementStone026.png', - BrickDamage.lots: 'elementStone053.png', - }, + BrickDamage.none: 'elementStone021.png', + BrickDamage.some: 'elementStone026.png', + BrickDamage.lots: 'elementStone053.png', + }, (BrickType.wood, BrickSize.size140x220) => { - BrickDamage.none: 'elementWood020.png', - BrickDamage.some: 'elementWood025.png', - BrickDamage.lots: 'elementWood052.png', - }, + BrickDamage.none: 'elementWood020.png', + BrickDamage.some: 'elementWood025.png', + BrickDamage.lots: 'elementWood052.png', + }, }; } @@ -258,25 +258,26 @@ class Brick extends BodyComponentWithUserData { required BrickDamage damage, required Vector2 position, required Map sprites, - }) : _damage = damage, - _sprites = sprites, - super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.dynamic, - fixtureDefs: [ - FixtureDef( - PolygonShape() - ..setAsBoxXY( - size.size.width / 20 * brickScale, - size.size.height / 20 * brickScale, - ), - ) - ..restitution = 0.4 - ..density = type.density - ..friction = type.friction - ]); + }) : _damage = damage, + _sprites = sprites, + super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.dynamic, + fixtureDefs: [ + FixtureDef( + PolygonShape()..setAsBoxXY( + size.size.width / 20 * brickScale, + size.size.height / 20 * brickScale, + ), + ) + ..restitution = 0.4 + ..density = type.density + ..friction = type.friction, + ], + ); late final SpriteComponent _spriteComponent; diff --git a/forge2d_game/step_07/lib/components/enemy.dart b/forge2d_game/step_07/lib/components/enemy.dart index 678597a793..b09cc9152e 100644 --- a/forge2d_game/step_07/lib/components/enemy.dart +++ b/forge2d_game/step_07/lib/components/enemy.dart @@ -36,32 +36,32 @@ enum EnemyColor { class Enemy extends BodyComponentWithUserData with ContactCallbacks { Enemy(Vector2 position, Sprite sprite) - : super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.dynamic, - fixtureDefs: [ - FixtureDef( - PolygonShape()..setAsBoxXY(enemySize / 2, enemySize / 2), - friction: 0.3, - ) - ], - children: [ - SpriteComponent( - anchor: Anchor.center, - sprite: sprite, - size: Vector2.all(enemySize), - position: Vector2(0, 0), - ), - ], - ); + : super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.dynamic, + fixtureDefs: [ + FixtureDef( + PolygonShape()..setAsBoxXY(enemySize / 2, enemySize / 2), + friction: 0.3, + ), + ], + children: [ + SpriteComponent( + anchor: Anchor.center, + sprite: sprite, + size: Vector2.all(enemySize), + position: Vector2(0, 0), + ), + ], + ); @override void beginContact(Object other, Contact contact) { var interceptVelocity = - (contact.bodyA.linearVelocity - contact.bodyB.linearVelocity) - .length + (contact.bodyA.linearVelocity - contact.bodyB.linearVelocity).length .abs(); if (interceptVelocity > 35) { removeFromParent(); diff --git a/forge2d_game/step_07/lib/components/game.dart b/forge2d_game/step_07/lib/components/game.dart index 220a04e1a1..db965b1ef2 100644 --- a/forge2d_game/step_07/lib/components/game.dart +++ b/forge2d_game/step_07/lib/components/game.dart @@ -18,10 +18,10 @@ import 'player.dart'; class MyPhysicsGame extends Forge2DGame { MyPhysicsGame() - : super( - gravity: Vector2(0, 10), - camera: CameraComponent.withFixedResolution(width: 800, height: 600), - ); + : super( + gravity: Vector2(0, 10), + camera: CameraComponent.withFixedResolution(width: 800, height: 600), + ); late final XmlSpriteSheet aliens; late final XmlSpriteSheet elements; @@ -59,9 +59,11 @@ class MyPhysicsGame extends Forge2DGame { Future addGround() { return world.addAll([ - for (var x = camera.visibleWorldRect.left; - x < camera.visibleWorldRect.right + groundSize; - x += groundSize) + for ( + var x = camera.visibleWorldRect.left; + x < camera.visibleWorldRect.right + groundSize; + x += groundSize + ) Ground( Vector2(x, (camera.visibleWorldRect.height - groundSize) / 2), tiles.getSprite('grass.png'), @@ -81,15 +83,14 @@ class MyPhysicsGame extends Forge2DGame { size: size, damage: BrickDamage.some, position: Vector2( - camera.visibleWorldRect.right / 3 + - (_random.nextDouble() * 5 - 2.5), - 0), - sprites: brickFileNames(type, size).map( - (key, filename) => MapEntry( - key, - elements.getSprite(filename), - ), + camera.visibleWorldRect.right / 3 + + (_random.nextDouble() * 5 - 2.5), + 0, ), + sprites: brickFileNames( + type, + size, + ).map((key, filename) => MapEntry(key, elements.getSprite(filename))), ), ); await Future.delayed(const Duration(milliseconds: 500)); @@ -97,11 +98,11 @@ class MyPhysicsGame extends Forge2DGame { } Future addPlayer() async => world.add( - Player( - Vector2(camera.visibleWorldRect.left * 2 / 3, 0), - aliens.getSprite(PlayerColor.randomColor.fileName), - ), - ); + Player( + Vector2(camera.visibleWorldRect.left * 2 / 3, 0), + aliens.getSprite(PlayerColor.randomColor.fileName), + ), + ); @override void update(double dt) { @@ -141,9 +142,10 @@ class MyPhysicsGame extends Forge2DGame { await world.add( Enemy( Vector2( - camera.visibleWorldRect.right / 3 + - (_random.nextDouble() * 7 - 3.5), - (_random.nextDouble() * 3)), + camera.visibleWorldRect.right / 3 + + (_random.nextDouble() * 7 - 3.5), + (_random.nextDouble() * 3), + ), aliens.getSprite(EnemyColor.randomColor.fileName), ), ); diff --git a/forge2d_game/step_07/lib/components/ground.dart b/forge2d_game/step_07/lib/components/ground.dart index f7a87a2190..b568b189a8 100644 --- a/forge2d_game/step_07/lib/components/ground.dart +++ b/forge2d_game/step_07/lib/components/ground.dart @@ -11,24 +11,25 @@ const groundSize = 7.0; class Ground extends BodyComponentWithUserData { Ground(Vector2 position, Sprite sprite) - : super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.static, - fixtureDefs: [ - FixtureDef( - PolygonShape()..setAsBoxXY(groundSize / 2, groundSize / 2), - friction: 0.3, - ) - ], - children: [ - SpriteComponent( - anchor: Anchor.center, - sprite: sprite, - size: Vector2.all(groundSize), - position: Vector2(0, 0), - ), - ], - ); + : super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.static, + fixtureDefs: [ + FixtureDef( + PolygonShape()..setAsBoxXY(groundSize / 2, groundSize / 2), + friction: 0.3, + ), + ], + children: [ + SpriteComponent( + anchor: Anchor.center, + sprite: sprite, + size: Vector2.all(groundSize), + position: Vector2(0, 0), + ), + ], + ); } diff --git a/forge2d_game/step_07/lib/components/player.dart b/forge2d_game/step_07/lib/components/player.dart index 4c9989b447..05a7024c1b 100644 --- a/forge2d_game/step_07/lib/components/player.dart +++ b/forge2d_game/step_07/lib/components/player.dart @@ -29,21 +29,22 @@ enum PlayerColor { class Player extends BodyComponentWithUserData with DragCallbacks { Player(Vector2 position, Sprite sprite) - : _sprite = sprite, - super( - renderBody: false, - bodyDef: BodyDef() - ..position = position - ..type = BodyType.static - ..angularDamping = 0.1 - ..linearDamping = 0.1, - fixtureDefs: [ - FixtureDef(CircleShape()..radius = playerSize / 2) - ..restitution = 0.4 - ..density = 0.75 - ..friction = 0.5 - ], - ); + : _sprite = sprite, + super( + renderBody: false, + bodyDef: + BodyDef() + ..position = position + ..type = BodyType.static + ..angularDamping = 0.1 + ..linearDamping = 0.1, + fixtureDefs: [ + FixtureDef(CircleShape()..radius = playerSize / 2) + ..restitution = 0.4 + ..density = 0.75 + ..friction = 0.5, + ], + ); final Sprite _sprite; @@ -61,7 +62,7 @@ class Player extends BodyComponentWithUserData with DragCallbacks { sprite: _sprite, size: Vector2(playerSize, playerSize), position: Vector2(0, 0), - ) + ), ]); return super.onLoad(); } @@ -109,9 +110,7 @@ class Player extends BodyComponentWithUserData with DragCallbacks { ?.removeFromParent(); body.setType(BodyType.dynamic); body.applyLinearImpulse(_dragDelta * -50); - add(RemoveEffect( - delay: 5.0, - )); + add(RemoveEffect(delay: 5.0)); } } } @@ -131,12 +130,13 @@ class _DragPainter extends CustomPainter { if (player.dragDelta != Vector2.zero()) { var center = size.center(Offset.zero); canvas.drawLine( - center, - center + (player.dragDelta * -1).toOffset(), - Paint() - ..color = Colors.orange.withAlpha(180) - ..strokeWidth = 0.4 - ..strokeCap = StrokeCap.round); + center, + center + (player.dragDelta * -1).toOffset(), + Paint() + ..color = Colors.orange.withAlpha(180) + ..strokeWidth = 0.4 + ..strokeCap = StrokeCap.round, + ); } } diff --git a/forge2d_game/step_07/lib/main.dart b/forge2d_game/step_07/lib/main.dart index 8e82ff7fb6..37929857ee 100644 --- a/forge2d_game/step_07/lib/main.dart +++ b/forge2d_game/step_07/lib/main.dart @@ -8,9 +8,5 @@ import 'package:flutter/material.dart'; import 'components/game.dart'; void main() { - runApp( - GameWidget.controlled( - gameFactory: MyPhysicsGame.new, - ), - ); + runApp(GameWidget.controlled(gameFactory: MyPhysicsGame.new)); } diff --git a/forge2d_game/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/forge2d_game/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d0625c3fca..5fb87637db 100644 --- a/forge2d_game/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/forge2d_game/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/forge2d_game/step_07/pubspec.yaml b/forge2d_game/step_07/pubspec.yaml index e1cb03eee2..c9bd4375cd 100644 --- a/forge2d_game/step_07/pubspec.yaml +++ b/forge2d_game/step_07/pubspec.yaml @@ -4,12 +4,12 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter - characters: ^1.3.0 + characters: ^1.4.0 flame: ^1.24.0 flame_forge2d: ^0.18.2+5 flame_kenney_xml: ^0.1.1+5 diff --git a/generate_crossword/codelab_rebuild.yaml b/generate_crossword/codelab_rebuild.yaml index 482eacb52c..a60e94d734 100644 --- a/generate_crossword/codelab_rebuild.yaml +++ b/generate_crossword/codelab_rebuild.yaml @@ -54,10 +54,10 @@ steps: // Copyright 2024 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; - + void main() { runApp( ProviderScope( @@ -70,10 +70,7 @@ steps: ), home: Scaffold( body: Center( - child: Text( - 'Hello, World!', - style: TextStyle(fontSize: 24), - ), + child: Text('Hello, World!', style: TextStyle(fontSize: 24)), ), ), ), @@ -104,7 +101,7 @@ steps: copydir: from: generate_crossword to: step_02 - - name: Flutter clean + - name: Flutter clean step_02 path: step_02 flutter: clean - name: step_03 @@ -130,15 +127,15 @@ steps: // Copyright 2024 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; - + import '../providers.dart'; - + class CrosswordGeneratorApp extends StatelessWidget { const CrosswordGeneratorApp({super.key}); - + @override Widget build(BuildContext context) { return _EagerInitialization( @@ -156,20 +153,15 @@ steps: builder: (context, ref, _) { final wordListAsync = ref.watch(wordListProvider); return wordListAsync.when( - data: (wordList) => ListView.builder( - itemCount: wordList.length, - itemBuilder: (context, index) { - return ListTile( - title: Text(wordList.elementAt(index)), - ); - }, - ), - error: (error, stackTrace) => Center( - child: Text('$error'), - ), - loading: () => Center( - child: CircularProgressIndicator(), - ), + data: + (wordList) => ListView.builder( + itemCount: wordList.length, + itemBuilder: (context, index) { + return ListTile(title: Text(wordList.elementAt(index))); + }, + ), + error: (error, stackTrace) => Center(child: Text('$error')), + loading: () => Center(child: CircularProgressIndicator()), ); }, ), @@ -178,11 +170,11 @@ steps: ); } } - + class _EagerInitialization extends ConsumerWidget { const _EagerInitialization({required this.child}); final Widget child; - + @override Widget build(BuildContext context, WidgetRef ref) { ref.watch(wordListProvider); @@ -215,10 +207,16 @@ steps: final re = RegExp(r'^[a-z]+$'); final words = await rootBundle.loadString('assets/words.txt'); - return const LineSplitter().convert(words).toBuiltSet().rebuild((b) => b - ..map((word) => word.toLowerCase().trim()) - ..where((word) => word.length > 2) - ..where((word) => re.hasMatch(word))); + return const LineSplitter() + .convert(words) + .toBuiltSet() + .rebuild( + (b) => + b + ..map((word) => word.toLowerCase().trim()) + ..where((word) => word.length > 2) + ..where((word) => re.hasMatch(word)), + ); } - name: Flutter clean path: generate_crossword @@ -49024,16 +49022,13 @@ steps: void main() { runApp( ProviderScope( - @@ -15,14 +17,7 @@ void main() { + @@ -15,11 +17,7 @@ void main() { colorSchemeSeed: Colors.blueGrey, brightness: Brightness.light, ), - home: Scaffold( - body: Center( - - child: Text( - - 'Hello, World!', - - style: TextStyle(fontSize: 24), - - ), + - child: Text('Hello, World!', style: TextStyle(fontSize: 24)), - ), - ), + home: CrosswordGeneratorApp(), @@ -49149,7 +49144,10 @@ steps: static int locationComparator(CrosswordWord a, CrosswordWord b) { final compareRows = a.location.y.compareTo(b.location.y); final compareColumns = a.location.x.compareTo(b.location.x); - return switch (compareColumns) { 0 => compareRows, _ => compareColumns }; + return switch (compareColumns) { + 0 => compareRows, + _ => compareColumns, + }; } /// Constructor for [CrosswordWord]. @@ -49158,10 +49156,13 @@ steps: required Location location, required Direction direction, }) { - return CrosswordWord((b) => b - ..word = word - ..direction = direction - ..location.replace(location)); + return CrosswordWord( + (b) => + b + ..word = word + ..direction = direction + ..location.replace(location), + ); } /// Constructor for [CrosswordWord]. @@ -49208,9 +49209,9 @@ steps: /// Constructor for [CrosswordCharacter]. /// Use [CrosswordCharacter.character] instead. - factory CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) = - _$CrosswordCharacter; + factory CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) = _$CrosswordCharacter; CrosswordCharacter._(); } @@ -49239,14 +49240,15 @@ steps: required Direction direction, }) { return rebuild( - (b) => b - ..words.add( - CrosswordWord.word( - word: word, - direction: direction, - location: location, - ), - ), + (b) => + b + ..words.add( + CrosswordWord.word( + word: word, + direction: direction, + location: location, + ), + ), ); } @@ -49262,19 +49264,21 @@ steps: b.characters.updateValue( word.location.rightOffset(idx), (b) => b.rebuild((bInner) => bInner.acrossWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - acrossWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + acrossWord: word, + character: character, + ), ); case Direction.down: b.characters.updateValue( word.location.downOffset(idx), (b) => b.rebuild((bInner) => bInner.downWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - downWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + downWord: word, + character: character, + ), ); } } @@ -49288,7 +49292,8 @@ steps: final grid = List.generate( height, (_) => List.generate( - width, (_) => '░', // https://www.compart.com/en/unicode/U+2591 + width, + (_) => '░', // https://www.compart.com/en/unicode/U+2591 ), ); @@ -49343,12 +49348,7 @@ steps: } /// Construct the serialization/deserialization code for the data model. - @SerializersFor([ - Location, - Crossword, - CrosswordWord, - CrosswordCharacter, - ]) + @SerializersFor([Location, Crossword, CrosswordWord, CrosswordCharacter]) final Serializers serializers = _$serializers; - name: Create lib/utils.dart path: generate_crossword/lib/utils.dart @@ -49377,25 +49377,25 @@ steps: +++ a/generate_crossword/step_04/lib/providers.dart @@ -3,12 +3,17 @@ // found in the LICENSE file. - + import 'dart:convert'; +import 'dart:math'; - + import 'package:built_collection/built_collection.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:riverpod/riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; - + +import 'model.dart' as model; +import 'utils.dart'; + part 'providers.g.dart'; - + /// A provider for the wordlist to use when generating the crossword. - @@ -26,3 +31,72 @@ Future> wordList(Ref ref) async { - ..where((word) => word.length > 2) - ..where((word) => re.hasMatch(word))); + @@ -32,3 +37,76 @@ Future> wordList(Ref ref) async { + ..where((word) => re.hasMatch(word)), + ); } + +/// An enumeration for different sizes of [model.Crossword]s. @@ -49406,10 +49406,7 @@ steps: + xlarge(width: 160, height: 88), + xxlarge(width: 500, height: 500); + - + const CrosswordSize({ - + required this.width, - + required this.height, - + }); + + const CrosswordSize({required this.width, required this.height}); + + final int width; + final int height; @@ -49437,8 +49434,10 @@ steps: + final size = ref.watch(sizeProvider); + final wordListAsync = ref.watch(wordListProvider); + - + var crossword = - + model.Crossword.crossword(width: size.width, height: size.height); + + var crossword = model.Crossword.crossword( + + width: size.width, + + height: size.height, + + ); + + yield* wordListAsync.when( + data: (wordList) async* { @@ -49447,10 +49446,15 @@ steps: + final direction = + _random.nextBool() ? model.Direction.across : model.Direction.down; + final location = model.Location.at( - + _random.nextInt(size.width), _random.nextInt(size.height)); + + _random.nextInt(size.width), + + _random.nextInt(size.height), + + ); + + crossword = crossword.addWord( - + word: word, direction: direction, location: location); + + word: word, + + direction: direction, + + location: location, + + ); + yield crossword; + await Future.delayed(Duration(milliseconds: 100)); + } @@ -49472,17 +49476,17 @@ steps: // Copyright 2024 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:two_dimensional_scrollables/two_dimensional_scrollables.dart'; - + import '../model.dart'; import '../providers.dart'; - + class CrosswordWidget extends ConsumerWidget { const CrosswordWidget({super.key}); - + @override Widget build(BuildContext context, WidgetRef ref) { final size = ref.watch(sizeProvider); @@ -49495,10 +49499,10 @@ steps: rowBuilder: (index) => _buildSpan(context, index), ); } - + TableViewCell _buildCell(BuildContext context, TableVicinity vicinity) { final location = Location.at(vicinity.column, vicinity.row); - + return TableViewCell( child: Consumer( builder: (context, ref, _) { @@ -49511,7 +49515,7 @@ steps: ), ), ); - + if (character != null) { return Container( color: Theme.of(context).colorScheme.onPrimary, @@ -49526,7 +49530,7 @@ steps: ), ); } - + return ColoredBox( color: Theme.of(context).colorScheme.primaryContainer, ); @@ -49534,16 +49538,18 @@ steps: ), ); } - + TableSpan _buildSpan(BuildContext context, int index) { return TableSpan( extent: FixedTableSpanExtent(32), foregroundDecoration: TableSpanDecoration( border: TableSpanBorder( leading: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), trailing: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ), ); @@ -49570,36 +49576,33 @@ steps: titleTextStyle: TextStyle( color: Theme.of(context).colorScheme.primary, fontSize: 16, - @@ -23,27 +25,7 @@ class CrosswordGeneratorApp extends StatelessWidget { + @@ -22,24 +24,7 @@ class CrosswordGeneratorApp extends StatelessWidget { + ), title: Text('Crossword Generator'), ), - body: SafeArea( + - body: SafeArea( - child: Consumer( - builder: (context, ref, _) { - final wordListAsync = ref.watch(wordListProvider); - return wordListAsync.when( - - data: (wordList) => ListView.builder( - - itemCount: wordList.length, - - itemBuilder: (context, index) { - - return ListTile( - - title: Text(wordList.elementAt(index)), - - ); - - }, - - ), - - error: (error, stackTrace) => Center( - - child: Text('$error'), - - ), - - loading: () => Center( - - child: CircularProgressIndicator(), - - ), + - data: + - (wordList) => ListView.builder( + - itemCount: wordList.length, + - itemBuilder: (context, index) { + - return ListTile(title: Text(wordList.elementAt(index))); + - }, + - ), + - error: (error, stackTrace) => Center(child: Text('$error')), + - loading: () => Center(child: CircularProgressIndicator()), - ); - }, - ), - + child: CrosswordWidget(), - ), + - ), + + body: SafeArea(child: CrosswordWidget()), ), ); - @@ -60,3 +42,23 @@ class _EagerInitialization extends ConsumerWidget { + } + @@ -55,3 +40,25 @@ class _EagerInitialization extends ConsumerWidget { return child; } } @@ -49607,25 +49610,30 @@ steps: +class _CrosswordGeneratorMenu extends ConsumerWidget { + @override + Widget build(BuildContext context, WidgetRef ref) => MenuAnchor( - + menuChildren: [ - + for (final entry in CrosswordSize.values) - + MenuItemButton( - + onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), - + leadingIcon: entry == ref.watch(sizeProvider) + + menuChildren: [ + + for (final entry in CrosswordSize.values) + + MenuItemButton( + + onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), + + leadingIcon: + + entry == ref.watch(sizeProvider) + ? Icon(Icons.radio_button_checked_outlined) + : Icon(Icons.radio_button_unchecked_outlined), - + child: Text(entry.label), - + ), - + ], - + builder: (context, controller, child) => IconButton( + + child: Text(entry.label), + + ), + + ], + + builder: + + (context, controller, child) => IconButton( + onPressed: () => controller.open(), + icon: Icon(Icons.settings), + ), - + ); + + ); +} - name: Run build_runner path: generate_crossword dart: run build_runner build --delete-conflicting-outputs + - name: format model.g.dart + path: generate_crossword + dart: format lib/model.g.dart - name: Build macOS app platforms: [ macos ] path: generate_crossword @@ -49687,28 +49695,27 @@ steps: expect(crossword.words.isNotEmpty, true); expect(crossword.words.length, 2); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 1, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .length, + 1, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 7); expect( - crossword.characters[topLeft], - CrosswordCharacter.character( - acrossWord: thisWord, - downWord: thatWord, - character: 't', - )); + crossword.characters[topLeft], + CrosswordCharacter.character( + acrossWord: thisWord, + downWord: thatWord, + character: 't', + ), + ); expect(crossword.valid, isTrue); }); @@ -49734,19 +49741,17 @@ steps: expect(crossword.words.isNotEmpty, true); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 2); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 2, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .isEmpty, - true); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .isEmpty, + true, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 8); expect(crossword.valid, isFalse); @@ -49756,11 +49761,12 @@ steps: Crossword crossword = Crossword.crossword(width: 50, height: 50); expect(crossword.valid, true); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'this', - )!; + crossword = + crossword.addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'this', + )!; expect(crossword.valid, true); final crossword2 = crossword.addWord( @@ -49822,17 +49828,18 @@ steps: final topLeft = Location.at(0, 0); - crossword = crossword - .addWord( - location: topLeft, - word: 'this', - direction: Direction.down, - )! - .addWord( - location: topLeft, - word: 'total', - direction: Direction.across, - )!; + crossword = + crossword + .addWord( + location: topLeft, + word: 'this', + direction: Direction.down, + )! + .addWord( + location: topLeft, + word: 'total', + direction: Direction.across, + )!; expect(crossword.valid, isTrue); @@ -49883,77 +49890,85 @@ steps: }); test('Crossword is not valid with run-on across words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on across/down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down/across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); @@ -49961,36 +49976,40 @@ steps: test('Adding duplicate across words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.across, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -49998,36 +50017,40 @@ steps: test('Adding duplicate down words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.down, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate down words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -50037,7 +50060,7 @@ steps: patch: | --- b/generate_crossword/step_05_a/lib/model.dart +++ a/generate_crossword/step_05_a/lib/model.dart - @@ -169,16 +169,118 @@ abstract class Crossword implements Built { + @@ -175,16 +175,118 @@ abstract class Crossword implements Built { /// The words in the crossword. BuiltList get words; @@ -50156,12 +50179,12 @@ steps: + } + + final candidate = rebuild( - (b) => b - ..words.add( - CrosswordWord.word( - @@ -188,6 +290,12 @@ abstract class Crossword implements Built { - ), - ), + (b) => + b + ..words.add( + @@ -195,6 +297,12 @@ abstract class Crossword implements Built { + ), + ), ); + + if (candidate.valid) { @@ -50177,13 +50200,16 @@ steps: patch: | --- b/generate_crossword/step_05_a/lib/providers.dart +++ a/generate_crossword/step_05_a/lib/providers.dart - @@ -83,10 +83,16 @@ Stream crossword(Ref ref) async* { - final location = model.Location.at( - _random.nextInt(size.width), _random.nextInt(size.height)); + @@ -90,13 +90,19 @@ Stream crossword(Ref ref) async* { + _random.nextInt(size.height), + ); - crossword = crossword.addWord( + var candidate = crossword.addWord( - word: word, direction: direction, location: location); + word: word, + direction: direction, + location: location, + ); - yield crossword; - await Future.delayed(Duration(milliseconds: 100)); + await Future.delayed(Duration(milliseconds: 10)); @@ -50200,6 +50226,9 @@ steps: - name: Run build_runner path: generate_crossword dart: run build_runner build --delete-conflicting-outputs + - name: format model.g.dart + path: generate_crossword + dart: format lib/model.g.dart - name: Flutter test path: generate_crossword flutter: test @@ -50235,13 +50264,16 @@ steps: patch: | --- b/generate_crossword/step_05_b/lib/providers.dart +++ a/generate_crossword/step_05_b/lib/providers.dart - @@ -82,16 +82,20 @@ Stream crossword(Ref ref) async* { - _random.nextBool() ? model.Direction.across : model.Direction.down; - final location = model.Location.at( - _random.nextInt(size.width), _random.nextInt(size.height)); + @@ -89,19 +89,24 @@ Stream crossword(Ref ref) async* { + _random.nextInt(size.width), + _random.nextInt(size.height), + ); - - var candidate = crossword.addWord( - - word: word, direction: direction, location: location); + - word: word, + - direction: direction, + - location: location, + - ); - await Future.delayed(Duration(milliseconds: 10)); - if (candidate != null) { - debugPrint('Added word: $word'); @@ -50250,11 +50282,15 @@ steps: - } else { - debugPrint('Failed to add word: $word'); + try { - + var candidate = await compute( - + ((String, model.Direction, model.Location) wordToAdd) { + + var candidate = await compute(( + + (String, model.Direction, model.Location) wordToAdd, + + ) { + final (word, direction, location) = wordToAdd; + return crossword.addWord( - + word: word, direction: direction, location: location); + + word: word, + + direction: direction, + + location: location, + + ); + }, (word, direction, location)); + + if (candidate != null) { @@ -50268,6 +50304,9 @@ steps: - name: Run build_runner path: generate_crossword dart: run build_runner build --delete-conflicting-outputs + - name: format model.g.dart + path: generate_crossword + dart: format lib/model.g.dart - name: Flutter test path: generate_crossword flutter: test @@ -50319,17 +50358,22 @@ steps: required Crossword crossword, required BuiltSet wordList, }) async* { - while ( - crossword.characters.length < crossword.width * crossword.height * 0.8) { + while (crossword.characters.length < + crossword.width * crossword.height * 0.8) { final word = wordList.randomElement(); final direction = _random.nextBool() ? Direction.across : Direction.down; final location = Location.at( - _random.nextInt(crossword.width), _random.nextInt(crossword.height)); + _random.nextInt(crossword.width), + _random.nextInt(crossword.height), + ); try { var candidate = await compute(((String, Direction, Location) wordToAdd) { final (word, direction, location) = wordToAdd; return crossword.addWord( - word: word, direction: direction, location: location); + word: word, + direction: direction, + location: location, + ); }, (word, direction, location)); if (candidate != null) { @@ -50364,7 +50408,7 @@ steps: part 'providers.g.dart'; - @@ -64,49 +63,25 @@ class Size extends _$Size { + @@ -67,57 +66,28 @@ class Size extends _$Size { } } @@ -50375,9 +50419,11 @@ steps: final size = ref.watch(sizeProvider); final wordListAsync = ref.watch(wordListProvider); - - var crossword = - + final emptyCrossword = - model.Crossword.crossword(width: size.width, height: size.height); + - var crossword = model.Crossword.crossword( + + final emptyCrossword = model.Crossword.crossword( + width: size.width, + height: size.height, + ); yield* wordListAsync.when( - data: (wordList) async* { @@ -50386,13 +50432,19 @@ steps: - final direction = - _random.nextBool() ? model.Direction.across : model.Direction.down; - final location = model.Location.at( - - _random.nextInt(size.width), _random.nextInt(size.height)); + - _random.nextInt(size.width), + - _random.nextInt(size.height), + - ); - try { - - var candidate = await compute( - - ((String, model.Direction, model.Location) wordToAdd) { + - var candidate = await compute(( + - (String, model.Direction, model.Location) wordToAdd, + - ) { - final (word, direction, location) = wordToAdd; - return crossword.addWord( - - word: word, direction: direction, location: location); + - word: word, + - direction: direction, + - location: location, + - ); - }, (word, direction, location)); - - if (candidate != null) { @@ -50406,10 +50458,11 @@ steps: - - yield crossword; - }, - + data: (wordList) => exploreCrosswordSolutions( - + crossword: emptyCrossword, - + wordList: wordList, - + ), + + data: + + (wordList) => exploreCrosswordSolutions( + + crossword: emptyCrossword, + + wordList: wordList, + + ), error: (error, stackTrace) async* { debugPrint('Error loading word list: $error'); - yield crossword; @@ -50424,6 +50477,9 @@ steps: - name: Run build_runner path: generate_crossword dart: run build_runner build --delete-conflicting-outputs + - name: format model.g.dart + path: generate_crossword + dart: format lib/model.g.dart - name: Flutter test path: generate_crossword flutter: test @@ -50467,7 +50523,7 @@ steps: import 'package:flutter_test/flutter_test.dart'; import 'package:generate_crossword/model.dart'; - @@ -382,4 +383,105 @@ void main() { + @@ -397,4 +398,121 @@ void main() { expect(crossword.valid, false); }); @@ -50481,10 +50537,12 @@ steps: + ); + expect(queue.locationsToTry.length, 1); + - + crossword = crossword.addWord( - + direction: Direction.across, - + location: Location.at(0, 0), - + word: 'word')!; + + crossword = + + crossword.addWord( + + direction: Direction.across, + + location: Location.at(0, 0), + + word: 'word', + + )!; + queue = WorkQueue.from( + crossword: crossword, + candidateWords: ['words', 'and', 'moar', 'wordz'], @@ -50492,21 +50550,26 @@ steps: + ); + expect(queue.locationsToTry.length, 4); + expect( - + queue.locationsToTry.entries - + .every((element) => element.value == Direction.down), - + isTrue); + + queue.locationsToTry.entries.every( + + (element) => element.value == Direction.down, + + ), + + isTrue, + + ); + final entries = queue.locationsToTry.entries; + expect(entries.every((element) => element.key.y == 0), isTrue); - + expect(entries.map((element) => element.key.x).toBuiltSet(), - + equals(BuiltSet([0, 1, 2, 3]))); + + expect( + + entries.map((element) => element.key.x).toBuiltSet(), + + equals(BuiltSet([0, 1, 2, 3])), + + ); + }); + + test('WorkQueue from down word', () { - + Crossword crossword = Crossword.crossword(width: 50, height: 50).addWord( - + direction: Direction.down, - + location: Location.at(0, 0), - + word: 'word', - + )!; + + Crossword crossword = + + Crossword.crossword(width: 50, height: 50).addWord( + + direction: Direction.down, + + location: Location.at(0, 0), + + word: 'word', + + )!; + + WorkQueue queue = WorkQueue.from( + crossword: crossword, @@ -50515,27 +50578,32 @@ steps: + ); + expect(queue.locationsToTry.length, 4); + expect( - + queue.locationsToTry.entries - + .every((element) => element.value == Direction.across), - + isTrue); + + queue.locationsToTry.entries.every( + + (element) => element.value == Direction.across, + + ), + + isTrue, + + ); + final entries = queue.locationsToTry.entries; + expect(entries.every((element) => element.key.x == 0), isTrue); - + expect(entries.map((element) => element.key.y).toBuiltSet(), - + equals(BuiltSet([0, 1, 2, 3]))); + + expect( + + entries.map((element) => element.key.y).toBuiltSet(), + + equals(BuiltSet([0, 1, 2, 3])), + + ); + }); + + test('WorkQueue from two words', () { - + Crossword crossword = Crossword.crossword(width: 50, height: 50) - + .addWord( - + direction: Direction.across, - + location: Location.at(0, 0), - + word: 'word', - + )! - + .addWord( - + direction: Direction.down, - + location: Location.at(0, 0), - + word: 'work', - + )!; + + Crossword crossword = + + Crossword.crossword(width: 50, height: 50) + + .addWord( + + direction: Direction.across, + + location: Location.at(0, 0), + + word: 'word', + + )! + + .addWord( + + direction: Direction.down, + + location: Location.at(0, 0), + + word: 'work', + + )!; + + WorkQueue queue = WorkQueue.from( + crossword: crossword, @@ -50543,27 +50611,31 @@ steps: + startLocation: Location.at(0, 0), + ); + expect( - + queue.locationsToTry, - + equals(BuiltMap({ + + queue.locationsToTry, + + equals( + + BuiltMap({ + Location.at(2, 0): Direction.down, + Location.at(0, 2): Direction.across, + Location.at(3, 0): Direction.down, + Location.at(0, 3): Direction.across, - + }))); + + }), + + ), + + ); + }); + + test('WorkQueue removes used words from candidate list', () { - + Crossword crossword = Crossword.crossword(width: 50, height: 50) - + .addWord( - + direction: Direction.across, - + location: Location.at(0, 0), - + word: 'word', - + )! - + .addWord( - + direction: Direction.down, - + location: Location.at(0, 0), - + word: 'work', - + )!; + + Crossword crossword = + + Crossword.crossword(width: 50, height: 50) + + .addWord( + + direction: Direction.across, + + location: Location.at(0, 0), + + word: 'word', + + )! + + .addWord( + + direction: Direction.down, + + location: Location.at(0, 0), + + word: 'work', + + )!; + + WorkQueue queue = WorkQueue.from( + crossword: crossword, @@ -50578,7 +50650,7 @@ steps: patch: | --- b/generate_crossword/step_06/lib/model.dart +++ a/generate_crossword/step_06/lib/model.dart - @@ -390,11 +390,108 @@ abstract class Crossword implements Built { + @@ -400,6 +400,120 @@ abstract class Crossword implements Built { Crossword._(); } @@ -50608,40 +50680,44 @@ steps: + required Crossword crossword, + required Iterable candidateWords, + required Location startLocation, - + }) => - + WorkQueue((b) { - + if (crossword.words.isEmpty) { - + // Strip candidate words too long to fit in the crossword - + b.candidateWords.addAll(candidateWords - + .where((word) => word.characters.length <= crossword.width)); + + }) => WorkQueue((b) { + + if (crossword.words.isEmpty) { + + // Strip candidate words too long to fit in the crossword + + b.candidateWords.addAll( + + candidateWords.where( + + (word) => word.characters.length <= crossword.width, + + ), + + ); + - + b.crossword.replace(crossword); + + b.crossword.replace(crossword); + - + b.locationsToTry.addAll({startLocation: Direction.across}); - + } else { - + // Assuming words have already been stripped to length - + b.candidateWords.addAll( - + candidateWords.toBuiltSet().rebuild( - + (b) => b.removeAll(crossword.words.map((word) => word.word))), - + ); - + b.crossword.replace(crossword); - + crossword.characters - + .rebuild((b) => b.removeWhere((location, character) { - + if (character.acrossWord != null && - + character.downWord != null) { - + return true; - + } - + final left = crossword.characters[location.left]; - + if (left != null && left.downWord != null) return true; - + final right = crossword.characters[location.right]; - + if (right != null && right.downWord != null) return true; - + final up = crossword.characters[location.up]; - + if (up != null && up.acrossWord != null) return true; - + final down = crossword.characters[location.down]; - + if (down != null && down.acrossWord != null) return true; - + return false; - + })) - + .forEach((location, character) { + + b.locationsToTry.addAll({startLocation: Direction.across}); + + } else { + + // Assuming words have already been stripped to length + + b.candidateWords.addAll( + + candidateWords.toBuiltSet().rebuild( + + (b) => b.removeAll(crossword.words.map((word) => word.word)), + + ), + + ); + + b.crossword.replace(crossword); + + crossword.characters + + .rebuild( + + (b) => b.removeWhere((location, character) { + + if (character.acrossWord != null && character.downWord != null) { + + return true; + + } + + final left = crossword.characters[location.left]; + + if (left != null && left.downWord != null) return true; + + final right = crossword.characters[location.right]; + + if (right != null && right.downWord != null) return true; + + final up = crossword.characters[location.up]; + + if (up != null && up.acrossWord != null) return true; + + final down = crossword.characters[location.down]; + + if (down != null && down.acrossWord != null) return true; + + return false; + + }), + + ) + + .forEach((location, character) { + b.locationsToTry.addAll({ + location: switch ((character.acrossWord, character.downWord)) { + (null, null) => @@ -50649,28 +50725,36 @@ steps: + (null, _) => Direction.across, + (_, null) => Direction.down, + (_, _) => throw StateError('Character is part of two words'), - + } + + }, + }); + }); - + } - + }); + + } + + }); + - + WorkQueue remove(Location location) => rebuild((b) => b - + ..locationsToTry.remove(location) - + ..badLocations.add(location)); + + WorkQueue remove(Location location) => rebuild( + + (b) => + + b + + ..locationsToTry.remove(location) + + ..badLocations.add(location), + + ); + + /// Update the work queue from a crossword derived from the current crossword + /// that this work queue is built from. + WorkQueue updateFrom(final Crossword crossword) => WorkQueue.from( - + crossword: crossword, - + candidateWords: candidateWords, - + startLocation: locationsToTry.isNotEmpty + + crossword: crossword, + + candidateWords: candidateWords, + + startLocation: + + locationsToTry.isNotEmpty + ? locationsToTry.keys.first + : Location.at(0, 0), - + ).rebuild((b) => b - + ..badLocations.addAll(badLocations) - + ..locationsToTry - + .removeWhere((location, _) => badLocations.contains(location))); + + ).rebuild( + + (b) => + + b + + ..badLocations.addAll(badLocations) + + ..locationsToTry.removeWhere( + + (location, _) => badLocations.contains(location), + + ), + + ); + + /// Factory constructor for [WorkQueue] + factory WorkQueue([void Function(WorkQueueBuilder)? updates]) = _$WorkQueue; @@ -50679,13 +50763,14 @@ steps: +} + /// Construct the serialization/deserialization code for the data model. - @SerializersFor([ - Location, - Crossword, - CrosswordWord, - CrosswordCharacter, + -@SerializersFor([Location, Crossword, CrosswordWord, CrosswordCharacter]) + +@SerializersFor([ + + Location, + + Crossword, + + CrosswordWord, + + CrosswordCharacter, + WorkQueue, - ]) + +]) final Serializers serializers = _$serializers; - name: Patch lib/utils.dart path: generate_crossword/lib/utils.dart @@ -50718,7 +50803,7 @@ steps: patch: | --- b/generate_crossword/step_06/lib/isolates.dart +++ a/generate_crossword/step_06/lib/isolates.dart - @@ -2,39 +2,73 @@ + @@ -2,44 +2,78 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -50737,12 +50822,14 @@ steps: required Crossword crossword, required BuiltSet wordList, }) async* { - - while ( - - crossword.characters.length < crossword.width * crossword.height * 0.8) { + - while (crossword.characters.length < + - crossword.width * crossword.height * 0.8) { - final word = wordList.randomElement(); - final direction = _random.nextBool() ? Direction.across : Direction.down; - final location = Location.at( - - _random.nextInt(crossword.width), _random.nextInt(crossword.height)); + - _random.nextInt(crossword.width), + - _random.nextInt(crossword.height), + - ); + final start = DateTime.now(); + var workQueue = WorkQueue.from( + crossword: crossword, @@ -50755,8 +50842,9 @@ steps: - var candidate = await compute(((String, Direction, Location) wordToAdd) { - final (word, direction, location) = wordToAdd; - return crossword.addWord( - - word: word, direction: direction, location: location); - - }, (word, direction, location)); + - word: word, + - direction: direction, + - location: location, + final crossword = await compute(((WorkQueue, Location) workMessage) { + final (workQueue, location) = workMessage; + final direction = workQueue.locationsToTry[location]!; @@ -50768,9 +50856,13 @@ steps: + word: workQueue.candidateWords.randomElement(), + ); + } - + var words = workQueue.candidateWords.toBuiltList().rebuild((b) => b - + ..where((b) => b.characters.contains(target.character)) - + ..shuffle()); + + var words = workQueue.candidateWords.toBuiltList().rebuild( + + (b) => + + b + + ..where((b) => b.characters.contains(target.character)) + + ..shuffle(), + ); + - }, (word, direction, location)); + int tryCount = 0; + for (final word in words) { + tryCount++; @@ -50806,12 +50898,17 @@ steps: debugPrint('Error running isolate: $e'); } } - + debugPrint('${crossword.width} x ${crossword.height} Crossword generated in ' - + '${DateTime.now().difference(start).formatted}'); + + debugPrint( + + '${crossword.width} x ${crossword.height} Crossword generated in ' + + '${DateTime.now().difference(start).formatted}', + + ); } - name: Run build_runner path: generate_crossword dart: run build_runner build --delete-conflicting-outputs + - name: format model.g.dart + path: generate_crossword + dart: format lib/model.g.dart - name: Flutter test path: generate_crossword flutter: test @@ -50855,7 +50952,7 @@ steps: part 'model.g.dart'; - @@ -486,6 +487,52 @@ abstract class WorkQueue implements Built { + @@ -508,6 +509,62 @@ abstract class WorkQueue implements Built { WorkQueue._(); } @@ -50880,25 +50977,35 @@ steps: + + /// Construct a [DisplayInfo] instance from a [WorkQueue]. + factory DisplayInfo.from({required WorkQueue workQueue}) { - + final gridFilled = (workQueue.crossword.characters.length / - + (workQueue.crossword.width * workQueue.crossword.height)); + + final gridFilled = + + (workQueue.crossword.characters.length / + + (workQueue.crossword.width * workQueue.crossword.height)); + final fmt = NumberFormat.decimalPattern(); + - + return DisplayInfo((b) => b - + ..wordsInGridCount = fmt.format(workQueue.crossword.words.length) - + ..candidateWordsCount = fmt.format(workQueue.candidateWords.length) - + ..locationsToExploreCount = fmt.format(workQueue.locationsToTry.length) - + ..knownBadLocationsCount = fmt.format(workQueue.badLocations.length) - + ..gridFilledPercentage = '${(gridFilled * 100).toStringAsFixed(2)}%'); + + return DisplayInfo( + + (b) => + + b + + ..wordsInGridCount = fmt.format(workQueue.crossword.words.length) + + ..candidateWordsCount = fmt.format(workQueue.candidateWords.length) + + ..locationsToExploreCount = fmt.format( + + workQueue.locationsToTry.length, + + ) + + ..knownBadLocationsCount = fmt.format(workQueue.badLocations.length) + + ..gridFilledPercentage = + + '${(gridFilled * 100).toStringAsFixed(2)}%', + + ); + } + + /// An empty [DisplayInfo] instance. - + static DisplayInfo get empty => DisplayInfo((b) => b - + ..wordsInGridCount = '0' - + ..candidateWordsCount = '0' - + ..locationsToExploreCount = '0' - + ..knownBadLocationsCount = '0' - + ..gridFilledPercentage = '0%'); + + static DisplayInfo get empty => DisplayInfo( + + (b) => + + b + + ..wordsInGridCount = '0' + + ..candidateWordsCount = '0' + + ..locationsToExploreCount = '0' + + ..knownBadLocationsCount = '0' + + ..gridFilledPercentage = '0%', + + ); + + factory DisplayInfo([void Function(DisplayInfoBuilder)? updates]) = + _$DisplayInfo; @@ -50908,7 +51015,7 @@ steps: /// Construct the serialization/deserialization code for the data model. @SerializersFor([ Location, - @@ -493,5 +540,6 @@ abstract class WorkQueue implements Built { + @@ -515,5 +572,6 @@ abstract class WorkQueue implements Built { CrosswordWord, CrosswordCharacter, WorkQueue, @@ -50929,7 +51036,7 @@ steps: required Crossword crossword, required BuiltSet wordList, }) async* { - @@ -61,10 +61,10 @@ Stream exploreCrosswordSolutions({ + @@ -64,10 +64,10 @@ Stream exploreCrosswordSolutions({ }, (workQueue, location)); if (crossword != null) { workQueue = workQueue.updateFrom(crossword); @@ -50954,7 +51061,7 @@ steps: import 'package:built_collection/built_collection.dart'; import 'package:flutter/foundation.dart'; - @@ -64,12 +65,19 @@ class Size extends _$Size { + @@ -67,14 +68,21 @@ class Size extends _$Size { } @riverpod @@ -50963,8 +51070,10 @@ steps: final size = ref.watch(sizeProvider); final wordListAsync = ref.watch(wordListProvider); - - final emptyCrossword = - model.Crossword.crossword(width: size.width, height: size.height); + final emptyCrossword = model.Crossword.crossword( + width: size.width, + height: size.height, + ); + final emptyWorkQueue = model.WorkQueue.from( + crossword: emptyCrossword, + candidateWords: BuiltSet(), @@ -50975,9 +51084,9 @@ steps: + ref.read(endTimeProvider.notifier).clear(); yield* wordListAsync.when( - data: (wordList) => exploreCrosswordSolutions( - @@ -78,10 +86,100 @@ Stream crossword(Ref ref) async* { - ), + data: + @@ -84,10 +92,103 @@ Stream crossword(Ref ref) async* { + ), error: (error, stackTrace) async* { debugPrint('Error loading word list: $error'); - yield emptyCrossword; @@ -50986,8 +51095,8 @@ steps: loading: () async* { - yield emptyCrossword; + yield emptyWorkQueue; - + }, - + ); + }, + ); + + ref.read(endTimeProvider.notifier).end(); +} @@ -51039,21 +51148,22 @@ steps: + try { + final soFar = DateTime.now().difference(startTime); + final completedPercentage = min( - + 0.99, - + (workQueue.crossword.characters.length / - + (workQueue.crossword.width * workQueue.crossword.height) / - + _estimatedTotalCoverage)); + + 0.99, + + (workQueue.crossword.characters.length / + + (workQueue.crossword.width * workQueue.crossword.height) / + + _estimatedTotalCoverage), + + ); + final expectedTotal = soFar.inSeconds / completedPercentage; + final expectedRemaining = expectedTotal - soFar.inSeconds; + return Duration(seconds: expectedRemaining.toInt()); + } catch (e) { + return Duration.zero; + } - }, + + }, + error: (error, stackTrace) => Duration.zero, + loading: () => Duration.zero, - ); - } + + ); + +} + +/// A provider that holds whether to display info. +@Riverpod(keepAlive: true) @@ -51073,17 +51183,19 @@ steps: +@riverpod +class DisplayInfo extends _$DisplayInfo { + @override - + model.DisplayInfo build() => ref.watch(workQueueProvider).when( + + model.DisplayInfo build() => ref + + .watch(workQueueProvider) + + .when( + data: (workQueue) => model.DisplayInfo.from(workQueue: workQueue), + error: (error, stackTrace) => model.DisplayInfo.empty, + loading: () => model.DisplayInfo.empty, + ); - +} + } - name: Patch lib/widgets/crossword_widget.dart path: generate_crossword/lib/widgets/crossword_widget.dart patch: | - --- a/generate_crossword/step_07/lib/widgets/crossword_widget.dart - +++ b/generate_crossword/step_07/lib/widgets/crossword_widget.dart + --- b/generate_crossword/step_07/lib/widgets/crossword_widget.dart + +++ a/generate_crossword/step_07/lib/widgets/crossword_widget.dart @@ -32,9 +32,9 @@ class CrosswordWidget extends ConsumerWidget { child: Consumer( builder: (context, ref, _) { @@ -51155,9 +51267,7 @@ steps: import 'ticker_builder.dart'; class CrosswordInfoWidget extends ConsumerWidget { - const CrosswordInfoWidget({ - super.key, - }); + const CrosswordInfoWidget({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -51170,62 +51280,68 @@ steps: return Align( alignment: Alignment.bottomRight, child: Padding( - padding: const EdgeInsets.only( - right: 32.0, - bottom: 32.0, - ), + padding: const EdgeInsets.only(right: 32.0, bottom: 32.0), child: ClipRRect( borderRadius: BorderRadius.circular(8), child: ColoredBox( color: Theme.of(context).colorScheme.onPrimary.withAlpha(230), child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 12, - vertical: 8, - ), + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), child: DefaultTextStyle( style: TextStyle( - fontSize: 16, color: Theme.of(context).colorScheme.primary), + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ _CrosswordInfoRichText( - label: 'Grid Size', - value: '${size.width} x ${size.height}'), + label: 'Grid Size', + value: '${size.width} x ${size.height}', + ), _CrosswordInfoRichText( - label: 'Words in grid', - value: displayInfo.wordsInGridCount), + label: 'Words in grid', + value: displayInfo.wordsInGridCount, + ), _CrosswordInfoRichText( - label: 'Candidate words', - value: displayInfo.candidateWordsCount), + label: 'Candidate words', + value: displayInfo.candidateWordsCount, + ), _CrosswordInfoRichText( - label: 'Locations to explore', - value: displayInfo.locationsToExploreCount), + label: 'Locations to explore', + value: displayInfo.locationsToExploreCount, + ), _CrosswordInfoRichText( - label: 'Known bad locations', - value: displayInfo.knownBadLocationsCount), + label: 'Known bad locations', + value: displayInfo.knownBadLocationsCount, + ), _CrosswordInfoRichText( - label: 'Grid filled', - value: displayInfo.gridFilledPercentage), + label: 'Grid filled', + value: displayInfo.gridFilledPercentage, + ), switch ((startTime, endTime)) { (null, _) => _CrosswordInfoRichText( - label: 'Time elapsed', - value: 'Not started yet', - ), + label: 'Time elapsed', + value: 'Not started yet', + ), (DateTime start, null) => TickerBuilder( - builder: (context) => _CrosswordInfoRichText( - label: 'Time elapsed', - value: DateTime.now().difference(start).formatted, - ), - ), + builder: + (context) => _CrosswordInfoRichText( + label: 'Time elapsed', + value: DateTime.now().difference(start).formatted, + ), + ), (DateTime start, DateTime end) => _CrosswordInfoRichText( - label: 'Completed in', - value: end.difference(start).formatted), + label: 'Completed in', + value: end.difference(start).formatted, + ), }, if (startTime != null && endTime == null) _CrosswordInfoRichText( - label: 'Est. remaining', value: remaining.formatted), + label: 'Est. remaining', + value: remaining.formatted, + ), ], ), ), @@ -51245,27 +51361,24 @@ steps: @override Widget build(BuildContext context) => RichText( - text: TextSpan( - children: [ - TextSpan( - text: '$label ', - style: DefaultTextStyle.of(context).style, - ), - TextSpan( - text: value, - style: DefaultTextStyle.of(context) - .style - .copyWith(fontWeight: FontWeight.bold), - ), - ], + text: TextSpan( + children: [ + TextSpan(text: '$label ', style: DefaultTextStyle.of(context).style), + TextSpan( + text: value, + style: DefaultTextStyle.of( + context, + ).style.copyWith(fontWeight: FontWeight.bold), ), - ); + ], + ), + ); } - name: Patch lib/widgets/crossword_generator_app.dart path: generate_crossword/lib/widgets/crossword_generator_app.dart patch: | - --- a/generate_crossword/step_07/lib/widgets/crossword_generator_app.dart - +++ b/generate_crossword/step_07/lib/widgets/crossword_generator_app.dart + --- b/generate_crossword/step_07/lib/widgets/crossword_generator_app.dart + +++ a/generate_crossword/step_07/lib/widgets/crossword_generator_app.dart @@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -51274,44 +51387,47 @@ steps: import 'crossword_widget.dart'; class CrosswordGeneratorApp extends StatelessWidget { - @@ -25,7 +26,18 @@ class CrosswordGeneratorApp extends StatelessWidget { + @@ -24,7 +25,18 @@ class CrosswordGeneratorApp extends StatelessWidget { + ), title: Text('Crossword Generator'), ), - body: SafeArea( - - child: CrosswordWidget(), + - body: SafeArea(child: CrosswordWidget()), + + body: SafeArea( + child: Consumer( + builder: (context, ref, child) { + return Stack( + children: [ - + Positioned.fill( - + child: CrosswordWidget(), - + ), + + Positioned.fill(child: CrosswordWidget()), + if (ref.watch(showDisplayInfoProvider)) CrosswordInfoWidget(), + ], + ); + }, + ), - ), + + ), ), ); - @@ -55,6 +67,14 @@ class _CrosswordGeneratorMenu extends ConsumerWidget { + } + @@ -54,6 +66,14 @@ class _CrosswordGeneratorMenu extends ConsumerWidget { : Icon(Icons.radio_button_unchecked_outlined), - child: Text(entry.label), - ), - + MenuItemButton( - + leadingIcon: ref.watch(showDisplayInfoProvider) + child: Text(entry.label), + ), + + MenuItemButton( + + leadingIcon: + + ref.watch(showDisplayInfoProvider) + ? Icon(Icons.check_box_outlined) + : Icon(Icons.check_box_outline_blank_outlined), - + onPressed: () => - + ref.read(showDisplayInfoProvider.notifier).toggle(), - + child: Text('Display Info'), - + ), - ], - builder: (context, controller, child) => IconButton( - onPressed: () => controller.open(), + + onPressed: () => ref.read(showDisplayInfoProvider.notifier).toggle(), + + child: Text('Display Info'), + + ), + ], + builder: + (context, controller, child) => IconButton( - name: Run build_runner path: generate_crossword dart: run build_runner build --delete-conflicting-outputs + - name: format model.g.dart lib/providers.g.dart + path: generate_crossword + dart: format lib/model.g.dart lib/providers.g.dart - name: Flutter test path: generate_crossword flutter: test @@ -51347,15 +51463,16 @@ steps: patch: | --- b/generate_crossword/step_08/lib/widgets/crossword_widget.dart +++ a/generate_crossword/step_08/lib/widgets/crossword_widget.dart - @@ -41,16 +41,35 @@ class CrosswordWidget extends ConsumerWidget { + @@ -41,16 +41,38 @@ class CrosswordWidget extends ConsumerWidget { ), ); + final explorationCell = ref.watch( + workQueueProvider.select( + (workQueueAsync) => workQueueAsync.when( - + data: (workQueue) => - + workQueue.locationsToTry.keys.contains(location), + + data: + + (workQueue) => + + workQueue.locationsToTry.keys.contains(location), + error: (error, stackTrace) => false, + loading: () => false, + ), @@ -51368,9 +51485,10 @@ steps: + return AnimatedContainer( + duration: Durations.extralong1, + curve: Curves.easeInOut, - + color: explorationCell - + ? Theme.of(context).colorScheme.primary - + : Theme.of(context).colorScheme.onPrimary, + + color: + + explorationCell + + ? Theme.of(context).colorScheme.primary + + : Theme.of(context).colorScheme.onPrimary, child: Center( - child: Text( - character.character, @@ -51380,9 +51498,10 @@ steps: style: TextStyle( fontSize: 24, - color: Theme.of(context).colorScheme.primary, - + color: explorationCell - + ? Theme.of(context).colorScheme.onPrimary - + : Theme.of(context).colorScheme.primary, + + color: + + explorationCell + + ? Theme.of(context).colorScheme.onPrimary + + : Theme.of(context).colorScheme.primary, ), + child: Text(character.character), ), @@ -51401,7 +51520,7 @@ steps: }) async* { final start = DateTime.now(); var workQueue = WorkQueue.from( - @@ -20,55 +21,98 @@ Stream exploreCrosswordSolutions({ + @@ -20,60 +21,116 @@ Stream exploreCrosswordSolutions({ startLocation: Location.at(0, 0), ); while (!workQueue.isCompleted) { @@ -51418,9 +51537,12 @@ steps: - word: workQueue.candidateWords.randomElement(), - ); - } - - var words = workQueue.candidateWords.toBuiltList().rebuild((b) => b - - ..where((b) => b.characters.contains(target.character)) - - ..shuffle()); + - var words = workQueue.candidateWords.toBuiltList().rebuild( + - (b) => + - b + - ..where((b) => b.characters.contains(target.character)) + - ..shuffle(), + - ); - int tryCount = 0; - for (final word in words) { - tryCount++; @@ -51433,11 +51555,26 @@ steps: + } + } + - + debugPrint('Generated ${workQueue.crossword.width} x ' - + '${workQueue.crossword.height} crossword in ' - + '${DateTime.now().difference(start).formatted} ' - + 'with $maxWorkerCount workers.'); + + debugPrint( + + 'Generated ${workQueue.crossword.width} x ' + + '${workQueue.crossword.height} crossword in ' + + '${DateTime.now().difference(start).formatted} ' + + 'with $maxWorkerCount workers.', + + ); +} + + + +Future _generate((WorkQueue, int) workMessage) async { + + var (workQueue, maxWorkerCount) = workMessage; + + final candidateGeneratorFutures = >[]; + + final locations = workQueue.locationsToTry.keys.toBuiltList().rebuild( + + (b) => + + b + + ..shuffle() + + ..take(maxWorkerCount), + + ); + + + + for (final location in locations) { + + final direction = workQueue.locationsToTry[location]!; - final candidate = workQueue.crossword.addWord( - location: switch (direction) { @@ -51454,18 +51591,14 @@ steps: - if (tryCount > 1000) { - break; - } - +Future _generate((WorkQueue, int) workMessage) async { - + var (workQueue, maxWorkerCount) = workMessage; - + final candidateGeneratorFutures = >[]; - + final locations = workQueue.locationsToTry.keys.toBuiltList().rebuild((b) => b - + ..shuffle() - + ..take(maxWorkerCount)); - + - + for (final location in locations) { - + final direction = workQueue.locationsToTry[location]!; - + - + candidateGeneratorFutures.add(compute(_generateCandidate, - + (workQueue.crossword, workQueue.candidateWords, location, direction))); + + candidateGeneratorFutures.add( + + compute(_generateCandidate, ( + + workQueue.crossword, + + workQueue.candidateWords, + + location, + + direction, + + )), + + ); + } + + try { @@ -51474,7 +51607,10 @@ steps: + for (final (location, direction, word) in results) { + if (word != null) { + final candidate = crossword.addWord( - + location: location, word: word, direction: direction); + + location: location, + + word: word, + + direction: direction, + + ); + if (candidate != null) { + crossword = candidate; } @@ -51487,18 +51623,22 @@ steps: - yield workQueue; - } catch (e) { - debugPrint('Error running isolate: $e'); - + } + } + + workQueue = workQueue.updateFrom(crossword); + } catch (e) { + debugPrint('$e'); - + } + } + - debugPrint( + - '${crossword.width} x ${crossword.height} Crossword generated in ' + - '${DateTime.now().difference(start).formatted}', + + return workQueue; +} + +(Location, Direction, String?) _generateCandidate( - + (Crossword, BuiltSet, Location, Direction) searchDetailMessage) { + + (Crossword, BuiltSet, Location, Direction) searchDetailMessage, + +) { + final (crossword, candidateWords, location, direction) = searchDetailMessage; + + final target = crossword.characters[location]; @@ -51508,9 +51648,12 @@ steps: + + // Filter down the candidate word list to those that contain the letter + // at the current location - + final words = candidateWords.toBuiltList().rebuild((b) => b - + ..where((b) => b.characters.contains(target.character)) - + ..shuffle()); + + final words = candidateWords.toBuiltList().rebuild( + + (b) => + + b + + ..where((b) => b.characters.contains(target.character)) + + ..shuffle(), + ); + int tryCount = 0; + final start = DateTime.now(); + for (final word in words) { @@ -51536,10 +51679,8 @@ steps: + if (tryCount >= 1000 || deltaTime > Duration(seconds: 10)) { + return (location, direction, null); + } - } - } - - debugPrint('${crossword.width} x ${crossword.height} Crossword generated in ' - - '${DateTime.now().difference(start).formatted}'); + + } + + } + + return (location, direction, null); } @@ -51548,23 +51689,23 @@ steps: patch: | --- b/generate_crossword/step_08/lib/providers.dart +++ a/generate_crossword/step_08/lib/providers.dart - @@ -66,6 +66,7 @@ class Size extends _$Size { + @@ -69,6 +69,7 @@ class Size extends _$Size { @riverpod Stream workQueue(Ref ref) async* { + final workers = ref.watch(workerCountProvider); final size = ref.watch(sizeProvider); final wordListAsync = ref.watch(wordListProvider); - final emptyCrossword = - @@ -83,6 +84,7 @@ Stream workQueue(Ref ref) async* { - data: (wordList) => exploreCrosswordSolutions( - crossword: emptyCrossword, - wordList: wordList, - + maxWorkerCount: workers.count, - ), + final emptyCrossword = model.Crossword.crossword( + @@ -89,6 +90,7 @@ Stream workQueue(Ref ref) async* { + (wordList) => exploreCrosswordSolutions( + crossword: emptyCrossword, + wordList: wordList, + + maxWorkerCount: workers.count, + ), error: (error, stackTrace) async* { debugPrint('Error loading word list: $error'); - @@ -183,3 +185,33 @@ class DisplayInfo extends _$DisplayInfo { + @@ -192,3 +194,33 @@ class DisplayInfo extends _$DisplayInfo { loading: () => model.DisplayInfo.empty, ); } @@ -51601,9 +51742,9 @@ steps: - name: Patch lib/widgets/crossword_info_widget.dart path: generate_crossword/lib/widgets/crossword_info_widget.dart patch: | - --- a/generate_crossword/step_08/lib/widgets/crossword_info_widget.dart - +++ b/generate_crossword/step_08/lib/widgets/crossword_info_widget.dart - @@ -18,6 +18,7 @@ class CrosswordInfoWidget extends ConsumerWidget { + --- b/generate_crossword/step_08/lib/widgets/crossword_info_widget.dart + +++ a/generate_crossword/step_08/lib/widgets/crossword_info_widget.dart + @@ -16,6 +16,7 @@ class CrosswordInfoWidget extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final size = ref.watch(sizeProvider); final displayInfo = ref.watch(displayInfoProvider); @@ -51611,39 +51752,45 @@ steps: final startTime = ref.watch(startTimeProvider); final endTime = ref.watch(endTimeProvider); final remaining = ref.watch(expectedRemainingTimeProvider); - @@ -63,6 +64,8 @@ class CrosswordInfoWidget extends ConsumerWidget { - _CrosswordInfoRichText( - label: 'Grid filled', - value: displayInfo.gridFilledPercentage), + @@ -63,6 +64,10 @@ class CrosswordInfoWidget extends ConsumerWidget { + label: 'Grid filled', + value: displayInfo.gridFilledPercentage, + ), + _CrosswordInfoRichText( - + label: 'Max worker count', value: workerCount), + + label: 'Max worker count', + + value: workerCount, + + ), switch ((startTime, endTime)) { (null, _) => _CrosswordInfoRichText( - label: 'Time elapsed', + label: 'Time elapsed', - name: Patch lib/widgets/crossword_generator_app.dart path: generate_crossword/lib/widgets/crossword_generator_app.dart patch: | - --- a/generate_crossword/step_08/lib/widgets/crossword_generator_app.dart - +++ b/generate_crossword/step_08/lib/widgets/crossword_generator_app.dart - @@ -75,6 +75,15 @@ class _CrosswordGeneratorMenu extends ConsumerWidget { - ref.read(showDisplayInfoProvider.notifier).toggle(), - child: Text('Display Info'), - ), - + for (final count in BackgroundWorkers.values) - + MenuItemButton( - + leadingIcon: count == ref.watch(workerCountProvider) + --- b/generate_crossword/step_08/lib/widgets/crossword_generator_app.dart + +++ a/generate_crossword/step_08/lib/widgets/crossword_generator_app.dart + @@ -74,6 +74,16 @@ class _CrosswordGeneratorMenu extends ConsumerWidget { + onPressed: () => ref.read(showDisplayInfoProvider.notifier).toggle(), + child: Text('Display Info'), + ), + + for (final count in BackgroundWorkers.values) + + MenuItemButton( + + leadingIcon: + + count == ref.watch(workerCountProvider) + ? Icon(Icons.radio_button_checked_outlined) + : Icon(Icons.radio_button_unchecked_outlined), - + onPressed: () => - + ref.read(workerCountProvider.notifier).setCount(count), - + child: Text(count.label), - + ), - ], - builder: (context, controller, child) => IconButton( - onPressed: () => controller.open(), + + onPressed: + + () => ref.read(workerCountProvider.notifier).setCount(count), + + child: Text(count.label), + + ), + ], + builder: + (context, controller, child) => IconButton( - name: Run build_runner path: generate_crossword dart: run build_runner build --delete-conflicting-outputs + - name: format model.g.dart lib/providers.g.dart + path: generate_crossword + dart: format lib/model.g.dart lib/providers.g.dart - name: Flutter test path: generate_crossword flutter: test @@ -51687,7 +51834,7 @@ steps: import 'package:flutter_test/flutter_test.dart'; import 'package:generate_crossword/model.dart'; - @@ -484,4 +485,298 @@ void main() { + @@ -515,4 +516,339 @@ void main() { ); expect(queue.candidateWords.length, equals(0)); }); @@ -51706,16 +51853,22 @@ steps: + word: 'works', + location: Location.at(0, 0), + direction: Direction.down, - + ) + + ), + ], + ); + + final re = RegExp('^[a-z]+\$'); + final str = await rootBundle.loadString('assets/words.txt'); - + final words = str.split('\n').toBuiltSet().rebuild((b) => b - + ..map((str) => str.toLowerCase().trim()) - + ..removeWhere((str) => str.length < 3) - + ..removeWhere((str) => re.stringMatch(str) == null)); + + final words = str + + .split('\n') + + .toBuiltSet() + + .rebuild( + + (b) => + + b + + ..map((str) => str.toLowerCase().trim()) + + ..removeWhere((str) => str.length < 3) + + ..removeWhere((str) => re.stringMatch(str) == null), + + ); + + final puzzle = CrosswordPuzzleGame.from( + crossword: crossword, @@ -51726,132 +51879,144 @@ steps: + expect(puzzle.alternateWords.keys.length, 1); + expect(puzzle.alternateWords[Location.at(0, 0)]?.keys.length, 2); + expect( - + puzzle.alternateWords[Location.at(0, 0)]?[Direction.down]?.length, 4); + + puzzle.alternateWords[Location.at(0, 0)]?[Direction.down]?.length, + + 4, + + ); + expect( - + puzzle.alternateWords[Location.at(0, 0)]?[Direction.across]?.length, 4); + + puzzle.alternateWords[Location.at(0, 0)]?[Direction.across]?.length, + + 4, + + ); + }); + + test('Allow non-overlapping words with requireOverlap: false', () { + Crossword? crossword = Crossword.crossword(width: 50, height: 50); + + crossword = crossword.addWord( - + direction: Direction.across, - + location: Location.at(0, 0), - + word: 'word', - + requireOverlap: false); + + direction: Direction.across, + + location: Location.at(0, 0), + + word: 'word', + + requireOverlap: false, + + ); + + if (crossword == null) fail("crossword shouldn't be null"); + + crossword = crossword.addWord( - + direction: Direction.across, - + location: Location.at(3, 3), - + word: 'another', - + requireOverlap: false); + + direction: Direction.across, + + location: Location.at(3, 3), + + word: 'another', + + requireOverlap: false, + + ); + + if (crossword == null) fail("crossword shouldn't be null"); + }); + + test( - + 'Adding overlapping across words returns null with requireOverlap: false', - + () { - + Crossword? crossword = Crossword.crossword(width: 50, height: 50); - + expect(crossword.valid, isTrue); + + 'Adding overlapping across words returns null with requireOverlap: false', + + () { + + Crossword? crossword = Crossword.crossword(width: 50, height: 50); + + expect(crossword.valid, isTrue); + - + final topLeft = Location.at(0, 0); + + final topLeft = Location.at(0, 0); + - + crossword = crossword.addWord( - + direction: Direction.across, - + location: topLeft, - + word: 'this', - + requireOverlap: false, - + ); - + if (crossword == null) fail("crossword shouldn't be null"); - + expect(crossword.valid, true); + + crossword = crossword.addWord( + + direction: Direction.across, + + location: topLeft, + + word: 'this', + + requireOverlap: false, + + ); + + if (crossword == null) fail("crossword shouldn't be null"); + + expect(crossword.valid, true); + - + final crossword2 = crossword.addWord( - + direction: Direction.across, - + location: topLeft, - + word: 'that', - + requireOverlap: false, - + ); - + expect(crossword2, isNull); - + }); + + final crossword2 = crossword.addWord( + + direction: Direction.across, + + location: topLeft, + + word: 'that', + + requireOverlap: false, + + ); + + expect(crossword2, isNull); + + }, + + ); + - + test('Adding overlapping down words returns null with requireOverlap: false', - + () { - + Crossword? crossword = Crossword.crossword(width: 50, height: 50); + + test( + + 'Adding overlapping down words returns null with requireOverlap: false', + + () { + + Crossword? crossword = Crossword.crossword(width: 50, height: 50); + - + expect(crossword.valid, true); + + expect(crossword.valid, true); + - + final topLeft = Location.at(0, 0); + + final topLeft = Location.at(0, 0); + - + crossword = crossword - + .addWord( - + location: topLeft, - + word: 'this', - + direction: Direction.down, - + requireOverlap: false, - + )! - + .addWord( - + location: topLeft, - + word: 'total', - + direction: Direction.across, - + requireOverlap: false, - + )!; + + crossword = + + crossword + + .addWord( + + location: topLeft, + + word: 'this', + + direction: Direction.down, + + requireOverlap: false, + + )! + + .addWord( + + location: topLeft, + + word: 'total', + + direction: Direction.across, + + requireOverlap: false, + + )!; + - + expect(crossword.valid, isTrue); + + expect(crossword.valid, isTrue); + - + final crossword2 = crossword.addWord( - + direction: Direction.down, - + location: topLeft, - + word: 'that', - + requireOverlap: false, - + ); - + expect(crossword2, isNull); - + }); + + final crossword2 = crossword.addWord( + + direction: Direction.down, + + location: topLeft, + + word: 'that', + + requireOverlap: false, + + ); + + expect(crossword2, isNull); + + }, + + ); + - + test('Adding words out of bounds returns null with requireOverlap: false', - + () { - + final crossword = Crossword.crossword(width: 50, height: 50); + + test( + + 'Adding words out of bounds returns null with requireOverlap: false', + + () { + + final crossword = Crossword.crossword(width: 50, height: 50); + - + expect(crossword.valid, true); + + expect(crossword.valid, true); + - + // Above the top of the board - + final crossword1 = crossword.addWord( - + direction: Direction.down, - + location: Location.at(0, -1), - + word: 'this', - + requireOverlap: false, - + ); - + expect(crossword1, isNull); + + // Above the top of the board + + final crossword1 = crossword.addWord( + + direction: Direction.down, + + location: Location.at(0, -1), + + word: 'this', + + requireOverlap: false, + + ); + + expect(crossword1, isNull); + - + // To the left of the board - + final crossword2 = crossword.addWord( - + direction: Direction.down, - + location: Location.at(-1, 0), - + word: 'that', - + requireOverlap: false, - + ); - + expect(crossword2, isNull); + + // To the left of the board + + final crossword2 = crossword.addWord( + + direction: Direction.down, + + location: Location.at(-1, 0), + + word: 'that', + + requireOverlap: false, + + ); + + expect(crossword2, isNull); + - + // To the right of the board - + final crossword3 = crossword.addWord( - + direction: Direction.down, - + location: Location.at(51, 0), - + word: 'this', - + requireOverlap: false, - + ); - + expect(crossword3, isNull); + + // To the right of the board + + final crossword3 = crossword.addWord( + + direction: Direction.down, + + location: Location.at(51, 0), + + word: 'this', + + requireOverlap: false, + + ); + + expect(crossword3, isNull); + - + // Below the bottom of the board - + final crossword4 = crossword.addWord( - + direction: Direction.down, - + location: Location.at(0, 51), - + word: 'that', - + requireOverlap: false, - + ); - + expect(crossword4, isNull); - + }); + + // Below the bottom of the board + + final crossword4 = crossword.addWord( + + direction: Direction.down, + + location: Location.at(0, 51), + + word: 'that', + + requireOverlap: false, + + ); + + expect(crossword4, isNull); + + }, + + ); + + test('CrosswordPuzzleGame allows alternate play', () async { + final topLeft = Location.at(0, 0); @@ -51882,10 +52047,16 @@ steps: + + final re = RegExp('^[a-z]+\$'); + final str = await rootBundle.loadString('assets/words.txt'); - + final words = str.split('\n').toBuiltSet().rebuild((b) => b - + ..map((str) => str.toLowerCase().trim()) - + ..removeWhere((str) => str.length < 3) - + ..removeWhere((str) => re.stringMatch(str) == null)); + + final words = str + + .split('\n') + + .toBuiltSet() + + .rebuild( + + (b) => + + b + + ..map((str) => str.toLowerCase().trim()) + + ..removeWhere((str) => str.length < 3) + + ..removeWhere((str) => re.stringMatch(str) == null), + + ); + + CrosswordPuzzleGame? puzzle = CrosswordPuzzleGame.from( + crossword: crossword, @@ -51908,17 +52079,19 @@ steps: + } + + puzzle = puzzle.selectWord( - + location: topLeft, - + word: topLeftAcrossAlternates.first, - + direction: Direction.across); + + location: topLeft, + + word: topLeftAcrossAlternates.first, + + direction: Direction.across, + + ); + if (puzzle == null) { + fail('puzzle should not be null'); + } + + puzzle = puzzle.selectWord( - + location: downBy4, - + word: downBy4AcrossAlternates.first, - + direction: Direction.across); + + location: downBy4, + + word: downBy4AcrossAlternates.first, + + direction: Direction.across, + + ); + if (puzzle == null) { + fail('puzzle should not be null'); + } @@ -51955,10 +52128,16 @@ steps: + + final re = RegExp('^[a-z]+\$'); + final str = await rootBundle.loadString('assets/words.txt'); - + final words = str.split('\n').toBuiltSet().rebuild((b) => b - + ..map((str) => str.toLowerCase().trim()) - + ..removeWhere((str) => str.length < 3) - + ..removeWhere((str) => re.stringMatch(str) == null)); + + final words = str + + .split('\n') + + .toBuiltSet() + + .rebuild( + + (b) => + + b + + ..map((str) => str.toLowerCase().trim()) + + ..removeWhere((str) => str.length < 3) + + ..removeWhere((str) => re.stringMatch(str) == null), + + ); + + CrosswordPuzzleGame? puzzle = CrosswordPuzzleGame.from( + crossword: crossword, @@ -51966,19 +52145,28 @@ steps: + ); + + puzzle = puzzle.selectWord( - + location: topLeft, word: 'word', direction: Direction.across); + + location: topLeft, + + word: 'word', + + direction: Direction.across, + + ); + if (puzzle == null) { + fail('puzzle should not be null'); + } + + puzzle = puzzle.selectWord( - + location: topLeft, word: 'works', direction: Direction.down); + + location: topLeft, + + word: 'works', + + direction: Direction.down, + + ); + if (puzzle == null) { + fail('puzzle should not be null'); + } + + puzzle = puzzle.selectWord( - + location: downBy4, word: 'silent', direction: Direction.across); + + location: downBy4, + + word: 'silent', + + direction: Direction.across, + + ); + if (puzzle == null) { + fail('puzzle should not be null'); + } @@ -51991,7 +52179,7 @@ steps: patch: | --- b/generate_crossword/step_09/lib/model.dart +++ a/generate_crossword/step_09/lib/model.dart - @@ -249,6 +249,7 @@ abstract class Crossword implements Built { + @@ -255,6 +255,7 @@ abstract class Crossword implements Built { required Location location, required String word, required Direction direction, @@ -51999,7 +52187,7 @@ steps: }) { // Require that the word is not already in the crossword. if (words.map((crosswordWord) => crosswordWord.word).contains(word)) { - @@ -277,7 +278,10 @@ abstract class Crossword implements Built { + @@ -283,7 +284,10 @@ abstract class Crossword implements Built { } } } @@ -52011,7 +52199,7 @@ steps: return null; } - @@ -533,6 +537,173 @@ abstract class DisplayInfo implements Built { + @@ -565,6 +569,196 @@ abstract class DisplayInfo implements Built { DisplayInfo._(); } @@ -52050,20 +52238,24 @@ steps: + if (puzzle.selectedWords + .where((b) => b.direction == direction && b.location == location) + .isNotEmpty) { - + puzzle = puzzle.rebuild((b) => b - + ..selectedWords.removeWhere( - + (selectedWord) => - + selectedWord.location == location && - + selectedWord.direction == direction, - + )); + + puzzle = puzzle.rebuild( + + (b) => + + b + + ..selectedWords.removeWhere( + + (selectedWord) => + + selectedWord.location == location && + + selectedWord.direction == direction, + + ), + + ); + } + + return null != + puzzle.crosswordFromSelectedWords.addWord( - + location: location, - + word: word, - + direction: direction, - + requireOverlap: false); + + location: location, + + word: word, + + direction: direction, + + requireOverlap: false, + + ); + } + + CrosswordPuzzleGame? selectWord({ @@ -52086,33 +52278,44 @@ steps: + if (puzzle.selectedWords + .where((b) => b.direction == direction && b.location == location) + .isNotEmpty) { - + puzzle = puzzle.rebuild((b) => b - + ..selectedWords.removeWhere( - + (selectedWord) => - + selectedWord.location == location && - + selectedWord.direction == direction, - + )); + + puzzle = puzzle.rebuild( + + (b) => + + b + + ..selectedWords.removeWhere( + + (selectedWord) => + + selectedWord.location == location && + + selectedWord.direction == direction, + + ), + + ); + } + + // Check if the selected word meshes with the already selected words. + // Note this version of the crossword does not enforce overlap to + // allow the player to select words anywhere on the grid. Enforcing words + // to be solved in order is a possible alternative. - + final updatedSelectedWordsCrossword = - + puzzle.crosswordFromSelectedWords.addWord( - + location: location, - + word: word, - + direction: direction, - + requireOverlap: false, - + ); + + final updatedSelectedWordsCrossword = puzzle.crosswordFromSelectedWords + + .addWord( + + location: location, + + word: word, + + direction: direction, + + requireOverlap: false, + + ); + + // Make sure the selected word is in the crossword or is an alternate word. + if (updatedSelectedWordsCrossword != null) { + if (puzzle.crossword.words.contains(crosswordWord) || + puzzle.alternateWords[location]?[direction]?.contains(word) == true) { - + return puzzle.rebuild((b) => b - + ..selectedWords.add(CrosswordWord.word( - + word: word, location: location, direction: direction))); + + return puzzle.rebuild( + + (b) => + + b + + ..selectedWords.add( + + CrosswordWord.word( + + word: word, + + location: location, + + direction: direction, + + ), + + ), + + ); + } + } + return null; @@ -52120,7 +52323,10 @@ steps: + + /// The crossword from the selected words. + Crossword get crosswordFromSelectedWords => Crossword.crossword( - + width: crossword.width, height: crossword.height, words: selectedWords); + + width: crossword.width, + + height: crossword.height, + + words: selectedWords, + + ); + + /// Test if the puzzle is solved. Note, this allows for the possibility of + /// multiple solutions. @@ -52136,8 +52342,9 @@ steps: + required BuiltSet candidateWords, + }) { + // Remove all of the currently used words from the list of candidates - + candidateWords = candidateWords - + .rebuild((p0) => p0.removeAll(crossword.words.map((p1) => p1.word))); + + candidateWords = candidateWords.rebuild( + + (p0) => p0.removeAll(crossword.words.map((p1) => p1.word)), + + ); + + // This is the list of alternate words for each word in the crossword + var alternates = @@ -52145,14 +52352,18 @@ steps: + + // Build the alternate words for each word in the crossword + for (final crosswordWord in crossword.words) { - + final alternateWords = candidateWords.toBuiltList().rebuild((b) => b - + ..where((b) => b.length == crosswordWord.word.length) - + ..shuffle() - + ..take(4) - + ..sort()); + + final alternateWords = candidateWords.toBuiltList().rebuild( + + (b) => + + b + + ..where((b) => b.length == crosswordWord.word.length) + + ..shuffle() + + ..take(4) + + ..sort(), + + ); + - + candidateWords = - + candidateWords.rebuild((b) => b.removeAll(alternateWords)); + + candidateWords = candidateWords.rebuild( + + (b) => b.removeAll(alternateWords), + + ); + + alternates = alternates.rebuild( + (b) => b.updateValue( @@ -52176,16 +52387,16 @@ steps: + }); + } + - + factory CrosswordPuzzleGame( - + [void Function(CrosswordPuzzleGameBuilder)? updates]) = - + _$CrosswordPuzzleGame; + + factory CrosswordPuzzleGame([ + + void Function(CrosswordPuzzleGameBuilder)? updates, + + ]) = _$CrosswordPuzzleGame; + CrosswordPuzzleGame._(); +} + /// Construct the serialization/deserialization code for the data model. @SerializersFor([ Location, - @@ -541,5 +712,6 @@ abstract class DisplayInfo implements Built { + @@ -573,5 +767,6 @@ abstract class DisplayInfo implements Built { CrosswordCharacter, WorkQueue, DisplayInfo, @@ -52214,15 +52425,15 @@ steps: /// A provider for the wordlist to use when generating the crossword. @riverpod Future> wordList(Ref ref) async { - @@ -66,7 +67,6 @@ class Size extends _$Size { + @@ -69,7 +70,6 @@ class Size extends _$Size { @riverpod Stream workQueue(Ref ref) async* { - final workers = ref.watch(workerCountProvider); final size = ref.watch(sizeProvider); final wordListAsync = ref.watch(wordListProvider); - final emptyCrossword = - @@ -77,14 +77,11 @@ Stream workQueue(Ref ref) async* { + final emptyCrossword = model.Crossword.crossword( + @@ -82,15 +82,12 @@ Stream workQueue(Ref ref) async* { startLocation: model.Location.at(0, 0), ); @@ -52230,15 +52441,16 @@ steps: - ref.read(endTimeProvider.notifier).clear(); - yield* wordListAsync.when( - data: (wordList) => exploreCrosswordSolutions( - crossword: emptyCrossword, - wordList: wordList, - - maxWorkerCount: workers.count, - + maxWorkerCount: backgroundWorkerCount, - ), + data: + (wordList) => exploreCrosswordSolutions( + crossword: emptyCrossword, + wordList: wordList, + - maxWorkerCount: workers.count, + + maxWorkerCount: backgroundWorkerCount, + ), error: (error, stackTrace) async* { debugPrint('Error loading word list: $error'); - @@ -94,124 +91,78 @@ Stream workQueue(Ref ref) async* { + @@ -100,127 +97,80 @@ Stream workQueue(Ref ref) async* { yield emptyWorkQueue; }, ); @@ -52257,8 +52469,8 @@ steps: - _start = DateTime.now(); - ref.invalidateSelf(); - } - } - + -} + - -@Riverpod(keepAlive: true) -class EndTime extends _$EndTime { - @override @@ -52275,8 +52487,8 @@ steps: - _end = DateTime.now(); - ref.invalidateSelf(); - } - -} - - + } + -const _estimatedTotalCoverage = 0.54; - @riverpod @@ -52293,10 +52505,11 @@ steps: - try { - final soFar = DateTime.now().difference(startTime); - final completedPercentage = min( - - 0.99, - - (workQueue.crossword.characters.length / - - (workQueue.crossword.width * workQueue.crossword.height) / - - _estimatedTotalCoverage)); + - 0.99, + - (workQueue.crossword.characters.length / + - (workQueue.crossword.width * workQueue.crossword.height) / + - _estimatedTotalCoverage), + - ); - final expectedTotal = soFar.inSeconds / completedPercentage; - final expectedRemaining = expectedTotal - soFar.inSeconds; - return Duration(seconds: expectedRemaining.toInt()); @@ -52335,8 +52548,10 @@ steps: + (_puzzle.crossword.height != size.height || + _puzzle.crossword.width != size.width || + _puzzle.crossword != workQueue.crossword)) { - + compute(_puzzleFromCrosswordTrampoline, (workQueue.crossword, wordList)) - + .then((puzzle) { + + compute(_puzzleFromCrosswordTrampoline, ( + + workQueue.crossword, + + wordList, + + )).then((puzzle) { + _puzzle = puzzle; + ref.invalidateSelf(); + }); @@ -52350,13 +52565,15 @@ steps: -@riverpod -class DisplayInfo extends _$DisplayInfo { - @override - - model.DisplayInfo build() => ref.watch(workQueueProvider).when( + - model.DisplayInfo build() => ref + - .watch(workQueueProvider) + - .when( - data: (workQueue) => model.DisplayInfo.from(workQueue: workQueue), - error: (error, stackTrace) => model.DisplayInfo.empty, - loading: () => model.DisplayInfo.empty, - ); -} - - + -enum BackgroundWorkers { - one(1), - two(2), @@ -52368,25 +52585,17 @@ steps: - oneTwentyEight(128); - - const BackgroundWorkers(this.count); - - - final int count; - - String get label => count.toString(); - -} - - - -/// A provider that holds the current number of background workers to use. - -@Riverpod(keepAlive: true) - -class WorkerCount extends _$WorkerCount { - - var _count = BackgroundWorkers.four; - - - - @override - - BackgroundWorkers build() => _count; + Future selectWord({ + required model.Location location, + required String word, + required model.Direction direction, + }) async { - + final candidate = await compute( - + _puzzleSelectWordTrampoline, (_puzzle, location, word, direction)); + + final candidate = await compute(_puzzleSelectWordTrampoline, ( + + _puzzle, + + location, + + word, + + direction, + + )); + + if (candidate != null) { + _puzzle = candidate; @@ -52396,9 +52605,8 @@ steps: + } + } - - void setCount(BackgroundWorkers count) { - - _count = count; - - ref.invalidateSelf(); + - final int count; + - String get label => count.toString(); + bool canSelectWord({ + required model.Location location, + required String word, @@ -52409,24 +52617,31 @@ steps: + word: word, + direction: direction, + ); - } + + } } - + + + -/// A provider that holds the current number of background workers to use. + -@Riverpod(keepAlive: true) + -class WorkerCount extends _$WorkerCount { + - var _count = BackgroundWorkers.four; +// Trampoline functions to disentangle these Isolate target calls from the +// unsendable reference to the [Puzzle] provider. - + + + - @override + - BackgroundWorkers build() => _count; +Future _puzzleFromCrosswordTrampoline( - + (model.Crossword, BuiltSet) args) async => + + (model.Crossword, BuiltSet) args, + +) async => + model.CrosswordPuzzleGame.from(crossword: args.$1, candidateWords: args.$2); - + + + - void setCount(BackgroundWorkers count) { + - _count = count; + - ref.invalidateSelf(); + - } + -} +model.CrosswordPuzzleGame? _puzzleSelectWordTrampoline( - + ( - + model.CrosswordPuzzleGame, - + model.Location, - + String, - + model.Direction - + ) args) => - + args.$1.selectWord(location: args.$2, word: args.$3, direction: args.$4); + + (model.CrosswordPuzzleGame, model.Location, String, model.Direction) args, + +) => args.$1.selectWord(location: args.$2, word: args.$3, direction: args.$4); - name: Remove the old widgets rmdir: generate_crossword/lib/widgets - name: Create the new widgets @@ -52463,26 +52678,29 @@ steps: title: Text('Crossword Puzzle'), ), body: SafeArea( - child: Consumer(builder: (context, ref, _) { - final workQueueAsync = ref.watch(workQueueProvider); - final puzzleSolved = - ref.watch(puzzleProvider.select((puzzle) => puzzle.solved)); + child: Consumer( + builder: (context, ref, _) { + final workQueueAsync = ref.watch(workQueueProvider); + final puzzleSolved = ref.watch( + puzzleProvider.select((puzzle) => puzzle.solved), + ); - return workQueueAsync.when( - data: (workQueue) { - if (puzzleSolved) { - return PuzzleCompletedWidget(); - } - if (workQueue.isCompleted && - workQueue.crossword.characters.isNotEmpty) { - return CrosswordPuzzleWidget(); - } - return CrosswordGeneratorWidget(); - }, - loading: () => Center(child: CircularProgressIndicator()), - error: (error, stackTrace) => Center(child: Text('$error')), - ); - }), + return workQueueAsync.when( + data: (workQueue) { + if (puzzleSolved) { + return PuzzleCompletedWidget(); + } + if (workQueue.isCompleted && + workQueue.crossword.characters.isNotEmpty) { + return CrosswordPuzzleWidget(); + } + return CrosswordGeneratorWidget(); + }, + loading: () => Center(child: CircularProgressIndicator()), + error: (error, stackTrace) => Center(child: Text('$error')), + ); + }, + ), ), ), ); @@ -52503,21 +52721,23 @@ steps: class _CrosswordPuzzleAppMenu extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) => MenuAnchor( - menuChildren: [ - for (final entry in CrosswordSize.values) - MenuItemButton( - onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), - leadingIcon: entry == ref.watch(sizeProvider) + menuChildren: [ + for (final entry in CrosswordSize.values) + MenuItemButton( + onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), + leadingIcon: + entry == ref.watch(sizeProvider) ? Icon(Icons.radio_button_checked_outlined) : Icon(Icons.radio_button_unchecked_outlined), - child: Text(entry.label), - ), - ], - builder: (context, controller, child) => IconButton( + child: Text(entry.label), + ), + ], + builder: + (context, controller, child) => IconButton( onPressed: () => controller.open(), icon: Icon(Icons.settings), ), - ); + ); } - name: Add lib/widgets/crossword_generator_widget.dart path: generate_crossword/lib/widgets/crossword_generator_widget.dart @@ -52568,8 +52788,9 @@ steps: final explorationCell = ref.watch( workQueueProvider.select( (workQueueAsync) => workQueueAsync.when( - data: (workQueue) => - workQueue.locationsToTry.keys.contains(location), + data: + (workQueue) => + workQueue.locationsToTry.keys.contains(location), error: (error, stackTrace) => false, loading: () => false, ), @@ -52580,18 +52801,20 @@ steps: return AnimatedContainer( duration: Durations.extralong1, curve: Curves.easeInOut, - color: explorationCell - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary, + color: + explorationCell + ? Theme.of(context).colorScheme.primary + : Theme.of(context).colorScheme.onPrimary, child: Center( child: AnimatedDefaultTextStyle( duration: Durations.extralong1, curve: Curves.easeInOut, style: TextStyle( fontSize: 24, - color: explorationCell - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.primary, + color: + explorationCell + ? Theme.of(context).colorScheme.onPrimary + : Theme.of(context).colorScheme.primary, ), child: Text('•'), // https://www.compart.com/en/unicode/U+2022 ), @@ -52613,9 +52836,11 @@ steps: foregroundDecoration: TableSpanDecoration( border: TableSpanBorder( leading: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), trailing: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ), ); @@ -52658,41 +52883,60 @@ steps: return TableViewCell( child: Consumer( builder: (context, ref, _) { - final character = ref.watch(puzzleProvider - .select((puzzle) => puzzle.crossword.characters[location])); - final selectedCharacter = ref.watch(puzzleProvider.select((puzzle) => - puzzle.crosswordFromSelectedWords.characters[location])); - final alternateWords = ref - .watch(puzzleProvider.select((puzzle) => puzzle.alternateWords)); + final character = ref.watch( + puzzleProvider.select( + (puzzle) => puzzle.crossword.characters[location], + ), + ); + final selectedCharacter = ref.watch( + puzzleProvider.select( + (puzzle) => + puzzle.crosswordFromSelectedWords.characters[location], + ), + ); + final alternateWords = ref.watch( + puzzleProvider.select((puzzle) => puzzle.alternateWords), + ); if (character != null) { final acrossWord = character.acrossWord; var acrossWords = BuiltList(); if (acrossWord != null) { - acrossWords = acrossWords.rebuild((b) => b - ..add(acrossWord.word) - ..addAll(alternateWords[acrossWord.location] - ?[acrossWord.direction] ?? - []) - ..sort()); + acrossWords = acrossWords.rebuild( + (b) => + b + ..add(acrossWord.word) + ..addAll( + alternateWords[acrossWord.location]?[acrossWord + .direction] ?? + [], + ) + ..sort(), + ); } final downWord = character.downWord; var downWords = BuiltList(); if (downWord != null) { - downWords = downWords.rebuild((b) => b - ..add(downWord.word) - ..addAll(alternateWords[downWord.location] - ?[downWord.direction] ?? - []) - ..sort()); + downWords = downWords.rebuild( + (b) => + b + ..add(downWord.word) + ..addAll( + alternateWords[downWord.location]?[downWord + .direction] ?? + [], + ) + ..sort(), + ); } return MenuAnchor( builder: (context, controller, _) { return GestureDetector( - onTapDown: (details) => - controller.open(position: details.localPosition), + onTapDown: + (details) => + controller.open(position: details.localPosition), child: AnimatedContainer( duration: Durations.extralong1, curve: Curves.easeInOut, @@ -52754,9 +52998,11 @@ steps: foregroundDecoration: TableSpanDecoration( border: TableSpanBorder( leading: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), trailing: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ), ); @@ -52780,18 +53026,29 @@ steps: Widget build(BuildContext context, WidgetRef ref) { final notifier = ref.read(puzzleProvider.notifier); return MenuItemButton( - onPressed: ref.watch(puzzleProvider.select((puzzle) => - puzzle.canSelectWord( - location: location, word: word, direction: direction))) - ? () => notifier.selectWord( - location: location, word: word, direction: direction) - : null, - leadingIcon: switch (direction) { - Direction.across => selectedCharacter?.acrossWord?.word == word, - Direction.down => selectedCharacter?.downWord?.word == word, - } - ? Icon(Icons.radio_button_checked_outlined) - : Icon(Icons.radio_button_unchecked_outlined), + onPressed: + ref.watch( + puzzleProvider.select( + (puzzle) => puzzle.canSelectWord( + location: location, + word: word, + direction: direction, + ), + ), + ) + ? () => notifier.selectWord( + location: location, + word: word, + direction: direction, + ) + : null, + leadingIcon: + switch (direction) { + Direction.across => selectedCharacter?.acrossWord?.word == word, + Direction.down => selectedCharacter?.downWord?.word == word, + } + ? Icon(Icons.radio_button_checked_outlined) + : Icon(Icons.radio_button_unchecked_outlined), child: Text(word), ); } @@ -52813,10 +53070,7 @@ steps: return Center( child: Text( 'Puzzle Completed!', - style: TextStyle( - fontSize: 36, - fontWeight: FontWeight.bold, - ), + style: TextStyle(fontSize: 36, fontWeight: FontWeight.bold), ), ); } @@ -52852,6 +53106,9 @@ steps: - name: Run build_runner path: generate_crossword dart: run build_runner build --delete-conflicting-outputs + - name: format model.g.dart lib/providers.g.dart + path: generate_crossword + dart: format lib/model.g.dart lib/providers.g.dart - name: Flutter test path: generate_crossword flutter: test diff --git a/generate_crossword/step_02/android/.gitignore b/generate_crossword/step_02/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/generate_crossword/step_02/android/.gitignore +++ b/generate_crossword/step_02/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/generate_crossword/step_02/android/app/build.gradle b/generate_crossword/step_02/android/app/build.gradle deleted file mode 100644 index d4a93e6565..0000000000 --- a/generate_crossword/step_02/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.generate_crossword" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.generate_crossword" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/generate_crossword/step_02/android/app/build.gradle.kts b/generate_crossword/step_02/android/app/build.gradle.kts new file mode 100644 index 0000000000..9a7651c2a6 --- /dev/null +++ b/generate_crossword/step_02/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.generate_crossword" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.generate_crossword" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/generate_crossword/step_02/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt b/generate_crossword/step_02/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt index 7011ed9ff4..e1bbbdcb4c 100644 --- a/generate_crossword/step_02/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt +++ b/generate_crossword/step_02/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.generate_crossword import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/generate_crossword/step_02/android/build.gradle b/generate_crossword/step_02/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/generate_crossword/step_02/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/generate_crossword/step_02/android/build.gradle.kts b/generate_crossword/step_02/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/generate_crossword/step_02/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/generate_crossword/step_02/android/gradle.properties b/generate_crossword/step_02/android/gradle.properties index 2597170821..f018a61817 100644 --- a/generate_crossword/step_02/android/gradle.properties +++ b/generate_crossword/step_02/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/generate_crossword/step_02/android/gradle/wrapper/gradle-wrapper.properties b/generate_crossword/step_02/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/generate_crossword/step_02/android/gradle/wrapper/gradle-wrapper.properties +++ b/generate_crossword/step_02/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/generate_crossword/step_02/android/settings.gradle b/generate_crossword/step_02/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/generate_crossword/step_02/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/generate_crossword/step_02/android/settings.gradle.kts b/generate_crossword/step_02/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/generate_crossword/step_02/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/generate_crossword/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/generate_crossword/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_02/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_02/lib/main.dart b/generate_crossword/step_02/lib/main.dart index 822ad77977..9a2ae09035 100644 --- a/generate_crossword/step_02/lib/main.dart +++ b/generate_crossword/step_02/lib/main.dart @@ -17,10 +17,7 @@ void main() { ), home: Scaffold( body: Center( - child: Text( - 'Hello, World!', - style: TextStyle(fontSize: 24), - ), + child: Text('Hello, World!', style: TextStyle(fontSize: 24)), ), ), ), diff --git a/generate_crossword/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 070fd74eff..5845d19a0a 100644 --- a/generate_crossword/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_02/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_02/pubspec.yaml b/generate_crossword/step_02/pubspec.yaml index f63671d8eb..50596764e4 100644 --- a/generate_crossword/step_02/pubspec.yaml +++ b/generate_crossword/step_02/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter built_collection: ^5.1.1 built_value: ^8.9.3 - characters: ^1.3.0 + characters: ^1.4.0 flutter_riverpod: ^2.6.1 intl: ^0.20.2 riverpod: ^2.6.1 diff --git a/generate_crossword/step_03/android/.gitignore b/generate_crossword/step_03/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/generate_crossword/step_03/android/.gitignore +++ b/generate_crossword/step_03/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/generate_crossword/step_03/android/app/build.gradle b/generate_crossword/step_03/android/app/build.gradle deleted file mode 100644 index d4a93e6565..0000000000 --- a/generate_crossword/step_03/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.generate_crossword" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.generate_crossword" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/generate_crossword/step_03/android/app/build.gradle.kts b/generate_crossword/step_03/android/app/build.gradle.kts new file mode 100644 index 0000000000..9a7651c2a6 --- /dev/null +++ b/generate_crossword/step_03/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.generate_crossword" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.generate_crossword" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/generate_crossword/step_03/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt b/generate_crossword/step_03/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt index 7011ed9ff4..e1bbbdcb4c 100644 --- a/generate_crossword/step_03/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt +++ b/generate_crossword/step_03/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.generate_crossword import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/generate_crossword/step_03/android/build.gradle b/generate_crossword/step_03/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/generate_crossword/step_03/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/generate_crossword/step_03/android/build.gradle.kts b/generate_crossword/step_03/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/generate_crossword/step_03/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/generate_crossword/step_03/android/gradle.properties b/generate_crossword/step_03/android/gradle.properties index 2597170821..f018a61817 100644 --- a/generate_crossword/step_03/android/gradle.properties +++ b/generate_crossword/step_03/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/generate_crossword/step_03/android/gradle/wrapper/gradle-wrapper.properties b/generate_crossword/step_03/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/generate_crossword/step_03/android/gradle/wrapper/gradle-wrapper.properties +++ b/generate_crossword/step_03/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/generate_crossword/step_03/android/settings.gradle b/generate_crossword/step_03/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/generate_crossword/step_03/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/generate_crossword/step_03/android/settings.gradle.kts b/generate_crossword/step_03/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/generate_crossword/step_03/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/generate_crossword/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/generate_crossword/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_03/lib/providers.dart b/generate_crossword/step_03/lib/providers.dart index f03b3cb367..966475eb49 100644 --- a/generate_crossword/step_03/lib/providers.dart +++ b/generate_crossword/step_03/lib/providers.dart @@ -21,8 +21,14 @@ Future> wordList(Ref ref) async { final re = RegExp(r'^[a-z]+$'); final words = await rootBundle.loadString('assets/words.txt'); - return const LineSplitter().convert(words).toBuiltSet().rebuild((b) => b - ..map((word) => word.toLowerCase().trim()) - ..where((word) => word.length > 2) - ..where((word) => re.hasMatch(word))); + return const LineSplitter() + .convert(words) + .toBuiltSet() + .rebuild( + (b) => + b + ..map((word) => word.toLowerCase().trim()) + ..where((word) => word.length > 2) + ..where((word) => re.hasMatch(word)), + ); } diff --git a/generate_crossword/step_03/lib/widgets/crossword_generator_app.dart b/generate_crossword/step_03/lib/widgets/crossword_generator_app.dart index 15adf69cd9..031ef47f82 100644 --- a/generate_crossword/step_03/lib/widgets/crossword_generator_app.dart +++ b/generate_crossword/step_03/lib/widgets/crossword_generator_app.dart @@ -27,20 +27,15 @@ class CrosswordGeneratorApp extends StatelessWidget { builder: (context, ref, _) { final wordListAsync = ref.watch(wordListProvider); return wordListAsync.when( - data: (wordList) => ListView.builder( - itemCount: wordList.length, - itemBuilder: (context, index) { - return ListTile( - title: Text(wordList.elementAt(index)), - ); - }, - ), - error: (error, stackTrace) => Center( - child: Text('$error'), - ), - loading: () => Center( - child: CircularProgressIndicator(), - ), + data: + (wordList) => ListView.builder( + itemCount: wordList.length, + itemBuilder: (context, index) { + return ListTile(title: Text(wordList.elementAt(index))); + }, + ), + error: (error, stackTrace) => Center(child: Text('$error')), + loading: () => Center(child: CircularProgressIndicator()), ); }, ), diff --git a/generate_crossword/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 070fd74eff..5845d19a0a 100644 --- a/generate_crossword/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_03/pubspec.yaml b/generate_crossword/step_03/pubspec.yaml index 701f231c6a..a4e12dc3f1 100644 --- a/generate_crossword/step_03/pubspec.yaml +++ b/generate_crossword/step_03/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter built_collection: ^5.1.1 built_value: ^8.9.3 - characters: ^1.3.0 + characters: ^1.4.0 flutter_riverpod: ^2.6.1 intl: ^0.20.2 riverpod: ^2.6.1 diff --git a/generate_crossword/step_04/android/.gitignore b/generate_crossword/step_04/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/generate_crossword/step_04/android/.gitignore +++ b/generate_crossword/step_04/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/generate_crossword/step_04/android/app/build.gradle b/generate_crossword/step_04/android/app/build.gradle deleted file mode 100644 index d4a93e6565..0000000000 --- a/generate_crossword/step_04/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.generate_crossword" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.generate_crossword" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/generate_crossword/step_04/android/app/build.gradle.kts b/generate_crossword/step_04/android/app/build.gradle.kts new file mode 100644 index 0000000000..9a7651c2a6 --- /dev/null +++ b/generate_crossword/step_04/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.generate_crossword" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.generate_crossword" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/generate_crossword/step_04/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt b/generate_crossword/step_04/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt index 7011ed9ff4..e1bbbdcb4c 100644 --- a/generate_crossword/step_04/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt +++ b/generate_crossword/step_04/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.generate_crossword import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/generate_crossword/step_04/android/build.gradle b/generate_crossword/step_04/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/generate_crossword/step_04/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/generate_crossword/step_04/android/build.gradle.kts b/generate_crossword/step_04/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/generate_crossword/step_04/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/generate_crossword/step_04/android/gradle.properties b/generate_crossword/step_04/android/gradle.properties index 2597170821..f018a61817 100644 --- a/generate_crossword/step_04/android/gradle.properties +++ b/generate_crossword/step_04/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/generate_crossword/step_04/android/gradle/wrapper/gradle-wrapper.properties b/generate_crossword/step_04/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/generate_crossword/step_04/android/gradle/wrapper/gradle-wrapper.properties +++ b/generate_crossword/step_04/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/generate_crossword/step_04/android/settings.gradle b/generate_crossword/step_04/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/generate_crossword/step_04/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/generate_crossword/step_04/android/settings.gradle.kts b/generate_crossword/step_04/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/generate_crossword/step_04/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/generate_crossword/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/generate_crossword/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_04/lib/model.dart b/generate_crossword/step_04/lib/model.dart index d45bbbe70b..7cd0da4230 100644 --- a/generate_crossword/step_04/lib/model.dart +++ b/generate_crossword/step_04/lib/model.dart @@ -89,7 +89,10 @@ abstract class CrosswordWord static int locationComparator(CrosswordWord a, CrosswordWord b) { final compareRows = a.location.y.compareTo(b.location.y); final compareColumns = a.location.x.compareTo(b.location.x); - return switch (compareColumns) { 0 => compareRows, _ => compareColumns }; + return switch (compareColumns) { + 0 => compareRows, + _ => compareColumns, + }; } /// Constructor for [CrosswordWord]. @@ -98,10 +101,13 @@ abstract class CrosswordWord required Location location, required Direction direction, }) { - return CrosswordWord((b) => b - ..word = word - ..direction = direction - ..location.replace(location)); + return CrosswordWord( + (b) => + b + ..word = word + ..direction = direction + ..location.replace(location), + ); } /// Constructor for [CrosswordWord]. @@ -148,9 +154,9 @@ abstract class CrosswordCharacter /// Constructor for [CrosswordCharacter]. /// Use [CrosswordCharacter.character] instead. - factory CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) = - _$CrosswordCharacter; + factory CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) = _$CrosswordCharacter; CrosswordCharacter._(); } @@ -179,14 +185,15 @@ abstract class Crossword implements Built { required Direction direction, }) { return rebuild( - (b) => b - ..words.add( - CrosswordWord.word( - word: word, - direction: direction, - location: location, - ), - ), + (b) => + b + ..words.add( + CrosswordWord.word( + word: word, + direction: direction, + location: location, + ), + ), ); } @@ -202,19 +209,21 @@ abstract class Crossword implements Built { b.characters.updateValue( word.location.rightOffset(idx), (b) => b.rebuild((bInner) => bInner.acrossWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - acrossWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + acrossWord: word, + character: character, + ), ); case Direction.down: b.characters.updateValue( word.location.downOffset(idx), (b) => b.rebuild((bInner) => bInner.downWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - downWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + downWord: word, + character: character, + ), ); } } @@ -228,7 +237,8 @@ abstract class Crossword implements Built { final grid = List.generate( height, (_) => List.generate( - width, (_) => '░', // https://www.compart.com/en/unicode/U+2591 + width, + (_) => '░', // https://www.compart.com/en/unicode/U+2591 ), ); @@ -283,10 +293,5 @@ abstract class Crossword implements Built { } /// Construct the serialization/deserialization code for the data model. -@SerializersFor([ - Location, - Crossword, - CrosswordWord, - CrosswordCharacter, -]) +@SerializersFor([Location, Crossword, CrosswordWord, CrosswordCharacter]) final Serializers serializers = _$serializers; diff --git a/generate_crossword/step_04/lib/model.g.dart b/generate_crossword/step_04/lib/model.g.dart index 975954b5f0..a4ddf76c65 100644 --- a/generate_crossword/step_04/lib/model.g.dart +++ b/generate_crossword/step_04/lib/model.g.dart @@ -6,21 +6,24 @@ part of 'model.dart'; // BuiltValueGenerator // ************************************************************************** -Serializers _$serializers = (new Serializers().toBuilder() - ..add(Crossword.serializer) - ..add(CrosswordCharacter.serializer) - ..add(CrosswordWord.serializer) - ..add(Location.serializer) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(CrosswordWord)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ]), - () => new MapBuilder())) - .build(); +Serializers _$serializers = + (new Serializers().toBuilder() + ..add(Crossword.serializer) + ..add(CrosswordCharacter.serializer) + ..add(CrosswordWord.serializer) + ..add(Location.serializer) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(CrosswordWord)]), + () => new ListBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + () => new MapBuilder(), + )) + .build(); Serializer _$locationSerializer = new _$LocationSerializer(); Serializer _$crosswordWordSerializer = new _$CrosswordWordSerializer(); @@ -35,8 +38,11 @@ class _$LocationSerializer implements StructuredSerializer { final String wireName = 'Location'; @override - Iterable serialize(Serializers serializers, Location object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Location object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'x', serializers.serialize(object.x, specifiedType: const FullType(int)), @@ -48,8 +54,11 @@ class _$LocationSerializer implements StructuredSerializer { } @override - Location deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Location deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new LocationBuilder(); final iterator = serialized.iterator; @@ -59,12 +68,20 @@ class _$LocationSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'x': - result.x = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.x = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'y': - result.y = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.y = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; } } @@ -80,17 +97,24 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final String wireName = 'CrosswordWord'; @override - Iterable serialize(Serializers serializers, CrosswordWord object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + CrosswordWord object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'word', serializers.serialize(object.word, specifiedType: const FullType(String)), 'location', - serializers.serialize(object.location, - specifiedType: const FullType(Location)), + serializers.serialize( + object.location, + specifiedType: const FullType(Location), + ), 'direction', - serializers.serialize(object.direction, - specifiedType: const FullType(Direction)), + serializers.serialize( + object.direction, + specifiedType: const FullType(Direction), + ), ]; return result; @@ -98,8 +122,10 @@ class _$CrosswordWordSerializer implements StructuredSerializer { @override CrosswordWord deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordWordBuilder(); final iterator = serialized.iterator; @@ -109,16 +135,29 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'word': - result.word = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.word = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'location': - result.location.replace(serializers.deserialize(value, - specifiedType: const FullType(Location))! as Location); + result.location.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Location), + )! + as Location, + ); break; case 'direction': - result.direction = serializers.deserialize(value, - specifiedType: const FullType(Direction))! as Direction; + result.direction = + serializers.deserialize( + value, + specifiedType: const FullType(Direction), + )! + as Direction; break; } } @@ -136,35 +175,49 @@ class _$CrosswordCharacterSerializer @override Iterable serialize( - Serializers serializers, CrosswordCharacter object, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + CrosswordCharacter object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'character', - serializers.serialize(object.character, - specifiedType: const FullType(String)), + serializers.serialize( + object.character, + specifiedType: const FullType(String), + ), ]; Object? value; value = object.acrossWord; if (value != null) { result ..add('acrossWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } value = object.downWord; if (value != null) { result ..add('downWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } return result; } @override CrosswordCharacter deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordCharacterBuilder(); final iterator = serialized.iterator; @@ -174,16 +227,30 @@ class _$CrosswordCharacterSerializer final Object? value = iterator.current; switch (key) { case 'character': - result.character = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.character = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'acrossWord': - result.acrossWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.acrossWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; case 'downWord': - result.downWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.downWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; } } @@ -199,31 +266,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final String wireName = 'Crossword'; @override - Iterable serialize(Serializers serializers, Crossword object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Crossword object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'width', serializers.serialize(object.width, specifiedType: const FullType(int)), 'height', serializers.serialize(object.height, specifiedType: const FullType(int)), 'words', - serializers.serialize(object.words, - specifiedType: - const FullType(BuiltList, const [const FullType(CrosswordWord)])), + serializers.serialize( + object.words, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + ), 'characters', - serializers.serialize(object.characters, - specifiedType: const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ])), + serializers.serialize( + object.characters, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + ), ]; return result; } @override - Crossword deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Crossword deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordBuilder(); final iterator = serialized.iterator; @@ -233,25 +311,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'width': - result.width = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.width = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'height': - result.height = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.height = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'words': - result.words.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(CrosswordWord)]))! - as BuiltList); + result.words.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + )! + as BuiltList, + ); break; case 'characters': - result.characters.replace(serializers.deserialize(value, + result.characters.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), - const FullType(CrosswordCharacter) - ]))!); + const FullType(CrosswordCharacter), + ]), + )!, + ); break; } } @@ -343,7 +438,8 @@ class LocationBuilder implements Builder { Location build() => _build(); _$Location _build() { - final _$result = _$v ?? + final _$result = + _$v ?? new _$Location._( x: BuiltValueNullFieldError.checkNotNull(x, r'Location', 'x'), y: BuiltValueNullFieldError.checkNotNull(y, r'Location', 'y'), @@ -364,14 +460,22 @@ class _$CrosswordWord extends CrosswordWord { factory _$CrosswordWord([void Function(CrosswordWordBuilder)? updates]) => (new CrosswordWordBuilder()..update(updates))._build(); - _$CrosswordWord._( - {required this.word, required this.location, required this.direction}) - : super._() { + _$CrosswordWord._({ + required this.word, + required this.location, + required this.direction, + }) : super._() { BuiltValueNullFieldError.checkNotNull(word, r'CrosswordWord', 'word'); BuiltValueNullFieldError.checkNotNull( - location, r'CrosswordWord', 'location'); + location, + r'CrosswordWord', + 'location', + ); BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'); + direction, + r'CrosswordWord', + 'direction', + ); } @override @@ -456,13 +560,20 @@ class CrosswordWordBuilder _$CrosswordWord _build() { _$CrosswordWord _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordWord._( word: BuiltValueNullFieldError.checkNotNull( - word, r'CrosswordWord', 'word'), + word, + r'CrosswordWord', + 'word', + ), location: location.build(), direction: BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'), + direction, + r'CrosswordWord', + 'direction', + ), ); } catch (_) { late String _$failedField; @@ -471,7 +582,10 @@ class CrosswordWordBuilder location.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordWord', _$failedField, e.toString()); + r'CrosswordWord', + _$failedField, + e.toString(), + ); } rethrow; } @@ -488,21 +602,26 @@ class _$CrosswordCharacter extends CrosswordCharacter { @override final CrosswordWord? downWord; - factory _$CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) => - (new CrosswordCharacterBuilder()..update(updates))._build(); + factory _$CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) => (new CrosswordCharacterBuilder()..update(updates))._build(); - _$CrosswordCharacter._( - {required this.character, this.acrossWord, this.downWord}) - : super._() { + _$CrosswordCharacter._({ + required this.character, + this.acrossWord, + this.downWord, + }) : super._() { BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'); + character, + r'CrosswordCharacter', + 'character', + ); } @override CrosswordCharacter rebuild( - void Function(CrosswordCharacterBuilder) updates) => - (toBuilder()..update(updates)).build(); + void Function(CrosswordCharacterBuilder) updates, + ) => (toBuilder()..update(updates)).build(); @override CrosswordCharacterBuilder toBuilder() => @@ -586,10 +705,14 @@ class CrosswordCharacterBuilder _$CrosswordCharacter _build() { _$CrosswordCharacter _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordCharacter._( character: BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'), + character, + r'CrosswordCharacter', + 'character', + ), acrossWord: _acrossWord?.build(), downWord: _downWord?.build(), ); @@ -602,7 +725,10 @@ class CrosswordCharacterBuilder _downWord?.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordCharacter', _$failedField, e.toString()); + r'CrosswordCharacter', + _$failedField, + e.toString(), + ); } rethrow; } @@ -624,17 +750,20 @@ class _$Crossword extends Crossword { factory _$Crossword([void Function(CrosswordBuilder)? updates]) => (new CrosswordBuilder()..update(updates))._build(); - _$Crossword._( - {required this.width, - required this.height, - required this.words, - required this.characters}) - : super._() { + _$Crossword._({ + required this.width, + required this.height, + required this.words, + required this.characters, + }) : super._() { BuiltValueNullFieldError.checkNotNull(width, r'Crossword', 'width'); BuiltValueNullFieldError.checkNotNull(height, r'Crossword', 'height'); BuiltValueNullFieldError.checkNotNull(words, r'Crossword', 'words'); BuiltValueNullFieldError.checkNotNull( - characters, r'Crossword', 'characters'); + characters, + r'Crossword', + 'characters', + ); } @override @@ -730,12 +859,19 @@ class CrosswordBuilder implements Builder { Crossword._fillCharacters(this); _$Crossword _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$Crossword._( width: BuiltValueNullFieldError.checkNotNull( - width, r'Crossword', 'width'), + width, + r'Crossword', + 'width', + ), height: BuiltValueNullFieldError.checkNotNull( - height, r'Crossword', 'height'), + height, + r'Crossword', + 'height', + ), words: words.build(), characters: characters.build(), ); @@ -748,7 +884,10 @@ class CrosswordBuilder implements Builder { characters.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'Crossword', _$failedField, e.toString()); + r'Crossword', + _$failedField, + e.toString(), + ); } rethrow; } diff --git a/generate_crossword/step_04/lib/providers.dart b/generate_crossword/step_04/lib/providers.dart index 7b7a0d1f89..5e378932a8 100644 --- a/generate_crossword/step_04/lib/providers.dart +++ b/generate_crossword/step_04/lib/providers.dart @@ -26,10 +26,16 @@ Future> wordList(Ref ref) async { final re = RegExp(r'^[a-z]+$'); final words = await rootBundle.loadString('assets/words.txt'); - return const LineSplitter().convert(words).toBuiltSet().rebuild((b) => b - ..map((word) => word.toLowerCase().trim()) - ..where((word) => word.length > 2) - ..where((word) => re.hasMatch(word))); + return const LineSplitter() + .convert(words) + .toBuiltSet() + .rebuild( + (b) => + b + ..map((word) => word.toLowerCase().trim()) + ..where((word) => word.length > 2) + ..where((word) => re.hasMatch(word)), + ); } /// An enumeration for different sizes of [model.Crossword]s. @@ -40,10 +46,7 @@ enum CrosswordSize { xlarge(width: 160, height: 88), xxlarge(width: 500, height: 500); - const CrosswordSize({ - required this.width, - required this.height, - }); + const CrosswordSize({required this.width, required this.height}); final int width; final int height; @@ -71,8 +74,10 @@ Stream crossword(Ref ref) async* { final size = ref.watch(sizeProvider); final wordListAsync = ref.watch(wordListProvider); - var crossword = - model.Crossword.crossword(width: size.width, height: size.height); + var crossword = model.Crossword.crossword( + width: size.width, + height: size.height, + ); yield* wordListAsync.when( data: (wordList) async* { @@ -81,10 +86,15 @@ Stream crossword(Ref ref) async* { final direction = _random.nextBool() ? model.Direction.across : model.Direction.down; final location = model.Location.at( - _random.nextInt(size.width), _random.nextInt(size.height)); + _random.nextInt(size.width), + _random.nextInt(size.height), + ); crossword = crossword.addWord( - word: word, direction: direction, location: location); + word: word, + direction: direction, + location: location, + ); yield crossword; await Future.delayed(Duration(milliseconds: 100)); } diff --git a/generate_crossword/step_04/lib/widgets/crossword_generator_app.dart b/generate_crossword/step_04/lib/widgets/crossword_generator_app.dart index 0c4a659789..6775f9fd89 100644 --- a/generate_crossword/step_04/lib/widgets/crossword_generator_app.dart +++ b/generate_crossword/step_04/lib/widgets/crossword_generator_app.dart @@ -24,9 +24,7 @@ class CrosswordGeneratorApp extends StatelessWidget { ), title: Text('Crossword Generator'), ), - body: SafeArea( - child: CrosswordWidget(), - ), + body: SafeArea(child: CrosswordWidget()), ), ); } @@ -46,19 +44,21 @@ class _EagerInitialization extends ConsumerWidget { class _CrosswordGeneratorMenu extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) => MenuAnchor( - menuChildren: [ - for (final entry in CrosswordSize.values) - MenuItemButton( - onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), - leadingIcon: entry == ref.watch(sizeProvider) + menuChildren: [ + for (final entry in CrosswordSize.values) + MenuItemButton( + onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), + leadingIcon: + entry == ref.watch(sizeProvider) ? Icon(Icons.radio_button_checked_outlined) : Icon(Icons.radio_button_unchecked_outlined), - child: Text(entry.label), - ), - ], - builder: (context, controller, child) => IconButton( + child: Text(entry.label), + ), + ], + builder: + (context, controller, child) => IconButton( onPressed: () => controller.open(), icon: Icon(Icons.settings), ), - ); + ); } diff --git a/generate_crossword/step_04/lib/widgets/crossword_widget.dart b/generate_crossword/step_04/lib/widgets/crossword_widget.dart index 17941440ee..1795fe68da 100644 --- a/generate_crossword/step_04/lib/widgets/crossword_widget.dart +++ b/generate_crossword/step_04/lib/widgets/crossword_widget.dart @@ -70,9 +70,11 @@ class CrosswordWidget extends ConsumerWidget { foregroundDecoration: TableSpanDecoration( border: TableSpanBorder( leading: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), trailing: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ), ); diff --git a/generate_crossword/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 070fd74eff..5845d19a0a 100644 --- a/generate_crossword/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_04/pubspec.yaml b/generate_crossword/step_04/pubspec.yaml index 701f231c6a..a4e12dc3f1 100644 --- a/generate_crossword/step_04/pubspec.yaml +++ b/generate_crossword/step_04/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter built_collection: ^5.1.1 built_value: ^8.9.3 - characters: ^1.3.0 + characters: ^1.4.0 flutter_riverpod: ^2.6.1 intl: ^0.20.2 riverpod: ^2.6.1 diff --git a/generate_crossword/step_05_a/android/.gitignore b/generate_crossword/step_05_a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/generate_crossword/step_05_a/android/.gitignore +++ b/generate_crossword/step_05_a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/generate_crossword/step_05_a/android/app/build.gradle b/generate_crossword/step_05_a/android/app/build.gradle deleted file mode 100644 index d4a93e6565..0000000000 --- a/generate_crossword/step_05_a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.generate_crossword" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.generate_crossword" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/generate_crossword/step_05_a/android/app/build.gradle.kts b/generate_crossword/step_05_a/android/app/build.gradle.kts new file mode 100644 index 0000000000..9a7651c2a6 --- /dev/null +++ b/generate_crossword/step_05_a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.generate_crossword" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.generate_crossword" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/generate_crossword/step_05_a/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt b/generate_crossword/step_05_a/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt index 7011ed9ff4..e1bbbdcb4c 100644 --- a/generate_crossword/step_05_a/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt +++ b/generate_crossword/step_05_a/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.generate_crossword import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/generate_crossword/step_05_a/android/build.gradle b/generate_crossword/step_05_a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/generate_crossword/step_05_a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/generate_crossword/step_05_a/android/build.gradle.kts b/generate_crossword/step_05_a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/generate_crossword/step_05_a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/generate_crossword/step_05_a/android/gradle.properties b/generate_crossword/step_05_a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/generate_crossword/step_05_a/android/gradle.properties +++ b/generate_crossword/step_05_a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/generate_crossword/step_05_a/android/gradle/wrapper/gradle-wrapper.properties b/generate_crossword/step_05_a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/generate_crossword/step_05_a/android/gradle/wrapper/gradle-wrapper.properties +++ b/generate_crossword/step_05_a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/generate_crossword/step_05_a/android/settings.gradle b/generate_crossword/step_05_a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/generate_crossword/step_05_a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/generate_crossword/step_05_a/android/settings.gradle.kts b/generate_crossword/step_05_a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/generate_crossword/step_05_a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/generate_crossword/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/generate_crossword/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_05_a/lib/model.dart b/generate_crossword/step_05_a/lib/model.dart index a9a144b816..48ac50d45d 100644 --- a/generate_crossword/step_05_a/lib/model.dart +++ b/generate_crossword/step_05_a/lib/model.dart @@ -89,7 +89,10 @@ abstract class CrosswordWord static int locationComparator(CrosswordWord a, CrosswordWord b) { final compareRows = a.location.y.compareTo(b.location.y); final compareColumns = a.location.x.compareTo(b.location.x); - return switch (compareColumns) { 0 => compareRows, _ => compareColumns }; + return switch (compareColumns) { + 0 => compareRows, + _ => compareColumns, + }; } /// Constructor for [CrosswordWord]. @@ -98,10 +101,13 @@ abstract class CrosswordWord required Location location, required Direction direction, }) { - return CrosswordWord((b) => b - ..word = word - ..direction = direction - ..location.replace(location)); + return CrosswordWord( + (b) => + b + ..word = word + ..direction = direction + ..location.replace(location), + ); } /// Constructor for [CrosswordWord]. @@ -148,9 +154,9 @@ abstract class CrosswordCharacter /// Constructor for [CrosswordCharacter]. /// Use [CrosswordCharacter.character] instead. - factory CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) = - _$CrosswordCharacter; + factory CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) = _$CrosswordCharacter; CrosswordCharacter._(); } @@ -281,14 +287,15 @@ abstract class Crossword implements Built { } final candidate = rebuild( - (b) => b - ..words.add( - CrosswordWord.word( - word: word, - direction: direction, - location: location, - ), - ), + (b) => + b + ..words.add( + CrosswordWord.word( + word: word, + direction: direction, + location: location, + ), + ), ); if (candidate.valid) { @@ -310,19 +317,21 @@ abstract class Crossword implements Built { b.characters.updateValue( word.location.rightOffset(idx), (b) => b.rebuild((bInner) => bInner.acrossWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - acrossWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + acrossWord: word, + character: character, + ), ); case Direction.down: b.characters.updateValue( word.location.downOffset(idx), (b) => b.rebuild((bInner) => bInner.downWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - downWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + downWord: word, + character: character, + ), ); } } @@ -336,7 +345,8 @@ abstract class Crossword implements Built { final grid = List.generate( height, (_) => List.generate( - width, (_) => '░', // https://www.compart.com/en/unicode/U+2591 + width, + (_) => '░', // https://www.compart.com/en/unicode/U+2591 ), ); @@ -391,10 +401,5 @@ abstract class Crossword implements Built { } /// Construct the serialization/deserialization code for the data model. -@SerializersFor([ - Location, - Crossword, - CrosswordWord, - CrosswordCharacter, -]) +@SerializersFor([Location, Crossword, CrosswordWord, CrosswordCharacter]) final Serializers serializers = _$serializers; diff --git a/generate_crossword/step_05_a/lib/model.g.dart b/generate_crossword/step_05_a/lib/model.g.dart index 975954b5f0..a4ddf76c65 100644 --- a/generate_crossword/step_05_a/lib/model.g.dart +++ b/generate_crossword/step_05_a/lib/model.g.dart @@ -6,21 +6,24 @@ part of 'model.dart'; // BuiltValueGenerator // ************************************************************************** -Serializers _$serializers = (new Serializers().toBuilder() - ..add(Crossword.serializer) - ..add(CrosswordCharacter.serializer) - ..add(CrosswordWord.serializer) - ..add(Location.serializer) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(CrosswordWord)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ]), - () => new MapBuilder())) - .build(); +Serializers _$serializers = + (new Serializers().toBuilder() + ..add(Crossword.serializer) + ..add(CrosswordCharacter.serializer) + ..add(CrosswordWord.serializer) + ..add(Location.serializer) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(CrosswordWord)]), + () => new ListBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + () => new MapBuilder(), + )) + .build(); Serializer _$locationSerializer = new _$LocationSerializer(); Serializer _$crosswordWordSerializer = new _$CrosswordWordSerializer(); @@ -35,8 +38,11 @@ class _$LocationSerializer implements StructuredSerializer { final String wireName = 'Location'; @override - Iterable serialize(Serializers serializers, Location object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Location object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'x', serializers.serialize(object.x, specifiedType: const FullType(int)), @@ -48,8 +54,11 @@ class _$LocationSerializer implements StructuredSerializer { } @override - Location deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Location deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new LocationBuilder(); final iterator = serialized.iterator; @@ -59,12 +68,20 @@ class _$LocationSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'x': - result.x = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.x = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'y': - result.y = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.y = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; } } @@ -80,17 +97,24 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final String wireName = 'CrosswordWord'; @override - Iterable serialize(Serializers serializers, CrosswordWord object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + CrosswordWord object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'word', serializers.serialize(object.word, specifiedType: const FullType(String)), 'location', - serializers.serialize(object.location, - specifiedType: const FullType(Location)), + serializers.serialize( + object.location, + specifiedType: const FullType(Location), + ), 'direction', - serializers.serialize(object.direction, - specifiedType: const FullType(Direction)), + serializers.serialize( + object.direction, + specifiedType: const FullType(Direction), + ), ]; return result; @@ -98,8 +122,10 @@ class _$CrosswordWordSerializer implements StructuredSerializer { @override CrosswordWord deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordWordBuilder(); final iterator = serialized.iterator; @@ -109,16 +135,29 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'word': - result.word = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.word = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'location': - result.location.replace(serializers.deserialize(value, - specifiedType: const FullType(Location))! as Location); + result.location.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Location), + )! + as Location, + ); break; case 'direction': - result.direction = serializers.deserialize(value, - specifiedType: const FullType(Direction))! as Direction; + result.direction = + serializers.deserialize( + value, + specifiedType: const FullType(Direction), + )! + as Direction; break; } } @@ -136,35 +175,49 @@ class _$CrosswordCharacterSerializer @override Iterable serialize( - Serializers serializers, CrosswordCharacter object, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + CrosswordCharacter object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'character', - serializers.serialize(object.character, - specifiedType: const FullType(String)), + serializers.serialize( + object.character, + specifiedType: const FullType(String), + ), ]; Object? value; value = object.acrossWord; if (value != null) { result ..add('acrossWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } value = object.downWord; if (value != null) { result ..add('downWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } return result; } @override CrosswordCharacter deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordCharacterBuilder(); final iterator = serialized.iterator; @@ -174,16 +227,30 @@ class _$CrosswordCharacterSerializer final Object? value = iterator.current; switch (key) { case 'character': - result.character = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.character = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'acrossWord': - result.acrossWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.acrossWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; case 'downWord': - result.downWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.downWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; } } @@ -199,31 +266,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final String wireName = 'Crossword'; @override - Iterable serialize(Serializers serializers, Crossword object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Crossword object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'width', serializers.serialize(object.width, specifiedType: const FullType(int)), 'height', serializers.serialize(object.height, specifiedType: const FullType(int)), 'words', - serializers.serialize(object.words, - specifiedType: - const FullType(BuiltList, const [const FullType(CrosswordWord)])), + serializers.serialize( + object.words, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + ), 'characters', - serializers.serialize(object.characters, - specifiedType: const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ])), + serializers.serialize( + object.characters, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + ), ]; return result; } @override - Crossword deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Crossword deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordBuilder(); final iterator = serialized.iterator; @@ -233,25 +311,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'width': - result.width = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.width = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'height': - result.height = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.height = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'words': - result.words.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(CrosswordWord)]))! - as BuiltList); + result.words.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + )! + as BuiltList, + ); break; case 'characters': - result.characters.replace(serializers.deserialize(value, + result.characters.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), - const FullType(CrosswordCharacter) - ]))!); + const FullType(CrosswordCharacter), + ]), + )!, + ); break; } } @@ -343,7 +438,8 @@ class LocationBuilder implements Builder { Location build() => _build(); _$Location _build() { - final _$result = _$v ?? + final _$result = + _$v ?? new _$Location._( x: BuiltValueNullFieldError.checkNotNull(x, r'Location', 'x'), y: BuiltValueNullFieldError.checkNotNull(y, r'Location', 'y'), @@ -364,14 +460,22 @@ class _$CrosswordWord extends CrosswordWord { factory _$CrosswordWord([void Function(CrosswordWordBuilder)? updates]) => (new CrosswordWordBuilder()..update(updates))._build(); - _$CrosswordWord._( - {required this.word, required this.location, required this.direction}) - : super._() { + _$CrosswordWord._({ + required this.word, + required this.location, + required this.direction, + }) : super._() { BuiltValueNullFieldError.checkNotNull(word, r'CrosswordWord', 'word'); BuiltValueNullFieldError.checkNotNull( - location, r'CrosswordWord', 'location'); + location, + r'CrosswordWord', + 'location', + ); BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'); + direction, + r'CrosswordWord', + 'direction', + ); } @override @@ -456,13 +560,20 @@ class CrosswordWordBuilder _$CrosswordWord _build() { _$CrosswordWord _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordWord._( word: BuiltValueNullFieldError.checkNotNull( - word, r'CrosswordWord', 'word'), + word, + r'CrosswordWord', + 'word', + ), location: location.build(), direction: BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'), + direction, + r'CrosswordWord', + 'direction', + ), ); } catch (_) { late String _$failedField; @@ -471,7 +582,10 @@ class CrosswordWordBuilder location.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordWord', _$failedField, e.toString()); + r'CrosswordWord', + _$failedField, + e.toString(), + ); } rethrow; } @@ -488,21 +602,26 @@ class _$CrosswordCharacter extends CrosswordCharacter { @override final CrosswordWord? downWord; - factory _$CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) => - (new CrosswordCharacterBuilder()..update(updates))._build(); + factory _$CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) => (new CrosswordCharacterBuilder()..update(updates))._build(); - _$CrosswordCharacter._( - {required this.character, this.acrossWord, this.downWord}) - : super._() { + _$CrosswordCharacter._({ + required this.character, + this.acrossWord, + this.downWord, + }) : super._() { BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'); + character, + r'CrosswordCharacter', + 'character', + ); } @override CrosswordCharacter rebuild( - void Function(CrosswordCharacterBuilder) updates) => - (toBuilder()..update(updates)).build(); + void Function(CrosswordCharacterBuilder) updates, + ) => (toBuilder()..update(updates)).build(); @override CrosswordCharacterBuilder toBuilder() => @@ -586,10 +705,14 @@ class CrosswordCharacterBuilder _$CrosswordCharacter _build() { _$CrosswordCharacter _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordCharacter._( character: BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'), + character, + r'CrosswordCharacter', + 'character', + ), acrossWord: _acrossWord?.build(), downWord: _downWord?.build(), ); @@ -602,7 +725,10 @@ class CrosswordCharacterBuilder _downWord?.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordCharacter', _$failedField, e.toString()); + r'CrosswordCharacter', + _$failedField, + e.toString(), + ); } rethrow; } @@ -624,17 +750,20 @@ class _$Crossword extends Crossword { factory _$Crossword([void Function(CrosswordBuilder)? updates]) => (new CrosswordBuilder()..update(updates))._build(); - _$Crossword._( - {required this.width, - required this.height, - required this.words, - required this.characters}) - : super._() { + _$Crossword._({ + required this.width, + required this.height, + required this.words, + required this.characters, + }) : super._() { BuiltValueNullFieldError.checkNotNull(width, r'Crossword', 'width'); BuiltValueNullFieldError.checkNotNull(height, r'Crossword', 'height'); BuiltValueNullFieldError.checkNotNull(words, r'Crossword', 'words'); BuiltValueNullFieldError.checkNotNull( - characters, r'Crossword', 'characters'); + characters, + r'Crossword', + 'characters', + ); } @override @@ -730,12 +859,19 @@ class CrosswordBuilder implements Builder { Crossword._fillCharacters(this); _$Crossword _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$Crossword._( width: BuiltValueNullFieldError.checkNotNull( - width, r'Crossword', 'width'), + width, + r'Crossword', + 'width', + ), height: BuiltValueNullFieldError.checkNotNull( - height, r'Crossword', 'height'), + height, + r'Crossword', + 'height', + ), words: words.build(), characters: characters.build(), ); @@ -748,7 +884,10 @@ class CrosswordBuilder implements Builder { characters.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'Crossword', _$failedField, e.toString()); + r'Crossword', + _$failedField, + e.toString(), + ); } rethrow; } diff --git a/generate_crossword/step_05_a/lib/providers.dart b/generate_crossword/step_05_a/lib/providers.dart index 02b84e6ae9..102cc10871 100644 --- a/generate_crossword/step_05_a/lib/providers.dart +++ b/generate_crossword/step_05_a/lib/providers.dart @@ -26,10 +26,16 @@ Future> wordList(Ref ref) async { final re = RegExp(r'^[a-z]+$'); final words = await rootBundle.loadString('assets/words.txt'); - return const LineSplitter().convert(words).toBuiltSet().rebuild((b) => b - ..map((word) => word.toLowerCase().trim()) - ..where((word) => word.length > 2) - ..where((word) => re.hasMatch(word))); + return const LineSplitter() + .convert(words) + .toBuiltSet() + .rebuild( + (b) => + b + ..map((word) => word.toLowerCase().trim()) + ..where((word) => word.length > 2) + ..where((word) => re.hasMatch(word)), + ); } /// An enumeration for different sizes of [model.Crossword]s. @@ -40,10 +46,7 @@ enum CrosswordSize { xlarge(width: 160, height: 88), xxlarge(width: 500, height: 500); - const CrosswordSize({ - required this.width, - required this.height, - }); + const CrosswordSize({required this.width, required this.height}); final int width; final int height; @@ -71,8 +74,10 @@ Stream crossword(Ref ref) async* { final size = ref.watch(sizeProvider); final wordListAsync = ref.watch(wordListProvider); - var crossword = - model.Crossword.crossword(width: size.width, height: size.height); + var crossword = model.Crossword.crossword( + width: size.width, + height: size.height, + ); yield* wordListAsync.when( data: (wordList) async* { @@ -81,10 +86,15 @@ Stream crossword(Ref ref) async* { final direction = _random.nextBool() ? model.Direction.across : model.Direction.down; final location = model.Location.at( - _random.nextInt(size.width), _random.nextInt(size.height)); + _random.nextInt(size.width), + _random.nextInt(size.height), + ); var candidate = crossword.addWord( - word: word, direction: direction, location: location); + word: word, + direction: direction, + location: location, + ); await Future.delayed(Duration(milliseconds: 10)); if (candidate != null) { debugPrint('Added word: $word'); diff --git a/generate_crossword/step_05_a/lib/widgets/crossword_generator_app.dart b/generate_crossword/step_05_a/lib/widgets/crossword_generator_app.dart index 0c4a659789..6775f9fd89 100644 --- a/generate_crossword/step_05_a/lib/widgets/crossword_generator_app.dart +++ b/generate_crossword/step_05_a/lib/widgets/crossword_generator_app.dart @@ -24,9 +24,7 @@ class CrosswordGeneratorApp extends StatelessWidget { ), title: Text('Crossword Generator'), ), - body: SafeArea( - child: CrosswordWidget(), - ), + body: SafeArea(child: CrosswordWidget()), ), ); } @@ -46,19 +44,21 @@ class _EagerInitialization extends ConsumerWidget { class _CrosswordGeneratorMenu extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) => MenuAnchor( - menuChildren: [ - for (final entry in CrosswordSize.values) - MenuItemButton( - onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), - leadingIcon: entry == ref.watch(sizeProvider) + menuChildren: [ + for (final entry in CrosswordSize.values) + MenuItemButton( + onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), + leadingIcon: + entry == ref.watch(sizeProvider) ? Icon(Icons.radio_button_checked_outlined) : Icon(Icons.radio_button_unchecked_outlined), - child: Text(entry.label), - ), - ], - builder: (context, controller, child) => IconButton( + child: Text(entry.label), + ), + ], + builder: + (context, controller, child) => IconButton( onPressed: () => controller.open(), icon: Icon(Icons.settings), ), - ); + ); } diff --git a/generate_crossword/step_05_a/lib/widgets/crossword_widget.dart b/generate_crossword/step_05_a/lib/widgets/crossword_widget.dart index 17941440ee..1795fe68da 100644 --- a/generate_crossword/step_05_a/lib/widgets/crossword_widget.dart +++ b/generate_crossword/step_05_a/lib/widgets/crossword_widget.dart @@ -70,9 +70,11 @@ class CrosswordWidget extends ConsumerWidget { foregroundDecoration: TableSpanDecoration( border: TableSpanBorder( leading: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), trailing: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ), ); diff --git a/generate_crossword/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 070fd74eff..5845d19a0a 100644 --- a/generate_crossword/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_05_a/pubspec.yaml b/generate_crossword/step_05_a/pubspec.yaml index 701f231c6a..a4e12dc3f1 100644 --- a/generate_crossword/step_05_a/pubspec.yaml +++ b/generate_crossword/step_05_a/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter built_collection: ^5.1.1 built_value: ^8.9.3 - characters: ^1.3.0 + characters: ^1.4.0 flutter_riverpod: ^2.6.1 intl: ^0.20.2 riverpod: ^2.6.1 diff --git a/generate_crossword/step_05_a/test/model_test.dart b/generate_crossword/step_05_a/test/model_test.dart index 2b2f850b2d..1c7adb3431 100644 --- a/generate_crossword/step_05_a/test/model_test.dart +++ b/generate_crossword/step_05_a/test/model_test.dart @@ -38,28 +38,27 @@ void main() { expect(crossword.words.isNotEmpty, true); expect(crossword.words.length, 2); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 1, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .length, + 1, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 7); expect( - crossword.characters[topLeft], - CrosswordCharacter.character( - acrossWord: thisWord, - downWord: thatWord, - character: 't', - )); + crossword.characters[topLeft], + CrosswordCharacter.character( + acrossWord: thisWord, + downWord: thatWord, + character: 't', + ), + ); expect(crossword.valid, isTrue); }); @@ -85,19 +84,17 @@ void main() { expect(crossword.words.isNotEmpty, true); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 2); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 2, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .isEmpty, - true); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .isEmpty, + true, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 8); expect(crossword.valid, isFalse); @@ -107,11 +104,12 @@ void main() { Crossword crossword = Crossword.crossword(width: 50, height: 50); expect(crossword.valid, true); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'this', - )!; + crossword = + crossword.addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'this', + )!; expect(crossword.valid, true); final crossword2 = crossword.addWord( @@ -173,17 +171,18 @@ void main() { final topLeft = Location.at(0, 0); - crossword = crossword - .addWord( - location: topLeft, - word: 'this', - direction: Direction.down, - )! - .addWord( - location: topLeft, - word: 'total', - direction: Direction.across, - )!; + crossword = + crossword + .addWord( + location: topLeft, + word: 'this', + direction: Direction.down, + )! + .addWord( + location: topLeft, + word: 'total', + direction: Direction.across, + )!; expect(crossword.valid, isTrue); @@ -234,77 +233,85 @@ void main() { }); test('Crossword is not valid with run-on across words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on across/down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down/across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); @@ -312,36 +319,40 @@ void main() { test('Adding duplicate across words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.across, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -349,36 +360,40 @@ void main() { test('Adding duplicate down words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.down, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate down words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); diff --git a/generate_crossword/step_05_b/android/.gitignore b/generate_crossword/step_05_b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/generate_crossword/step_05_b/android/.gitignore +++ b/generate_crossword/step_05_b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/generate_crossword/step_05_b/android/app/build.gradle b/generate_crossword/step_05_b/android/app/build.gradle deleted file mode 100644 index d4a93e6565..0000000000 --- a/generate_crossword/step_05_b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.generate_crossword" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.generate_crossword" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/generate_crossword/step_05_b/android/app/build.gradle.kts b/generate_crossword/step_05_b/android/app/build.gradle.kts new file mode 100644 index 0000000000..9a7651c2a6 --- /dev/null +++ b/generate_crossword/step_05_b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.generate_crossword" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.generate_crossword" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/generate_crossword/step_05_b/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt b/generate_crossword/step_05_b/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt index 7011ed9ff4..e1bbbdcb4c 100644 --- a/generate_crossword/step_05_b/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt +++ b/generate_crossword/step_05_b/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.generate_crossword import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/generate_crossword/step_05_b/android/build.gradle b/generate_crossword/step_05_b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/generate_crossword/step_05_b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/generate_crossword/step_05_b/android/build.gradle.kts b/generate_crossword/step_05_b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/generate_crossword/step_05_b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/generate_crossword/step_05_b/android/gradle.properties b/generate_crossword/step_05_b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/generate_crossword/step_05_b/android/gradle.properties +++ b/generate_crossword/step_05_b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/generate_crossword/step_05_b/android/gradle/wrapper/gradle-wrapper.properties b/generate_crossword/step_05_b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/generate_crossword/step_05_b/android/gradle/wrapper/gradle-wrapper.properties +++ b/generate_crossword/step_05_b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/generate_crossword/step_05_b/android/settings.gradle b/generate_crossword/step_05_b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/generate_crossword/step_05_b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/generate_crossword/step_05_b/android/settings.gradle.kts b/generate_crossword/step_05_b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/generate_crossword/step_05_b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/generate_crossword/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/generate_crossword/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_05_b/lib/model.dart b/generate_crossword/step_05_b/lib/model.dart index a9a144b816..48ac50d45d 100644 --- a/generate_crossword/step_05_b/lib/model.dart +++ b/generate_crossword/step_05_b/lib/model.dart @@ -89,7 +89,10 @@ abstract class CrosswordWord static int locationComparator(CrosswordWord a, CrosswordWord b) { final compareRows = a.location.y.compareTo(b.location.y); final compareColumns = a.location.x.compareTo(b.location.x); - return switch (compareColumns) { 0 => compareRows, _ => compareColumns }; + return switch (compareColumns) { + 0 => compareRows, + _ => compareColumns, + }; } /// Constructor for [CrosswordWord]. @@ -98,10 +101,13 @@ abstract class CrosswordWord required Location location, required Direction direction, }) { - return CrosswordWord((b) => b - ..word = word - ..direction = direction - ..location.replace(location)); + return CrosswordWord( + (b) => + b + ..word = word + ..direction = direction + ..location.replace(location), + ); } /// Constructor for [CrosswordWord]. @@ -148,9 +154,9 @@ abstract class CrosswordCharacter /// Constructor for [CrosswordCharacter]. /// Use [CrosswordCharacter.character] instead. - factory CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) = - _$CrosswordCharacter; + factory CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) = _$CrosswordCharacter; CrosswordCharacter._(); } @@ -281,14 +287,15 @@ abstract class Crossword implements Built { } final candidate = rebuild( - (b) => b - ..words.add( - CrosswordWord.word( - word: word, - direction: direction, - location: location, - ), - ), + (b) => + b + ..words.add( + CrosswordWord.word( + word: word, + direction: direction, + location: location, + ), + ), ); if (candidate.valid) { @@ -310,19 +317,21 @@ abstract class Crossword implements Built { b.characters.updateValue( word.location.rightOffset(idx), (b) => b.rebuild((bInner) => bInner.acrossWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - acrossWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + acrossWord: word, + character: character, + ), ); case Direction.down: b.characters.updateValue( word.location.downOffset(idx), (b) => b.rebuild((bInner) => bInner.downWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - downWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + downWord: word, + character: character, + ), ); } } @@ -336,7 +345,8 @@ abstract class Crossword implements Built { final grid = List.generate( height, (_) => List.generate( - width, (_) => '░', // https://www.compart.com/en/unicode/U+2591 + width, + (_) => '░', // https://www.compart.com/en/unicode/U+2591 ), ); @@ -391,10 +401,5 @@ abstract class Crossword implements Built { } /// Construct the serialization/deserialization code for the data model. -@SerializersFor([ - Location, - Crossword, - CrosswordWord, - CrosswordCharacter, -]) +@SerializersFor([Location, Crossword, CrosswordWord, CrosswordCharacter]) final Serializers serializers = _$serializers; diff --git a/generate_crossword/step_05_b/lib/model.g.dart b/generate_crossword/step_05_b/lib/model.g.dart index 975954b5f0..a4ddf76c65 100644 --- a/generate_crossword/step_05_b/lib/model.g.dart +++ b/generate_crossword/step_05_b/lib/model.g.dart @@ -6,21 +6,24 @@ part of 'model.dart'; // BuiltValueGenerator // ************************************************************************** -Serializers _$serializers = (new Serializers().toBuilder() - ..add(Crossword.serializer) - ..add(CrosswordCharacter.serializer) - ..add(CrosswordWord.serializer) - ..add(Location.serializer) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(CrosswordWord)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ]), - () => new MapBuilder())) - .build(); +Serializers _$serializers = + (new Serializers().toBuilder() + ..add(Crossword.serializer) + ..add(CrosswordCharacter.serializer) + ..add(CrosswordWord.serializer) + ..add(Location.serializer) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(CrosswordWord)]), + () => new ListBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + () => new MapBuilder(), + )) + .build(); Serializer _$locationSerializer = new _$LocationSerializer(); Serializer _$crosswordWordSerializer = new _$CrosswordWordSerializer(); @@ -35,8 +38,11 @@ class _$LocationSerializer implements StructuredSerializer { final String wireName = 'Location'; @override - Iterable serialize(Serializers serializers, Location object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Location object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'x', serializers.serialize(object.x, specifiedType: const FullType(int)), @@ -48,8 +54,11 @@ class _$LocationSerializer implements StructuredSerializer { } @override - Location deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Location deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new LocationBuilder(); final iterator = serialized.iterator; @@ -59,12 +68,20 @@ class _$LocationSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'x': - result.x = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.x = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'y': - result.y = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.y = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; } } @@ -80,17 +97,24 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final String wireName = 'CrosswordWord'; @override - Iterable serialize(Serializers serializers, CrosswordWord object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + CrosswordWord object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'word', serializers.serialize(object.word, specifiedType: const FullType(String)), 'location', - serializers.serialize(object.location, - specifiedType: const FullType(Location)), + serializers.serialize( + object.location, + specifiedType: const FullType(Location), + ), 'direction', - serializers.serialize(object.direction, - specifiedType: const FullType(Direction)), + serializers.serialize( + object.direction, + specifiedType: const FullType(Direction), + ), ]; return result; @@ -98,8 +122,10 @@ class _$CrosswordWordSerializer implements StructuredSerializer { @override CrosswordWord deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordWordBuilder(); final iterator = serialized.iterator; @@ -109,16 +135,29 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'word': - result.word = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.word = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'location': - result.location.replace(serializers.deserialize(value, - specifiedType: const FullType(Location))! as Location); + result.location.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Location), + )! + as Location, + ); break; case 'direction': - result.direction = serializers.deserialize(value, - specifiedType: const FullType(Direction))! as Direction; + result.direction = + serializers.deserialize( + value, + specifiedType: const FullType(Direction), + )! + as Direction; break; } } @@ -136,35 +175,49 @@ class _$CrosswordCharacterSerializer @override Iterable serialize( - Serializers serializers, CrosswordCharacter object, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + CrosswordCharacter object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'character', - serializers.serialize(object.character, - specifiedType: const FullType(String)), + serializers.serialize( + object.character, + specifiedType: const FullType(String), + ), ]; Object? value; value = object.acrossWord; if (value != null) { result ..add('acrossWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } value = object.downWord; if (value != null) { result ..add('downWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } return result; } @override CrosswordCharacter deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordCharacterBuilder(); final iterator = serialized.iterator; @@ -174,16 +227,30 @@ class _$CrosswordCharacterSerializer final Object? value = iterator.current; switch (key) { case 'character': - result.character = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.character = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'acrossWord': - result.acrossWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.acrossWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; case 'downWord': - result.downWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.downWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; } } @@ -199,31 +266,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final String wireName = 'Crossword'; @override - Iterable serialize(Serializers serializers, Crossword object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Crossword object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'width', serializers.serialize(object.width, specifiedType: const FullType(int)), 'height', serializers.serialize(object.height, specifiedType: const FullType(int)), 'words', - serializers.serialize(object.words, - specifiedType: - const FullType(BuiltList, const [const FullType(CrosswordWord)])), + serializers.serialize( + object.words, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + ), 'characters', - serializers.serialize(object.characters, - specifiedType: const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ])), + serializers.serialize( + object.characters, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + ), ]; return result; } @override - Crossword deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Crossword deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordBuilder(); final iterator = serialized.iterator; @@ -233,25 +311,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'width': - result.width = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.width = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'height': - result.height = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.height = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'words': - result.words.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(CrosswordWord)]))! - as BuiltList); + result.words.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + )! + as BuiltList, + ); break; case 'characters': - result.characters.replace(serializers.deserialize(value, + result.characters.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), - const FullType(CrosswordCharacter) - ]))!); + const FullType(CrosswordCharacter), + ]), + )!, + ); break; } } @@ -343,7 +438,8 @@ class LocationBuilder implements Builder { Location build() => _build(); _$Location _build() { - final _$result = _$v ?? + final _$result = + _$v ?? new _$Location._( x: BuiltValueNullFieldError.checkNotNull(x, r'Location', 'x'), y: BuiltValueNullFieldError.checkNotNull(y, r'Location', 'y'), @@ -364,14 +460,22 @@ class _$CrosswordWord extends CrosswordWord { factory _$CrosswordWord([void Function(CrosswordWordBuilder)? updates]) => (new CrosswordWordBuilder()..update(updates))._build(); - _$CrosswordWord._( - {required this.word, required this.location, required this.direction}) - : super._() { + _$CrosswordWord._({ + required this.word, + required this.location, + required this.direction, + }) : super._() { BuiltValueNullFieldError.checkNotNull(word, r'CrosswordWord', 'word'); BuiltValueNullFieldError.checkNotNull( - location, r'CrosswordWord', 'location'); + location, + r'CrosswordWord', + 'location', + ); BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'); + direction, + r'CrosswordWord', + 'direction', + ); } @override @@ -456,13 +560,20 @@ class CrosswordWordBuilder _$CrosswordWord _build() { _$CrosswordWord _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordWord._( word: BuiltValueNullFieldError.checkNotNull( - word, r'CrosswordWord', 'word'), + word, + r'CrosswordWord', + 'word', + ), location: location.build(), direction: BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'), + direction, + r'CrosswordWord', + 'direction', + ), ); } catch (_) { late String _$failedField; @@ -471,7 +582,10 @@ class CrosswordWordBuilder location.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordWord', _$failedField, e.toString()); + r'CrosswordWord', + _$failedField, + e.toString(), + ); } rethrow; } @@ -488,21 +602,26 @@ class _$CrosswordCharacter extends CrosswordCharacter { @override final CrosswordWord? downWord; - factory _$CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) => - (new CrosswordCharacterBuilder()..update(updates))._build(); + factory _$CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) => (new CrosswordCharacterBuilder()..update(updates))._build(); - _$CrosswordCharacter._( - {required this.character, this.acrossWord, this.downWord}) - : super._() { + _$CrosswordCharacter._({ + required this.character, + this.acrossWord, + this.downWord, + }) : super._() { BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'); + character, + r'CrosswordCharacter', + 'character', + ); } @override CrosswordCharacter rebuild( - void Function(CrosswordCharacterBuilder) updates) => - (toBuilder()..update(updates)).build(); + void Function(CrosswordCharacterBuilder) updates, + ) => (toBuilder()..update(updates)).build(); @override CrosswordCharacterBuilder toBuilder() => @@ -586,10 +705,14 @@ class CrosswordCharacterBuilder _$CrosswordCharacter _build() { _$CrosswordCharacter _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordCharacter._( character: BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'), + character, + r'CrosswordCharacter', + 'character', + ), acrossWord: _acrossWord?.build(), downWord: _downWord?.build(), ); @@ -602,7 +725,10 @@ class CrosswordCharacterBuilder _downWord?.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordCharacter', _$failedField, e.toString()); + r'CrosswordCharacter', + _$failedField, + e.toString(), + ); } rethrow; } @@ -624,17 +750,20 @@ class _$Crossword extends Crossword { factory _$Crossword([void Function(CrosswordBuilder)? updates]) => (new CrosswordBuilder()..update(updates))._build(); - _$Crossword._( - {required this.width, - required this.height, - required this.words, - required this.characters}) - : super._() { + _$Crossword._({ + required this.width, + required this.height, + required this.words, + required this.characters, + }) : super._() { BuiltValueNullFieldError.checkNotNull(width, r'Crossword', 'width'); BuiltValueNullFieldError.checkNotNull(height, r'Crossword', 'height'); BuiltValueNullFieldError.checkNotNull(words, r'Crossword', 'words'); BuiltValueNullFieldError.checkNotNull( - characters, r'Crossword', 'characters'); + characters, + r'Crossword', + 'characters', + ); } @override @@ -730,12 +859,19 @@ class CrosswordBuilder implements Builder { Crossword._fillCharacters(this); _$Crossword _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$Crossword._( width: BuiltValueNullFieldError.checkNotNull( - width, r'Crossword', 'width'), + width, + r'Crossword', + 'width', + ), height: BuiltValueNullFieldError.checkNotNull( - height, r'Crossword', 'height'), + height, + r'Crossword', + 'height', + ), words: words.build(), characters: characters.build(), ); @@ -748,7 +884,10 @@ class CrosswordBuilder implements Builder { characters.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'Crossword', _$failedField, e.toString()); + r'Crossword', + _$failedField, + e.toString(), + ); } rethrow; } diff --git a/generate_crossword/step_05_b/lib/providers.dart b/generate_crossword/step_05_b/lib/providers.dart index b6191b4bb3..44bbaea58e 100644 --- a/generate_crossword/step_05_b/lib/providers.dart +++ b/generate_crossword/step_05_b/lib/providers.dart @@ -26,10 +26,16 @@ Future> wordList(Ref ref) async { final re = RegExp(r'^[a-z]+$'); final words = await rootBundle.loadString('assets/words.txt'); - return const LineSplitter().convert(words).toBuiltSet().rebuild((b) => b - ..map((word) => word.toLowerCase().trim()) - ..where((word) => word.length > 2) - ..where((word) => re.hasMatch(word))); + return const LineSplitter() + .convert(words) + .toBuiltSet() + .rebuild( + (b) => + b + ..map((word) => word.toLowerCase().trim()) + ..where((word) => word.length > 2) + ..where((word) => re.hasMatch(word)), + ); } /// An enumeration for different sizes of [model.Crossword]s. @@ -40,10 +46,7 @@ enum CrosswordSize { xlarge(width: 160, height: 88), xxlarge(width: 500, height: 500); - const CrosswordSize({ - required this.width, - required this.height, - }); + const CrosswordSize({required this.width, required this.height}); final int width; final int height; @@ -71,8 +74,10 @@ Stream crossword(Ref ref) async* { final size = ref.watch(sizeProvider); final wordListAsync = ref.watch(wordListProvider); - var crossword = - model.Crossword.crossword(width: size.width, height: size.height); + var crossword = model.Crossword.crossword( + width: size.width, + height: size.height, + ); yield* wordListAsync.when( data: (wordList) async* { @@ -81,13 +86,19 @@ Stream crossword(Ref ref) async* { final direction = _random.nextBool() ? model.Direction.across : model.Direction.down; final location = model.Location.at( - _random.nextInt(size.width), _random.nextInt(size.height)); + _random.nextInt(size.width), + _random.nextInt(size.height), + ); try { - var candidate = await compute( - ((String, model.Direction, model.Location) wordToAdd) { + var candidate = await compute(( + (String, model.Direction, model.Location) wordToAdd, + ) { final (word, direction, location) = wordToAdd; return crossword.addWord( - word: word, direction: direction, location: location); + word: word, + direction: direction, + location: location, + ); }, (word, direction, location)); if (candidate != null) { diff --git a/generate_crossword/step_05_b/lib/widgets/crossword_generator_app.dart b/generate_crossword/step_05_b/lib/widgets/crossword_generator_app.dart index 0c4a659789..6775f9fd89 100644 --- a/generate_crossword/step_05_b/lib/widgets/crossword_generator_app.dart +++ b/generate_crossword/step_05_b/lib/widgets/crossword_generator_app.dart @@ -24,9 +24,7 @@ class CrosswordGeneratorApp extends StatelessWidget { ), title: Text('Crossword Generator'), ), - body: SafeArea( - child: CrosswordWidget(), - ), + body: SafeArea(child: CrosswordWidget()), ), ); } @@ -46,19 +44,21 @@ class _EagerInitialization extends ConsumerWidget { class _CrosswordGeneratorMenu extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) => MenuAnchor( - menuChildren: [ - for (final entry in CrosswordSize.values) - MenuItemButton( - onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), - leadingIcon: entry == ref.watch(sizeProvider) + menuChildren: [ + for (final entry in CrosswordSize.values) + MenuItemButton( + onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), + leadingIcon: + entry == ref.watch(sizeProvider) ? Icon(Icons.radio_button_checked_outlined) : Icon(Icons.radio_button_unchecked_outlined), - child: Text(entry.label), - ), - ], - builder: (context, controller, child) => IconButton( + child: Text(entry.label), + ), + ], + builder: + (context, controller, child) => IconButton( onPressed: () => controller.open(), icon: Icon(Icons.settings), ), - ); + ); } diff --git a/generate_crossword/step_05_b/lib/widgets/crossword_widget.dart b/generate_crossword/step_05_b/lib/widgets/crossword_widget.dart index 17941440ee..1795fe68da 100644 --- a/generate_crossword/step_05_b/lib/widgets/crossword_widget.dart +++ b/generate_crossword/step_05_b/lib/widgets/crossword_widget.dart @@ -70,9 +70,11 @@ class CrosswordWidget extends ConsumerWidget { foregroundDecoration: TableSpanDecoration( border: TableSpanBorder( leading: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), trailing: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ), ); diff --git a/generate_crossword/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 070fd74eff..5845d19a0a 100644 --- a/generate_crossword/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_05_b/pubspec.yaml b/generate_crossword/step_05_b/pubspec.yaml index 701f231c6a..a4e12dc3f1 100644 --- a/generate_crossword/step_05_b/pubspec.yaml +++ b/generate_crossword/step_05_b/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter built_collection: ^5.1.1 built_value: ^8.9.3 - characters: ^1.3.0 + characters: ^1.4.0 flutter_riverpod: ^2.6.1 intl: ^0.20.2 riverpod: ^2.6.1 diff --git a/generate_crossword/step_05_b/test/model_test.dart b/generate_crossword/step_05_b/test/model_test.dart index 2b2f850b2d..1c7adb3431 100644 --- a/generate_crossword/step_05_b/test/model_test.dart +++ b/generate_crossword/step_05_b/test/model_test.dart @@ -38,28 +38,27 @@ void main() { expect(crossword.words.isNotEmpty, true); expect(crossword.words.length, 2); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 1, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .length, + 1, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 7); expect( - crossword.characters[topLeft], - CrosswordCharacter.character( - acrossWord: thisWord, - downWord: thatWord, - character: 't', - )); + crossword.characters[topLeft], + CrosswordCharacter.character( + acrossWord: thisWord, + downWord: thatWord, + character: 't', + ), + ); expect(crossword.valid, isTrue); }); @@ -85,19 +84,17 @@ void main() { expect(crossword.words.isNotEmpty, true); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 2); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 2, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .isEmpty, - true); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .isEmpty, + true, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 8); expect(crossword.valid, isFalse); @@ -107,11 +104,12 @@ void main() { Crossword crossword = Crossword.crossword(width: 50, height: 50); expect(crossword.valid, true); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'this', - )!; + crossword = + crossword.addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'this', + )!; expect(crossword.valid, true); final crossword2 = crossword.addWord( @@ -173,17 +171,18 @@ void main() { final topLeft = Location.at(0, 0); - crossword = crossword - .addWord( - location: topLeft, - word: 'this', - direction: Direction.down, - )! - .addWord( - location: topLeft, - word: 'total', - direction: Direction.across, - )!; + crossword = + crossword + .addWord( + location: topLeft, + word: 'this', + direction: Direction.down, + )! + .addWord( + location: topLeft, + word: 'total', + direction: Direction.across, + )!; expect(crossword.valid, isTrue); @@ -234,77 +233,85 @@ void main() { }); test('Crossword is not valid with run-on across words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on across/down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down/across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); @@ -312,36 +319,40 @@ void main() { test('Adding duplicate across words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.across, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -349,36 +360,40 @@ void main() { test('Adding duplicate down words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.down, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate down words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); diff --git a/generate_crossword/step_05_c/android/.gitignore b/generate_crossword/step_05_c/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/generate_crossword/step_05_c/android/.gitignore +++ b/generate_crossword/step_05_c/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/generate_crossword/step_05_c/android/app/build.gradle b/generate_crossword/step_05_c/android/app/build.gradle deleted file mode 100644 index d4a93e6565..0000000000 --- a/generate_crossword/step_05_c/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.generate_crossword" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.generate_crossword" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/generate_crossword/step_05_c/android/app/build.gradle.kts b/generate_crossword/step_05_c/android/app/build.gradle.kts new file mode 100644 index 0000000000..9a7651c2a6 --- /dev/null +++ b/generate_crossword/step_05_c/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.generate_crossword" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.generate_crossword" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/generate_crossword/step_05_c/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt b/generate_crossword/step_05_c/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt index 7011ed9ff4..e1bbbdcb4c 100644 --- a/generate_crossword/step_05_c/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt +++ b/generate_crossword/step_05_c/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.generate_crossword import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/generate_crossword/step_05_c/android/build.gradle b/generate_crossword/step_05_c/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/generate_crossword/step_05_c/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/generate_crossword/step_05_c/android/build.gradle.kts b/generate_crossword/step_05_c/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/generate_crossword/step_05_c/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/generate_crossword/step_05_c/android/gradle.properties b/generate_crossword/step_05_c/android/gradle.properties index 2597170821..f018a61817 100644 --- a/generate_crossword/step_05_c/android/gradle.properties +++ b/generate_crossword/step_05_c/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/generate_crossword/step_05_c/android/gradle/wrapper/gradle-wrapper.properties b/generate_crossword/step_05_c/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/generate_crossword/step_05_c/android/gradle/wrapper/gradle-wrapper.properties +++ b/generate_crossword/step_05_c/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/generate_crossword/step_05_c/android/settings.gradle b/generate_crossword/step_05_c/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/generate_crossword/step_05_c/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/generate_crossword/step_05_c/android/settings.gradle.kts b/generate_crossword/step_05_c/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/generate_crossword/step_05_c/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/generate_crossword/step_05_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_05_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/generate_crossword/step_05_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_05_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_05_c/lib/isolates.dart b/generate_crossword/step_05_c/lib/isolates.dart index e7e52ef472..94fa62bf5a 100644 --- a/generate_crossword/step_05_c/lib/isolates.dart +++ b/generate_crossword/step_05_c/lib/isolates.dart @@ -16,17 +16,22 @@ Stream exploreCrosswordSolutions({ required Crossword crossword, required BuiltSet wordList, }) async* { - while ( - crossword.characters.length < crossword.width * crossword.height * 0.8) { + while (crossword.characters.length < + crossword.width * crossword.height * 0.8) { final word = wordList.randomElement(); final direction = _random.nextBool() ? Direction.across : Direction.down; final location = Location.at( - _random.nextInt(crossword.width), _random.nextInt(crossword.height)); + _random.nextInt(crossword.width), + _random.nextInt(crossword.height), + ); try { var candidate = await compute(((String, Direction, Location) wordToAdd) { final (word, direction, location) = wordToAdd; return crossword.addWord( - word: word, direction: direction, location: location); + word: word, + direction: direction, + location: location, + ); }, (word, direction, location)); if (candidate != null) { diff --git a/generate_crossword/step_05_c/lib/model.dart b/generate_crossword/step_05_c/lib/model.dart index a9a144b816..48ac50d45d 100644 --- a/generate_crossword/step_05_c/lib/model.dart +++ b/generate_crossword/step_05_c/lib/model.dart @@ -89,7 +89,10 @@ abstract class CrosswordWord static int locationComparator(CrosswordWord a, CrosswordWord b) { final compareRows = a.location.y.compareTo(b.location.y); final compareColumns = a.location.x.compareTo(b.location.x); - return switch (compareColumns) { 0 => compareRows, _ => compareColumns }; + return switch (compareColumns) { + 0 => compareRows, + _ => compareColumns, + }; } /// Constructor for [CrosswordWord]. @@ -98,10 +101,13 @@ abstract class CrosswordWord required Location location, required Direction direction, }) { - return CrosswordWord((b) => b - ..word = word - ..direction = direction - ..location.replace(location)); + return CrosswordWord( + (b) => + b + ..word = word + ..direction = direction + ..location.replace(location), + ); } /// Constructor for [CrosswordWord]. @@ -148,9 +154,9 @@ abstract class CrosswordCharacter /// Constructor for [CrosswordCharacter]. /// Use [CrosswordCharacter.character] instead. - factory CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) = - _$CrosswordCharacter; + factory CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) = _$CrosswordCharacter; CrosswordCharacter._(); } @@ -281,14 +287,15 @@ abstract class Crossword implements Built { } final candidate = rebuild( - (b) => b - ..words.add( - CrosswordWord.word( - word: word, - direction: direction, - location: location, - ), - ), + (b) => + b + ..words.add( + CrosswordWord.word( + word: word, + direction: direction, + location: location, + ), + ), ); if (candidate.valid) { @@ -310,19 +317,21 @@ abstract class Crossword implements Built { b.characters.updateValue( word.location.rightOffset(idx), (b) => b.rebuild((bInner) => bInner.acrossWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - acrossWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + acrossWord: word, + character: character, + ), ); case Direction.down: b.characters.updateValue( word.location.downOffset(idx), (b) => b.rebuild((bInner) => bInner.downWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - downWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + downWord: word, + character: character, + ), ); } } @@ -336,7 +345,8 @@ abstract class Crossword implements Built { final grid = List.generate( height, (_) => List.generate( - width, (_) => '░', // https://www.compart.com/en/unicode/U+2591 + width, + (_) => '░', // https://www.compart.com/en/unicode/U+2591 ), ); @@ -391,10 +401,5 @@ abstract class Crossword implements Built { } /// Construct the serialization/deserialization code for the data model. -@SerializersFor([ - Location, - Crossword, - CrosswordWord, - CrosswordCharacter, -]) +@SerializersFor([Location, Crossword, CrosswordWord, CrosswordCharacter]) final Serializers serializers = _$serializers; diff --git a/generate_crossword/step_05_c/lib/model.g.dart b/generate_crossword/step_05_c/lib/model.g.dart index 975954b5f0..a4ddf76c65 100644 --- a/generate_crossword/step_05_c/lib/model.g.dart +++ b/generate_crossword/step_05_c/lib/model.g.dart @@ -6,21 +6,24 @@ part of 'model.dart'; // BuiltValueGenerator // ************************************************************************** -Serializers _$serializers = (new Serializers().toBuilder() - ..add(Crossword.serializer) - ..add(CrosswordCharacter.serializer) - ..add(CrosswordWord.serializer) - ..add(Location.serializer) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(CrosswordWord)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ]), - () => new MapBuilder())) - .build(); +Serializers _$serializers = + (new Serializers().toBuilder() + ..add(Crossword.serializer) + ..add(CrosswordCharacter.serializer) + ..add(CrosswordWord.serializer) + ..add(Location.serializer) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(CrosswordWord)]), + () => new ListBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + () => new MapBuilder(), + )) + .build(); Serializer _$locationSerializer = new _$LocationSerializer(); Serializer _$crosswordWordSerializer = new _$CrosswordWordSerializer(); @@ -35,8 +38,11 @@ class _$LocationSerializer implements StructuredSerializer { final String wireName = 'Location'; @override - Iterable serialize(Serializers serializers, Location object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Location object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'x', serializers.serialize(object.x, specifiedType: const FullType(int)), @@ -48,8 +54,11 @@ class _$LocationSerializer implements StructuredSerializer { } @override - Location deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Location deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new LocationBuilder(); final iterator = serialized.iterator; @@ -59,12 +68,20 @@ class _$LocationSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'x': - result.x = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.x = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'y': - result.y = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.y = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; } } @@ -80,17 +97,24 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final String wireName = 'CrosswordWord'; @override - Iterable serialize(Serializers serializers, CrosswordWord object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + CrosswordWord object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'word', serializers.serialize(object.word, specifiedType: const FullType(String)), 'location', - serializers.serialize(object.location, - specifiedType: const FullType(Location)), + serializers.serialize( + object.location, + specifiedType: const FullType(Location), + ), 'direction', - serializers.serialize(object.direction, - specifiedType: const FullType(Direction)), + serializers.serialize( + object.direction, + specifiedType: const FullType(Direction), + ), ]; return result; @@ -98,8 +122,10 @@ class _$CrosswordWordSerializer implements StructuredSerializer { @override CrosswordWord deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordWordBuilder(); final iterator = serialized.iterator; @@ -109,16 +135,29 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'word': - result.word = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.word = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'location': - result.location.replace(serializers.deserialize(value, - specifiedType: const FullType(Location))! as Location); + result.location.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Location), + )! + as Location, + ); break; case 'direction': - result.direction = serializers.deserialize(value, - specifiedType: const FullType(Direction))! as Direction; + result.direction = + serializers.deserialize( + value, + specifiedType: const FullType(Direction), + )! + as Direction; break; } } @@ -136,35 +175,49 @@ class _$CrosswordCharacterSerializer @override Iterable serialize( - Serializers serializers, CrosswordCharacter object, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + CrosswordCharacter object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'character', - serializers.serialize(object.character, - specifiedType: const FullType(String)), + serializers.serialize( + object.character, + specifiedType: const FullType(String), + ), ]; Object? value; value = object.acrossWord; if (value != null) { result ..add('acrossWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } value = object.downWord; if (value != null) { result ..add('downWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } return result; } @override CrosswordCharacter deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordCharacterBuilder(); final iterator = serialized.iterator; @@ -174,16 +227,30 @@ class _$CrosswordCharacterSerializer final Object? value = iterator.current; switch (key) { case 'character': - result.character = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.character = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'acrossWord': - result.acrossWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.acrossWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; case 'downWord': - result.downWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.downWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; } } @@ -199,31 +266,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final String wireName = 'Crossword'; @override - Iterable serialize(Serializers serializers, Crossword object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Crossword object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'width', serializers.serialize(object.width, specifiedType: const FullType(int)), 'height', serializers.serialize(object.height, specifiedType: const FullType(int)), 'words', - serializers.serialize(object.words, - specifiedType: - const FullType(BuiltList, const [const FullType(CrosswordWord)])), + serializers.serialize( + object.words, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + ), 'characters', - serializers.serialize(object.characters, - specifiedType: const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ])), + serializers.serialize( + object.characters, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + ), ]; return result; } @override - Crossword deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Crossword deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordBuilder(); final iterator = serialized.iterator; @@ -233,25 +311,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'width': - result.width = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.width = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'height': - result.height = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.height = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'words': - result.words.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(CrosswordWord)]))! - as BuiltList); + result.words.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + )! + as BuiltList, + ); break; case 'characters': - result.characters.replace(serializers.deserialize(value, + result.characters.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), - const FullType(CrosswordCharacter) - ]))!); + const FullType(CrosswordCharacter), + ]), + )!, + ); break; } } @@ -343,7 +438,8 @@ class LocationBuilder implements Builder { Location build() => _build(); _$Location _build() { - final _$result = _$v ?? + final _$result = + _$v ?? new _$Location._( x: BuiltValueNullFieldError.checkNotNull(x, r'Location', 'x'), y: BuiltValueNullFieldError.checkNotNull(y, r'Location', 'y'), @@ -364,14 +460,22 @@ class _$CrosswordWord extends CrosswordWord { factory _$CrosswordWord([void Function(CrosswordWordBuilder)? updates]) => (new CrosswordWordBuilder()..update(updates))._build(); - _$CrosswordWord._( - {required this.word, required this.location, required this.direction}) - : super._() { + _$CrosswordWord._({ + required this.word, + required this.location, + required this.direction, + }) : super._() { BuiltValueNullFieldError.checkNotNull(word, r'CrosswordWord', 'word'); BuiltValueNullFieldError.checkNotNull( - location, r'CrosswordWord', 'location'); + location, + r'CrosswordWord', + 'location', + ); BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'); + direction, + r'CrosswordWord', + 'direction', + ); } @override @@ -456,13 +560,20 @@ class CrosswordWordBuilder _$CrosswordWord _build() { _$CrosswordWord _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordWord._( word: BuiltValueNullFieldError.checkNotNull( - word, r'CrosswordWord', 'word'), + word, + r'CrosswordWord', + 'word', + ), location: location.build(), direction: BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'), + direction, + r'CrosswordWord', + 'direction', + ), ); } catch (_) { late String _$failedField; @@ -471,7 +582,10 @@ class CrosswordWordBuilder location.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordWord', _$failedField, e.toString()); + r'CrosswordWord', + _$failedField, + e.toString(), + ); } rethrow; } @@ -488,21 +602,26 @@ class _$CrosswordCharacter extends CrosswordCharacter { @override final CrosswordWord? downWord; - factory _$CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) => - (new CrosswordCharacterBuilder()..update(updates))._build(); + factory _$CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) => (new CrosswordCharacterBuilder()..update(updates))._build(); - _$CrosswordCharacter._( - {required this.character, this.acrossWord, this.downWord}) - : super._() { + _$CrosswordCharacter._({ + required this.character, + this.acrossWord, + this.downWord, + }) : super._() { BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'); + character, + r'CrosswordCharacter', + 'character', + ); } @override CrosswordCharacter rebuild( - void Function(CrosswordCharacterBuilder) updates) => - (toBuilder()..update(updates)).build(); + void Function(CrosswordCharacterBuilder) updates, + ) => (toBuilder()..update(updates)).build(); @override CrosswordCharacterBuilder toBuilder() => @@ -586,10 +705,14 @@ class CrosswordCharacterBuilder _$CrosswordCharacter _build() { _$CrosswordCharacter _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordCharacter._( character: BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'), + character, + r'CrosswordCharacter', + 'character', + ), acrossWord: _acrossWord?.build(), downWord: _downWord?.build(), ); @@ -602,7 +725,10 @@ class CrosswordCharacterBuilder _downWord?.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordCharacter', _$failedField, e.toString()); + r'CrosswordCharacter', + _$failedField, + e.toString(), + ); } rethrow; } @@ -624,17 +750,20 @@ class _$Crossword extends Crossword { factory _$Crossword([void Function(CrosswordBuilder)? updates]) => (new CrosswordBuilder()..update(updates))._build(); - _$Crossword._( - {required this.width, - required this.height, - required this.words, - required this.characters}) - : super._() { + _$Crossword._({ + required this.width, + required this.height, + required this.words, + required this.characters, + }) : super._() { BuiltValueNullFieldError.checkNotNull(width, r'Crossword', 'width'); BuiltValueNullFieldError.checkNotNull(height, r'Crossword', 'height'); BuiltValueNullFieldError.checkNotNull(words, r'Crossword', 'words'); BuiltValueNullFieldError.checkNotNull( - characters, r'Crossword', 'characters'); + characters, + r'Crossword', + 'characters', + ); } @override @@ -730,12 +859,19 @@ class CrosswordBuilder implements Builder { Crossword._fillCharacters(this); _$Crossword _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$Crossword._( width: BuiltValueNullFieldError.checkNotNull( - width, r'Crossword', 'width'), + width, + r'Crossword', + 'width', + ), height: BuiltValueNullFieldError.checkNotNull( - height, r'Crossword', 'height'), + height, + r'Crossword', + 'height', + ), words: words.build(), characters: characters.build(), ); @@ -748,7 +884,10 @@ class CrosswordBuilder implements Builder { characters.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'Crossword', _$failedField, e.toString()); + r'Crossword', + _$failedField, + e.toString(), + ); } rethrow; } diff --git a/generate_crossword/step_05_c/lib/providers.dart b/generate_crossword/step_05_c/lib/providers.dart index 102f7a18ca..63a780ffb9 100644 --- a/generate_crossword/step_05_c/lib/providers.dart +++ b/generate_crossword/step_05_c/lib/providers.dart @@ -25,10 +25,16 @@ Future> wordList(Ref ref) async { final re = RegExp(r'^[a-z]+$'); final words = await rootBundle.loadString('assets/words.txt'); - return const LineSplitter().convert(words).toBuiltSet().rebuild((b) => b - ..map((word) => word.toLowerCase().trim()) - ..where((word) => word.length > 2) - ..where((word) => re.hasMatch(word))); + return const LineSplitter() + .convert(words) + .toBuiltSet() + .rebuild( + (b) => + b + ..map((word) => word.toLowerCase().trim()) + ..where((word) => word.length > 2) + ..where((word) => re.hasMatch(word)), + ); } /// An enumeration for different sizes of [model.Crossword]s. @@ -39,10 +45,7 @@ enum CrosswordSize { xlarge(width: 160, height: 88), xxlarge(width: 500, height: 500); - const CrosswordSize({ - required this.width, - required this.height, - }); + const CrosswordSize({required this.width, required this.height}); final int width; final int height; @@ -68,14 +71,17 @@ Stream crossword(Ref ref) async* { final size = ref.watch(sizeProvider); final wordListAsync = ref.watch(wordListProvider); - final emptyCrossword = - model.Crossword.crossword(width: size.width, height: size.height); + final emptyCrossword = model.Crossword.crossword( + width: size.width, + height: size.height, + ); yield* wordListAsync.when( - data: (wordList) => exploreCrosswordSolutions( - crossword: emptyCrossword, - wordList: wordList, - ), + data: + (wordList) => exploreCrosswordSolutions( + crossword: emptyCrossword, + wordList: wordList, + ), error: (error, stackTrace) async* { debugPrint('Error loading word list: $error'); yield emptyCrossword; diff --git a/generate_crossword/step_05_c/lib/widgets/crossword_generator_app.dart b/generate_crossword/step_05_c/lib/widgets/crossword_generator_app.dart index 0c4a659789..6775f9fd89 100644 --- a/generate_crossword/step_05_c/lib/widgets/crossword_generator_app.dart +++ b/generate_crossword/step_05_c/lib/widgets/crossword_generator_app.dart @@ -24,9 +24,7 @@ class CrosswordGeneratorApp extends StatelessWidget { ), title: Text('Crossword Generator'), ), - body: SafeArea( - child: CrosswordWidget(), - ), + body: SafeArea(child: CrosswordWidget()), ), ); } @@ -46,19 +44,21 @@ class _EagerInitialization extends ConsumerWidget { class _CrosswordGeneratorMenu extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) => MenuAnchor( - menuChildren: [ - for (final entry in CrosswordSize.values) - MenuItemButton( - onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), - leadingIcon: entry == ref.watch(sizeProvider) + menuChildren: [ + for (final entry in CrosswordSize.values) + MenuItemButton( + onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), + leadingIcon: + entry == ref.watch(sizeProvider) ? Icon(Icons.radio_button_checked_outlined) : Icon(Icons.radio_button_unchecked_outlined), - child: Text(entry.label), - ), - ], - builder: (context, controller, child) => IconButton( + child: Text(entry.label), + ), + ], + builder: + (context, controller, child) => IconButton( onPressed: () => controller.open(), icon: Icon(Icons.settings), ), - ); + ); } diff --git a/generate_crossword/step_05_c/lib/widgets/crossword_widget.dart b/generate_crossword/step_05_c/lib/widgets/crossword_widget.dart index 17941440ee..1795fe68da 100644 --- a/generate_crossword/step_05_c/lib/widgets/crossword_widget.dart +++ b/generate_crossword/step_05_c/lib/widgets/crossword_widget.dart @@ -70,9 +70,11 @@ class CrosswordWidget extends ConsumerWidget { foregroundDecoration: TableSpanDecoration( border: TableSpanBorder( leading: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), trailing: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ), ); diff --git a/generate_crossword/step_05_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_05_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 070fd74eff..5845d19a0a 100644 --- a/generate_crossword/step_05_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_05_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_05_c/pubspec.yaml b/generate_crossword/step_05_c/pubspec.yaml index 701f231c6a..a4e12dc3f1 100644 --- a/generate_crossword/step_05_c/pubspec.yaml +++ b/generate_crossword/step_05_c/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter built_collection: ^5.1.1 built_value: ^8.9.3 - characters: ^1.3.0 + characters: ^1.4.0 flutter_riverpod: ^2.6.1 intl: ^0.20.2 riverpod: ^2.6.1 diff --git a/generate_crossword/step_05_c/test/model_test.dart b/generate_crossword/step_05_c/test/model_test.dart index 2b2f850b2d..1c7adb3431 100644 --- a/generate_crossword/step_05_c/test/model_test.dart +++ b/generate_crossword/step_05_c/test/model_test.dart @@ -38,28 +38,27 @@ void main() { expect(crossword.words.isNotEmpty, true); expect(crossword.words.length, 2); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 1, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .length, + 1, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 7); expect( - crossword.characters[topLeft], - CrosswordCharacter.character( - acrossWord: thisWord, - downWord: thatWord, - character: 't', - )); + crossword.characters[topLeft], + CrosswordCharacter.character( + acrossWord: thisWord, + downWord: thatWord, + character: 't', + ), + ); expect(crossword.valid, isTrue); }); @@ -85,19 +84,17 @@ void main() { expect(crossword.words.isNotEmpty, true); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 2); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 2, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .isEmpty, - true); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .isEmpty, + true, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 8); expect(crossword.valid, isFalse); @@ -107,11 +104,12 @@ void main() { Crossword crossword = Crossword.crossword(width: 50, height: 50); expect(crossword.valid, true); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'this', - )!; + crossword = + crossword.addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'this', + )!; expect(crossword.valid, true); final crossword2 = crossword.addWord( @@ -173,17 +171,18 @@ void main() { final topLeft = Location.at(0, 0); - crossword = crossword - .addWord( - location: topLeft, - word: 'this', - direction: Direction.down, - )! - .addWord( - location: topLeft, - word: 'total', - direction: Direction.across, - )!; + crossword = + crossword + .addWord( + location: topLeft, + word: 'this', + direction: Direction.down, + )! + .addWord( + location: topLeft, + word: 'total', + direction: Direction.across, + )!; expect(crossword.valid, isTrue); @@ -234,77 +233,85 @@ void main() { }); test('Crossword is not valid with run-on across words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on across/down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down/across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); @@ -312,36 +319,40 @@ void main() { test('Adding duplicate across words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.across, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -349,36 +360,40 @@ void main() { test('Adding duplicate down words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.down, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate down words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); diff --git a/generate_crossword/step_06/android/.gitignore b/generate_crossword/step_06/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/generate_crossword/step_06/android/.gitignore +++ b/generate_crossword/step_06/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/generate_crossword/step_06/android/app/build.gradle b/generate_crossword/step_06/android/app/build.gradle deleted file mode 100644 index d4a93e6565..0000000000 --- a/generate_crossword/step_06/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.generate_crossword" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.generate_crossword" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/generate_crossword/step_06/android/app/build.gradle.kts b/generate_crossword/step_06/android/app/build.gradle.kts new file mode 100644 index 0000000000..9a7651c2a6 --- /dev/null +++ b/generate_crossword/step_06/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.generate_crossword" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.generate_crossword" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/generate_crossword/step_06/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt b/generate_crossword/step_06/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt index 7011ed9ff4..e1bbbdcb4c 100644 --- a/generate_crossword/step_06/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt +++ b/generate_crossword/step_06/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.generate_crossword import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/generate_crossword/step_06/android/build.gradle b/generate_crossword/step_06/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/generate_crossword/step_06/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/generate_crossword/step_06/android/build.gradle.kts b/generate_crossword/step_06/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/generate_crossword/step_06/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/generate_crossword/step_06/android/gradle.properties b/generate_crossword/step_06/android/gradle.properties index 2597170821..f018a61817 100644 --- a/generate_crossword/step_06/android/gradle.properties +++ b/generate_crossword/step_06/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/generate_crossword/step_06/android/gradle/wrapper/gradle-wrapper.properties b/generate_crossword/step_06/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/generate_crossword/step_06/android/gradle/wrapper/gradle-wrapper.properties +++ b/generate_crossword/step_06/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/generate_crossword/step_06/android/settings.gradle b/generate_crossword/step_06/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/generate_crossword/step_06/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/generate_crossword/step_06/android/settings.gradle.kts b/generate_crossword/step_06/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/generate_crossword/step_06/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/generate_crossword/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/generate_crossword/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_06/lib/isolates.dart b/generate_crossword/step_06/lib/isolates.dart index fb84e41ec3..c2d24e8248 100644 --- a/generate_crossword/step_06/lib/isolates.dart +++ b/generate_crossword/step_06/lib/isolates.dart @@ -33,9 +33,12 @@ Stream exploreCrosswordSolutions({ word: workQueue.candidateWords.randomElement(), ); } - var words = workQueue.candidateWords.toBuiltList().rebuild((b) => b - ..where((b) => b.characters.contains(target.character)) - ..shuffle()); + var words = workQueue.candidateWords.toBuiltList().rebuild( + (b) => + b + ..where((b) => b.characters.contains(target.character)) + ..shuffle(), + ); int tryCount = 0; for (final word in words) { tryCount++; @@ -69,6 +72,8 @@ Stream exploreCrosswordSolutions({ debugPrint('Error running isolate: $e'); } } - debugPrint('${crossword.width} x ${crossword.height} Crossword generated in ' - '${DateTime.now().difference(start).formatted}'); + debugPrint( + '${crossword.width} x ${crossword.height} Crossword generated in ' + '${DateTime.now().difference(start).formatted}', + ); } diff --git a/generate_crossword/step_06/lib/model.dart b/generate_crossword/step_06/lib/model.dart index 33e6988c8e..214189d518 100644 --- a/generate_crossword/step_06/lib/model.dart +++ b/generate_crossword/step_06/lib/model.dart @@ -89,7 +89,10 @@ abstract class CrosswordWord static int locationComparator(CrosswordWord a, CrosswordWord b) { final compareRows = a.location.y.compareTo(b.location.y); final compareColumns = a.location.x.compareTo(b.location.x); - return switch (compareColumns) { 0 => compareRows, _ => compareColumns }; + return switch (compareColumns) { + 0 => compareRows, + _ => compareColumns, + }; } /// Constructor for [CrosswordWord]. @@ -98,10 +101,13 @@ abstract class CrosswordWord required Location location, required Direction direction, }) { - return CrosswordWord((b) => b - ..word = word - ..direction = direction - ..location.replace(location)); + return CrosswordWord( + (b) => + b + ..word = word + ..direction = direction + ..location.replace(location), + ); } /// Constructor for [CrosswordWord]. @@ -148,9 +154,9 @@ abstract class CrosswordCharacter /// Constructor for [CrosswordCharacter]. /// Use [CrosswordCharacter.character] instead. - factory CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) = - _$CrosswordCharacter; + factory CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) = _$CrosswordCharacter; CrosswordCharacter._(); } @@ -281,14 +287,15 @@ abstract class Crossword implements Built { } final candidate = rebuild( - (b) => b - ..words.add( - CrosswordWord.word( - word: word, - direction: direction, - location: location, - ), - ), + (b) => + b + ..words.add( + CrosswordWord.word( + word: word, + direction: direction, + location: location, + ), + ), ); if (candidate.valid) { @@ -310,19 +317,21 @@ abstract class Crossword implements Built { b.characters.updateValue( word.location.rightOffset(idx), (b) => b.rebuild((bInner) => bInner.acrossWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - acrossWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + acrossWord: word, + character: character, + ), ); case Direction.down: b.characters.updateValue( word.location.downOffset(idx), (b) => b.rebuild((bInner) => bInner.downWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - downWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + downWord: word, + character: character, + ), ); } } @@ -336,7 +345,8 @@ abstract class Crossword implements Built { final grid = List.generate( height, (_) => List.generate( - width, (_) => '░', // https://www.compart.com/en/unicode/U+2591 + width, + (_) => '░', // https://www.compart.com/en/unicode/U+2591 ), ); @@ -416,40 +426,44 @@ abstract class WorkQueue implements Built { required Crossword crossword, required Iterable candidateWords, required Location startLocation, - }) => - WorkQueue((b) { - if (crossword.words.isEmpty) { - // Strip candidate words too long to fit in the crossword - b.candidateWords.addAll(candidateWords - .where((word) => word.characters.length <= crossword.width)); - - b.crossword.replace(crossword); - - b.locationsToTry.addAll({startLocation: Direction.across}); - } else { - // Assuming words have already been stripped to length - b.candidateWords.addAll( - candidateWords.toBuiltSet().rebuild( - (b) => b.removeAll(crossword.words.map((word) => word.word))), - ); - b.crossword.replace(crossword); - crossword.characters - .rebuild((b) => b.removeWhere((location, character) { - if (character.acrossWord != null && - character.downWord != null) { - return true; - } - final left = crossword.characters[location.left]; - if (left != null && left.downWord != null) return true; - final right = crossword.characters[location.right]; - if (right != null && right.downWord != null) return true; - final up = crossword.characters[location.up]; - if (up != null && up.acrossWord != null) return true; - final down = crossword.characters[location.down]; - if (down != null && down.acrossWord != null) return true; - return false; - })) - .forEach((location, character) { + }) => WorkQueue((b) { + if (crossword.words.isEmpty) { + // Strip candidate words too long to fit in the crossword + b.candidateWords.addAll( + candidateWords.where( + (word) => word.characters.length <= crossword.width, + ), + ); + + b.crossword.replace(crossword); + + b.locationsToTry.addAll({startLocation: Direction.across}); + } else { + // Assuming words have already been stripped to length + b.candidateWords.addAll( + candidateWords.toBuiltSet().rebuild( + (b) => b.removeAll(crossword.words.map((word) => word.word)), + ), + ); + b.crossword.replace(crossword); + crossword.characters + .rebuild( + (b) => b.removeWhere((location, character) { + if (character.acrossWord != null && character.downWord != null) { + return true; + } + final left = crossword.characters[location.left]; + if (left != null && left.downWord != null) return true; + final right = crossword.characters[location.right]; + if (right != null && right.downWord != null) return true; + final up = crossword.characters[location.up]; + if (up != null && up.acrossWord != null) return true; + final down = crossword.characters[location.down]; + if (down != null && down.acrossWord != null) return true; + return false; + }), + ) + .forEach((location, character) { b.locationsToTry.addAll({ location: switch ((character.acrossWord, character.downWord)) { (null, null) => @@ -457,28 +471,36 @@ abstract class WorkQueue implements Built { (null, _) => Direction.across, (_, null) => Direction.down, (_, _) => throw StateError('Character is part of two words'), - } + }, }); }); - } - }); + } + }); - WorkQueue remove(Location location) => rebuild((b) => b - ..locationsToTry.remove(location) - ..badLocations.add(location)); + WorkQueue remove(Location location) => rebuild( + (b) => + b + ..locationsToTry.remove(location) + ..badLocations.add(location), + ); /// Update the work queue from a crossword derived from the current crossword /// that this work queue is built from. WorkQueue updateFrom(final Crossword crossword) => WorkQueue.from( - crossword: crossword, - candidateWords: candidateWords, - startLocation: locationsToTry.isNotEmpty + crossword: crossword, + candidateWords: candidateWords, + startLocation: + locationsToTry.isNotEmpty ? locationsToTry.keys.first : Location.at(0, 0), - ).rebuild((b) => b - ..badLocations.addAll(badLocations) - ..locationsToTry - .removeWhere((location, _) => badLocations.contains(location))); + ).rebuild( + (b) => + b + ..badLocations.addAll(badLocations) + ..locationsToTry.removeWhere( + (location, _) => badLocations.contains(location), + ), + ); /// Factory constructor for [WorkQueue] factory WorkQueue([void Function(WorkQueueBuilder)? updates]) = _$WorkQueue; diff --git a/generate_crossword/step_06/lib/model.g.dart b/generate_crossword/step_06/lib/model.g.dart index a55339f61a..ac2ab54c78 100644 --- a/generate_crossword/step_06/lib/model.g.dart +++ b/generate_crossword/step_06/lib/model.g.dart @@ -6,32 +6,40 @@ part of 'model.dart'; // BuiltValueGenerator // ************************************************************************** -Serializers _$serializers = (new Serializers().toBuilder() - ..add(Crossword.serializer) - ..add(CrosswordCharacter.serializer) - ..add(CrosswordWord.serializer) - ..add(Location.serializer) - ..add(WorkQueue.serializer) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(CrosswordWord)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ]), - () => new MapBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, - const [const FullType(Location), const FullType(Direction)]), - () => new MapBuilder()) - ..addBuilderFactory( - const FullType(BuiltSet, const [const FullType(Location)]), - () => new SetBuilder()) - ..addBuilderFactory( - const FullType(BuiltSet, const [const FullType(String)]), - () => new SetBuilder())) - .build(); +Serializers _$serializers = + (new Serializers().toBuilder() + ..add(Crossword.serializer) + ..add(CrosswordCharacter.serializer) + ..add(CrosswordWord.serializer) + ..add(Location.serializer) + ..add(WorkQueue.serializer) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(CrosswordWord)]), + () => new ListBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + () => new MapBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(Direction), + ]), + () => new MapBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltSet, const [const FullType(Location)]), + () => new SetBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltSet, const [const FullType(String)]), + () => new SetBuilder(), + )) + .build(); Serializer _$locationSerializer = new _$LocationSerializer(); Serializer _$crosswordWordSerializer = new _$CrosswordWordSerializer(); @@ -47,8 +55,11 @@ class _$LocationSerializer implements StructuredSerializer { final String wireName = 'Location'; @override - Iterable serialize(Serializers serializers, Location object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Location object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'x', serializers.serialize(object.x, specifiedType: const FullType(int)), @@ -60,8 +71,11 @@ class _$LocationSerializer implements StructuredSerializer { } @override - Location deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Location deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new LocationBuilder(); final iterator = serialized.iterator; @@ -71,12 +85,20 @@ class _$LocationSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'x': - result.x = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.x = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'y': - result.y = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.y = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; } } @@ -92,17 +114,24 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final String wireName = 'CrosswordWord'; @override - Iterable serialize(Serializers serializers, CrosswordWord object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + CrosswordWord object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'word', serializers.serialize(object.word, specifiedType: const FullType(String)), 'location', - serializers.serialize(object.location, - specifiedType: const FullType(Location)), + serializers.serialize( + object.location, + specifiedType: const FullType(Location), + ), 'direction', - serializers.serialize(object.direction, - specifiedType: const FullType(Direction)), + serializers.serialize( + object.direction, + specifiedType: const FullType(Direction), + ), ]; return result; @@ -110,8 +139,10 @@ class _$CrosswordWordSerializer implements StructuredSerializer { @override CrosswordWord deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordWordBuilder(); final iterator = serialized.iterator; @@ -121,16 +152,29 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'word': - result.word = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.word = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'location': - result.location.replace(serializers.deserialize(value, - specifiedType: const FullType(Location))! as Location); + result.location.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Location), + )! + as Location, + ); break; case 'direction': - result.direction = serializers.deserialize(value, - specifiedType: const FullType(Direction))! as Direction; + result.direction = + serializers.deserialize( + value, + specifiedType: const FullType(Direction), + )! + as Direction; break; } } @@ -148,35 +192,49 @@ class _$CrosswordCharacterSerializer @override Iterable serialize( - Serializers serializers, CrosswordCharacter object, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + CrosswordCharacter object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'character', - serializers.serialize(object.character, - specifiedType: const FullType(String)), + serializers.serialize( + object.character, + specifiedType: const FullType(String), + ), ]; Object? value; value = object.acrossWord; if (value != null) { result ..add('acrossWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } value = object.downWord; if (value != null) { result ..add('downWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } return result; } @override CrosswordCharacter deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordCharacterBuilder(); final iterator = serialized.iterator; @@ -186,16 +244,30 @@ class _$CrosswordCharacterSerializer final Object? value = iterator.current; switch (key) { case 'character': - result.character = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.character = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'acrossWord': - result.acrossWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.acrossWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; case 'downWord': - result.downWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.downWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; } } @@ -211,31 +283,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final String wireName = 'Crossword'; @override - Iterable serialize(Serializers serializers, Crossword object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Crossword object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'width', serializers.serialize(object.width, specifiedType: const FullType(int)), 'height', serializers.serialize(object.height, specifiedType: const FullType(int)), 'words', - serializers.serialize(object.words, - specifiedType: - const FullType(BuiltList, const [const FullType(CrosswordWord)])), + serializers.serialize( + object.words, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + ), 'characters', - serializers.serialize(object.characters, - specifiedType: const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ])), + serializers.serialize( + object.characters, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + ), ]; return result; } @override - Crossword deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Crossword deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordBuilder(); final iterator = serialized.iterator; @@ -245,25 +328,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'width': - result.width = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.width = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'height': - result.height = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.height = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'words': - result.words.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(CrosswordWord)]))! - as BuiltList); + result.words.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + )! + as BuiltList, + ); break; case 'characters': - result.characters.replace(serializers.deserialize(value, + result.characters.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), - const FullType(CrosswordCharacter) - ]))!); + const FullType(CrosswordCharacter), + ]), + )!, + ); break; } } @@ -279,32 +379,48 @@ class _$WorkQueueSerializer implements StructuredSerializer { final String wireName = 'WorkQueue'; @override - Iterable serialize(Serializers serializers, WorkQueue object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + WorkQueue object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'crossword', - serializers.serialize(object.crossword, - specifiedType: const FullType(Crossword)), + serializers.serialize( + object.crossword, + specifiedType: const FullType(Crossword), + ), 'locationsToTry', - serializers.serialize(object.locationsToTry, - specifiedType: const FullType(BuiltMap, - const [const FullType(Location), const FullType(Direction)])), + serializers.serialize( + object.locationsToTry, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(Direction), + ]), + ), 'badLocations', - serializers.serialize(object.badLocations, - specifiedType: - const FullType(BuiltSet, const [const FullType(Location)])), + serializers.serialize( + object.badLocations, + specifiedType: const FullType(BuiltSet, const [ + const FullType(Location), + ]), + ), 'candidateWords', - serializers.serialize(object.candidateWords, - specifiedType: - const FullType(BuiltSet, const [const FullType(String)])), + serializers.serialize( + object.candidateWords, + specifiedType: const FullType(BuiltSet, const [const FullType(String)]), + ), ]; return result; } @override - WorkQueue deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + WorkQueue deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new WorkQueueBuilder(); final iterator = serialized.iterator; @@ -314,27 +430,46 @@ class _$WorkQueueSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'crossword': - result.crossword.replace(serializers.deserialize(value, - specifiedType: const FullType(Crossword))! as Crossword); + result.crossword.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Crossword), + )! + as Crossword, + ); break; case 'locationsToTry': - result.locationsToTry.replace(serializers.deserialize(value, + result.locationsToTry.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), - const FullType(Direction) - ]))!); + const FullType(Direction), + ]), + )!, + ); break; case 'badLocations': - result.badLocations.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltSet, const [const FullType(Location)]))! - as BuiltSet); + result.badLocations.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltSet, const [ + const FullType(Location), + ]), + )! + as BuiltSet, + ); break; case 'candidateWords': - result.candidateWords.replace(serializers.deserialize(value, - specifiedType: - const FullType(BuiltSet, const [const FullType(String)]))! - as BuiltSet); + result.candidateWords.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltSet, const [ + const FullType(String), + ]), + )! + as BuiltSet, + ); break; } } @@ -426,7 +561,8 @@ class LocationBuilder implements Builder { Location build() => _build(); _$Location _build() { - final _$result = _$v ?? + final _$result = + _$v ?? new _$Location._( x: BuiltValueNullFieldError.checkNotNull(x, r'Location', 'x'), y: BuiltValueNullFieldError.checkNotNull(y, r'Location', 'y'), @@ -447,14 +583,22 @@ class _$CrosswordWord extends CrosswordWord { factory _$CrosswordWord([void Function(CrosswordWordBuilder)? updates]) => (new CrosswordWordBuilder()..update(updates))._build(); - _$CrosswordWord._( - {required this.word, required this.location, required this.direction}) - : super._() { + _$CrosswordWord._({ + required this.word, + required this.location, + required this.direction, + }) : super._() { BuiltValueNullFieldError.checkNotNull(word, r'CrosswordWord', 'word'); BuiltValueNullFieldError.checkNotNull( - location, r'CrosswordWord', 'location'); + location, + r'CrosswordWord', + 'location', + ); BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'); + direction, + r'CrosswordWord', + 'direction', + ); } @override @@ -539,13 +683,20 @@ class CrosswordWordBuilder _$CrosswordWord _build() { _$CrosswordWord _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordWord._( word: BuiltValueNullFieldError.checkNotNull( - word, r'CrosswordWord', 'word'), + word, + r'CrosswordWord', + 'word', + ), location: location.build(), direction: BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'), + direction, + r'CrosswordWord', + 'direction', + ), ); } catch (_) { late String _$failedField; @@ -554,7 +705,10 @@ class CrosswordWordBuilder location.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordWord', _$failedField, e.toString()); + r'CrosswordWord', + _$failedField, + e.toString(), + ); } rethrow; } @@ -571,21 +725,26 @@ class _$CrosswordCharacter extends CrosswordCharacter { @override final CrosswordWord? downWord; - factory _$CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) => - (new CrosswordCharacterBuilder()..update(updates))._build(); + factory _$CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) => (new CrosswordCharacterBuilder()..update(updates))._build(); - _$CrosswordCharacter._( - {required this.character, this.acrossWord, this.downWord}) - : super._() { + _$CrosswordCharacter._({ + required this.character, + this.acrossWord, + this.downWord, + }) : super._() { BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'); + character, + r'CrosswordCharacter', + 'character', + ); } @override CrosswordCharacter rebuild( - void Function(CrosswordCharacterBuilder) updates) => - (toBuilder()..update(updates)).build(); + void Function(CrosswordCharacterBuilder) updates, + ) => (toBuilder()..update(updates)).build(); @override CrosswordCharacterBuilder toBuilder() => @@ -669,10 +828,14 @@ class CrosswordCharacterBuilder _$CrosswordCharacter _build() { _$CrosswordCharacter _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordCharacter._( character: BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'), + character, + r'CrosswordCharacter', + 'character', + ), acrossWord: _acrossWord?.build(), downWord: _downWord?.build(), ); @@ -685,7 +848,10 @@ class CrosswordCharacterBuilder _downWord?.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordCharacter', _$failedField, e.toString()); + r'CrosswordCharacter', + _$failedField, + e.toString(), + ); } rethrow; } @@ -707,17 +873,20 @@ class _$Crossword extends Crossword { factory _$Crossword([void Function(CrosswordBuilder)? updates]) => (new CrosswordBuilder()..update(updates))._build(); - _$Crossword._( - {required this.width, - required this.height, - required this.words, - required this.characters}) - : super._() { + _$Crossword._({ + required this.width, + required this.height, + required this.words, + required this.characters, + }) : super._() { BuiltValueNullFieldError.checkNotNull(width, r'Crossword', 'width'); BuiltValueNullFieldError.checkNotNull(height, r'Crossword', 'height'); BuiltValueNullFieldError.checkNotNull(words, r'Crossword', 'words'); BuiltValueNullFieldError.checkNotNull( - characters, r'Crossword', 'characters'); + characters, + r'Crossword', + 'characters', + ); } @override @@ -813,12 +982,19 @@ class CrosswordBuilder implements Builder { Crossword._fillCharacters(this); _$Crossword _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$Crossword._( width: BuiltValueNullFieldError.checkNotNull( - width, r'Crossword', 'width'), + width, + r'Crossword', + 'width', + ), height: BuiltValueNullFieldError.checkNotNull( - height, r'Crossword', 'height'), + height, + r'Crossword', + 'height', + ), words: words.build(), characters: characters.build(), ); @@ -831,7 +1007,10 @@ class CrosswordBuilder implements Builder { characters.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'Crossword', _$failedField, e.toString()); + r'Crossword', + _$failedField, + e.toString(), + ); } rethrow; } @@ -853,19 +1032,28 @@ class _$WorkQueue extends WorkQueue { factory _$WorkQueue([void Function(WorkQueueBuilder)? updates]) => (new WorkQueueBuilder()..update(updates))._build(); - _$WorkQueue._( - {required this.crossword, - required this.locationsToTry, - required this.badLocations, - required this.candidateWords}) - : super._() { + _$WorkQueue._({ + required this.crossword, + required this.locationsToTry, + required this.badLocations, + required this.candidateWords, + }) : super._() { BuiltValueNullFieldError.checkNotNull(crossword, r'WorkQueue', 'crossword'); BuiltValueNullFieldError.checkNotNull( - locationsToTry, r'WorkQueue', 'locationsToTry'); + locationsToTry, + r'WorkQueue', + 'locationsToTry', + ); BuiltValueNullFieldError.checkNotNull( - badLocations, r'WorkQueue', 'badLocations'); + badLocations, + r'WorkQueue', + 'badLocations', + ); BuiltValueNullFieldError.checkNotNull( - candidateWords, r'WorkQueue', 'candidateWords'); + candidateWords, + r'WorkQueue', + 'candidateWords', + ); } @override @@ -964,7 +1152,8 @@ class WorkQueueBuilder implements Builder { _$WorkQueue _build() { _$WorkQueue _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$WorkQueue._( crossword: crossword.build(), locationsToTry: locationsToTry.build(), @@ -984,7 +1173,10 @@ class WorkQueueBuilder implements Builder { candidateWords.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'WorkQueue', _$failedField, e.toString()); + r'WorkQueue', + _$failedField, + e.toString(), + ); } rethrow; } diff --git a/generate_crossword/step_06/lib/providers.dart b/generate_crossword/step_06/lib/providers.dart index 102f7a18ca..63a780ffb9 100644 --- a/generate_crossword/step_06/lib/providers.dart +++ b/generate_crossword/step_06/lib/providers.dart @@ -25,10 +25,16 @@ Future> wordList(Ref ref) async { final re = RegExp(r'^[a-z]+$'); final words = await rootBundle.loadString('assets/words.txt'); - return const LineSplitter().convert(words).toBuiltSet().rebuild((b) => b - ..map((word) => word.toLowerCase().trim()) - ..where((word) => word.length > 2) - ..where((word) => re.hasMatch(word))); + return const LineSplitter() + .convert(words) + .toBuiltSet() + .rebuild( + (b) => + b + ..map((word) => word.toLowerCase().trim()) + ..where((word) => word.length > 2) + ..where((word) => re.hasMatch(word)), + ); } /// An enumeration for different sizes of [model.Crossword]s. @@ -39,10 +45,7 @@ enum CrosswordSize { xlarge(width: 160, height: 88), xxlarge(width: 500, height: 500); - const CrosswordSize({ - required this.width, - required this.height, - }); + const CrosswordSize({required this.width, required this.height}); final int width; final int height; @@ -68,14 +71,17 @@ Stream crossword(Ref ref) async* { final size = ref.watch(sizeProvider); final wordListAsync = ref.watch(wordListProvider); - final emptyCrossword = - model.Crossword.crossword(width: size.width, height: size.height); + final emptyCrossword = model.Crossword.crossword( + width: size.width, + height: size.height, + ); yield* wordListAsync.when( - data: (wordList) => exploreCrosswordSolutions( - crossword: emptyCrossword, - wordList: wordList, - ), + data: + (wordList) => exploreCrosswordSolutions( + crossword: emptyCrossword, + wordList: wordList, + ), error: (error, stackTrace) async* { debugPrint('Error loading word list: $error'); yield emptyCrossword; diff --git a/generate_crossword/step_06/lib/widgets/crossword_generator_app.dart b/generate_crossword/step_06/lib/widgets/crossword_generator_app.dart index 0c4a659789..6775f9fd89 100644 --- a/generate_crossword/step_06/lib/widgets/crossword_generator_app.dart +++ b/generate_crossword/step_06/lib/widgets/crossword_generator_app.dart @@ -24,9 +24,7 @@ class CrosswordGeneratorApp extends StatelessWidget { ), title: Text('Crossword Generator'), ), - body: SafeArea( - child: CrosswordWidget(), - ), + body: SafeArea(child: CrosswordWidget()), ), ); } @@ -46,19 +44,21 @@ class _EagerInitialization extends ConsumerWidget { class _CrosswordGeneratorMenu extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) => MenuAnchor( - menuChildren: [ - for (final entry in CrosswordSize.values) - MenuItemButton( - onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), - leadingIcon: entry == ref.watch(sizeProvider) + menuChildren: [ + for (final entry in CrosswordSize.values) + MenuItemButton( + onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), + leadingIcon: + entry == ref.watch(sizeProvider) ? Icon(Icons.radio_button_checked_outlined) : Icon(Icons.radio_button_unchecked_outlined), - child: Text(entry.label), - ), - ], - builder: (context, controller, child) => IconButton( + child: Text(entry.label), + ), + ], + builder: + (context, controller, child) => IconButton( onPressed: () => controller.open(), icon: Icon(Icons.settings), ), - ); + ); } diff --git a/generate_crossword/step_06/lib/widgets/crossword_widget.dart b/generate_crossword/step_06/lib/widgets/crossword_widget.dart index 17941440ee..1795fe68da 100644 --- a/generate_crossword/step_06/lib/widgets/crossword_widget.dart +++ b/generate_crossword/step_06/lib/widgets/crossword_widget.dart @@ -70,9 +70,11 @@ class CrosswordWidget extends ConsumerWidget { foregroundDecoration: TableSpanDecoration( border: TableSpanBorder( leading: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), trailing: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ), ); diff --git a/generate_crossword/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 070fd74eff..5845d19a0a 100644 --- a/generate_crossword/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_06/pubspec.yaml b/generate_crossword/step_06/pubspec.yaml index 701f231c6a..a4e12dc3f1 100644 --- a/generate_crossword/step_06/pubspec.yaml +++ b/generate_crossword/step_06/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter built_collection: ^5.1.1 built_value: ^8.9.3 - characters: ^1.3.0 + characters: ^1.4.0 flutter_riverpod: ^2.6.1 intl: ^0.20.2 riverpod: ^2.6.1 diff --git a/generate_crossword/step_06/test/model_test.dart b/generate_crossword/step_06/test/model_test.dart index f11e1addb1..342c515ec1 100644 --- a/generate_crossword/step_06/test/model_test.dart +++ b/generate_crossword/step_06/test/model_test.dart @@ -39,28 +39,27 @@ void main() { expect(crossword.words.isNotEmpty, true); expect(crossword.words.length, 2); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 1, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .length, + 1, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 7); expect( - crossword.characters[topLeft], - CrosswordCharacter.character( - acrossWord: thisWord, - downWord: thatWord, - character: 't', - )); + crossword.characters[topLeft], + CrosswordCharacter.character( + acrossWord: thisWord, + downWord: thatWord, + character: 't', + ), + ); expect(crossword.valid, isTrue); }); @@ -86,19 +85,17 @@ void main() { expect(crossword.words.isNotEmpty, true); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 2); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 2, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .isEmpty, - true); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .isEmpty, + true, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 8); expect(crossword.valid, isFalse); @@ -108,11 +105,12 @@ void main() { Crossword crossword = Crossword.crossword(width: 50, height: 50); expect(crossword.valid, true); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'this', - )!; + crossword = + crossword.addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'this', + )!; expect(crossword.valid, true); final crossword2 = crossword.addWord( @@ -174,17 +172,18 @@ void main() { final topLeft = Location.at(0, 0); - crossword = crossword - .addWord( - location: topLeft, - word: 'this', - direction: Direction.down, - )! - .addWord( - location: topLeft, - word: 'total', - direction: Direction.across, - )!; + crossword = + crossword + .addWord( + location: topLeft, + word: 'this', + direction: Direction.down, + )! + .addWord( + location: topLeft, + word: 'total', + direction: Direction.across, + )!; expect(crossword.valid, isTrue); @@ -235,77 +234,85 @@ void main() { }); test('Crossword is not valid with run-on across words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on across/down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down/across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); @@ -313,36 +320,40 @@ void main() { test('Adding duplicate across words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.across, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -350,36 +361,40 @@ void main() { test('Adding duplicate down words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.down, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate down words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -393,10 +408,12 @@ void main() { ); expect(queue.locationsToTry.length, 1); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word')!; + crossword = + crossword.addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + )!; queue = WorkQueue.from( crossword: crossword, candidateWords: ['words', 'and', 'moar', 'wordz'], @@ -404,21 +421,26 @@ void main() { ); expect(queue.locationsToTry.length, 4); expect( - queue.locationsToTry.entries - .every((element) => element.value == Direction.down), - isTrue); + queue.locationsToTry.entries.every( + (element) => element.value == Direction.down, + ), + isTrue, + ); final entries = queue.locationsToTry.entries; expect(entries.every((element) => element.key.y == 0), isTrue); - expect(entries.map((element) => element.key.x).toBuiltSet(), - equals(BuiltSet([0, 1, 2, 3]))); + expect( + entries.map((element) => element.key.x).toBuiltSet(), + equals(BuiltSet([0, 1, 2, 3])), + ); }); test('WorkQueue from down word', () { - Crossword crossword = Crossword.crossword(width: 50, height: 50).addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - )!; + Crossword crossword = + Crossword.crossword(width: 50, height: 50).addWord( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + )!; WorkQueue queue = WorkQueue.from( crossword: crossword, @@ -427,27 +449,32 @@ void main() { ); expect(queue.locationsToTry.length, 4); expect( - queue.locationsToTry.entries - .every((element) => element.value == Direction.across), - isTrue); + queue.locationsToTry.entries.every( + (element) => element.value == Direction.across, + ), + isTrue, + ); final entries = queue.locationsToTry.entries; expect(entries.every((element) => element.key.x == 0), isTrue); - expect(entries.map((element) => element.key.y).toBuiltSet(), - equals(BuiltSet([0, 1, 2, 3]))); + expect( + entries.map((element) => element.key.y).toBuiltSet(), + equals(BuiltSet([0, 1, 2, 3])), + ); }); test('WorkQueue from two words', () { - Crossword crossword = Crossword.crossword(width: 50, height: 50) - .addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - )! - .addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'work', - )!; + Crossword crossword = + Crossword.crossword(width: 50, height: 50) + .addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + )! + .addWord( + direction: Direction.down, + location: Location.at(0, 0), + word: 'work', + )!; WorkQueue queue = WorkQueue.from( crossword: crossword, @@ -455,27 +482,31 @@ void main() { startLocation: Location.at(0, 0), ); expect( - queue.locationsToTry, - equals(BuiltMap({ + queue.locationsToTry, + equals( + BuiltMap({ Location.at(2, 0): Direction.down, Location.at(0, 2): Direction.across, Location.at(3, 0): Direction.down, Location.at(0, 3): Direction.across, - }))); + }), + ), + ); }); test('WorkQueue removes used words from candidate list', () { - Crossword crossword = Crossword.crossword(width: 50, height: 50) - .addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - )! - .addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'work', - )!; + Crossword crossword = + Crossword.crossword(width: 50, height: 50) + .addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + )! + .addWord( + direction: Direction.down, + location: Location.at(0, 0), + word: 'work', + )!; WorkQueue queue = WorkQueue.from( crossword: crossword, diff --git a/generate_crossword/step_07/android/.gitignore b/generate_crossword/step_07/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/generate_crossword/step_07/android/.gitignore +++ b/generate_crossword/step_07/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/generate_crossword/step_07/android/app/build.gradle b/generate_crossword/step_07/android/app/build.gradle deleted file mode 100644 index d4a93e6565..0000000000 --- a/generate_crossword/step_07/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.generate_crossword" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.generate_crossword" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/generate_crossword/step_07/android/app/build.gradle.kts b/generate_crossword/step_07/android/app/build.gradle.kts new file mode 100644 index 0000000000..9a7651c2a6 --- /dev/null +++ b/generate_crossword/step_07/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.generate_crossword" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.generate_crossword" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/generate_crossword/step_07/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt b/generate_crossword/step_07/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt index 7011ed9ff4..e1bbbdcb4c 100644 --- a/generate_crossword/step_07/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt +++ b/generate_crossword/step_07/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.generate_crossword import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/generate_crossword/step_07/android/build.gradle b/generate_crossword/step_07/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/generate_crossword/step_07/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/generate_crossword/step_07/android/build.gradle.kts b/generate_crossword/step_07/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/generate_crossword/step_07/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/generate_crossword/step_07/android/gradle.properties b/generate_crossword/step_07/android/gradle.properties index 2597170821..f018a61817 100644 --- a/generate_crossword/step_07/android/gradle.properties +++ b/generate_crossword/step_07/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/generate_crossword/step_07/android/gradle/wrapper/gradle-wrapper.properties b/generate_crossword/step_07/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/generate_crossword/step_07/android/gradle/wrapper/gradle-wrapper.properties +++ b/generate_crossword/step_07/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/generate_crossword/step_07/android/settings.gradle b/generate_crossword/step_07/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/generate_crossword/step_07/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/generate_crossword/step_07/android/settings.gradle.kts b/generate_crossword/step_07/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/generate_crossword/step_07/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/generate_crossword/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/generate_crossword/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_07/lib/isolates.dart b/generate_crossword/step_07/lib/isolates.dart index 93c2b5e3fd..bc5cad39a1 100644 --- a/generate_crossword/step_07/lib/isolates.dart +++ b/generate_crossword/step_07/lib/isolates.dart @@ -33,9 +33,12 @@ Stream exploreCrosswordSolutions({ word: workQueue.candidateWords.randomElement(), ); } - var words = workQueue.candidateWords.toBuiltList().rebuild((b) => b - ..where((b) => b.characters.contains(target.character)) - ..shuffle()); + var words = workQueue.candidateWords.toBuiltList().rebuild( + (b) => + b + ..where((b) => b.characters.contains(target.character)) + ..shuffle(), + ); int tryCount = 0; for (final word in words) { tryCount++; @@ -69,6 +72,8 @@ Stream exploreCrosswordSolutions({ debugPrint('Error running isolate: $e'); } } - debugPrint('${crossword.width} x ${crossword.height} Crossword generated in ' - '${DateTime.now().difference(start).formatted}'); + debugPrint( + '${crossword.width} x ${crossword.height} Crossword generated in ' + '${DateTime.now().difference(start).formatted}', + ); } diff --git a/generate_crossword/step_07/lib/model.dart b/generate_crossword/step_07/lib/model.dart index dbd0a3e309..78800297ac 100644 --- a/generate_crossword/step_07/lib/model.dart +++ b/generate_crossword/step_07/lib/model.dart @@ -90,7 +90,10 @@ abstract class CrosswordWord static int locationComparator(CrosswordWord a, CrosswordWord b) { final compareRows = a.location.y.compareTo(b.location.y); final compareColumns = a.location.x.compareTo(b.location.x); - return switch (compareColumns) { 0 => compareRows, _ => compareColumns }; + return switch (compareColumns) { + 0 => compareRows, + _ => compareColumns, + }; } /// Constructor for [CrosswordWord]. @@ -99,10 +102,13 @@ abstract class CrosswordWord required Location location, required Direction direction, }) { - return CrosswordWord((b) => b - ..word = word - ..direction = direction - ..location.replace(location)); + return CrosswordWord( + (b) => + b + ..word = word + ..direction = direction + ..location.replace(location), + ); } /// Constructor for [CrosswordWord]. @@ -149,9 +155,9 @@ abstract class CrosswordCharacter /// Constructor for [CrosswordCharacter]. /// Use [CrosswordCharacter.character] instead. - factory CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) = - _$CrosswordCharacter; + factory CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) = _$CrosswordCharacter; CrosswordCharacter._(); } @@ -282,14 +288,15 @@ abstract class Crossword implements Built { } final candidate = rebuild( - (b) => b - ..words.add( - CrosswordWord.word( - word: word, - direction: direction, - location: location, - ), - ), + (b) => + b + ..words.add( + CrosswordWord.word( + word: word, + direction: direction, + location: location, + ), + ), ); if (candidate.valid) { @@ -311,19 +318,21 @@ abstract class Crossword implements Built { b.characters.updateValue( word.location.rightOffset(idx), (b) => b.rebuild((bInner) => bInner.acrossWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - acrossWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + acrossWord: word, + character: character, + ), ); case Direction.down: b.characters.updateValue( word.location.downOffset(idx), (b) => b.rebuild((bInner) => bInner.downWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - downWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + downWord: word, + character: character, + ), ); } } @@ -337,7 +346,8 @@ abstract class Crossword implements Built { final grid = List.generate( height, (_) => List.generate( - width, (_) => '░', // https://www.compart.com/en/unicode/U+2591 + width, + (_) => '░', // https://www.compart.com/en/unicode/U+2591 ), ); @@ -417,40 +427,44 @@ abstract class WorkQueue implements Built { required Crossword crossword, required Iterable candidateWords, required Location startLocation, - }) => - WorkQueue((b) { - if (crossword.words.isEmpty) { - // Strip candidate words too long to fit in the crossword - b.candidateWords.addAll(candidateWords - .where((word) => word.characters.length <= crossword.width)); - - b.crossword.replace(crossword); - - b.locationsToTry.addAll({startLocation: Direction.across}); - } else { - // Assuming words have already been stripped to length - b.candidateWords.addAll( - candidateWords.toBuiltSet().rebuild( - (b) => b.removeAll(crossword.words.map((word) => word.word))), - ); - b.crossword.replace(crossword); - crossword.characters - .rebuild((b) => b.removeWhere((location, character) { - if (character.acrossWord != null && - character.downWord != null) { - return true; - } - final left = crossword.characters[location.left]; - if (left != null && left.downWord != null) return true; - final right = crossword.characters[location.right]; - if (right != null && right.downWord != null) return true; - final up = crossword.characters[location.up]; - if (up != null && up.acrossWord != null) return true; - final down = crossword.characters[location.down]; - if (down != null && down.acrossWord != null) return true; - return false; - })) - .forEach((location, character) { + }) => WorkQueue((b) { + if (crossword.words.isEmpty) { + // Strip candidate words too long to fit in the crossword + b.candidateWords.addAll( + candidateWords.where( + (word) => word.characters.length <= crossword.width, + ), + ); + + b.crossword.replace(crossword); + + b.locationsToTry.addAll({startLocation: Direction.across}); + } else { + // Assuming words have already been stripped to length + b.candidateWords.addAll( + candidateWords.toBuiltSet().rebuild( + (b) => b.removeAll(crossword.words.map((word) => word.word)), + ), + ); + b.crossword.replace(crossword); + crossword.characters + .rebuild( + (b) => b.removeWhere((location, character) { + if (character.acrossWord != null && character.downWord != null) { + return true; + } + final left = crossword.characters[location.left]; + if (left != null && left.downWord != null) return true; + final right = crossword.characters[location.right]; + if (right != null && right.downWord != null) return true; + final up = crossword.characters[location.up]; + if (up != null && up.acrossWord != null) return true; + final down = crossword.characters[location.down]; + if (down != null && down.acrossWord != null) return true; + return false; + }), + ) + .forEach((location, character) { b.locationsToTry.addAll({ location: switch ((character.acrossWord, character.downWord)) { (null, null) => @@ -458,28 +472,36 @@ abstract class WorkQueue implements Built { (null, _) => Direction.across, (_, null) => Direction.down, (_, _) => throw StateError('Character is part of two words'), - } + }, }); }); - } - }); + } + }); - WorkQueue remove(Location location) => rebuild((b) => b - ..locationsToTry.remove(location) - ..badLocations.add(location)); + WorkQueue remove(Location location) => rebuild( + (b) => + b + ..locationsToTry.remove(location) + ..badLocations.add(location), + ); /// Update the work queue from a crossword derived from the current crossword /// that this work queue is built from. WorkQueue updateFrom(final Crossword crossword) => WorkQueue.from( - crossword: crossword, - candidateWords: candidateWords, - startLocation: locationsToTry.isNotEmpty + crossword: crossword, + candidateWords: candidateWords, + startLocation: + locationsToTry.isNotEmpty ? locationsToTry.keys.first : Location.at(0, 0), - ).rebuild((b) => b - ..badLocations.addAll(badLocations) - ..locationsToTry - .removeWhere((location, _) => badLocations.contains(location))); + ).rebuild( + (b) => + b + ..badLocations.addAll(badLocations) + ..locationsToTry.removeWhere( + (location, _) => badLocations.contains(location), + ), + ); /// Factory constructor for [WorkQueue] factory WorkQueue([void Function(WorkQueueBuilder)? updates]) = _$WorkQueue; @@ -508,25 +530,35 @@ abstract class DisplayInfo implements Built { /// Construct a [DisplayInfo] instance from a [WorkQueue]. factory DisplayInfo.from({required WorkQueue workQueue}) { - final gridFilled = (workQueue.crossword.characters.length / - (workQueue.crossword.width * workQueue.crossword.height)); + final gridFilled = + (workQueue.crossword.characters.length / + (workQueue.crossword.width * workQueue.crossword.height)); final fmt = NumberFormat.decimalPattern(); - return DisplayInfo((b) => b - ..wordsInGridCount = fmt.format(workQueue.crossword.words.length) - ..candidateWordsCount = fmt.format(workQueue.candidateWords.length) - ..locationsToExploreCount = fmt.format(workQueue.locationsToTry.length) - ..knownBadLocationsCount = fmt.format(workQueue.badLocations.length) - ..gridFilledPercentage = '${(gridFilled * 100).toStringAsFixed(2)}%'); + return DisplayInfo( + (b) => + b + ..wordsInGridCount = fmt.format(workQueue.crossword.words.length) + ..candidateWordsCount = fmt.format(workQueue.candidateWords.length) + ..locationsToExploreCount = fmt.format( + workQueue.locationsToTry.length, + ) + ..knownBadLocationsCount = fmt.format(workQueue.badLocations.length) + ..gridFilledPercentage = + '${(gridFilled * 100).toStringAsFixed(2)}%', + ); } /// An empty [DisplayInfo] instance. - static DisplayInfo get empty => DisplayInfo((b) => b - ..wordsInGridCount = '0' - ..candidateWordsCount = '0' - ..locationsToExploreCount = '0' - ..knownBadLocationsCount = '0' - ..gridFilledPercentage = '0%'); + static DisplayInfo get empty => DisplayInfo( + (b) => + b + ..wordsInGridCount = '0' + ..candidateWordsCount = '0' + ..locationsToExploreCount = '0' + ..knownBadLocationsCount = '0' + ..gridFilledPercentage = '0%', + ); factory DisplayInfo([void Function(DisplayInfoBuilder)? updates]) = _$DisplayInfo; diff --git a/generate_crossword/step_07/lib/model.g.dart b/generate_crossword/step_07/lib/model.g.dart index 887ee81df7..f10a37ad34 100644 --- a/generate_crossword/step_07/lib/model.g.dart +++ b/generate_crossword/step_07/lib/model.g.dart @@ -6,33 +6,41 @@ part of 'model.dart'; // BuiltValueGenerator // ************************************************************************** -Serializers _$serializers = (new Serializers().toBuilder() - ..add(Crossword.serializer) - ..add(CrosswordCharacter.serializer) - ..add(CrosswordWord.serializer) - ..add(DisplayInfo.serializer) - ..add(Location.serializer) - ..add(WorkQueue.serializer) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(CrosswordWord)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ]), - () => new MapBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, - const [const FullType(Location), const FullType(Direction)]), - () => new MapBuilder()) - ..addBuilderFactory( - const FullType(BuiltSet, const [const FullType(Location)]), - () => new SetBuilder()) - ..addBuilderFactory( - const FullType(BuiltSet, const [const FullType(String)]), - () => new SetBuilder())) - .build(); +Serializers _$serializers = + (new Serializers().toBuilder() + ..add(Crossword.serializer) + ..add(CrosswordCharacter.serializer) + ..add(CrosswordWord.serializer) + ..add(DisplayInfo.serializer) + ..add(Location.serializer) + ..add(WorkQueue.serializer) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(CrosswordWord)]), + () => new ListBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + () => new MapBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(Direction), + ]), + () => new MapBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltSet, const [const FullType(Location)]), + () => new SetBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltSet, const [const FullType(String)]), + () => new SetBuilder(), + )) + .build(); Serializer _$locationSerializer = new _$LocationSerializer(); Serializer _$crosswordWordSerializer = new _$CrosswordWordSerializer(); @@ -49,8 +57,11 @@ class _$LocationSerializer implements StructuredSerializer { final String wireName = 'Location'; @override - Iterable serialize(Serializers serializers, Location object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Location object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'x', serializers.serialize(object.x, specifiedType: const FullType(int)), @@ -62,8 +73,11 @@ class _$LocationSerializer implements StructuredSerializer { } @override - Location deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Location deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new LocationBuilder(); final iterator = serialized.iterator; @@ -73,12 +87,20 @@ class _$LocationSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'x': - result.x = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.x = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'y': - result.y = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.y = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; } } @@ -94,17 +116,24 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final String wireName = 'CrosswordWord'; @override - Iterable serialize(Serializers serializers, CrosswordWord object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + CrosswordWord object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'word', serializers.serialize(object.word, specifiedType: const FullType(String)), 'location', - serializers.serialize(object.location, - specifiedType: const FullType(Location)), + serializers.serialize( + object.location, + specifiedType: const FullType(Location), + ), 'direction', - serializers.serialize(object.direction, - specifiedType: const FullType(Direction)), + serializers.serialize( + object.direction, + specifiedType: const FullType(Direction), + ), ]; return result; @@ -112,8 +141,10 @@ class _$CrosswordWordSerializer implements StructuredSerializer { @override CrosswordWord deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordWordBuilder(); final iterator = serialized.iterator; @@ -123,16 +154,29 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'word': - result.word = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.word = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'location': - result.location.replace(serializers.deserialize(value, - specifiedType: const FullType(Location))! as Location); + result.location.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Location), + )! + as Location, + ); break; case 'direction': - result.direction = serializers.deserialize(value, - specifiedType: const FullType(Direction))! as Direction; + result.direction = + serializers.deserialize( + value, + specifiedType: const FullType(Direction), + )! + as Direction; break; } } @@ -150,35 +194,49 @@ class _$CrosswordCharacterSerializer @override Iterable serialize( - Serializers serializers, CrosswordCharacter object, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + CrosswordCharacter object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'character', - serializers.serialize(object.character, - specifiedType: const FullType(String)), + serializers.serialize( + object.character, + specifiedType: const FullType(String), + ), ]; Object? value; value = object.acrossWord; if (value != null) { result ..add('acrossWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } value = object.downWord; if (value != null) { result ..add('downWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } return result; } @override CrosswordCharacter deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordCharacterBuilder(); final iterator = serialized.iterator; @@ -188,16 +246,30 @@ class _$CrosswordCharacterSerializer final Object? value = iterator.current; switch (key) { case 'character': - result.character = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.character = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'acrossWord': - result.acrossWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.acrossWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; case 'downWord': - result.downWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.downWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; } } @@ -213,31 +285,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final String wireName = 'Crossword'; @override - Iterable serialize(Serializers serializers, Crossword object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Crossword object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'width', serializers.serialize(object.width, specifiedType: const FullType(int)), 'height', serializers.serialize(object.height, specifiedType: const FullType(int)), 'words', - serializers.serialize(object.words, - specifiedType: - const FullType(BuiltList, const [const FullType(CrosswordWord)])), + serializers.serialize( + object.words, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + ), 'characters', - serializers.serialize(object.characters, - specifiedType: const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ])), + serializers.serialize( + object.characters, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + ), ]; return result; } @override - Crossword deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Crossword deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordBuilder(); final iterator = serialized.iterator; @@ -247,25 +330,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'width': - result.width = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.width = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'height': - result.height = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.height = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'words': - result.words.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(CrosswordWord)]))! - as BuiltList); + result.words.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + )! + as BuiltList, + ); break; case 'characters': - result.characters.replace(serializers.deserialize(value, + result.characters.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), - const FullType(CrosswordCharacter) - ]))!); + const FullType(CrosswordCharacter), + ]), + )!, + ); break; } } @@ -281,32 +381,48 @@ class _$WorkQueueSerializer implements StructuredSerializer { final String wireName = 'WorkQueue'; @override - Iterable serialize(Serializers serializers, WorkQueue object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + WorkQueue object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'crossword', - serializers.serialize(object.crossword, - specifiedType: const FullType(Crossword)), + serializers.serialize( + object.crossword, + specifiedType: const FullType(Crossword), + ), 'locationsToTry', - serializers.serialize(object.locationsToTry, - specifiedType: const FullType(BuiltMap, - const [const FullType(Location), const FullType(Direction)])), + serializers.serialize( + object.locationsToTry, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(Direction), + ]), + ), 'badLocations', - serializers.serialize(object.badLocations, - specifiedType: - const FullType(BuiltSet, const [const FullType(Location)])), + serializers.serialize( + object.badLocations, + specifiedType: const FullType(BuiltSet, const [ + const FullType(Location), + ]), + ), 'candidateWords', - serializers.serialize(object.candidateWords, - specifiedType: - const FullType(BuiltSet, const [const FullType(String)])), + serializers.serialize( + object.candidateWords, + specifiedType: const FullType(BuiltSet, const [const FullType(String)]), + ), ]; return result; } @override - WorkQueue deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + WorkQueue deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new WorkQueueBuilder(); final iterator = serialized.iterator; @@ -316,27 +432,46 @@ class _$WorkQueueSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'crossword': - result.crossword.replace(serializers.deserialize(value, - specifiedType: const FullType(Crossword))! as Crossword); + result.crossword.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Crossword), + )! + as Crossword, + ); break; case 'locationsToTry': - result.locationsToTry.replace(serializers.deserialize(value, + result.locationsToTry.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), - const FullType(Direction) - ]))!); + const FullType(Direction), + ]), + )!, + ); break; case 'badLocations': - result.badLocations.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltSet, const [const FullType(Location)]))! - as BuiltSet); + result.badLocations.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltSet, const [ + const FullType(Location), + ]), + )! + as BuiltSet, + ); break; case 'candidateWords': - result.candidateWords.replace(serializers.deserialize(value, - specifiedType: - const FullType(BuiltSet, const [const FullType(String)]))! - as BuiltSet); + result.candidateWords.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltSet, const [ + const FullType(String), + ]), + )! + as BuiltSet, + ); break; } } @@ -352,32 +487,48 @@ class _$DisplayInfoSerializer implements StructuredSerializer { final String wireName = 'DisplayInfo'; @override - Iterable serialize(Serializers serializers, DisplayInfo object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + DisplayInfo object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'wordsInGridCount', - serializers.serialize(object.wordsInGridCount, - specifiedType: const FullType(String)), + serializers.serialize( + object.wordsInGridCount, + specifiedType: const FullType(String), + ), 'candidateWordsCount', - serializers.serialize(object.candidateWordsCount, - specifiedType: const FullType(String)), + serializers.serialize( + object.candidateWordsCount, + specifiedType: const FullType(String), + ), 'locationsToExploreCount', - serializers.serialize(object.locationsToExploreCount, - specifiedType: const FullType(String)), + serializers.serialize( + object.locationsToExploreCount, + specifiedType: const FullType(String), + ), 'knownBadLocationsCount', - serializers.serialize(object.knownBadLocationsCount, - specifiedType: const FullType(String)), + serializers.serialize( + object.knownBadLocationsCount, + specifiedType: const FullType(String), + ), 'gridFilledPercentage', - serializers.serialize(object.gridFilledPercentage, - specifiedType: const FullType(String)), + serializers.serialize( + object.gridFilledPercentage, + specifiedType: const FullType(String), + ), ]; return result; } @override - DisplayInfo deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + DisplayInfo deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new DisplayInfoBuilder(); final iterator = serialized.iterator; @@ -387,24 +538,44 @@ class _$DisplayInfoSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'wordsInGridCount': - result.wordsInGridCount = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.wordsInGridCount = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'candidateWordsCount': - result.candidateWordsCount = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.candidateWordsCount = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'locationsToExploreCount': - result.locationsToExploreCount = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.locationsToExploreCount = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'knownBadLocationsCount': - result.knownBadLocationsCount = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.knownBadLocationsCount = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'gridFilledPercentage': - result.gridFilledPercentage = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.gridFilledPercentage = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; } } @@ -496,7 +667,8 @@ class LocationBuilder implements Builder { Location build() => _build(); _$Location _build() { - final _$result = _$v ?? + final _$result = + _$v ?? new _$Location._( x: BuiltValueNullFieldError.checkNotNull(x, r'Location', 'x'), y: BuiltValueNullFieldError.checkNotNull(y, r'Location', 'y'), @@ -517,14 +689,22 @@ class _$CrosswordWord extends CrosswordWord { factory _$CrosswordWord([void Function(CrosswordWordBuilder)? updates]) => (new CrosswordWordBuilder()..update(updates))._build(); - _$CrosswordWord._( - {required this.word, required this.location, required this.direction}) - : super._() { + _$CrosswordWord._({ + required this.word, + required this.location, + required this.direction, + }) : super._() { BuiltValueNullFieldError.checkNotNull(word, r'CrosswordWord', 'word'); BuiltValueNullFieldError.checkNotNull( - location, r'CrosswordWord', 'location'); + location, + r'CrosswordWord', + 'location', + ); BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'); + direction, + r'CrosswordWord', + 'direction', + ); } @override @@ -609,13 +789,20 @@ class CrosswordWordBuilder _$CrosswordWord _build() { _$CrosswordWord _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordWord._( word: BuiltValueNullFieldError.checkNotNull( - word, r'CrosswordWord', 'word'), + word, + r'CrosswordWord', + 'word', + ), location: location.build(), direction: BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'), + direction, + r'CrosswordWord', + 'direction', + ), ); } catch (_) { late String _$failedField; @@ -624,7 +811,10 @@ class CrosswordWordBuilder location.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordWord', _$failedField, e.toString()); + r'CrosswordWord', + _$failedField, + e.toString(), + ); } rethrow; } @@ -641,21 +831,26 @@ class _$CrosswordCharacter extends CrosswordCharacter { @override final CrosswordWord? downWord; - factory _$CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) => - (new CrosswordCharacterBuilder()..update(updates))._build(); + factory _$CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) => (new CrosswordCharacterBuilder()..update(updates))._build(); - _$CrosswordCharacter._( - {required this.character, this.acrossWord, this.downWord}) - : super._() { + _$CrosswordCharacter._({ + required this.character, + this.acrossWord, + this.downWord, + }) : super._() { BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'); + character, + r'CrosswordCharacter', + 'character', + ); } @override CrosswordCharacter rebuild( - void Function(CrosswordCharacterBuilder) updates) => - (toBuilder()..update(updates)).build(); + void Function(CrosswordCharacterBuilder) updates, + ) => (toBuilder()..update(updates)).build(); @override CrosswordCharacterBuilder toBuilder() => @@ -739,10 +934,14 @@ class CrosswordCharacterBuilder _$CrosswordCharacter _build() { _$CrosswordCharacter _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordCharacter._( character: BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'), + character, + r'CrosswordCharacter', + 'character', + ), acrossWord: _acrossWord?.build(), downWord: _downWord?.build(), ); @@ -755,7 +954,10 @@ class CrosswordCharacterBuilder _downWord?.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordCharacter', _$failedField, e.toString()); + r'CrosswordCharacter', + _$failedField, + e.toString(), + ); } rethrow; } @@ -777,17 +979,20 @@ class _$Crossword extends Crossword { factory _$Crossword([void Function(CrosswordBuilder)? updates]) => (new CrosswordBuilder()..update(updates))._build(); - _$Crossword._( - {required this.width, - required this.height, - required this.words, - required this.characters}) - : super._() { + _$Crossword._({ + required this.width, + required this.height, + required this.words, + required this.characters, + }) : super._() { BuiltValueNullFieldError.checkNotNull(width, r'Crossword', 'width'); BuiltValueNullFieldError.checkNotNull(height, r'Crossword', 'height'); BuiltValueNullFieldError.checkNotNull(words, r'Crossword', 'words'); BuiltValueNullFieldError.checkNotNull( - characters, r'Crossword', 'characters'); + characters, + r'Crossword', + 'characters', + ); } @override @@ -883,12 +1088,19 @@ class CrosswordBuilder implements Builder { Crossword._fillCharacters(this); _$Crossword _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$Crossword._( width: BuiltValueNullFieldError.checkNotNull( - width, r'Crossword', 'width'), + width, + r'Crossword', + 'width', + ), height: BuiltValueNullFieldError.checkNotNull( - height, r'Crossword', 'height'), + height, + r'Crossword', + 'height', + ), words: words.build(), characters: characters.build(), ); @@ -901,7 +1113,10 @@ class CrosswordBuilder implements Builder { characters.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'Crossword', _$failedField, e.toString()); + r'Crossword', + _$failedField, + e.toString(), + ); } rethrow; } @@ -923,19 +1138,28 @@ class _$WorkQueue extends WorkQueue { factory _$WorkQueue([void Function(WorkQueueBuilder)? updates]) => (new WorkQueueBuilder()..update(updates))._build(); - _$WorkQueue._( - {required this.crossword, - required this.locationsToTry, - required this.badLocations, - required this.candidateWords}) - : super._() { + _$WorkQueue._({ + required this.crossword, + required this.locationsToTry, + required this.badLocations, + required this.candidateWords, + }) : super._() { BuiltValueNullFieldError.checkNotNull(crossword, r'WorkQueue', 'crossword'); BuiltValueNullFieldError.checkNotNull( - locationsToTry, r'WorkQueue', 'locationsToTry'); + locationsToTry, + r'WorkQueue', + 'locationsToTry', + ); BuiltValueNullFieldError.checkNotNull( - badLocations, r'WorkQueue', 'badLocations'); + badLocations, + r'WorkQueue', + 'badLocations', + ); BuiltValueNullFieldError.checkNotNull( - candidateWords, r'WorkQueue', 'candidateWords'); + candidateWords, + r'WorkQueue', + 'candidateWords', + ); } @override @@ -1034,7 +1258,8 @@ class WorkQueueBuilder implements Builder { _$WorkQueue _build() { _$WorkQueue _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$WorkQueue._( crossword: crossword.build(), locationsToTry: locationsToTry.build(), @@ -1054,7 +1279,10 @@ class WorkQueueBuilder implements Builder { candidateWords.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'WorkQueue', _$failedField, e.toString()); + r'WorkQueue', + _$failedField, + e.toString(), + ); } rethrow; } @@ -1078,23 +1306,38 @@ class _$DisplayInfo extends DisplayInfo { factory _$DisplayInfo([void Function(DisplayInfoBuilder)? updates]) => (new DisplayInfoBuilder()..update(updates))._build(); - _$DisplayInfo._( - {required this.wordsInGridCount, - required this.candidateWordsCount, - required this.locationsToExploreCount, - required this.knownBadLocationsCount, - required this.gridFilledPercentage}) - : super._() { + _$DisplayInfo._({ + required this.wordsInGridCount, + required this.candidateWordsCount, + required this.locationsToExploreCount, + required this.knownBadLocationsCount, + required this.gridFilledPercentage, + }) : super._() { BuiltValueNullFieldError.checkNotNull( - wordsInGridCount, r'DisplayInfo', 'wordsInGridCount'); + wordsInGridCount, + r'DisplayInfo', + 'wordsInGridCount', + ); BuiltValueNullFieldError.checkNotNull( - candidateWordsCount, r'DisplayInfo', 'candidateWordsCount'); + candidateWordsCount, + r'DisplayInfo', + 'candidateWordsCount', + ); BuiltValueNullFieldError.checkNotNull( - locationsToExploreCount, r'DisplayInfo', 'locationsToExploreCount'); + locationsToExploreCount, + r'DisplayInfo', + 'locationsToExploreCount', + ); BuiltValueNullFieldError.checkNotNull( - knownBadLocationsCount, r'DisplayInfo', 'knownBadLocationsCount'); + knownBadLocationsCount, + r'DisplayInfo', + 'knownBadLocationsCount', + ); BuiltValueNullFieldError.checkNotNull( - gridFilledPercentage, r'DisplayInfo', 'gridFilledPercentage'); + gridFilledPercentage, + r'DisplayInfo', + 'gridFilledPercentage', + ); } @override @@ -1197,20 +1440,34 @@ class DisplayInfoBuilder implements Builder { DisplayInfo build() => _build(); _$DisplayInfo _build() { - final _$result = _$v ?? + final _$result = + _$v ?? new _$DisplayInfo._( wordsInGridCount: BuiltValueNullFieldError.checkNotNull( - wordsInGridCount, r'DisplayInfo', 'wordsInGridCount'), + wordsInGridCount, + r'DisplayInfo', + 'wordsInGridCount', + ), candidateWordsCount: BuiltValueNullFieldError.checkNotNull( - candidateWordsCount, r'DisplayInfo', 'candidateWordsCount'), + candidateWordsCount, + r'DisplayInfo', + 'candidateWordsCount', + ), locationsToExploreCount: BuiltValueNullFieldError.checkNotNull( - locationsToExploreCount, - r'DisplayInfo', - 'locationsToExploreCount'), + locationsToExploreCount, + r'DisplayInfo', + 'locationsToExploreCount', + ), knownBadLocationsCount: BuiltValueNullFieldError.checkNotNull( - knownBadLocationsCount, r'DisplayInfo', 'knownBadLocationsCount'), + knownBadLocationsCount, + r'DisplayInfo', + 'knownBadLocationsCount', + ), gridFilledPercentage: BuiltValueNullFieldError.checkNotNull( - gridFilledPercentage, r'DisplayInfo', 'gridFilledPercentage'), + gridFilledPercentage, + r'DisplayInfo', + 'gridFilledPercentage', + ), ); replace(_$result); return _$result; diff --git a/generate_crossword/step_07/lib/providers.dart b/generate_crossword/step_07/lib/providers.dart index 683c943f0d..854108939a 100644 --- a/generate_crossword/step_07/lib/providers.dart +++ b/generate_crossword/step_07/lib/providers.dart @@ -26,10 +26,16 @@ Future> wordList(Ref ref) async { final re = RegExp(r'^[a-z]+$'); final words = await rootBundle.loadString('assets/words.txt'); - return const LineSplitter().convert(words).toBuiltSet().rebuild((b) => b - ..map((word) => word.toLowerCase().trim()) - ..where((word) => word.length > 2) - ..where((word) => re.hasMatch(word))); + return const LineSplitter() + .convert(words) + .toBuiltSet() + .rebuild( + (b) => + b + ..map((word) => word.toLowerCase().trim()) + ..where((word) => word.length > 2) + ..where((word) => re.hasMatch(word)), + ); } /// An enumeration for different sizes of [model.Crossword]s. @@ -40,10 +46,7 @@ enum CrosswordSize { xlarge(width: 160, height: 88), xxlarge(width: 500, height: 500); - const CrosswordSize({ - required this.width, - required this.height, - }); + const CrosswordSize({required this.width, required this.height}); final int width; final int height; @@ -68,8 +71,10 @@ class Size extends _$Size { Stream workQueue(Ref ref) async* { final size = ref.watch(sizeProvider); final wordListAsync = ref.watch(wordListProvider); - final emptyCrossword = - model.Crossword.crossword(width: size.width, height: size.height); + final emptyCrossword = model.Crossword.crossword( + width: size.width, + height: size.height, + ); final emptyWorkQueue = model.WorkQueue.from( crossword: emptyCrossword, candidateWords: BuiltSet(), @@ -80,10 +85,11 @@ Stream workQueue(Ref ref) async* { ref.read(endTimeProvider.notifier).clear(); yield* wordListAsync.when( - data: (wordList) => exploreCrosswordSolutions( - crossword: emptyCrossword, - wordList: wordList, - ), + data: + (wordList) => exploreCrosswordSolutions( + crossword: emptyCrossword, + wordList: wordList, + ), error: (error, stackTrace) async* { debugPrint('Error loading word list: $error'); yield emptyWorkQueue; @@ -143,10 +149,11 @@ Duration expectedRemainingTime(Ref ref) { try { final soFar = DateTime.now().difference(startTime); final completedPercentage = min( - 0.99, - (workQueue.crossword.characters.length / - (workQueue.crossword.width * workQueue.crossword.height) / - _estimatedTotalCoverage)); + 0.99, + (workQueue.crossword.characters.length / + (workQueue.crossword.width * workQueue.crossword.height) / + _estimatedTotalCoverage), + ); final expectedTotal = soFar.inSeconds / completedPercentage; final expectedRemaining = expectedTotal - soFar.inSeconds; return Duration(seconds: expectedRemaining.toInt()); @@ -177,7 +184,9 @@ class ShowDisplayInfo extends _$ShowDisplayInfo { @riverpod class DisplayInfo extends _$DisplayInfo { @override - model.DisplayInfo build() => ref.watch(workQueueProvider).when( + model.DisplayInfo build() => ref + .watch(workQueueProvider) + .when( data: (workQueue) => model.DisplayInfo.from(workQueue: workQueue), error: (error, stackTrace) => model.DisplayInfo.empty, loading: () => model.DisplayInfo.empty, diff --git a/generate_crossword/step_07/lib/providers.g.dart b/generate_crossword/step_07/lib/providers.g.dart index 6363546d41..322f686f1d 100644 --- a/generate_crossword/step_07/lib/providers.g.dart +++ b/generate_crossword/step_07/lib/providers.g.dart @@ -48,9 +48,10 @@ String _$expectedRemainingTimeHash() => final expectedRemainingTimeProvider = AutoDisposeProvider.internal( expectedRemainingTime, name: r'expectedRemainingTimeProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$expectedRemainingTimeHash, + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$expectedRemainingTimeHash, dependencies: null, allTransitiveDependencies: null, ); @@ -110,14 +111,15 @@ String _$showDisplayInfoHash() => r'75a0679db4cc1a0d5cfa7aa33afc633faf08fc24'; @ProviderFor(ShowDisplayInfo) final showDisplayInfoProvider = NotifierProvider.internal( - ShowDisplayInfo.new, - name: r'showDisplayInfoProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$showDisplayInfoHash, - dependencies: null, - allTransitiveDependencies: null, -); + ShowDisplayInfo.new, + name: r'showDisplayInfoProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$showDisplayInfoHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$ShowDisplayInfo = Notifier; String _$displayInfoHash() => r'6516f6bf346baa6914fdfffad1ccee8a5345a137'; @@ -128,13 +130,15 @@ String _$displayInfoHash() => r'6516f6bf346baa6914fdfffad1ccee8a5345a137'; @ProviderFor(DisplayInfo) final displayInfoProvider = AutoDisposeNotifierProvider.internal( - DisplayInfo.new, - name: r'displayInfoProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$displayInfoHash, - dependencies: null, - allTransitiveDependencies: null, -); + DisplayInfo.new, + name: r'displayInfoProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$displayInfoHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$DisplayInfo = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/generate_crossword/step_07/lib/widgets/crossword_generator_app.dart b/generate_crossword/step_07/lib/widgets/crossword_generator_app.dart index e8b6093db1..f3d64afb4b 100644 --- a/generate_crossword/step_07/lib/widgets/crossword_generator_app.dart +++ b/generate_crossword/step_07/lib/widgets/crossword_generator_app.dart @@ -30,9 +30,7 @@ class CrosswordGeneratorApp extends StatelessWidget { builder: (context, ref, child) { return Stack( children: [ - Positioned.fill( - child: CrosswordWidget(), - ), + Positioned.fill(child: CrosswordWidget()), if (ref.watch(showDisplayInfoProvider)) CrosswordInfoWidget(), ], ); @@ -58,27 +56,29 @@ class _EagerInitialization extends ConsumerWidget { class _CrosswordGeneratorMenu extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) => MenuAnchor( - menuChildren: [ - for (final entry in CrosswordSize.values) - MenuItemButton( - onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), - leadingIcon: entry == ref.watch(sizeProvider) + menuChildren: [ + for (final entry in CrosswordSize.values) + MenuItemButton( + onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), + leadingIcon: + entry == ref.watch(sizeProvider) ? Icon(Icons.radio_button_checked_outlined) : Icon(Icons.radio_button_unchecked_outlined), - child: Text(entry.label), - ), - MenuItemButton( - leadingIcon: ref.watch(showDisplayInfoProvider) + child: Text(entry.label), + ), + MenuItemButton( + leadingIcon: + ref.watch(showDisplayInfoProvider) ? Icon(Icons.check_box_outlined) : Icon(Icons.check_box_outline_blank_outlined), - onPressed: () => - ref.read(showDisplayInfoProvider.notifier).toggle(), - child: Text('Display Info'), - ), - ], - builder: (context, controller, child) => IconButton( + onPressed: () => ref.read(showDisplayInfoProvider.notifier).toggle(), + child: Text('Display Info'), + ), + ], + builder: + (context, controller, child) => IconButton( onPressed: () => controller.open(), icon: Icon(Icons.settings), ), - ); + ); } diff --git a/generate_crossword/step_07/lib/widgets/crossword_info_widget.dart b/generate_crossword/step_07/lib/widgets/crossword_info_widget.dart index 44deb06303..eb75df49c1 100644 --- a/generate_crossword/step_07/lib/widgets/crossword_info_widget.dart +++ b/generate_crossword/step_07/lib/widgets/crossword_info_widget.dart @@ -10,9 +10,7 @@ import '../utils.dart'; import 'ticker_builder.dart'; class CrosswordInfoWidget extends ConsumerWidget { - const CrosswordInfoWidget({ - super.key, - }); + const CrosswordInfoWidget({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -25,62 +23,68 @@ class CrosswordInfoWidget extends ConsumerWidget { return Align( alignment: Alignment.bottomRight, child: Padding( - padding: const EdgeInsets.only( - right: 32.0, - bottom: 32.0, - ), + padding: const EdgeInsets.only(right: 32.0, bottom: 32.0), child: ClipRRect( borderRadius: BorderRadius.circular(8), child: ColoredBox( color: Theme.of(context).colorScheme.onPrimary.withAlpha(230), child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 12, - vertical: 8, - ), + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), child: DefaultTextStyle( style: TextStyle( - fontSize: 16, color: Theme.of(context).colorScheme.primary), + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ _CrosswordInfoRichText( - label: 'Grid Size', - value: '${size.width} x ${size.height}'), + label: 'Grid Size', + value: '${size.width} x ${size.height}', + ), _CrosswordInfoRichText( - label: 'Words in grid', - value: displayInfo.wordsInGridCount), + label: 'Words in grid', + value: displayInfo.wordsInGridCount, + ), _CrosswordInfoRichText( - label: 'Candidate words', - value: displayInfo.candidateWordsCount), + label: 'Candidate words', + value: displayInfo.candidateWordsCount, + ), _CrosswordInfoRichText( - label: 'Locations to explore', - value: displayInfo.locationsToExploreCount), + label: 'Locations to explore', + value: displayInfo.locationsToExploreCount, + ), _CrosswordInfoRichText( - label: 'Known bad locations', - value: displayInfo.knownBadLocationsCount), + label: 'Known bad locations', + value: displayInfo.knownBadLocationsCount, + ), _CrosswordInfoRichText( - label: 'Grid filled', - value: displayInfo.gridFilledPercentage), + label: 'Grid filled', + value: displayInfo.gridFilledPercentage, + ), switch ((startTime, endTime)) { (null, _) => _CrosswordInfoRichText( - label: 'Time elapsed', - value: 'Not started yet', - ), + label: 'Time elapsed', + value: 'Not started yet', + ), (DateTime start, null) => TickerBuilder( - builder: (context) => _CrosswordInfoRichText( - label: 'Time elapsed', - value: DateTime.now().difference(start).formatted, - ), - ), + builder: + (context) => _CrosswordInfoRichText( + label: 'Time elapsed', + value: DateTime.now().difference(start).formatted, + ), + ), (DateTime start, DateTime end) => _CrosswordInfoRichText( - label: 'Completed in', - value: end.difference(start).formatted), + label: 'Completed in', + value: end.difference(start).formatted, + ), }, if (startTime != null && endTime == null) _CrosswordInfoRichText( - label: 'Est. remaining', value: remaining.formatted), + label: 'Est. remaining', + value: remaining.formatted, + ), ], ), ), @@ -100,19 +104,16 @@ class _CrosswordInfoRichText extends StatelessWidget { @override Widget build(BuildContext context) => RichText( - text: TextSpan( - children: [ - TextSpan( - text: '$label ', - style: DefaultTextStyle.of(context).style, - ), - TextSpan( - text: value, - style: DefaultTextStyle.of(context) - .style - .copyWith(fontWeight: FontWeight.bold), - ), - ], + text: TextSpan( + children: [ + TextSpan(text: '$label ', style: DefaultTextStyle.of(context).style), + TextSpan( + text: value, + style: DefaultTextStyle.of( + context, + ).style.copyWith(fontWeight: FontWeight.bold), ), - ); + ], + ), + ); } diff --git a/generate_crossword/step_07/lib/widgets/crossword_widget.dart b/generate_crossword/step_07/lib/widgets/crossword_widget.dart index d243507093..6ac322d6d4 100644 --- a/generate_crossword/step_07/lib/widgets/crossword_widget.dart +++ b/generate_crossword/step_07/lib/widgets/crossword_widget.dart @@ -70,9 +70,11 @@ class CrosswordWidget extends ConsumerWidget { foregroundDecoration: TableSpanDecoration( border: TableSpanBorder( leading: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), trailing: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ), ); diff --git a/generate_crossword/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 070fd74eff..5845d19a0a 100644 --- a/generate_crossword/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_07/pubspec.yaml b/generate_crossword/step_07/pubspec.yaml index 701f231c6a..a4e12dc3f1 100644 --- a/generate_crossword/step_07/pubspec.yaml +++ b/generate_crossword/step_07/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter built_collection: ^5.1.1 built_value: ^8.9.3 - characters: ^1.3.0 + characters: ^1.4.0 flutter_riverpod: ^2.6.1 intl: ^0.20.2 riverpod: ^2.6.1 diff --git a/generate_crossword/step_07/test/model_test.dart b/generate_crossword/step_07/test/model_test.dart index f11e1addb1..342c515ec1 100644 --- a/generate_crossword/step_07/test/model_test.dart +++ b/generate_crossword/step_07/test/model_test.dart @@ -39,28 +39,27 @@ void main() { expect(crossword.words.isNotEmpty, true); expect(crossword.words.length, 2); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 1, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .length, + 1, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 7); expect( - crossword.characters[topLeft], - CrosswordCharacter.character( - acrossWord: thisWord, - downWord: thatWord, - character: 't', - )); + crossword.characters[topLeft], + CrosswordCharacter.character( + acrossWord: thisWord, + downWord: thatWord, + character: 't', + ), + ); expect(crossword.valid, isTrue); }); @@ -86,19 +85,17 @@ void main() { expect(crossword.words.isNotEmpty, true); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 2); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 2, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .isEmpty, - true); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .isEmpty, + true, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 8); expect(crossword.valid, isFalse); @@ -108,11 +105,12 @@ void main() { Crossword crossword = Crossword.crossword(width: 50, height: 50); expect(crossword.valid, true); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'this', - )!; + crossword = + crossword.addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'this', + )!; expect(crossword.valid, true); final crossword2 = crossword.addWord( @@ -174,17 +172,18 @@ void main() { final topLeft = Location.at(0, 0); - crossword = crossword - .addWord( - location: topLeft, - word: 'this', - direction: Direction.down, - )! - .addWord( - location: topLeft, - word: 'total', - direction: Direction.across, - )!; + crossword = + crossword + .addWord( + location: topLeft, + word: 'this', + direction: Direction.down, + )! + .addWord( + location: topLeft, + word: 'total', + direction: Direction.across, + )!; expect(crossword.valid, isTrue); @@ -235,77 +234,85 @@ void main() { }); test('Crossword is not valid with run-on across words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on across/down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down/across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); @@ -313,36 +320,40 @@ void main() { test('Adding duplicate across words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.across, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -350,36 +361,40 @@ void main() { test('Adding duplicate down words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.down, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate down words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -393,10 +408,12 @@ void main() { ); expect(queue.locationsToTry.length, 1); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word')!; + crossword = + crossword.addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + )!; queue = WorkQueue.from( crossword: crossword, candidateWords: ['words', 'and', 'moar', 'wordz'], @@ -404,21 +421,26 @@ void main() { ); expect(queue.locationsToTry.length, 4); expect( - queue.locationsToTry.entries - .every((element) => element.value == Direction.down), - isTrue); + queue.locationsToTry.entries.every( + (element) => element.value == Direction.down, + ), + isTrue, + ); final entries = queue.locationsToTry.entries; expect(entries.every((element) => element.key.y == 0), isTrue); - expect(entries.map((element) => element.key.x).toBuiltSet(), - equals(BuiltSet([0, 1, 2, 3]))); + expect( + entries.map((element) => element.key.x).toBuiltSet(), + equals(BuiltSet([0, 1, 2, 3])), + ); }); test('WorkQueue from down word', () { - Crossword crossword = Crossword.crossword(width: 50, height: 50).addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - )!; + Crossword crossword = + Crossword.crossword(width: 50, height: 50).addWord( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + )!; WorkQueue queue = WorkQueue.from( crossword: crossword, @@ -427,27 +449,32 @@ void main() { ); expect(queue.locationsToTry.length, 4); expect( - queue.locationsToTry.entries - .every((element) => element.value == Direction.across), - isTrue); + queue.locationsToTry.entries.every( + (element) => element.value == Direction.across, + ), + isTrue, + ); final entries = queue.locationsToTry.entries; expect(entries.every((element) => element.key.x == 0), isTrue); - expect(entries.map((element) => element.key.y).toBuiltSet(), - equals(BuiltSet([0, 1, 2, 3]))); + expect( + entries.map((element) => element.key.y).toBuiltSet(), + equals(BuiltSet([0, 1, 2, 3])), + ); }); test('WorkQueue from two words', () { - Crossword crossword = Crossword.crossword(width: 50, height: 50) - .addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - )! - .addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'work', - )!; + Crossword crossword = + Crossword.crossword(width: 50, height: 50) + .addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + )! + .addWord( + direction: Direction.down, + location: Location.at(0, 0), + word: 'work', + )!; WorkQueue queue = WorkQueue.from( crossword: crossword, @@ -455,27 +482,31 @@ void main() { startLocation: Location.at(0, 0), ); expect( - queue.locationsToTry, - equals(BuiltMap({ + queue.locationsToTry, + equals( + BuiltMap({ Location.at(2, 0): Direction.down, Location.at(0, 2): Direction.across, Location.at(3, 0): Direction.down, Location.at(0, 3): Direction.across, - }))); + }), + ), + ); }); test('WorkQueue removes used words from candidate list', () { - Crossword crossword = Crossword.crossword(width: 50, height: 50) - .addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - )! - .addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'work', - )!; + Crossword crossword = + Crossword.crossword(width: 50, height: 50) + .addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + )! + .addWord( + direction: Direction.down, + location: Location.at(0, 0), + word: 'work', + )!; WorkQueue queue = WorkQueue.from( crossword: crossword, diff --git a/generate_crossword/step_08/android/.gitignore b/generate_crossword/step_08/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/generate_crossword/step_08/android/.gitignore +++ b/generate_crossword/step_08/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/generate_crossword/step_08/android/app/build.gradle b/generate_crossword/step_08/android/app/build.gradle deleted file mode 100644 index d4a93e6565..0000000000 --- a/generate_crossword/step_08/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.generate_crossword" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.generate_crossword" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/generate_crossword/step_08/android/app/build.gradle.kts b/generate_crossword/step_08/android/app/build.gradle.kts new file mode 100644 index 0000000000..9a7651c2a6 --- /dev/null +++ b/generate_crossword/step_08/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.generate_crossword" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.generate_crossword" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/generate_crossword/step_08/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt b/generate_crossword/step_08/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt index 7011ed9ff4..e1bbbdcb4c 100644 --- a/generate_crossword/step_08/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt +++ b/generate_crossword/step_08/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.generate_crossword import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/generate_crossword/step_08/android/build.gradle b/generate_crossword/step_08/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/generate_crossword/step_08/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/generate_crossword/step_08/android/build.gradle.kts b/generate_crossword/step_08/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/generate_crossword/step_08/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/generate_crossword/step_08/android/gradle.properties b/generate_crossword/step_08/android/gradle.properties index 2597170821..f018a61817 100644 --- a/generate_crossword/step_08/android/gradle.properties +++ b/generate_crossword/step_08/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/generate_crossword/step_08/android/gradle/wrapper/gradle-wrapper.properties b/generate_crossword/step_08/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/generate_crossword/step_08/android/gradle/wrapper/gradle-wrapper.properties +++ b/generate_crossword/step_08/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/generate_crossword/step_08/android/settings.gradle b/generate_crossword/step_08/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/generate_crossword/step_08/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/generate_crossword/step_08/android/settings.gradle.kts b/generate_crossword/step_08/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/generate_crossword/step_08/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/generate_crossword/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/generate_crossword/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_08/lib/isolates.dart b/generate_crossword/step_08/lib/isolates.dart index bc16c4f074..91f8015800 100644 --- a/generate_crossword/step_08/lib/isolates.dart +++ b/generate_crossword/step_08/lib/isolates.dart @@ -29,24 +29,35 @@ Stream exploreCrosswordSolutions({ } } - debugPrint('Generated ${workQueue.crossword.width} x ' - '${workQueue.crossword.height} crossword in ' - '${DateTime.now().difference(start).formatted} ' - 'with $maxWorkerCount workers.'); + debugPrint( + 'Generated ${workQueue.crossword.width} x ' + '${workQueue.crossword.height} crossword in ' + '${DateTime.now().difference(start).formatted} ' + 'with $maxWorkerCount workers.', + ); } Future _generate((WorkQueue, int) workMessage) async { var (workQueue, maxWorkerCount) = workMessage; final candidateGeneratorFutures = >[]; - final locations = workQueue.locationsToTry.keys.toBuiltList().rebuild((b) => b - ..shuffle() - ..take(maxWorkerCount)); + final locations = workQueue.locationsToTry.keys.toBuiltList().rebuild( + (b) => + b + ..shuffle() + ..take(maxWorkerCount), + ); for (final location in locations) { final direction = workQueue.locationsToTry[location]!; - candidateGeneratorFutures.add(compute(_generateCandidate, - (workQueue.crossword, workQueue.candidateWords, location, direction))); + candidateGeneratorFutures.add( + compute(_generateCandidate, ( + workQueue.crossword, + workQueue.candidateWords, + location, + direction, + )), + ); } try { @@ -55,7 +66,10 @@ Future _generate((WorkQueue, int) workMessage) async { for (final (location, direction, word) in results) { if (word != null) { final candidate = crossword.addWord( - location: location, word: word, direction: direction); + location: location, + word: word, + direction: direction, + ); if (candidate != null) { crossword = candidate; } @@ -73,7 +87,8 @@ Future _generate((WorkQueue, int) workMessage) async { } (Location, Direction, String?) _generateCandidate( - (Crossword, BuiltSet, Location, Direction) searchDetailMessage) { + (Crossword, BuiltSet, Location, Direction) searchDetailMessage, +) { final (crossword, candidateWords, location, direction) = searchDetailMessage; final target = crossword.characters[location]; @@ -83,9 +98,12 @@ Future _generate((WorkQueue, int) workMessage) async { // Filter down the candidate word list to those that contain the letter // at the current location - final words = candidateWords.toBuiltList().rebuild((b) => b - ..where((b) => b.characters.contains(target.character)) - ..shuffle()); + final words = candidateWords.toBuiltList().rebuild( + (b) => + b + ..where((b) => b.characters.contains(target.character)) + ..shuffle(), + ); int tryCount = 0; final start = DateTime.now(); for (final word in words) { diff --git a/generate_crossword/step_08/lib/model.dart b/generate_crossword/step_08/lib/model.dart index dbd0a3e309..78800297ac 100644 --- a/generate_crossword/step_08/lib/model.dart +++ b/generate_crossword/step_08/lib/model.dart @@ -90,7 +90,10 @@ abstract class CrosswordWord static int locationComparator(CrosswordWord a, CrosswordWord b) { final compareRows = a.location.y.compareTo(b.location.y); final compareColumns = a.location.x.compareTo(b.location.x); - return switch (compareColumns) { 0 => compareRows, _ => compareColumns }; + return switch (compareColumns) { + 0 => compareRows, + _ => compareColumns, + }; } /// Constructor for [CrosswordWord]. @@ -99,10 +102,13 @@ abstract class CrosswordWord required Location location, required Direction direction, }) { - return CrosswordWord((b) => b - ..word = word - ..direction = direction - ..location.replace(location)); + return CrosswordWord( + (b) => + b + ..word = word + ..direction = direction + ..location.replace(location), + ); } /// Constructor for [CrosswordWord]. @@ -149,9 +155,9 @@ abstract class CrosswordCharacter /// Constructor for [CrosswordCharacter]. /// Use [CrosswordCharacter.character] instead. - factory CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) = - _$CrosswordCharacter; + factory CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) = _$CrosswordCharacter; CrosswordCharacter._(); } @@ -282,14 +288,15 @@ abstract class Crossword implements Built { } final candidate = rebuild( - (b) => b - ..words.add( - CrosswordWord.word( - word: word, - direction: direction, - location: location, - ), - ), + (b) => + b + ..words.add( + CrosswordWord.word( + word: word, + direction: direction, + location: location, + ), + ), ); if (candidate.valid) { @@ -311,19 +318,21 @@ abstract class Crossword implements Built { b.characters.updateValue( word.location.rightOffset(idx), (b) => b.rebuild((bInner) => bInner.acrossWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - acrossWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + acrossWord: word, + character: character, + ), ); case Direction.down: b.characters.updateValue( word.location.downOffset(idx), (b) => b.rebuild((bInner) => bInner.downWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - downWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + downWord: word, + character: character, + ), ); } } @@ -337,7 +346,8 @@ abstract class Crossword implements Built { final grid = List.generate( height, (_) => List.generate( - width, (_) => '░', // https://www.compart.com/en/unicode/U+2591 + width, + (_) => '░', // https://www.compart.com/en/unicode/U+2591 ), ); @@ -417,40 +427,44 @@ abstract class WorkQueue implements Built { required Crossword crossword, required Iterable candidateWords, required Location startLocation, - }) => - WorkQueue((b) { - if (crossword.words.isEmpty) { - // Strip candidate words too long to fit in the crossword - b.candidateWords.addAll(candidateWords - .where((word) => word.characters.length <= crossword.width)); - - b.crossword.replace(crossword); - - b.locationsToTry.addAll({startLocation: Direction.across}); - } else { - // Assuming words have already been stripped to length - b.candidateWords.addAll( - candidateWords.toBuiltSet().rebuild( - (b) => b.removeAll(crossword.words.map((word) => word.word))), - ); - b.crossword.replace(crossword); - crossword.characters - .rebuild((b) => b.removeWhere((location, character) { - if (character.acrossWord != null && - character.downWord != null) { - return true; - } - final left = crossword.characters[location.left]; - if (left != null && left.downWord != null) return true; - final right = crossword.characters[location.right]; - if (right != null && right.downWord != null) return true; - final up = crossword.characters[location.up]; - if (up != null && up.acrossWord != null) return true; - final down = crossword.characters[location.down]; - if (down != null && down.acrossWord != null) return true; - return false; - })) - .forEach((location, character) { + }) => WorkQueue((b) { + if (crossword.words.isEmpty) { + // Strip candidate words too long to fit in the crossword + b.candidateWords.addAll( + candidateWords.where( + (word) => word.characters.length <= crossword.width, + ), + ); + + b.crossword.replace(crossword); + + b.locationsToTry.addAll({startLocation: Direction.across}); + } else { + // Assuming words have already been stripped to length + b.candidateWords.addAll( + candidateWords.toBuiltSet().rebuild( + (b) => b.removeAll(crossword.words.map((word) => word.word)), + ), + ); + b.crossword.replace(crossword); + crossword.characters + .rebuild( + (b) => b.removeWhere((location, character) { + if (character.acrossWord != null && character.downWord != null) { + return true; + } + final left = crossword.characters[location.left]; + if (left != null && left.downWord != null) return true; + final right = crossword.characters[location.right]; + if (right != null && right.downWord != null) return true; + final up = crossword.characters[location.up]; + if (up != null && up.acrossWord != null) return true; + final down = crossword.characters[location.down]; + if (down != null && down.acrossWord != null) return true; + return false; + }), + ) + .forEach((location, character) { b.locationsToTry.addAll({ location: switch ((character.acrossWord, character.downWord)) { (null, null) => @@ -458,28 +472,36 @@ abstract class WorkQueue implements Built { (null, _) => Direction.across, (_, null) => Direction.down, (_, _) => throw StateError('Character is part of two words'), - } + }, }); }); - } - }); + } + }); - WorkQueue remove(Location location) => rebuild((b) => b - ..locationsToTry.remove(location) - ..badLocations.add(location)); + WorkQueue remove(Location location) => rebuild( + (b) => + b + ..locationsToTry.remove(location) + ..badLocations.add(location), + ); /// Update the work queue from a crossword derived from the current crossword /// that this work queue is built from. WorkQueue updateFrom(final Crossword crossword) => WorkQueue.from( - crossword: crossword, - candidateWords: candidateWords, - startLocation: locationsToTry.isNotEmpty + crossword: crossword, + candidateWords: candidateWords, + startLocation: + locationsToTry.isNotEmpty ? locationsToTry.keys.first : Location.at(0, 0), - ).rebuild((b) => b - ..badLocations.addAll(badLocations) - ..locationsToTry - .removeWhere((location, _) => badLocations.contains(location))); + ).rebuild( + (b) => + b + ..badLocations.addAll(badLocations) + ..locationsToTry.removeWhere( + (location, _) => badLocations.contains(location), + ), + ); /// Factory constructor for [WorkQueue] factory WorkQueue([void Function(WorkQueueBuilder)? updates]) = _$WorkQueue; @@ -508,25 +530,35 @@ abstract class DisplayInfo implements Built { /// Construct a [DisplayInfo] instance from a [WorkQueue]. factory DisplayInfo.from({required WorkQueue workQueue}) { - final gridFilled = (workQueue.crossword.characters.length / - (workQueue.crossword.width * workQueue.crossword.height)); + final gridFilled = + (workQueue.crossword.characters.length / + (workQueue.crossword.width * workQueue.crossword.height)); final fmt = NumberFormat.decimalPattern(); - return DisplayInfo((b) => b - ..wordsInGridCount = fmt.format(workQueue.crossword.words.length) - ..candidateWordsCount = fmt.format(workQueue.candidateWords.length) - ..locationsToExploreCount = fmt.format(workQueue.locationsToTry.length) - ..knownBadLocationsCount = fmt.format(workQueue.badLocations.length) - ..gridFilledPercentage = '${(gridFilled * 100).toStringAsFixed(2)}%'); + return DisplayInfo( + (b) => + b + ..wordsInGridCount = fmt.format(workQueue.crossword.words.length) + ..candidateWordsCount = fmt.format(workQueue.candidateWords.length) + ..locationsToExploreCount = fmt.format( + workQueue.locationsToTry.length, + ) + ..knownBadLocationsCount = fmt.format(workQueue.badLocations.length) + ..gridFilledPercentage = + '${(gridFilled * 100).toStringAsFixed(2)}%', + ); } /// An empty [DisplayInfo] instance. - static DisplayInfo get empty => DisplayInfo((b) => b - ..wordsInGridCount = '0' - ..candidateWordsCount = '0' - ..locationsToExploreCount = '0' - ..knownBadLocationsCount = '0' - ..gridFilledPercentage = '0%'); + static DisplayInfo get empty => DisplayInfo( + (b) => + b + ..wordsInGridCount = '0' + ..candidateWordsCount = '0' + ..locationsToExploreCount = '0' + ..knownBadLocationsCount = '0' + ..gridFilledPercentage = '0%', + ); factory DisplayInfo([void Function(DisplayInfoBuilder)? updates]) = _$DisplayInfo; diff --git a/generate_crossword/step_08/lib/model.g.dart b/generate_crossword/step_08/lib/model.g.dart index 887ee81df7..f10a37ad34 100644 --- a/generate_crossword/step_08/lib/model.g.dart +++ b/generate_crossword/step_08/lib/model.g.dart @@ -6,33 +6,41 @@ part of 'model.dart'; // BuiltValueGenerator // ************************************************************************** -Serializers _$serializers = (new Serializers().toBuilder() - ..add(Crossword.serializer) - ..add(CrosswordCharacter.serializer) - ..add(CrosswordWord.serializer) - ..add(DisplayInfo.serializer) - ..add(Location.serializer) - ..add(WorkQueue.serializer) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(CrosswordWord)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ]), - () => new MapBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, - const [const FullType(Location), const FullType(Direction)]), - () => new MapBuilder()) - ..addBuilderFactory( - const FullType(BuiltSet, const [const FullType(Location)]), - () => new SetBuilder()) - ..addBuilderFactory( - const FullType(BuiltSet, const [const FullType(String)]), - () => new SetBuilder())) - .build(); +Serializers _$serializers = + (new Serializers().toBuilder() + ..add(Crossword.serializer) + ..add(CrosswordCharacter.serializer) + ..add(CrosswordWord.serializer) + ..add(DisplayInfo.serializer) + ..add(Location.serializer) + ..add(WorkQueue.serializer) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(CrosswordWord)]), + () => new ListBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + () => new MapBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(Direction), + ]), + () => new MapBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltSet, const [const FullType(Location)]), + () => new SetBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltSet, const [const FullType(String)]), + () => new SetBuilder(), + )) + .build(); Serializer _$locationSerializer = new _$LocationSerializer(); Serializer _$crosswordWordSerializer = new _$CrosswordWordSerializer(); @@ -49,8 +57,11 @@ class _$LocationSerializer implements StructuredSerializer { final String wireName = 'Location'; @override - Iterable serialize(Serializers serializers, Location object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Location object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'x', serializers.serialize(object.x, specifiedType: const FullType(int)), @@ -62,8 +73,11 @@ class _$LocationSerializer implements StructuredSerializer { } @override - Location deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Location deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new LocationBuilder(); final iterator = serialized.iterator; @@ -73,12 +87,20 @@ class _$LocationSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'x': - result.x = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.x = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'y': - result.y = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.y = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; } } @@ -94,17 +116,24 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final String wireName = 'CrosswordWord'; @override - Iterable serialize(Serializers serializers, CrosswordWord object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + CrosswordWord object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'word', serializers.serialize(object.word, specifiedType: const FullType(String)), 'location', - serializers.serialize(object.location, - specifiedType: const FullType(Location)), + serializers.serialize( + object.location, + specifiedType: const FullType(Location), + ), 'direction', - serializers.serialize(object.direction, - specifiedType: const FullType(Direction)), + serializers.serialize( + object.direction, + specifiedType: const FullType(Direction), + ), ]; return result; @@ -112,8 +141,10 @@ class _$CrosswordWordSerializer implements StructuredSerializer { @override CrosswordWord deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordWordBuilder(); final iterator = serialized.iterator; @@ -123,16 +154,29 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'word': - result.word = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.word = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'location': - result.location.replace(serializers.deserialize(value, - specifiedType: const FullType(Location))! as Location); + result.location.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Location), + )! + as Location, + ); break; case 'direction': - result.direction = serializers.deserialize(value, - specifiedType: const FullType(Direction))! as Direction; + result.direction = + serializers.deserialize( + value, + specifiedType: const FullType(Direction), + )! + as Direction; break; } } @@ -150,35 +194,49 @@ class _$CrosswordCharacterSerializer @override Iterable serialize( - Serializers serializers, CrosswordCharacter object, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + CrosswordCharacter object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'character', - serializers.serialize(object.character, - specifiedType: const FullType(String)), + serializers.serialize( + object.character, + specifiedType: const FullType(String), + ), ]; Object? value; value = object.acrossWord; if (value != null) { result ..add('acrossWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } value = object.downWord; if (value != null) { result ..add('downWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } return result; } @override CrosswordCharacter deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordCharacterBuilder(); final iterator = serialized.iterator; @@ -188,16 +246,30 @@ class _$CrosswordCharacterSerializer final Object? value = iterator.current; switch (key) { case 'character': - result.character = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.character = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'acrossWord': - result.acrossWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.acrossWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; case 'downWord': - result.downWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.downWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; } } @@ -213,31 +285,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final String wireName = 'Crossword'; @override - Iterable serialize(Serializers serializers, Crossword object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Crossword object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'width', serializers.serialize(object.width, specifiedType: const FullType(int)), 'height', serializers.serialize(object.height, specifiedType: const FullType(int)), 'words', - serializers.serialize(object.words, - specifiedType: - const FullType(BuiltList, const [const FullType(CrosswordWord)])), + serializers.serialize( + object.words, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + ), 'characters', - serializers.serialize(object.characters, - specifiedType: const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ])), + serializers.serialize( + object.characters, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + ), ]; return result; } @override - Crossword deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Crossword deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordBuilder(); final iterator = serialized.iterator; @@ -247,25 +330,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'width': - result.width = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.width = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'height': - result.height = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.height = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'words': - result.words.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(CrosswordWord)]))! - as BuiltList); + result.words.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + )! + as BuiltList, + ); break; case 'characters': - result.characters.replace(serializers.deserialize(value, + result.characters.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), - const FullType(CrosswordCharacter) - ]))!); + const FullType(CrosswordCharacter), + ]), + )!, + ); break; } } @@ -281,32 +381,48 @@ class _$WorkQueueSerializer implements StructuredSerializer { final String wireName = 'WorkQueue'; @override - Iterable serialize(Serializers serializers, WorkQueue object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + WorkQueue object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'crossword', - serializers.serialize(object.crossword, - specifiedType: const FullType(Crossword)), + serializers.serialize( + object.crossword, + specifiedType: const FullType(Crossword), + ), 'locationsToTry', - serializers.serialize(object.locationsToTry, - specifiedType: const FullType(BuiltMap, - const [const FullType(Location), const FullType(Direction)])), + serializers.serialize( + object.locationsToTry, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(Direction), + ]), + ), 'badLocations', - serializers.serialize(object.badLocations, - specifiedType: - const FullType(BuiltSet, const [const FullType(Location)])), + serializers.serialize( + object.badLocations, + specifiedType: const FullType(BuiltSet, const [ + const FullType(Location), + ]), + ), 'candidateWords', - serializers.serialize(object.candidateWords, - specifiedType: - const FullType(BuiltSet, const [const FullType(String)])), + serializers.serialize( + object.candidateWords, + specifiedType: const FullType(BuiltSet, const [const FullType(String)]), + ), ]; return result; } @override - WorkQueue deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + WorkQueue deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new WorkQueueBuilder(); final iterator = serialized.iterator; @@ -316,27 +432,46 @@ class _$WorkQueueSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'crossword': - result.crossword.replace(serializers.deserialize(value, - specifiedType: const FullType(Crossword))! as Crossword); + result.crossword.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Crossword), + )! + as Crossword, + ); break; case 'locationsToTry': - result.locationsToTry.replace(serializers.deserialize(value, + result.locationsToTry.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), - const FullType(Direction) - ]))!); + const FullType(Direction), + ]), + )!, + ); break; case 'badLocations': - result.badLocations.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltSet, const [const FullType(Location)]))! - as BuiltSet); + result.badLocations.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltSet, const [ + const FullType(Location), + ]), + )! + as BuiltSet, + ); break; case 'candidateWords': - result.candidateWords.replace(serializers.deserialize(value, - specifiedType: - const FullType(BuiltSet, const [const FullType(String)]))! - as BuiltSet); + result.candidateWords.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltSet, const [ + const FullType(String), + ]), + )! + as BuiltSet, + ); break; } } @@ -352,32 +487,48 @@ class _$DisplayInfoSerializer implements StructuredSerializer { final String wireName = 'DisplayInfo'; @override - Iterable serialize(Serializers serializers, DisplayInfo object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + DisplayInfo object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'wordsInGridCount', - serializers.serialize(object.wordsInGridCount, - specifiedType: const FullType(String)), + serializers.serialize( + object.wordsInGridCount, + specifiedType: const FullType(String), + ), 'candidateWordsCount', - serializers.serialize(object.candidateWordsCount, - specifiedType: const FullType(String)), + serializers.serialize( + object.candidateWordsCount, + specifiedType: const FullType(String), + ), 'locationsToExploreCount', - serializers.serialize(object.locationsToExploreCount, - specifiedType: const FullType(String)), + serializers.serialize( + object.locationsToExploreCount, + specifiedType: const FullType(String), + ), 'knownBadLocationsCount', - serializers.serialize(object.knownBadLocationsCount, - specifiedType: const FullType(String)), + serializers.serialize( + object.knownBadLocationsCount, + specifiedType: const FullType(String), + ), 'gridFilledPercentage', - serializers.serialize(object.gridFilledPercentage, - specifiedType: const FullType(String)), + serializers.serialize( + object.gridFilledPercentage, + specifiedType: const FullType(String), + ), ]; return result; } @override - DisplayInfo deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + DisplayInfo deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new DisplayInfoBuilder(); final iterator = serialized.iterator; @@ -387,24 +538,44 @@ class _$DisplayInfoSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'wordsInGridCount': - result.wordsInGridCount = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.wordsInGridCount = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'candidateWordsCount': - result.candidateWordsCount = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.candidateWordsCount = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'locationsToExploreCount': - result.locationsToExploreCount = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.locationsToExploreCount = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'knownBadLocationsCount': - result.knownBadLocationsCount = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.knownBadLocationsCount = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'gridFilledPercentage': - result.gridFilledPercentage = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.gridFilledPercentage = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; } } @@ -496,7 +667,8 @@ class LocationBuilder implements Builder { Location build() => _build(); _$Location _build() { - final _$result = _$v ?? + final _$result = + _$v ?? new _$Location._( x: BuiltValueNullFieldError.checkNotNull(x, r'Location', 'x'), y: BuiltValueNullFieldError.checkNotNull(y, r'Location', 'y'), @@ -517,14 +689,22 @@ class _$CrosswordWord extends CrosswordWord { factory _$CrosswordWord([void Function(CrosswordWordBuilder)? updates]) => (new CrosswordWordBuilder()..update(updates))._build(); - _$CrosswordWord._( - {required this.word, required this.location, required this.direction}) - : super._() { + _$CrosswordWord._({ + required this.word, + required this.location, + required this.direction, + }) : super._() { BuiltValueNullFieldError.checkNotNull(word, r'CrosswordWord', 'word'); BuiltValueNullFieldError.checkNotNull( - location, r'CrosswordWord', 'location'); + location, + r'CrosswordWord', + 'location', + ); BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'); + direction, + r'CrosswordWord', + 'direction', + ); } @override @@ -609,13 +789,20 @@ class CrosswordWordBuilder _$CrosswordWord _build() { _$CrosswordWord _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordWord._( word: BuiltValueNullFieldError.checkNotNull( - word, r'CrosswordWord', 'word'), + word, + r'CrosswordWord', + 'word', + ), location: location.build(), direction: BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'), + direction, + r'CrosswordWord', + 'direction', + ), ); } catch (_) { late String _$failedField; @@ -624,7 +811,10 @@ class CrosswordWordBuilder location.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordWord', _$failedField, e.toString()); + r'CrosswordWord', + _$failedField, + e.toString(), + ); } rethrow; } @@ -641,21 +831,26 @@ class _$CrosswordCharacter extends CrosswordCharacter { @override final CrosswordWord? downWord; - factory _$CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) => - (new CrosswordCharacterBuilder()..update(updates))._build(); + factory _$CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) => (new CrosswordCharacterBuilder()..update(updates))._build(); - _$CrosswordCharacter._( - {required this.character, this.acrossWord, this.downWord}) - : super._() { + _$CrosswordCharacter._({ + required this.character, + this.acrossWord, + this.downWord, + }) : super._() { BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'); + character, + r'CrosswordCharacter', + 'character', + ); } @override CrosswordCharacter rebuild( - void Function(CrosswordCharacterBuilder) updates) => - (toBuilder()..update(updates)).build(); + void Function(CrosswordCharacterBuilder) updates, + ) => (toBuilder()..update(updates)).build(); @override CrosswordCharacterBuilder toBuilder() => @@ -739,10 +934,14 @@ class CrosswordCharacterBuilder _$CrosswordCharacter _build() { _$CrosswordCharacter _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordCharacter._( character: BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'), + character, + r'CrosswordCharacter', + 'character', + ), acrossWord: _acrossWord?.build(), downWord: _downWord?.build(), ); @@ -755,7 +954,10 @@ class CrosswordCharacterBuilder _downWord?.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordCharacter', _$failedField, e.toString()); + r'CrosswordCharacter', + _$failedField, + e.toString(), + ); } rethrow; } @@ -777,17 +979,20 @@ class _$Crossword extends Crossword { factory _$Crossword([void Function(CrosswordBuilder)? updates]) => (new CrosswordBuilder()..update(updates))._build(); - _$Crossword._( - {required this.width, - required this.height, - required this.words, - required this.characters}) - : super._() { + _$Crossword._({ + required this.width, + required this.height, + required this.words, + required this.characters, + }) : super._() { BuiltValueNullFieldError.checkNotNull(width, r'Crossword', 'width'); BuiltValueNullFieldError.checkNotNull(height, r'Crossword', 'height'); BuiltValueNullFieldError.checkNotNull(words, r'Crossword', 'words'); BuiltValueNullFieldError.checkNotNull( - characters, r'Crossword', 'characters'); + characters, + r'Crossword', + 'characters', + ); } @override @@ -883,12 +1088,19 @@ class CrosswordBuilder implements Builder { Crossword._fillCharacters(this); _$Crossword _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$Crossword._( width: BuiltValueNullFieldError.checkNotNull( - width, r'Crossword', 'width'), + width, + r'Crossword', + 'width', + ), height: BuiltValueNullFieldError.checkNotNull( - height, r'Crossword', 'height'), + height, + r'Crossword', + 'height', + ), words: words.build(), characters: characters.build(), ); @@ -901,7 +1113,10 @@ class CrosswordBuilder implements Builder { characters.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'Crossword', _$failedField, e.toString()); + r'Crossword', + _$failedField, + e.toString(), + ); } rethrow; } @@ -923,19 +1138,28 @@ class _$WorkQueue extends WorkQueue { factory _$WorkQueue([void Function(WorkQueueBuilder)? updates]) => (new WorkQueueBuilder()..update(updates))._build(); - _$WorkQueue._( - {required this.crossword, - required this.locationsToTry, - required this.badLocations, - required this.candidateWords}) - : super._() { + _$WorkQueue._({ + required this.crossword, + required this.locationsToTry, + required this.badLocations, + required this.candidateWords, + }) : super._() { BuiltValueNullFieldError.checkNotNull(crossword, r'WorkQueue', 'crossword'); BuiltValueNullFieldError.checkNotNull( - locationsToTry, r'WorkQueue', 'locationsToTry'); + locationsToTry, + r'WorkQueue', + 'locationsToTry', + ); BuiltValueNullFieldError.checkNotNull( - badLocations, r'WorkQueue', 'badLocations'); + badLocations, + r'WorkQueue', + 'badLocations', + ); BuiltValueNullFieldError.checkNotNull( - candidateWords, r'WorkQueue', 'candidateWords'); + candidateWords, + r'WorkQueue', + 'candidateWords', + ); } @override @@ -1034,7 +1258,8 @@ class WorkQueueBuilder implements Builder { _$WorkQueue _build() { _$WorkQueue _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$WorkQueue._( crossword: crossword.build(), locationsToTry: locationsToTry.build(), @@ -1054,7 +1279,10 @@ class WorkQueueBuilder implements Builder { candidateWords.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'WorkQueue', _$failedField, e.toString()); + r'WorkQueue', + _$failedField, + e.toString(), + ); } rethrow; } @@ -1078,23 +1306,38 @@ class _$DisplayInfo extends DisplayInfo { factory _$DisplayInfo([void Function(DisplayInfoBuilder)? updates]) => (new DisplayInfoBuilder()..update(updates))._build(); - _$DisplayInfo._( - {required this.wordsInGridCount, - required this.candidateWordsCount, - required this.locationsToExploreCount, - required this.knownBadLocationsCount, - required this.gridFilledPercentage}) - : super._() { + _$DisplayInfo._({ + required this.wordsInGridCount, + required this.candidateWordsCount, + required this.locationsToExploreCount, + required this.knownBadLocationsCount, + required this.gridFilledPercentage, + }) : super._() { BuiltValueNullFieldError.checkNotNull( - wordsInGridCount, r'DisplayInfo', 'wordsInGridCount'); + wordsInGridCount, + r'DisplayInfo', + 'wordsInGridCount', + ); BuiltValueNullFieldError.checkNotNull( - candidateWordsCount, r'DisplayInfo', 'candidateWordsCount'); + candidateWordsCount, + r'DisplayInfo', + 'candidateWordsCount', + ); BuiltValueNullFieldError.checkNotNull( - locationsToExploreCount, r'DisplayInfo', 'locationsToExploreCount'); + locationsToExploreCount, + r'DisplayInfo', + 'locationsToExploreCount', + ); BuiltValueNullFieldError.checkNotNull( - knownBadLocationsCount, r'DisplayInfo', 'knownBadLocationsCount'); + knownBadLocationsCount, + r'DisplayInfo', + 'knownBadLocationsCount', + ); BuiltValueNullFieldError.checkNotNull( - gridFilledPercentage, r'DisplayInfo', 'gridFilledPercentage'); + gridFilledPercentage, + r'DisplayInfo', + 'gridFilledPercentage', + ); } @override @@ -1197,20 +1440,34 @@ class DisplayInfoBuilder implements Builder { DisplayInfo build() => _build(); _$DisplayInfo _build() { - final _$result = _$v ?? + final _$result = + _$v ?? new _$DisplayInfo._( wordsInGridCount: BuiltValueNullFieldError.checkNotNull( - wordsInGridCount, r'DisplayInfo', 'wordsInGridCount'), + wordsInGridCount, + r'DisplayInfo', + 'wordsInGridCount', + ), candidateWordsCount: BuiltValueNullFieldError.checkNotNull( - candidateWordsCount, r'DisplayInfo', 'candidateWordsCount'), + candidateWordsCount, + r'DisplayInfo', + 'candidateWordsCount', + ), locationsToExploreCount: BuiltValueNullFieldError.checkNotNull( - locationsToExploreCount, - r'DisplayInfo', - 'locationsToExploreCount'), + locationsToExploreCount, + r'DisplayInfo', + 'locationsToExploreCount', + ), knownBadLocationsCount: BuiltValueNullFieldError.checkNotNull( - knownBadLocationsCount, r'DisplayInfo', 'knownBadLocationsCount'), + knownBadLocationsCount, + r'DisplayInfo', + 'knownBadLocationsCount', + ), gridFilledPercentage: BuiltValueNullFieldError.checkNotNull( - gridFilledPercentage, r'DisplayInfo', 'gridFilledPercentage'), + gridFilledPercentage, + r'DisplayInfo', + 'gridFilledPercentage', + ), ); replace(_$result); return _$result; diff --git a/generate_crossword/step_08/lib/providers.dart b/generate_crossword/step_08/lib/providers.dart index 658211c69d..01748b11d9 100644 --- a/generate_crossword/step_08/lib/providers.dart +++ b/generate_crossword/step_08/lib/providers.dart @@ -26,10 +26,16 @@ Future> wordList(Ref ref) async { final re = RegExp(r'^[a-z]+$'); final words = await rootBundle.loadString('assets/words.txt'); - return const LineSplitter().convert(words).toBuiltSet().rebuild((b) => b - ..map((word) => word.toLowerCase().trim()) - ..where((word) => word.length > 2) - ..where((word) => re.hasMatch(word))); + return const LineSplitter() + .convert(words) + .toBuiltSet() + .rebuild( + (b) => + b + ..map((word) => word.toLowerCase().trim()) + ..where((word) => word.length > 2) + ..where((word) => re.hasMatch(word)), + ); } /// An enumeration for different sizes of [model.Crossword]s. @@ -40,10 +46,7 @@ enum CrosswordSize { xlarge(width: 160, height: 88), xxlarge(width: 500, height: 500); - const CrosswordSize({ - required this.width, - required this.height, - }); + const CrosswordSize({required this.width, required this.height}); final int width; final int height; @@ -69,8 +72,10 @@ Stream workQueue(Ref ref) async* { final workers = ref.watch(workerCountProvider); final size = ref.watch(sizeProvider); final wordListAsync = ref.watch(wordListProvider); - final emptyCrossword = - model.Crossword.crossword(width: size.width, height: size.height); + final emptyCrossword = model.Crossword.crossword( + width: size.width, + height: size.height, + ); final emptyWorkQueue = model.WorkQueue.from( crossword: emptyCrossword, candidateWords: BuiltSet(), @@ -81,11 +86,12 @@ Stream workQueue(Ref ref) async* { ref.read(endTimeProvider.notifier).clear(); yield* wordListAsync.when( - data: (wordList) => exploreCrosswordSolutions( - crossword: emptyCrossword, - wordList: wordList, - maxWorkerCount: workers.count, - ), + data: + (wordList) => exploreCrosswordSolutions( + crossword: emptyCrossword, + wordList: wordList, + maxWorkerCount: workers.count, + ), error: (error, stackTrace) async* { debugPrint('Error loading word list: $error'); yield emptyWorkQueue; @@ -145,10 +151,11 @@ Duration expectedRemainingTime(Ref ref) { try { final soFar = DateTime.now().difference(startTime); final completedPercentage = min( - 0.99, - (workQueue.crossword.characters.length / - (workQueue.crossword.width * workQueue.crossword.height) / - _estimatedTotalCoverage)); + 0.99, + (workQueue.crossword.characters.length / + (workQueue.crossword.width * workQueue.crossword.height) / + _estimatedTotalCoverage), + ); final expectedTotal = soFar.inSeconds / completedPercentage; final expectedRemaining = expectedTotal - soFar.inSeconds; return Duration(seconds: expectedRemaining.toInt()); @@ -179,7 +186,9 @@ class ShowDisplayInfo extends _$ShowDisplayInfo { @riverpod class DisplayInfo extends _$DisplayInfo { @override - model.DisplayInfo build() => ref.watch(workQueueProvider).when( + model.DisplayInfo build() => ref + .watch(workQueueProvider) + .when( data: (workQueue) => model.DisplayInfo.from(workQueue: workQueue), error: (error, stackTrace) => model.DisplayInfo.empty, loading: () => model.DisplayInfo.empty, diff --git a/generate_crossword/step_08/lib/providers.g.dart b/generate_crossword/step_08/lib/providers.g.dart index c5660762c1..e29c2fd6fa 100644 --- a/generate_crossword/step_08/lib/providers.g.dart +++ b/generate_crossword/step_08/lib/providers.g.dart @@ -48,9 +48,10 @@ String _$expectedRemainingTimeHash() => final expectedRemainingTimeProvider = AutoDisposeProvider.internal( expectedRemainingTime, name: r'expectedRemainingTimeProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$expectedRemainingTimeHash, + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$expectedRemainingTimeHash, dependencies: null, allTransitiveDependencies: null, ); @@ -110,14 +111,15 @@ String _$showDisplayInfoHash() => r'75a0679db4cc1a0d5cfa7aa33afc633faf08fc24'; @ProviderFor(ShowDisplayInfo) final showDisplayInfoProvider = NotifierProvider.internal( - ShowDisplayInfo.new, - name: r'showDisplayInfoProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$showDisplayInfoHash, - dependencies: null, - allTransitiveDependencies: null, -); + ShowDisplayInfo.new, + name: r'showDisplayInfoProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$showDisplayInfoHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$ShowDisplayInfo = Notifier; String _$displayInfoHash() => r'6516f6bf346baa6914fdfffad1ccee8a5345a137'; @@ -128,13 +130,15 @@ String _$displayInfoHash() => r'6516f6bf346baa6914fdfffad1ccee8a5345a137'; @ProviderFor(DisplayInfo) final displayInfoProvider = AutoDisposeNotifierProvider.internal( - DisplayInfo.new, - name: r'displayInfoProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$displayInfoHash, - dependencies: null, - allTransitiveDependencies: null, -); + DisplayInfo.new, + name: r'displayInfoProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$displayInfoHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$DisplayInfo = AutoDisposeNotifier; String _$workerCountHash() => r'36dad09ba2cfe03b0879e7bf20059cec12e5118c'; @@ -145,13 +149,15 @@ String _$workerCountHash() => r'36dad09ba2cfe03b0879e7bf20059cec12e5118c'; @ProviderFor(WorkerCount) final workerCountProvider = NotifierProvider.internal( - WorkerCount.new, - name: r'workerCountProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$workerCountHash, - dependencies: null, - allTransitiveDependencies: null, -); + WorkerCount.new, + name: r'workerCountProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$workerCountHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$WorkerCount = Notifier; // ignore_for_file: type=lint diff --git a/generate_crossword/step_08/lib/widgets/crossword_generator_app.dart b/generate_crossword/step_08/lib/widgets/crossword_generator_app.dart index 58113f5b93..72f96bcee2 100644 --- a/generate_crossword/step_08/lib/widgets/crossword_generator_app.dart +++ b/generate_crossword/step_08/lib/widgets/crossword_generator_app.dart @@ -30,9 +30,7 @@ class CrosswordGeneratorApp extends StatelessWidget { builder: (context, ref, child) { return Stack( children: [ - Positioned.fill( - child: CrosswordWidget(), - ), + Positioned.fill(child: CrosswordWidget()), if (ref.watch(showDisplayInfoProvider)) CrosswordInfoWidget(), ], ); @@ -58,36 +56,39 @@ class _EagerInitialization extends ConsumerWidget { class _CrosswordGeneratorMenu extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) => MenuAnchor( - menuChildren: [ - for (final entry in CrosswordSize.values) - MenuItemButton( - onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), - leadingIcon: entry == ref.watch(sizeProvider) + menuChildren: [ + for (final entry in CrosswordSize.values) + MenuItemButton( + onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), + leadingIcon: + entry == ref.watch(sizeProvider) ? Icon(Icons.radio_button_checked_outlined) : Icon(Icons.radio_button_unchecked_outlined), - child: Text(entry.label), - ), - MenuItemButton( - leadingIcon: ref.watch(showDisplayInfoProvider) + child: Text(entry.label), + ), + MenuItemButton( + leadingIcon: + ref.watch(showDisplayInfoProvider) ? Icon(Icons.check_box_outlined) : Icon(Icons.check_box_outline_blank_outlined), - onPressed: () => - ref.read(showDisplayInfoProvider.notifier).toggle(), - child: Text('Display Info'), - ), - for (final count in BackgroundWorkers.values) - MenuItemButton( - leadingIcon: count == ref.watch(workerCountProvider) + onPressed: () => ref.read(showDisplayInfoProvider.notifier).toggle(), + child: Text('Display Info'), + ), + for (final count in BackgroundWorkers.values) + MenuItemButton( + leadingIcon: + count == ref.watch(workerCountProvider) ? Icon(Icons.radio_button_checked_outlined) : Icon(Icons.radio_button_unchecked_outlined), - onPressed: () => - ref.read(workerCountProvider.notifier).setCount(count), - child: Text(count.label), - ), - ], - builder: (context, controller, child) => IconButton( + onPressed: + () => ref.read(workerCountProvider.notifier).setCount(count), + child: Text(count.label), + ), + ], + builder: + (context, controller, child) => IconButton( onPressed: () => controller.open(), icon: Icon(Icons.settings), ), - ); + ); } diff --git a/generate_crossword/step_08/lib/widgets/crossword_info_widget.dart b/generate_crossword/step_08/lib/widgets/crossword_info_widget.dart index 31c0affe1a..ebdc2ef73b 100644 --- a/generate_crossword/step_08/lib/widgets/crossword_info_widget.dart +++ b/generate_crossword/step_08/lib/widgets/crossword_info_widget.dart @@ -10,9 +10,7 @@ import '../utils.dart'; import 'ticker_builder.dart'; class CrosswordInfoWidget extends ConsumerWidget { - const CrosswordInfoWidget({ - super.key, - }); + const CrosswordInfoWidget({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -26,64 +24,72 @@ class CrosswordInfoWidget extends ConsumerWidget { return Align( alignment: Alignment.bottomRight, child: Padding( - padding: const EdgeInsets.only( - right: 32.0, - bottom: 32.0, - ), + padding: const EdgeInsets.only(right: 32.0, bottom: 32.0), child: ClipRRect( borderRadius: BorderRadius.circular(8), child: ColoredBox( color: Theme.of(context).colorScheme.onPrimary.withAlpha(230), child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 12, - vertical: 8, - ), + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), child: DefaultTextStyle( style: TextStyle( - fontSize: 16, color: Theme.of(context).colorScheme.primary), + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ _CrosswordInfoRichText( - label: 'Grid Size', - value: '${size.width} x ${size.height}'), + label: 'Grid Size', + value: '${size.width} x ${size.height}', + ), _CrosswordInfoRichText( - label: 'Words in grid', - value: displayInfo.wordsInGridCount), + label: 'Words in grid', + value: displayInfo.wordsInGridCount, + ), _CrosswordInfoRichText( - label: 'Candidate words', - value: displayInfo.candidateWordsCount), + label: 'Candidate words', + value: displayInfo.candidateWordsCount, + ), _CrosswordInfoRichText( - label: 'Locations to explore', - value: displayInfo.locationsToExploreCount), + label: 'Locations to explore', + value: displayInfo.locationsToExploreCount, + ), _CrosswordInfoRichText( - label: 'Known bad locations', - value: displayInfo.knownBadLocationsCount), + label: 'Known bad locations', + value: displayInfo.knownBadLocationsCount, + ), _CrosswordInfoRichText( - label: 'Grid filled', - value: displayInfo.gridFilledPercentage), + label: 'Grid filled', + value: displayInfo.gridFilledPercentage, + ), _CrosswordInfoRichText( - label: 'Max worker count', value: workerCount), + label: 'Max worker count', + value: workerCount, + ), switch ((startTime, endTime)) { (null, _) => _CrosswordInfoRichText( - label: 'Time elapsed', - value: 'Not started yet', - ), + label: 'Time elapsed', + value: 'Not started yet', + ), (DateTime start, null) => TickerBuilder( - builder: (context) => _CrosswordInfoRichText( - label: 'Time elapsed', - value: DateTime.now().difference(start).formatted, - ), - ), + builder: + (context) => _CrosswordInfoRichText( + label: 'Time elapsed', + value: DateTime.now().difference(start).formatted, + ), + ), (DateTime start, DateTime end) => _CrosswordInfoRichText( - label: 'Completed in', - value: end.difference(start).formatted), + label: 'Completed in', + value: end.difference(start).formatted, + ), }, if (startTime != null && endTime == null) _CrosswordInfoRichText( - label: 'Est. remaining', value: remaining.formatted), + label: 'Est. remaining', + value: remaining.formatted, + ), ], ), ), @@ -103,19 +109,16 @@ class _CrosswordInfoRichText extends StatelessWidget { @override Widget build(BuildContext context) => RichText( - text: TextSpan( - children: [ - TextSpan( - text: '$label ', - style: DefaultTextStyle.of(context).style, - ), - TextSpan( - text: value, - style: DefaultTextStyle.of(context) - .style - .copyWith(fontWeight: FontWeight.bold), - ), - ], + text: TextSpan( + children: [ + TextSpan(text: '$label ', style: DefaultTextStyle.of(context).style), + TextSpan( + text: value, + style: DefaultTextStyle.of( + context, + ).style.copyWith(fontWeight: FontWeight.bold), ), - ); + ], + ), + ); } diff --git a/generate_crossword/step_08/lib/widgets/crossword_widget.dart b/generate_crossword/step_08/lib/widgets/crossword_widget.dart index 23b2678ff5..955436b7da 100644 --- a/generate_crossword/step_08/lib/widgets/crossword_widget.dart +++ b/generate_crossword/step_08/lib/widgets/crossword_widget.dart @@ -44,8 +44,9 @@ class CrosswordWidget extends ConsumerWidget { final explorationCell = ref.watch( workQueueProvider.select( (workQueueAsync) => workQueueAsync.when( - data: (workQueue) => - workQueue.locationsToTry.keys.contains(location), + data: + (workQueue) => + workQueue.locationsToTry.keys.contains(location), error: (error, stackTrace) => false, loading: () => false, ), @@ -56,18 +57,20 @@ class CrosswordWidget extends ConsumerWidget { return AnimatedContainer( duration: Durations.extralong1, curve: Curves.easeInOut, - color: explorationCell - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary, + color: + explorationCell + ? Theme.of(context).colorScheme.primary + : Theme.of(context).colorScheme.onPrimary, child: Center( child: AnimatedDefaultTextStyle( duration: Durations.extralong1, curve: Curves.easeInOut, style: TextStyle( fontSize: 24, - color: explorationCell - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.primary, + color: + explorationCell + ? Theme.of(context).colorScheme.onPrimary + : Theme.of(context).colorScheme.primary, ), child: Text(character.character), ), @@ -89,9 +92,11 @@ class CrosswordWidget extends ConsumerWidget { foregroundDecoration: TableSpanDecoration( border: TableSpanBorder( leading: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), trailing: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ), ); diff --git a/generate_crossword/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 070fd74eff..5845d19a0a 100644 --- a/generate_crossword/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_08/pubspec.yaml b/generate_crossword/step_08/pubspec.yaml index 701f231c6a..a4e12dc3f1 100644 --- a/generate_crossword/step_08/pubspec.yaml +++ b/generate_crossword/step_08/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter built_collection: ^5.1.1 built_value: ^8.9.3 - characters: ^1.3.0 + characters: ^1.4.0 flutter_riverpod: ^2.6.1 intl: ^0.20.2 riverpod: ^2.6.1 diff --git a/generate_crossword/step_08/test/model_test.dart b/generate_crossword/step_08/test/model_test.dart index f11e1addb1..342c515ec1 100644 --- a/generate_crossword/step_08/test/model_test.dart +++ b/generate_crossword/step_08/test/model_test.dart @@ -39,28 +39,27 @@ void main() { expect(crossword.words.isNotEmpty, true); expect(crossword.words.length, 2); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 1, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .length, + 1, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 7); expect( - crossword.characters[topLeft], - CrosswordCharacter.character( - acrossWord: thisWord, - downWord: thatWord, - character: 't', - )); + crossword.characters[topLeft], + CrosswordCharacter.character( + acrossWord: thisWord, + downWord: thatWord, + character: 't', + ), + ); expect(crossword.valid, isTrue); }); @@ -86,19 +85,17 @@ void main() { expect(crossword.words.isNotEmpty, true); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 2); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 2, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .isEmpty, - true); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .isEmpty, + true, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 8); expect(crossword.valid, isFalse); @@ -108,11 +105,12 @@ void main() { Crossword crossword = Crossword.crossword(width: 50, height: 50); expect(crossword.valid, true); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'this', - )!; + crossword = + crossword.addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'this', + )!; expect(crossword.valid, true); final crossword2 = crossword.addWord( @@ -174,17 +172,18 @@ void main() { final topLeft = Location.at(0, 0); - crossword = crossword - .addWord( - location: topLeft, - word: 'this', - direction: Direction.down, - )! - .addWord( - location: topLeft, - word: 'total', - direction: Direction.across, - )!; + crossword = + crossword + .addWord( + location: topLeft, + word: 'this', + direction: Direction.down, + )! + .addWord( + location: topLeft, + word: 'total', + direction: Direction.across, + )!; expect(crossword.valid, isTrue); @@ -235,77 +234,85 @@ void main() { }); test('Crossword is not valid with run-on across words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on across/down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down/across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); @@ -313,36 +320,40 @@ void main() { test('Adding duplicate across words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.across, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -350,36 +361,40 @@ void main() { test('Adding duplicate down words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.down, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate down words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -393,10 +408,12 @@ void main() { ); expect(queue.locationsToTry.length, 1); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word')!; + crossword = + crossword.addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + )!; queue = WorkQueue.from( crossword: crossword, candidateWords: ['words', 'and', 'moar', 'wordz'], @@ -404,21 +421,26 @@ void main() { ); expect(queue.locationsToTry.length, 4); expect( - queue.locationsToTry.entries - .every((element) => element.value == Direction.down), - isTrue); + queue.locationsToTry.entries.every( + (element) => element.value == Direction.down, + ), + isTrue, + ); final entries = queue.locationsToTry.entries; expect(entries.every((element) => element.key.y == 0), isTrue); - expect(entries.map((element) => element.key.x).toBuiltSet(), - equals(BuiltSet([0, 1, 2, 3]))); + expect( + entries.map((element) => element.key.x).toBuiltSet(), + equals(BuiltSet([0, 1, 2, 3])), + ); }); test('WorkQueue from down word', () { - Crossword crossword = Crossword.crossword(width: 50, height: 50).addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - )!; + Crossword crossword = + Crossword.crossword(width: 50, height: 50).addWord( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + )!; WorkQueue queue = WorkQueue.from( crossword: crossword, @@ -427,27 +449,32 @@ void main() { ); expect(queue.locationsToTry.length, 4); expect( - queue.locationsToTry.entries - .every((element) => element.value == Direction.across), - isTrue); + queue.locationsToTry.entries.every( + (element) => element.value == Direction.across, + ), + isTrue, + ); final entries = queue.locationsToTry.entries; expect(entries.every((element) => element.key.x == 0), isTrue); - expect(entries.map((element) => element.key.y).toBuiltSet(), - equals(BuiltSet([0, 1, 2, 3]))); + expect( + entries.map((element) => element.key.y).toBuiltSet(), + equals(BuiltSet([0, 1, 2, 3])), + ); }); test('WorkQueue from two words', () { - Crossword crossword = Crossword.crossword(width: 50, height: 50) - .addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - )! - .addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'work', - )!; + Crossword crossword = + Crossword.crossword(width: 50, height: 50) + .addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + )! + .addWord( + direction: Direction.down, + location: Location.at(0, 0), + word: 'work', + )!; WorkQueue queue = WorkQueue.from( crossword: crossword, @@ -455,27 +482,31 @@ void main() { startLocation: Location.at(0, 0), ); expect( - queue.locationsToTry, - equals(BuiltMap({ + queue.locationsToTry, + equals( + BuiltMap({ Location.at(2, 0): Direction.down, Location.at(0, 2): Direction.across, Location.at(3, 0): Direction.down, Location.at(0, 3): Direction.across, - }))); + }), + ), + ); }); test('WorkQueue removes used words from candidate list', () { - Crossword crossword = Crossword.crossword(width: 50, height: 50) - .addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - )! - .addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'work', - )!; + Crossword crossword = + Crossword.crossword(width: 50, height: 50) + .addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + )! + .addWord( + direction: Direction.down, + location: Location.at(0, 0), + word: 'work', + )!; WorkQueue queue = WorkQueue.from( crossword: crossword, diff --git a/generate_crossword/step_09/android/.gitignore b/generate_crossword/step_09/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/generate_crossword/step_09/android/.gitignore +++ b/generate_crossword/step_09/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/generate_crossword/step_09/android/app/build.gradle b/generate_crossword/step_09/android/app/build.gradle deleted file mode 100644 index d4a93e6565..0000000000 --- a/generate_crossword/step_09/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.generate_crossword" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.generate_crossword" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/generate_crossword/step_09/android/app/build.gradle.kts b/generate_crossword/step_09/android/app/build.gradle.kts new file mode 100644 index 0000000000..9a7651c2a6 --- /dev/null +++ b/generate_crossword/step_09/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.generate_crossword" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.generate_crossword" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/generate_crossword/step_09/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt b/generate_crossword/step_09/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt index 7011ed9ff4..e1bbbdcb4c 100644 --- a/generate_crossword/step_09/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt +++ b/generate_crossword/step_09/android/app/src/main/kotlin/com/example/generate_crossword/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.generate_crossword import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/generate_crossword/step_09/android/build.gradle b/generate_crossword/step_09/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/generate_crossword/step_09/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/generate_crossword/step_09/android/build.gradle.kts b/generate_crossword/step_09/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/generate_crossword/step_09/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/generate_crossword/step_09/android/gradle.properties b/generate_crossword/step_09/android/gradle.properties index 2597170821..f018a61817 100644 --- a/generate_crossword/step_09/android/gradle.properties +++ b/generate_crossword/step_09/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/generate_crossword/step_09/android/gradle/wrapper/gradle-wrapper.properties b/generate_crossword/step_09/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/generate_crossword/step_09/android/gradle/wrapper/gradle-wrapper.properties +++ b/generate_crossword/step_09/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/generate_crossword/step_09/android/settings.gradle b/generate_crossword/step_09/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/generate_crossword/step_09/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/generate_crossword/step_09/android/settings.gradle.kts b/generate_crossword/step_09/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/generate_crossword/step_09/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/generate_crossword/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/generate_crossword/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_09/lib/isolates.dart b/generate_crossword/step_09/lib/isolates.dart index bc16c4f074..91f8015800 100644 --- a/generate_crossword/step_09/lib/isolates.dart +++ b/generate_crossword/step_09/lib/isolates.dart @@ -29,24 +29,35 @@ Stream exploreCrosswordSolutions({ } } - debugPrint('Generated ${workQueue.crossword.width} x ' - '${workQueue.crossword.height} crossword in ' - '${DateTime.now().difference(start).formatted} ' - 'with $maxWorkerCount workers.'); + debugPrint( + 'Generated ${workQueue.crossword.width} x ' + '${workQueue.crossword.height} crossword in ' + '${DateTime.now().difference(start).formatted} ' + 'with $maxWorkerCount workers.', + ); } Future _generate((WorkQueue, int) workMessage) async { var (workQueue, maxWorkerCount) = workMessage; final candidateGeneratorFutures = >[]; - final locations = workQueue.locationsToTry.keys.toBuiltList().rebuild((b) => b - ..shuffle() - ..take(maxWorkerCount)); + final locations = workQueue.locationsToTry.keys.toBuiltList().rebuild( + (b) => + b + ..shuffle() + ..take(maxWorkerCount), + ); for (final location in locations) { final direction = workQueue.locationsToTry[location]!; - candidateGeneratorFutures.add(compute(_generateCandidate, - (workQueue.crossword, workQueue.candidateWords, location, direction))); + candidateGeneratorFutures.add( + compute(_generateCandidate, ( + workQueue.crossword, + workQueue.candidateWords, + location, + direction, + )), + ); } try { @@ -55,7 +66,10 @@ Future _generate((WorkQueue, int) workMessage) async { for (final (location, direction, word) in results) { if (word != null) { final candidate = crossword.addWord( - location: location, word: word, direction: direction); + location: location, + word: word, + direction: direction, + ); if (candidate != null) { crossword = candidate; } @@ -73,7 +87,8 @@ Future _generate((WorkQueue, int) workMessage) async { } (Location, Direction, String?) _generateCandidate( - (Crossword, BuiltSet, Location, Direction) searchDetailMessage) { + (Crossword, BuiltSet, Location, Direction) searchDetailMessage, +) { final (crossword, candidateWords, location, direction) = searchDetailMessage; final target = crossword.characters[location]; @@ -83,9 +98,12 @@ Future _generate((WorkQueue, int) workMessage) async { // Filter down the candidate word list to those that contain the letter // at the current location - final words = candidateWords.toBuiltList().rebuild((b) => b - ..where((b) => b.characters.contains(target.character)) - ..shuffle()); + final words = candidateWords.toBuiltList().rebuild( + (b) => + b + ..where((b) => b.characters.contains(target.character)) + ..shuffle(), + ); int tryCount = 0; final start = DateTime.now(); for (final word in words) { diff --git a/generate_crossword/step_09/lib/model.dart b/generate_crossword/step_09/lib/model.dart index 45963c9ae1..2a390bf1a5 100644 --- a/generate_crossword/step_09/lib/model.dart +++ b/generate_crossword/step_09/lib/model.dart @@ -90,7 +90,10 @@ abstract class CrosswordWord static int locationComparator(CrosswordWord a, CrosswordWord b) { final compareRows = a.location.y.compareTo(b.location.y); final compareColumns = a.location.x.compareTo(b.location.x); - return switch (compareColumns) { 0 => compareRows, _ => compareColumns }; + return switch (compareColumns) { + 0 => compareRows, + _ => compareColumns, + }; } /// Constructor for [CrosswordWord]. @@ -99,10 +102,13 @@ abstract class CrosswordWord required Location location, required Direction direction, }) { - return CrosswordWord((b) => b - ..word = word - ..direction = direction - ..location.replace(location)); + return CrosswordWord( + (b) => + b + ..word = word + ..direction = direction + ..location.replace(location), + ); } /// Constructor for [CrosswordWord]. @@ -149,9 +155,9 @@ abstract class CrosswordCharacter /// Constructor for [CrosswordCharacter]. /// Use [CrosswordCharacter.character] instead. - factory CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) = - _$CrosswordCharacter; + factory CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) = _$CrosswordCharacter; CrosswordCharacter._(); } @@ -286,14 +292,15 @@ abstract class Crossword implements Built { } final candidate = rebuild( - (b) => b - ..words.add( - CrosswordWord.word( - word: word, - direction: direction, - location: location, - ), - ), + (b) => + b + ..words.add( + CrosswordWord.word( + word: word, + direction: direction, + location: location, + ), + ), ); if (candidate.valid) { @@ -315,19 +322,21 @@ abstract class Crossword implements Built { b.characters.updateValue( word.location.rightOffset(idx), (b) => b.rebuild((bInner) => bInner.acrossWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - acrossWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + acrossWord: word, + character: character, + ), ); case Direction.down: b.characters.updateValue( word.location.downOffset(idx), (b) => b.rebuild((bInner) => bInner.downWord.replace(word)), - ifAbsent: () => CrosswordCharacter.character( - downWord: word, - character: character, - ), + ifAbsent: + () => CrosswordCharacter.character( + downWord: word, + character: character, + ), ); } } @@ -341,7 +350,8 @@ abstract class Crossword implements Built { final grid = List.generate( height, (_) => List.generate( - width, (_) => '░', // https://www.compart.com/en/unicode/U+2591 + width, + (_) => '░', // https://www.compart.com/en/unicode/U+2591 ), ); @@ -421,40 +431,44 @@ abstract class WorkQueue implements Built { required Crossword crossword, required Iterable candidateWords, required Location startLocation, - }) => - WorkQueue((b) { - if (crossword.words.isEmpty) { - // Strip candidate words too long to fit in the crossword - b.candidateWords.addAll(candidateWords - .where((word) => word.characters.length <= crossword.width)); - - b.crossword.replace(crossword); - - b.locationsToTry.addAll({startLocation: Direction.across}); - } else { - // Assuming words have already been stripped to length - b.candidateWords.addAll( - candidateWords.toBuiltSet().rebuild( - (b) => b.removeAll(crossword.words.map((word) => word.word))), - ); - b.crossword.replace(crossword); - crossword.characters - .rebuild((b) => b.removeWhere((location, character) { - if (character.acrossWord != null && - character.downWord != null) { - return true; - } - final left = crossword.characters[location.left]; - if (left != null && left.downWord != null) return true; - final right = crossword.characters[location.right]; - if (right != null && right.downWord != null) return true; - final up = crossword.characters[location.up]; - if (up != null && up.acrossWord != null) return true; - final down = crossword.characters[location.down]; - if (down != null && down.acrossWord != null) return true; - return false; - })) - .forEach((location, character) { + }) => WorkQueue((b) { + if (crossword.words.isEmpty) { + // Strip candidate words too long to fit in the crossword + b.candidateWords.addAll( + candidateWords.where( + (word) => word.characters.length <= crossword.width, + ), + ); + + b.crossword.replace(crossword); + + b.locationsToTry.addAll({startLocation: Direction.across}); + } else { + // Assuming words have already been stripped to length + b.candidateWords.addAll( + candidateWords.toBuiltSet().rebuild( + (b) => b.removeAll(crossword.words.map((word) => word.word)), + ), + ); + b.crossword.replace(crossword); + crossword.characters + .rebuild( + (b) => b.removeWhere((location, character) { + if (character.acrossWord != null && character.downWord != null) { + return true; + } + final left = crossword.characters[location.left]; + if (left != null && left.downWord != null) return true; + final right = crossword.characters[location.right]; + if (right != null && right.downWord != null) return true; + final up = crossword.characters[location.up]; + if (up != null && up.acrossWord != null) return true; + final down = crossword.characters[location.down]; + if (down != null && down.acrossWord != null) return true; + return false; + }), + ) + .forEach((location, character) { b.locationsToTry.addAll({ location: switch ((character.acrossWord, character.downWord)) { (null, null) => @@ -462,28 +476,36 @@ abstract class WorkQueue implements Built { (null, _) => Direction.across, (_, null) => Direction.down, (_, _) => throw StateError('Character is part of two words'), - } + }, }); }); - } - }); + } + }); - WorkQueue remove(Location location) => rebuild((b) => b - ..locationsToTry.remove(location) - ..badLocations.add(location)); + WorkQueue remove(Location location) => rebuild( + (b) => + b + ..locationsToTry.remove(location) + ..badLocations.add(location), + ); /// Update the work queue from a crossword derived from the current crossword /// that this work queue is built from. WorkQueue updateFrom(final Crossword crossword) => WorkQueue.from( - crossword: crossword, - candidateWords: candidateWords, - startLocation: locationsToTry.isNotEmpty + crossword: crossword, + candidateWords: candidateWords, + startLocation: + locationsToTry.isNotEmpty ? locationsToTry.keys.first : Location.at(0, 0), - ).rebuild((b) => b - ..badLocations.addAll(badLocations) - ..locationsToTry - .removeWhere((location, _) => badLocations.contains(location))); + ).rebuild( + (b) => + b + ..badLocations.addAll(badLocations) + ..locationsToTry.removeWhere( + (location, _) => badLocations.contains(location), + ), + ); /// Factory constructor for [WorkQueue] factory WorkQueue([void Function(WorkQueueBuilder)? updates]) = _$WorkQueue; @@ -512,25 +534,35 @@ abstract class DisplayInfo implements Built { /// Construct a [DisplayInfo] instance from a [WorkQueue]. factory DisplayInfo.from({required WorkQueue workQueue}) { - final gridFilled = (workQueue.crossword.characters.length / - (workQueue.crossword.width * workQueue.crossword.height)); + final gridFilled = + (workQueue.crossword.characters.length / + (workQueue.crossword.width * workQueue.crossword.height)); final fmt = NumberFormat.decimalPattern(); - return DisplayInfo((b) => b - ..wordsInGridCount = fmt.format(workQueue.crossword.words.length) - ..candidateWordsCount = fmt.format(workQueue.candidateWords.length) - ..locationsToExploreCount = fmt.format(workQueue.locationsToTry.length) - ..knownBadLocationsCount = fmt.format(workQueue.badLocations.length) - ..gridFilledPercentage = '${(gridFilled * 100).toStringAsFixed(2)}%'); + return DisplayInfo( + (b) => + b + ..wordsInGridCount = fmt.format(workQueue.crossword.words.length) + ..candidateWordsCount = fmt.format(workQueue.candidateWords.length) + ..locationsToExploreCount = fmt.format( + workQueue.locationsToTry.length, + ) + ..knownBadLocationsCount = fmt.format(workQueue.badLocations.length) + ..gridFilledPercentage = + '${(gridFilled * 100).toStringAsFixed(2)}%', + ); } /// An empty [DisplayInfo] instance. - static DisplayInfo get empty => DisplayInfo((b) => b - ..wordsInGridCount = '0' - ..candidateWordsCount = '0' - ..locationsToExploreCount = '0' - ..knownBadLocationsCount = '0' - ..gridFilledPercentage = '0%'); + static DisplayInfo get empty => DisplayInfo( + (b) => + b + ..wordsInGridCount = '0' + ..candidateWordsCount = '0' + ..locationsToExploreCount = '0' + ..knownBadLocationsCount = '0' + ..gridFilledPercentage = '0%', + ); factory DisplayInfo([void Function(DisplayInfoBuilder)? updates]) = _$DisplayInfo; @@ -572,20 +604,24 @@ abstract class CrosswordPuzzleGame if (puzzle.selectedWords .where((b) => b.direction == direction && b.location == location) .isNotEmpty) { - puzzle = puzzle.rebuild((b) => b - ..selectedWords.removeWhere( - (selectedWord) => - selectedWord.location == location && - selectedWord.direction == direction, - )); + puzzle = puzzle.rebuild( + (b) => + b + ..selectedWords.removeWhere( + (selectedWord) => + selectedWord.location == location && + selectedWord.direction == direction, + ), + ); } return null != puzzle.crosswordFromSelectedWords.addWord( - location: location, - word: word, - direction: direction, - requireOverlap: false); + location: location, + word: word, + direction: direction, + requireOverlap: false, + ); } CrosswordPuzzleGame? selectWord({ @@ -608,33 +644,44 @@ abstract class CrosswordPuzzleGame if (puzzle.selectedWords .where((b) => b.direction == direction && b.location == location) .isNotEmpty) { - puzzle = puzzle.rebuild((b) => b - ..selectedWords.removeWhere( - (selectedWord) => - selectedWord.location == location && - selectedWord.direction == direction, - )); + puzzle = puzzle.rebuild( + (b) => + b + ..selectedWords.removeWhere( + (selectedWord) => + selectedWord.location == location && + selectedWord.direction == direction, + ), + ); } // Check if the selected word meshes with the already selected words. // Note this version of the crossword does not enforce overlap to // allow the player to select words anywhere on the grid. Enforcing words // to be solved in order is a possible alternative. - final updatedSelectedWordsCrossword = - puzzle.crosswordFromSelectedWords.addWord( - location: location, - word: word, - direction: direction, - requireOverlap: false, - ); + final updatedSelectedWordsCrossword = puzzle.crosswordFromSelectedWords + .addWord( + location: location, + word: word, + direction: direction, + requireOverlap: false, + ); // Make sure the selected word is in the crossword or is an alternate word. if (updatedSelectedWordsCrossword != null) { if (puzzle.crossword.words.contains(crosswordWord) || puzzle.alternateWords[location]?[direction]?.contains(word) == true) { - return puzzle.rebuild((b) => b - ..selectedWords.add(CrosswordWord.word( - word: word, location: location, direction: direction))); + return puzzle.rebuild( + (b) => + b + ..selectedWords.add( + CrosswordWord.word( + word: word, + location: location, + direction: direction, + ), + ), + ); } } return null; @@ -642,7 +689,10 @@ abstract class CrosswordPuzzleGame /// The crossword from the selected words. Crossword get crosswordFromSelectedWords => Crossword.crossword( - width: crossword.width, height: crossword.height, words: selectedWords); + width: crossword.width, + height: crossword.height, + words: selectedWords, + ); /// Test if the puzzle is solved. Note, this allows for the possibility of /// multiple solutions. @@ -658,8 +708,9 @@ abstract class CrosswordPuzzleGame required BuiltSet candidateWords, }) { // Remove all of the currently used words from the list of candidates - candidateWords = candidateWords - .rebuild((p0) => p0.removeAll(crossword.words.map((p1) => p1.word))); + candidateWords = candidateWords.rebuild( + (p0) => p0.removeAll(crossword.words.map((p1) => p1.word)), + ); // This is the list of alternate words for each word in the crossword var alternates = @@ -667,14 +718,18 @@ abstract class CrosswordPuzzleGame // Build the alternate words for each word in the crossword for (final crosswordWord in crossword.words) { - final alternateWords = candidateWords.toBuiltList().rebuild((b) => b - ..where((b) => b.length == crosswordWord.word.length) - ..shuffle() - ..take(4) - ..sort()); + final alternateWords = candidateWords.toBuiltList().rebuild( + (b) => + b + ..where((b) => b.length == crosswordWord.word.length) + ..shuffle() + ..take(4) + ..sort(), + ); - candidateWords = - candidateWords.rebuild((b) => b.removeAll(alternateWords)); + candidateWords = candidateWords.rebuild( + (b) => b.removeAll(alternateWords), + ); alternates = alternates.rebuild( (b) => b.updateValue( @@ -698,9 +753,9 @@ abstract class CrosswordPuzzleGame }); } - factory CrosswordPuzzleGame( - [void Function(CrosswordPuzzleGameBuilder)? updates]) = - _$CrosswordPuzzleGame; + factory CrosswordPuzzleGame([ + void Function(CrosswordPuzzleGameBuilder)? updates, + ]) = _$CrosswordPuzzleGame; CrosswordPuzzleGame._(); } diff --git a/generate_crossword/step_09/lib/model.g.dart b/generate_crossword/step_09/lib/model.g.dart index 2a1c9c597e..ec4b5e7d67 100644 --- a/generate_crossword/step_09/lib/model.g.dart +++ b/generate_crossword/step_09/lib/model.g.dart @@ -6,47 +6,60 @@ part of 'model.dart'; // BuiltValueGenerator // ************************************************************************** -Serializers _$serializers = (new Serializers().toBuilder() - ..add(Crossword.serializer) - ..add(CrosswordCharacter.serializer) - ..add(CrosswordPuzzleGame.serializer) - ..add(CrosswordWord.serializer) - ..add(DisplayInfo.serializer) - ..add(Location.serializer) - ..add(WorkQueue.serializer) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(CrosswordWord)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ]), - () => new MapBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, const [ - const FullType(Location), +Serializers _$serializers = + (new Serializers().toBuilder() + ..add(Crossword.serializer) + ..add(CrosswordCharacter.serializer) + ..add(CrosswordPuzzleGame.serializer) + ..add(CrosswordWord.serializer) + ..add(DisplayInfo.serializer) + ..add(Location.serializer) + ..add(WorkQueue.serializer) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(CrosswordWord)]), + () => new ListBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + () => new MapBuilder(), + ) + ..addBuilderFactory( const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(BuiltMap, const [ + const FullType(Direction), + const FullType(BuiltList, const [const FullType(String)]), + ]), + ]), + () => + new MapBuilder< + Location, + BuiltMap> + >(), + ) + ..addBuilderFactory( + const FullType(BuiltList, const [const FullType(CrosswordWord)]), + () => new ListBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltMap, const [ + const FullType(Location), const FullType(Direction), - const FullType(BuiltList, const [const FullType(String)]) - ]) - ]), - () => new MapBuilder>>()) - ..addBuilderFactory( - const FullType(BuiltList, const [const FullType(CrosswordWord)]), - () => new ListBuilder()) - ..addBuilderFactory( - const FullType(BuiltMap, - const [const FullType(Location), const FullType(Direction)]), - () => new MapBuilder()) - ..addBuilderFactory( - const FullType(BuiltSet, const [const FullType(Location)]), - () => new SetBuilder()) - ..addBuilderFactory( - const FullType(BuiltSet, const [const FullType(String)]), - () => new SetBuilder())) - .build(); + ]), + () => new MapBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltSet, const [const FullType(Location)]), + () => new SetBuilder(), + ) + ..addBuilderFactory( + const FullType(BuiltSet, const [const FullType(String)]), + () => new SetBuilder(), + )) + .build(); Serializer _$locationSerializer = new _$LocationSerializer(); Serializer _$crosswordWordSerializer = new _$CrosswordWordSerializer(); @@ -65,8 +78,11 @@ class _$LocationSerializer implements StructuredSerializer { final String wireName = 'Location'; @override - Iterable serialize(Serializers serializers, Location object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Location object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'x', serializers.serialize(object.x, specifiedType: const FullType(int)), @@ -78,8 +94,11 @@ class _$LocationSerializer implements StructuredSerializer { } @override - Location deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Location deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new LocationBuilder(); final iterator = serialized.iterator; @@ -89,12 +108,20 @@ class _$LocationSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'x': - result.x = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.x = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'y': - result.y = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.y = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; } } @@ -110,17 +137,24 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final String wireName = 'CrosswordWord'; @override - Iterable serialize(Serializers serializers, CrosswordWord object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + CrosswordWord object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'word', serializers.serialize(object.word, specifiedType: const FullType(String)), 'location', - serializers.serialize(object.location, - specifiedType: const FullType(Location)), + serializers.serialize( + object.location, + specifiedType: const FullType(Location), + ), 'direction', - serializers.serialize(object.direction, - specifiedType: const FullType(Direction)), + serializers.serialize( + object.direction, + specifiedType: const FullType(Direction), + ), ]; return result; @@ -128,8 +162,10 @@ class _$CrosswordWordSerializer implements StructuredSerializer { @override CrosswordWord deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordWordBuilder(); final iterator = serialized.iterator; @@ -139,16 +175,29 @@ class _$CrosswordWordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'word': - result.word = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.word = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'location': - result.location.replace(serializers.deserialize(value, - specifiedType: const FullType(Location))! as Location); + result.location.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Location), + )! + as Location, + ); break; case 'direction': - result.direction = serializers.deserialize(value, - specifiedType: const FullType(Direction))! as Direction; + result.direction = + serializers.deserialize( + value, + specifiedType: const FullType(Direction), + )! + as Direction; break; } } @@ -166,35 +215,49 @@ class _$CrosswordCharacterSerializer @override Iterable serialize( - Serializers serializers, CrosswordCharacter object, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + CrosswordCharacter object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'character', - serializers.serialize(object.character, - specifiedType: const FullType(String)), + serializers.serialize( + object.character, + specifiedType: const FullType(String), + ), ]; Object? value; value = object.acrossWord; if (value != null) { result ..add('acrossWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } value = object.downWord; if (value != null) { result ..add('downWord') - ..add(serializers.serialize(value, - specifiedType: const FullType(CrosswordWord))); + ..add( + serializers.serialize( + value, + specifiedType: const FullType(CrosswordWord), + ), + ); } return result; } @override CrosswordCharacter deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordCharacterBuilder(); final iterator = serialized.iterator; @@ -204,16 +267,30 @@ class _$CrosswordCharacterSerializer final Object? value = iterator.current; switch (key) { case 'character': - result.character = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.character = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'acrossWord': - result.acrossWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.acrossWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; case 'downWord': - result.downWord.replace(serializers.deserialize(value, - specifiedType: const FullType(CrosswordWord))! as CrosswordWord); + result.downWord.replace( + serializers.deserialize( + value, + specifiedType: const FullType(CrosswordWord), + )! + as CrosswordWord, + ); break; } } @@ -229,31 +306,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final String wireName = 'Crossword'; @override - Iterable serialize(Serializers serializers, Crossword object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + Crossword object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'width', serializers.serialize(object.width, specifiedType: const FullType(int)), 'height', serializers.serialize(object.height, specifiedType: const FullType(int)), 'words', - serializers.serialize(object.words, - specifiedType: - const FullType(BuiltList, const [const FullType(CrosswordWord)])), + serializers.serialize( + object.words, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + ), 'characters', - serializers.serialize(object.characters, - specifiedType: const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(CrosswordCharacter) - ])), + serializers.serialize( + object.characters, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(CrosswordCharacter), + ]), + ), ]; return result; } @override - Crossword deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Crossword deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordBuilder(); final iterator = serialized.iterator; @@ -263,25 +351,42 @@ class _$CrosswordSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'width': - result.width = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.width = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'height': - result.height = serializers.deserialize(value, - specifiedType: const FullType(int))! as int; + result.height = + serializers.deserialize( + value, + specifiedType: const FullType(int), + )! + as int; break; case 'words': - result.words.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(CrosswordWord)]))! - as BuiltList); + result.words.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + )! + as BuiltList, + ); break; case 'characters': - result.characters.replace(serializers.deserialize(value, + result.characters.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), - const FullType(CrosswordCharacter) - ]))!); + const FullType(CrosswordCharacter), + ]), + )!, + ); break; } } @@ -297,32 +402,48 @@ class _$WorkQueueSerializer implements StructuredSerializer { final String wireName = 'WorkQueue'; @override - Iterable serialize(Serializers serializers, WorkQueue object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + WorkQueue object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'crossword', - serializers.serialize(object.crossword, - specifiedType: const FullType(Crossword)), + serializers.serialize( + object.crossword, + specifiedType: const FullType(Crossword), + ), 'locationsToTry', - serializers.serialize(object.locationsToTry, - specifiedType: const FullType(BuiltMap, - const [const FullType(Location), const FullType(Direction)])), + serializers.serialize( + object.locationsToTry, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(Direction), + ]), + ), 'badLocations', - serializers.serialize(object.badLocations, - specifiedType: - const FullType(BuiltSet, const [const FullType(Location)])), + serializers.serialize( + object.badLocations, + specifiedType: const FullType(BuiltSet, const [ + const FullType(Location), + ]), + ), 'candidateWords', - serializers.serialize(object.candidateWords, - specifiedType: - const FullType(BuiltSet, const [const FullType(String)])), + serializers.serialize( + object.candidateWords, + specifiedType: const FullType(BuiltSet, const [const FullType(String)]), + ), ]; return result; } @override - WorkQueue deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + WorkQueue deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new WorkQueueBuilder(); final iterator = serialized.iterator; @@ -332,27 +453,46 @@ class _$WorkQueueSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'crossword': - result.crossword.replace(serializers.deserialize(value, - specifiedType: const FullType(Crossword))! as Crossword); + result.crossword.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Crossword), + )! + as Crossword, + ); break; case 'locationsToTry': - result.locationsToTry.replace(serializers.deserialize(value, + result.locationsToTry.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), - const FullType(Direction) - ]))!); + const FullType(Direction), + ]), + )!, + ); break; case 'badLocations': - result.badLocations.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltSet, const [const FullType(Location)]))! - as BuiltSet); + result.badLocations.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltSet, const [ + const FullType(Location), + ]), + )! + as BuiltSet, + ); break; case 'candidateWords': - result.candidateWords.replace(serializers.deserialize(value, - specifiedType: - const FullType(BuiltSet, const [const FullType(String)]))! - as BuiltSet); + result.candidateWords.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltSet, const [ + const FullType(String), + ]), + )! + as BuiltSet, + ); break; } } @@ -368,32 +508,48 @@ class _$DisplayInfoSerializer implements StructuredSerializer { final String wireName = 'DisplayInfo'; @override - Iterable serialize(Serializers serializers, DisplayInfo object, - {FullType specifiedType = FullType.unspecified}) { + Iterable serialize( + Serializers serializers, + DisplayInfo object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'wordsInGridCount', - serializers.serialize(object.wordsInGridCount, - specifiedType: const FullType(String)), + serializers.serialize( + object.wordsInGridCount, + specifiedType: const FullType(String), + ), 'candidateWordsCount', - serializers.serialize(object.candidateWordsCount, - specifiedType: const FullType(String)), + serializers.serialize( + object.candidateWordsCount, + specifiedType: const FullType(String), + ), 'locationsToExploreCount', - serializers.serialize(object.locationsToExploreCount, - specifiedType: const FullType(String)), + serializers.serialize( + object.locationsToExploreCount, + specifiedType: const FullType(String), + ), 'knownBadLocationsCount', - serializers.serialize(object.knownBadLocationsCount, - specifiedType: const FullType(String)), + serializers.serialize( + object.knownBadLocationsCount, + specifiedType: const FullType(String), + ), 'gridFilledPercentage', - serializers.serialize(object.gridFilledPercentage, - specifiedType: const FullType(String)), + serializers.serialize( + object.gridFilledPercentage, + specifiedType: const FullType(String), + ), ]; return result; } @override - DisplayInfo deserialize(Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + DisplayInfo deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new DisplayInfoBuilder(); final iterator = serialized.iterator; @@ -403,24 +559,44 @@ class _$DisplayInfoSerializer implements StructuredSerializer { final Object? value = iterator.current; switch (key) { case 'wordsInGridCount': - result.wordsInGridCount = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.wordsInGridCount = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'candidateWordsCount': - result.candidateWordsCount = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.candidateWordsCount = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'locationsToExploreCount': - result.locationsToExploreCount = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.locationsToExploreCount = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'knownBadLocationsCount': - result.knownBadLocationsCount = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.knownBadLocationsCount = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; case 'gridFilledPercentage': - result.gridFilledPercentage = serializers.deserialize(value, - specifiedType: const FullType(String))! as String; + result.gridFilledPercentage = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; break; } } @@ -434,32 +610,41 @@ class _$CrosswordPuzzleGameSerializer @override final Iterable types = const [ CrosswordPuzzleGame, - _$CrosswordPuzzleGame + _$CrosswordPuzzleGame, ]; @override final String wireName = 'CrosswordPuzzleGame'; @override Iterable serialize( - Serializers serializers, CrosswordPuzzleGame object, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + CrosswordPuzzleGame object, { + FullType specifiedType = FullType.unspecified, + }) { final result = [ 'crossword', - serializers.serialize(object.crossword, - specifiedType: const FullType(Crossword)), + serializers.serialize( + object.crossword, + specifiedType: const FullType(Crossword), + ), 'alternateWords', - serializers.serialize(object.alternateWords, - specifiedType: const FullType(BuiltMap, const [ - const FullType(Location), - const FullType(BuiltMap, const [ - const FullType(Direction), - const FullType(BuiltList, const [const FullType(String)]) - ]) - ])), + serializers.serialize( + object.alternateWords, + specifiedType: const FullType(BuiltMap, const [ + const FullType(Location), + const FullType(BuiltMap, const [ + const FullType(Direction), + const FullType(BuiltList, const [const FullType(String)]), + ]), + ]), + ), 'selectedWords', - serializers.serialize(object.selectedWords, - specifiedType: - const FullType(BuiltList, const [const FullType(CrosswordWord)])), + serializers.serialize( + object.selectedWords, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + ), ]; return result; @@ -467,8 +652,10 @@ class _$CrosswordPuzzleGameSerializer @override CrosswordPuzzleGame deserialize( - Serializers serializers, Iterable serialized, - {FullType specifiedType = FullType.unspecified}) { + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { final result = new CrosswordPuzzleGameBuilder(); final iterator = serialized.iterator; @@ -478,24 +665,38 @@ class _$CrosswordPuzzleGameSerializer final Object? value = iterator.current; switch (key) { case 'crossword': - result.crossword.replace(serializers.deserialize(value, - specifiedType: const FullType(Crossword))! as Crossword); + result.crossword.replace( + serializers.deserialize( + value, + specifiedType: const FullType(Crossword), + )! + as Crossword, + ); break; case 'alternateWords': - result.alternateWords.replace(serializers.deserialize(value, + result.alternateWords.replace( + serializers.deserialize( + value, specifiedType: const FullType(BuiltMap, const [ const FullType(Location), const FullType(BuiltMap, const [ const FullType(Direction), - const FullType(BuiltList, const [const FullType(String)]) - ]) - ]))!); + const FullType(BuiltList, const [const FullType(String)]), + ]), + ]), + )!, + ); break; case 'selectedWords': - result.selectedWords.replace(serializers.deserialize(value, - specifiedType: const FullType( - BuiltList, const [const FullType(CrosswordWord)]))! - as BuiltList); + result.selectedWords.replace( + serializers.deserialize( + value, + specifiedType: const FullType(BuiltList, const [ + const FullType(CrosswordWord), + ]), + )! + as BuiltList, + ); break; } } @@ -587,7 +788,8 @@ class LocationBuilder implements Builder { Location build() => _build(); _$Location _build() { - final _$result = _$v ?? + final _$result = + _$v ?? new _$Location._( x: BuiltValueNullFieldError.checkNotNull(x, r'Location', 'x'), y: BuiltValueNullFieldError.checkNotNull(y, r'Location', 'y'), @@ -608,14 +810,22 @@ class _$CrosswordWord extends CrosswordWord { factory _$CrosswordWord([void Function(CrosswordWordBuilder)? updates]) => (new CrosswordWordBuilder()..update(updates))._build(); - _$CrosswordWord._( - {required this.word, required this.location, required this.direction}) - : super._() { + _$CrosswordWord._({ + required this.word, + required this.location, + required this.direction, + }) : super._() { BuiltValueNullFieldError.checkNotNull(word, r'CrosswordWord', 'word'); BuiltValueNullFieldError.checkNotNull( - location, r'CrosswordWord', 'location'); + location, + r'CrosswordWord', + 'location', + ); BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'); + direction, + r'CrosswordWord', + 'direction', + ); } @override @@ -700,13 +910,20 @@ class CrosswordWordBuilder _$CrosswordWord _build() { _$CrosswordWord _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordWord._( word: BuiltValueNullFieldError.checkNotNull( - word, r'CrosswordWord', 'word'), + word, + r'CrosswordWord', + 'word', + ), location: location.build(), direction: BuiltValueNullFieldError.checkNotNull( - direction, r'CrosswordWord', 'direction'), + direction, + r'CrosswordWord', + 'direction', + ), ); } catch (_) { late String _$failedField; @@ -715,7 +932,10 @@ class CrosswordWordBuilder location.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordWord', _$failedField, e.toString()); + r'CrosswordWord', + _$failedField, + e.toString(), + ); } rethrow; } @@ -732,21 +952,26 @@ class _$CrosswordCharacter extends CrosswordCharacter { @override final CrosswordWord? downWord; - factory _$CrosswordCharacter( - [void Function(CrosswordCharacterBuilder)? updates]) => - (new CrosswordCharacterBuilder()..update(updates))._build(); + factory _$CrosswordCharacter([ + void Function(CrosswordCharacterBuilder)? updates, + ]) => (new CrosswordCharacterBuilder()..update(updates))._build(); - _$CrosswordCharacter._( - {required this.character, this.acrossWord, this.downWord}) - : super._() { + _$CrosswordCharacter._({ + required this.character, + this.acrossWord, + this.downWord, + }) : super._() { BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'); + character, + r'CrosswordCharacter', + 'character', + ); } @override CrosswordCharacter rebuild( - void Function(CrosswordCharacterBuilder) updates) => - (toBuilder()..update(updates)).build(); + void Function(CrosswordCharacterBuilder) updates, + ) => (toBuilder()..update(updates)).build(); @override CrosswordCharacterBuilder toBuilder() => @@ -830,10 +1055,14 @@ class CrosswordCharacterBuilder _$CrosswordCharacter _build() { _$CrosswordCharacter _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordCharacter._( character: BuiltValueNullFieldError.checkNotNull( - character, r'CrosswordCharacter', 'character'), + character, + r'CrosswordCharacter', + 'character', + ), acrossWord: _acrossWord?.build(), downWord: _downWord?.build(), ); @@ -846,7 +1075,10 @@ class CrosswordCharacterBuilder _downWord?.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordCharacter', _$failedField, e.toString()); + r'CrosswordCharacter', + _$failedField, + e.toString(), + ); } rethrow; } @@ -868,17 +1100,20 @@ class _$Crossword extends Crossword { factory _$Crossword([void Function(CrosswordBuilder)? updates]) => (new CrosswordBuilder()..update(updates))._build(); - _$Crossword._( - {required this.width, - required this.height, - required this.words, - required this.characters}) - : super._() { + _$Crossword._({ + required this.width, + required this.height, + required this.words, + required this.characters, + }) : super._() { BuiltValueNullFieldError.checkNotNull(width, r'Crossword', 'width'); BuiltValueNullFieldError.checkNotNull(height, r'Crossword', 'height'); BuiltValueNullFieldError.checkNotNull(words, r'Crossword', 'words'); BuiltValueNullFieldError.checkNotNull( - characters, r'Crossword', 'characters'); + characters, + r'Crossword', + 'characters', + ); } @override @@ -974,12 +1209,19 @@ class CrosswordBuilder implements Builder { Crossword._fillCharacters(this); _$Crossword _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$Crossword._( width: BuiltValueNullFieldError.checkNotNull( - width, r'Crossword', 'width'), + width, + r'Crossword', + 'width', + ), height: BuiltValueNullFieldError.checkNotNull( - height, r'Crossword', 'height'), + height, + r'Crossword', + 'height', + ), words: words.build(), characters: characters.build(), ); @@ -992,7 +1234,10 @@ class CrosswordBuilder implements Builder { characters.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'Crossword', _$failedField, e.toString()); + r'Crossword', + _$failedField, + e.toString(), + ); } rethrow; } @@ -1014,19 +1259,28 @@ class _$WorkQueue extends WorkQueue { factory _$WorkQueue([void Function(WorkQueueBuilder)? updates]) => (new WorkQueueBuilder()..update(updates))._build(); - _$WorkQueue._( - {required this.crossword, - required this.locationsToTry, - required this.badLocations, - required this.candidateWords}) - : super._() { + _$WorkQueue._({ + required this.crossword, + required this.locationsToTry, + required this.badLocations, + required this.candidateWords, + }) : super._() { BuiltValueNullFieldError.checkNotNull(crossword, r'WorkQueue', 'crossword'); BuiltValueNullFieldError.checkNotNull( - locationsToTry, r'WorkQueue', 'locationsToTry'); + locationsToTry, + r'WorkQueue', + 'locationsToTry', + ); BuiltValueNullFieldError.checkNotNull( - badLocations, r'WorkQueue', 'badLocations'); + badLocations, + r'WorkQueue', + 'badLocations', + ); BuiltValueNullFieldError.checkNotNull( - candidateWords, r'WorkQueue', 'candidateWords'); + candidateWords, + r'WorkQueue', + 'candidateWords', + ); } @override @@ -1125,7 +1379,8 @@ class WorkQueueBuilder implements Builder { _$WorkQueue _build() { _$WorkQueue _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$WorkQueue._( crossword: crossword.build(), locationsToTry: locationsToTry.build(), @@ -1145,7 +1400,10 @@ class WorkQueueBuilder implements Builder { candidateWords.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'WorkQueue', _$failedField, e.toString()); + r'WorkQueue', + _$failedField, + e.toString(), + ); } rethrow; } @@ -1169,23 +1427,38 @@ class _$DisplayInfo extends DisplayInfo { factory _$DisplayInfo([void Function(DisplayInfoBuilder)? updates]) => (new DisplayInfoBuilder()..update(updates))._build(); - _$DisplayInfo._( - {required this.wordsInGridCount, - required this.candidateWordsCount, - required this.locationsToExploreCount, - required this.knownBadLocationsCount, - required this.gridFilledPercentage}) - : super._() { + _$DisplayInfo._({ + required this.wordsInGridCount, + required this.candidateWordsCount, + required this.locationsToExploreCount, + required this.knownBadLocationsCount, + required this.gridFilledPercentage, + }) : super._() { BuiltValueNullFieldError.checkNotNull( - wordsInGridCount, r'DisplayInfo', 'wordsInGridCount'); + wordsInGridCount, + r'DisplayInfo', + 'wordsInGridCount', + ); BuiltValueNullFieldError.checkNotNull( - candidateWordsCount, r'DisplayInfo', 'candidateWordsCount'); + candidateWordsCount, + r'DisplayInfo', + 'candidateWordsCount', + ); BuiltValueNullFieldError.checkNotNull( - locationsToExploreCount, r'DisplayInfo', 'locationsToExploreCount'); + locationsToExploreCount, + r'DisplayInfo', + 'locationsToExploreCount', + ); BuiltValueNullFieldError.checkNotNull( - knownBadLocationsCount, r'DisplayInfo', 'knownBadLocationsCount'); + knownBadLocationsCount, + r'DisplayInfo', + 'knownBadLocationsCount', + ); BuiltValueNullFieldError.checkNotNull( - gridFilledPercentage, r'DisplayInfo', 'gridFilledPercentage'); + gridFilledPercentage, + r'DisplayInfo', + 'gridFilledPercentage', + ); } @override @@ -1288,20 +1561,34 @@ class DisplayInfoBuilder implements Builder { DisplayInfo build() => _build(); _$DisplayInfo _build() { - final _$result = _$v ?? + final _$result = + _$v ?? new _$DisplayInfo._( wordsInGridCount: BuiltValueNullFieldError.checkNotNull( - wordsInGridCount, r'DisplayInfo', 'wordsInGridCount'), + wordsInGridCount, + r'DisplayInfo', + 'wordsInGridCount', + ), candidateWordsCount: BuiltValueNullFieldError.checkNotNull( - candidateWordsCount, r'DisplayInfo', 'candidateWordsCount'), + candidateWordsCount, + r'DisplayInfo', + 'candidateWordsCount', + ), locationsToExploreCount: BuiltValueNullFieldError.checkNotNull( - locationsToExploreCount, - r'DisplayInfo', - 'locationsToExploreCount'), + locationsToExploreCount, + r'DisplayInfo', + 'locationsToExploreCount', + ), knownBadLocationsCount: BuiltValueNullFieldError.checkNotNull( - knownBadLocationsCount, r'DisplayInfo', 'knownBadLocationsCount'), + knownBadLocationsCount, + r'DisplayInfo', + 'knownBadLocationsCount', + ), gridFilledPercentage: BuiltValueNullFieldError.checkNotNull( - gridFilledPercentage, r'DisplayInfo', 'gridFilledPercentage'), + gridFilledPercentage, + r'DisplayInfo', + 'gridFilledPercentage', + ), ); replace(_$result); return _$result; @@ -1313,31 +1600,40 @@ class _$CrosswordPuzzleGame extends CrosswordPuzzleGame { final Crossword crossword; @override final BuiltMap>> - alternateWords; + alternateWords; @override final BuiltList selectedWords; - factory _$CrosswordPuzzleGame( - [void Function(CrosswordPuzzleGameBuilder)? updates]) => - (new CrosswordPuzzleGameBuilder()..update(updates))._build(); + factory _$CrosswordPuzzleGame([ + void Function(CrosswordPuzzleGameBuilder)? updates, + ]) => (new CrosswordPuzzleGameBuilder()..update(updates))._build(); - _$CrosswordPuzzleGame._( - {required this.crossword, - required this.alternateWords, - required this.selectedWords}) - : super._() { + _$CrosswordPuzzleGame._({ + required this.crossword, + required this.alternateWords, + required this.selectedWords, + }) : super._() { BuiltValueNullFieldError.checkNotNull( - crossword, r'CrosswordPuzzleGame', 'crossword'); + crossword, + r'CrosswordPuzzleGame', + 'crossword', + ); BuiltValueNullFieldError.checkNotNull( - alternateWords, r'CrosswordPuzzleGame', 'alternateWords'); + alternateWords, + r'CrosswordPuzzleGame', + 'alternateWords', + ); BuiltValueNullFieldError.checkNotNull( - selectedWords, r'CrosswordPuzzleGame', 'selectedWords'); + selectedWords, + r'CrosswordPuzzleGame', + 'selectedWords', + ); } @override CrosswordPuzzleGame rebuild( - void Function(CrosswordPuzzleGameBuilder) updates) => - (toBuilder()..update(updates)).build(); + void Function(CrosswordPuzzleGameBuilder) updates, + ) => (toBuilder()..update(updates)).build(); @override CrosswordPuzzleGameBuilder toBuilder() => @@ -1383,12 +1679,13 @@ class CrosswordPuzzleGameBuilder MapBuilder>>? _alternateWords; MapBuilder>> - get alternateWords => _$this._alternateWords ??= + get alternateWords => + _$this._alternateWords ??= new MapBuilder>>(); set alternateWords( - MapBuilder>>? - alternateWords) => - _$this._alternateWords = alternateWords; + MapBuilder>>? + alternateWords, + ) => _$this._alternateWords = alternateWords; ListBuilder? _selectedWords; ListBuilder get selectedWords => @@ -1426,7 +1723,8 @@ class CrosswordPuzzleGameBuilder _$CrosswordPuzzleGame _build() { _$CrosswordPuzzleGame _$result; try { - _$result = _$v ?? + _$result = + _$v ?? new _$CrosswordPuzzleGame._( crossword: crossword.build(), alternateWords: alternateWords.build(), @@ -1443,7 +1741,10 @@ class CrosswordPuzzleGameBuilder selectedWords.build(); } catch (e) { throw new BuiltValueNestedFieldError( - r'CrosswordPuzzleGame', _$failedField, e.toString()); + r'CrosswordPuzzleGame', + _$failedField, + e.toString(), + ); } rethrow; } diff --git a/generate_crossword/step_09/lib/providers.dart b/generate_crossword/step_09/lib/providers.dart index 62e75c6222..d0900ceaff 100644 --- a/generate_crossword/step_09/lib/providers.dart +++ b/generate_crossword/step_09/lib/providers.dart @@ -27,10 +27,16 @@ Future> wordList(Ref ref) async { final re = RegExp(r'^[a-z]+$'); final words = await rootBundle.loadString('assets/words.txt'); - return const LineSplitter().convert(words).toBuiltSet().rebuild((b) => b - ..map((word) => word.toLowerCase().trim()) - ..where((word) => word.length > 2) - ..where((word) => re.hasMatch(word))); + return const LineSplitter() + .convert(words) + .toBuiltSet() + .rebuild( + (b) => + b + ..map((word) => word.toLowerCase().trim()) + ..where((word) => word.length > 2) + ..where((word) => re.hasMatch(word)), + ); } /// An enumeration for different sizes of [model.Crossword]s. @@ -41,10 +47,7 @@ enum CrosswordSize { xlarge(width: 160, height: 88), xxlarge(width: 500, height: 500); - const CrosswordSize({ - required this.width, - required this.height, - }); + const CrosswordSize({required this.width, required this.height}); final int width; final int height; @@ -69,8 +72,10 @@ class Size extends _$Size { Stream workQueue(Ref ref) async* { final size = ref.watch(sizeProvider); final wordListAsync = ref.watch(wordListProvider); - final emptyCrossword = - model.Crossword.crossword(width: size.width, height: size.height); + final emptyCrossword = model.Crossword.crossword( + width: size.width, + height: size.height, + ); final emptyWorkQueue = model.WorkQueue.from( crossword: emptyCrossword, candidateWords: BuiltSet(), @@ -78,11 +83,12 @@ Stream workQueue(Ref ref) async* { ); yield* wordListAsync.when( - data: (wordList) => exploreCrosswordSolutions( - crossword: emptyCrossword, - wordList: wordList, - maxWorkerCount: backgroundWorkerCount, - ), + data: + (wordList) => exploreCrosswordSolutions( + crossword: emptyCrossword, + wordList: wordList, + maxWorkerCount: backgroundWorkerCount, + ), error: (error, stackTrace) async* { debugPrint('Error loading word list: $error'); yield emptyWorkQueue; @@ -112,8 +118,10 @@ class Puzzle extends _$Puzzle { (_puzzle.crossword.height != size.height || _puzzle.crossword.width != size.width || _puzzle.crossword != workQueue.crossword)) { - compute(_puzzleFromCrosswordTrampoline, (workQueue.crossword, wordList)) - .then((puzzle) { + compute(_puzzleFromCrosswordTrampoline, ( + workQueue.crossword, + wordList, + )).then((puzzle) { _puzzle = puzzle; ref.invalidateSelf(); }); @@ -127,8 +135,12 @@ class Puzzle extends _$Puzzle { required String word, required model.Direction direction, }) async { - final candidate = await compute( - _puzzleSelectWordTrampoline, (_puzzle, location, word, direction)); + final candidate = await compute(_puzzleSelectWordTrampoline, ( + _puzzle, + location, + word, + direction, + )); if (candidate != null) { _puzzle = candidate; @@ -155,14 +167,10 @@ class Puzzle extends _$Puzzle { // unsendable reference to the [Puzzle] provider. Future _puzzleFromCrosswordTrampoline( - (model.Crossword, BuiltSet) args) async => + (model.Crossword, BuiltSet) args, +) async => model.CrosswordPuzzleGame.from(crossword: args.$1, candidateWords: args.$2); model.CrosswordPuzzleGame? _puzzleSelectWordTrampoline( - ( - model.CrosswordPuzzleGame, - model.Location, - String, - model.Direction - ) args) => - args.$1.selectWord(location: args.$2, word: args.$3, direction: args.$4); + (model.CrosswordPuzzleGame, model.Location, String, model.Direction) args, +) => args.$1.selectWord(location: args.$2, word: args.$3, direction: args.$4); diff --git a/generate_crossword/step_09/lib/providers.g.dart b/generate_crossword/step_09/lib/providers.g.dart index 18b1cd60e7..aa7fed7e1d 100644 --- a/generate_crossword/step_09/lib/providers.g.dart +++ b/generate_crossword/step_09/lib/providers.g.dart @@ -62,13 +62,13 @@ String _$puzzleHash() => r'dddad218b4318b008af2db67dd0ff284bcef3231'; @ProviderFor(Puzzle) final puzzleProvider = AutoDisposeNotifierProvider.internal( - Puzzle.new, - name: r'puzzleProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$puzzleHash, - dependencies: null, - allTransitiveDependencies: null, -); + Puzzle.new, + name: r'puzzleProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') ? null : _$puzzleHash, + dependencies: null, + allTransitiveDependencies: null, + ); typedef _$Puzzle = AutoDisposeNotifier; // ignore_for_file: type=lint diff --git a/generate_crossword/step_09/lib/widgets/crossword_generator_widget.dart b/generate_crossword/step_09/lib/widgets/crossword_generator_widget.dart index 306e7b31f4..0f1f92bceb 100644 --- a/generate_crossword/step_09/lib/widgets/crossword_generator_widget.dart +++ b/generate_crossword/step_09/lib/widgets/crossword_generator_widget.dart @@ -44,8 +44,9 @@ class CrosswordGeneratorWidget extends ConsumerWidget { final explorationCell = ref.watch( workQueueProvider.select( (workQueueAsync) => workQueueAsync.when( - data: (workQueue) => - workQueue.locationsToTry.keys.contains(location), + data: + (workQueue) => + workQueue.locationsToTry.keys.contains(location), error: (error, stackTrace) => false, loading: () => false, ), @@ -56,18 +57,20 @@ class CrosswordGeneratorWidget extends ConsumerWidget { return AnimatedContainer( duration: Durations.extralong1, curve: Curves.easeInOut, - color: explorationCell - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary, + color: + explorationCell + ? Theme.of(context).colorScheme.primary + : Theme.of(context).colorScheme.onPrimary, child: Center( child: AnimatedDefaultTextStyle( duration: Durations.extralong1, curve: Curves.easeInOut, style: TextStyle( fontSize: 24, - color: explorationCell - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.primary, + color: + explorationCell + ? Theme.of(context).colorScheme.onPrimary + : Theme.of(context).colorScheme.primary, ), child: Text('•'), // https://www.compart.com/en/unicode/U+2022 ), @@ -89,9 +92,11 @@ class CrosswordGeneratorWidget extends ConsumerWidget { foregroundDecoration: TableSpanDecoration( border: TableSpanBorder( leading: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), trailing: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ), ); diff --git a/generate_crossword/step_09/lib/widgets/crossword_puzzle_app.dart b/generate_crossword/step_09/lib/widgets/crossword_puzzle_app.dart index f7a53ec2ef..0ca224c7ad 100644 --- a/generate_crossword/step_09/lib/widgets/crossword_puzzle_app.dart +++ b/generate_crossword/step_09/lib/widgets/crossword_puzzle_app.dart @@ -27,26 +27,29 @@ class CrosswordPuzzleApp extends StatelessWidget { title: Text('Crossword Puzzle'), ), body: SafeArea( - child: Consumer(builder: (context, ref, _) { - final workQueueAsync = ref.watch(workQueueProvider); - final puzzleSolved = - ref.watch(puzzleProvider.select((puzzle) => puzzle.solved)); + child: Consumer( + builder: (context, ref, _) { + final workQueueAsync = ref.watch(workQueueProvider); + final puzzleSolved = ref.watch( + puzzleProvider.select((puzzle) => puzzle.solved), + ); - return workQueueAsync.when( - data: (workQueue) { - if (puzzleSolved) { - return PuzzleCompletedWidget(); - } - if (workQueue.isCompleted && - workQueue.crossword.characters.isNotEmpty) { - return CrosswordPuzzleWidget(); - } - return CrosswordGeneratorWidget(); - }, - loading: () => Center(child: CircularProgressIndicator()), - error: (error, stackTrace) => Center(child: Text('$error')), - ); - }), + return workQueueAsync.when( + data: (workQueue) { + if (puzzleSolved) { + return PuzzleCompletedWidget(); + } + if (workQueue.isCompleted && + workQueue.crossword.characters.isNotEmpty) { + return CrosswordPuzzleWidget(); + } + return CrosswordGeneratorWidget(); + }, + loading: () => Center(child: CircularProgressIndicator()), + error: (error, stackTrace) => Center(child: Text('$error')), + ); + }, + ), ), ), ); @@ -67,19 +70,21 @@ class _EagerInitialization extends ConsumerWidget { class _CrosswordPuzzleAppMenu extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) => MenuAnchor( - menuChildren: [ - for (final entry in CrosswordSize.values) - MenuItemButton( - onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), - leadingIcon: entry == ref.watch(sizeProvider) + menuChildren: [ + for (final entry in CrosswordSize.values) + MenuItemButton( + onPressed: () => ref.read(sizeProvider.notifier).setSize(entry), + leadingIcon: + entry == ref.watch(sizeProvider) ? Icon(Icons.radio_button_checked_outlined) : Icon(Icons.radio_button_unchecked_outlined), - child: Text(entry.label), - ), - ], - builder: (context, controller, child) => IconButton( + child: Text(entry.label), + ), + ], + builder: + (context, controller, child) => IconButton( onPressed: () => controller.open(), icon: Icon(Icons.settings), ), - ); + ); } diff --git a/generate_crossword/step_09/lib/widgets/crossword_puzzle_widget.dart b/generate_crossword/step_09/lib/widgets/crossword_puzzle_widget.dart index 79aec2492c..706376d963 100644 --- a/generate_crossword/step_09/lib/widgets/crossword_puzzle_widget.dart +++ b/generate_crossword/step_09/lib/widgets/crossword_puzzle_widget.dart @@ -32,41 +32,60 @@ class CrosswordPuzzleWidget extends ConsumerWidget { return TableViewCell( child: Consumer( builder: (context, ref, _) { - final character = ref.watch(puzzleProvider - .select((puzzle) => puzzle.crossword.characters[location])); - final selectedCharacter = ref.watch(puzzleProvider.select((puzzle) => - puzzle.crosswordFromSelectedWords.characters[location])); - final alternateWords = ref - .watch(puzzleProvider.select((puzzle) => puzzle.alternateWords)); + final character = ref.watch( + puzzleProvider.select( + (puzzle) => puzzle.crossword.characters[location], + ), + ); + final selectedCharacter = ref.watch( + puzzleProvider.select( + (puzzle) => + puzzle.crosswordFromSelectedWords.characters[location], + ), + ); + final alternateWords = ref.watch( + puzzleProvider.select((puzzle) => puzzle.alternateWords), + ); if (character != null) { final acrossWord = character.acrossWord; var acrossWords = BuiltList(); if (acrossWord != null) { - acrossWords = acrossWords.rebuild((b) => b - ..add(acrossWord.word) - ..addAll(alternateWords[acrossWord.location] - ?[acrossWord.direction] ?? - []) - ..sort()); + acrossWords = acrossWords.rebuild( + (b) => + b + ..add(acrossWord.word) + ..addAll( + alternateWords[acrossWord.location]?[acrossWord + .direction] ?? + [], + ) + ..sort(), + ); } final downWord = character.downWord; var downWords = BuiltList(); if (downWord != null) { - downWords = downWords.rebuild((b) => b - ..add(downWord.word) - ..addAll(alternateWords[downWord.location] - ?[downWord.direction] ?? - []) - ..sort()); + downWords = downWords.rebuild( + (b) => + b + ..add(downWord.word) + ..addAll( + alternateWords[downWord.location]?[downWord + .direction] ?? + [], + ) + ..sort(), + ); } return MenuAnchor( builder: (context, controller, _) { return GestureDetector( - onTapDown: (details) => - controller.open(position: details.localPosition), + onTapDown: + (details) => + controller.open(position: details.localPosition), child: AnimatedContainer( duration: Durations.extralong1, curve: Curves.easeInOut, @@ -128,9 +147,11 @@ class CrosswordPuzzleWidget extends ConsumerWidget { foregroundDecoration: TableSpanDecoration( border: TableSpanBorder( leading: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), trailing: BorderSide( - color: Theme.of(context).colorScheme.onPrimaryContainer), + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), ), ), ); @@ -154,18 +175,29 @@ class _WordSelectMenuItem extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final notifier = ref.read(puzzleProvider.notifier); return MenuItemButton( - onPressed: ref.watch(puzzleProvider.select((puzzle) => - puzzle.canSelectWord( - location: location, word: word, direction: direction))) - ? () => notifier.selectWord( - location: location, word: word, direction: direction) - : null, - leadingIcon: switch (direction) { - Direction.across => selectedCharacter?.acrossWord?.word == word, - Direction.down => selectedCharacter?.downWord?.word == word, - } - ? Icon(Icons.radio_button_checked_outlined) - : Icon(Icons.radio_button_unchecked_outlined), + onPressed: + ref.watch( + puzzleProvider.select( + (puzzle) => puzzle.canSelectWord( + location: location, + word: word, + direction: direction, + ), + ), + ) + ? () => notifier.selectWord( + location: location, + word: word, + direction: direction, + ) + : null, + leadingIcon: + switch (direction) { + Direction.across => selectedCharacter?.acrossWord?.word == word, + Direction.down => selectedCharacter?.downWord?.word == word, + } + ? Icon(Icons.radio_button_checked_outlined) + : Icon(Icons.radio_button_unchecked_outlined), child: Text(word), ); } diff --git a/generate_crossword/step_09/lib/widgets/puzzle_completed_widget.dart b/generate_crossword/step_09/lib/widgets/puzzle_completed_widget.dart index cfd658e738..182d34a6b0 100644 --- a/generate_crossword/step_09/lib/widgets/puzzle_completed_widget.dart +++ b/generate_crossword/step_09/lib/widgets/puzzle_completed_widget.dart @@ -12,10 +12,7 @@ class PuzzleCompletedWidget extends StatelessWidget { return Center( child: Text( 'Puzzle Completed!', - style: TextStyle( - fontSize: 36, - fontWeight: FontWeight.bold, - ), + style: TextStyle(fontSize: 36, fontWeight: FontWeight.bold), ), ); } diff --git a/generate_crossword/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/generate_crossword/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 070fd74eff..5845d19a0a 100644 --- a/generate_crossword/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/generate_crossword/step_09/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/generate_crossword/step_09/pubspec.yaml b/generate_crossword/step_09/pubspec.yaml index 701f231c6a..a4e12dc3f1 100644 --- a/generate_crossword/step_09/pubspec.yaml +++ b/generate_crossword/step_09/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter built_collection: ^5.1.1 built_value: ^8.9.3 - characters: ^1.3.0 + characters: ^1.4.0 flutter_riverpod: ^2.6.1 intl: ^0.20.2 riverpod: ^2.6.1 diff --git a/generate_crossword/step_09/test/model_test.dart b/generate_crossword/step_09/test/model_test.dart index 12e66f5401..690718d1f4 100644 --- a/generate_crossword/step_09/test/model_test.dart +++ b/generate_crossword/step_09/test/model_test.dart @@ -40,28 +40,27 @@ void main() { expect(crossword.words.isNotEmpty, true); expect(crossword.words.length, 2); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 1, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .length, - 1); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .length, + 1, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 7); expect( - crossword.characters[topLeft], - CrosswordCharacter.character( - acrossWord: thisWord, - downWord: thatWord, - character: 't', - )); + crossword.characters[topLeft], + CrosswordCharacter.character( + acrossWord: thisWord, + downWord: thatWord, + character: 't', + ), + ); expect(crossword.valid, isTrue); }); @@ -87,19 +86,17 @@ void main() { expect(crossword.words.isNotEmpty, true); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.across), - ) - .length, - 2); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.across)) + .length, + 2, + ); expect( - crossword.words - .rebuild( - (b) => b.where((b) => b.direction == Direction.down), - ) - .isEmpty, - true); + crossword.words + .rebuild((b) => b.where((b) => b.direction == Direction.down)) + .isEmpty, + true, + ); expect(crossword.characters.isNotEmpty, isTrue); expect(crossword.characters.length, 8); expect(crossword.valid, isFalse); @@ -109,11 +106,12 @@ void main() { Crossword crossword = Crossword.crossword(width: 50, height: 50); expect(crossword.valid, true); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'this', - )!; + crossword = + crossword.addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'this', + )!; expect(crossword.valid, true); final crossword2 = crossword.addWord( @@ -175,17 +173,18 @@ void main() { final topLeft = Location.at(0, 0); - crossword = crossword - .addWord( - location: topLeft, - word: 'this', - direction: Direction.down, - )! - .addWord( - location: topLeft, - word: 'total', - direction: Direction.across, - )!; + crossword = + crossword + .addWord( + location: topLeft, + word: 'this', + direction: Direction.down, + )! + .addWord( + location: topLeft, + word: 'total', + direction: Direction.across, + )!; expect(crossword.valid, isTrue); @@ -236,77 +235,85 @@ void main() { }); test('Crossword is not valid with run-on across words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on across/down words', () { - Crossword crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 0), - word: 'another', - ), - ])); + Crossword crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 0), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); test('Crossword is not valid with run-on down/across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 4), - word: 'another', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 4), + word: 'another', + ), + ]), + ); expect(crossword.valid, false); }); @@ -314,36 +321,40 @@ void main() { test('Adding duplicate across words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.across, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate across words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.across, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.across, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.across, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.across, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -351,36 +362,40 @@ void main() { test('Adding duplicate down words returns null', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - )!; - - expect( + crossword = crossword.addWord( direction: Direction.down, - location: Location.at(4, 4), + location: Location.at(0, 0), word: 'duplicated', - ), - isNull); + )!; + + expect( + crossword.addWord( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + isNull, + ); }); test('Crossword is not valid with duplicate down words', () { - Crossword? crossword = - Crossword.crossword(width: 50, height: 50).rebuild((b) => b - ..words.addAll([ - CrosswordWord.word( - direction: Direction.down, - location: Location.at(0, 0), - word: 'duplicated', - ), - CrosswordWord.word( - direction: Direction.down, - location: Location.at(4, 4), - word: 'duplicated', - ), - ])); + Crossword? crossword = Crossword.crossword(width: 50, height: 50).rebuild( + (b) => + b + ..words.addAll([ + CrosswordWord.word( + direction: Direction.down, + location: Location.at(0, 0), + word: 'duplicated', + ), + CrosswordWord.word( + direction: Direction.down, + location: Location.at(4, 4), + word: 'duplicated', + ), + ]), + ); expect(crossword.valid, false); }); @@ -394,10 +409,12 @@ void main() { ); expect(queue.locationsToTry.length, 1); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word')!; + crossword = + crossword.addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + )!; queue = WorkQueue.from( crossword: crossword, candidateWords: ['words', 'and', 'moar', 'wordz'], @@ -405,21 +422,26 @@ void main() { ); expect(queue.locationsToTry.length, 4); expect( - queue.locationsToTry.entries - .every((element) => element.value == Direction.down), - isTrue); + queue.locationsToTry.entries.every( + (element) => element.value == Direction.down, + ), + isTrue, + ); final entries = queue.locationsToTry.entries; expect(entries.every((element) => element.key.y == 0), isTrue); - expect(entries.map((element) => element.key.x).toBuiltSet(), - equals(BuiltSet([0, 1, 2, 3]))); + expect( + entries.map((element) => element.key.x).toBuiltSet(), + equals(BuiltSet([0, 1, 2, 3])), + ); }); test('WorkQueue from down word', () { - Crossword crossword = Crossword.crossword(width: 50, height: 50).addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'word', - )!; + Crossword crossword = + Crossword.crossword(width: 50, height: 50).addWord( + direction: Direction.down, + location: Location.at(0, 0), + word: 'word', + )!; WorkQueue queue = WorkQueue.from( crossword: crossword, @@ -428,27 +450,32 @@ void main() { ); expect(queue.locationsToTry.length, 4); expect( - queue.locationsToTry.entries - .every((element) => element.value == Direction.across), - isTrue); + queue.locationsToTry.entries.every( + (element) => element.value == Direction.across, + ), + isTrue, + ); final entries = queue.locationsToTry.entries; expect(entries.every((element) => element.key.x == 0), isTrue); - expect(entries.map((element) => element.key.y).toBuiltSet(), - equals(BuiltSet([0, 1, 2, 3]))); + expect( + entries.map((element) => element.key.y).toBuiltSet(), + equals(BuiltSet([0, 1, 2, 3])), + ); }); test('WorkQueue from two words', () { - Crossword crossword = Crossword.crossword(width: 50, height: 50) - .addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - )! - .addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'work', - )!; + Crossword crossword = + Crossword.crossword(width: 50, height: 50) + .addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + )! + .addWord( + direction: Direction.down, + location: Location.at(0, 0), + word: 'work', + )!; WorkQueue queue = WorkQueue.from( crossword: crossword, @@ -456,27 +483,31 @@ void main() { startLocation: Location.at(0, 0), ); expect( - queue.locationsToTry, - equals(BuiltMap({ + queue.locationsToTry, + equals( + BuiltMap({ Location.at(2, 0): Direction.down, Location.at(0, 2): Direction.across, Location.at(3, 0): Direction.down, Location.at(0, 3): Direction.across, - }))); + }), + ), + ); }); test('WorkQueue removes used words from candidate list', () { - Crossword crossword = Crossword.crossword(width: 50, height: 50) - .addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - )! - .addWord( - direction: Direction.down, - location: Location.at(0, 0), - word: 'work', - )!; + Crossword crossword = + Crossword.crossword(width: 50, height: 50) + .addWord( + direction: Direction.across, + location: Location.at(0, 0), + word: 'word', + )! + .addWord( + direction: Direction.down, + location: Location.at(0, 0), + word: 'work', + )!; WorkQueue queue = WorkQueue.from( crossword: crossword, @@ -500,16 +531,22 @@ void main() { word: 'works', location: Location.at(0, 0), direction: Direction.down, - ) + ), ], ); final re = RegExp('^[a-z]+\$'); final str = await rootBundle.loadString('assets/words.txt'); - final words = str.split('\n').toBuiltSet().rebuild((b) => b - ..map((str) => str.toLowerCase().trim()) - ..removeWhere((str) => str.length < 3) - ..removeWhere((str) => re.stringMatch(str) == null)); + final words = str + .split('\n') + .toBuiltSet() + .rebuild( + (b) => + b + ..map((str) => str.toLowerCase().trim()) + ..removeWhere((str) => str.length < 3) + ..removeWhere((str) => re.stringMatch(str) == null), + ); final puzzle = CrosswordPuzzleGame.from( crossword: crossword, @@ -520,132 +557,144 @@ void main() { expect(puzzle.alternateWords.keys.length, 1); expect(puzzle.alternateWords[Location.at(0, 0)]?.keys.length, 2); expect( - puzzle.alternateWords[Location.at(0, 0)]?[Direction.down]?.length, 4); + puzzle.alternateWords[Location.at(0, 0)]?[Direction.down]?.length, + 4, + ); expect( - puzzle.alternateWords[Location.at(0, 0)]?[Direction.across]?.length, 4); + puzzle.alternateWords[Location.at(0, 0)]?[Direction.across]?.length, + 4, + ); }); test('Allow non-overlapping words with requireOverlap: false', () { Crossword? crossword = Crossword.crossword(width: 50, height: 50); - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(0, 0), - word: 'word', - requireOverlap: false); - - if (crossword == null) fail("crossword shouldn't be null"); - - crossword = crossword.addWord( - direction: Direction.across, - location: Location.at(3, 3), - word: 'another', - requireOverlap: false); - - if (crossword == null) fail("crossword shouldn't be null"); - }); - - test( - 'Adding overlapping across words returns null with requireOverlap: false', - () { - Crossword? crossword = Crossword.crossword(width: 50, height: 50); - expect(crossword.valid, isTrue); - - final topLeft = Location.at(0, 0); - crossword = crossword.addWord( direction: Direction.across, - location: topLeft, - word: 'this', + location: Location.at(0, 0), + word: 'word', requireOverlap: false, ); + if (crossword == null) fail("crossword shouldn't be null"); - expect(crossword.valid, true); - final crossword2 = crossword.addWord( + crossword = crossword.addWord( direction: Direction.across, - location: topLeft, - word: 'that', + location: Location.at(3, 3), + word: 'another', requireOverlap: false, ); - expect(crossword2, isNull); - }); - - test('Adding overlapping down words returns null with requireOverlap: false', - () { - Crossword? crossword = Crossword.crossword(width: 50, height: 50); - expect(crossword.valid, true); - - final topLeft = Location.at(0, 0); - - crossword = crossword - .addWord( - location: topLeft, - word: 'this', - direction: Direction.down, - requireOverlap: false, - )! - .addWord( - location: topLeft, - word: 'total', - direction: Direction.across, - requireOverlap: false, - )!; - - expect(crossword.valid, isTrue); - - final crossword2 = crossword.addWord( - direction: Direction.down, - location: topLeft, - word: 'that', - requireOverlap: false, - ); - expect(crossword2, isNull); + if (crossword == null) fail("crossword shouldn't be null"); }); - test('Adding words out of bounds returns null with requireOverlap: false', - () { - final crossword = Crossword.crossword(width: 50, height: 50); + test( + 'Adding overlapping across words returns null with requireOverlap: false', + () { + Crossword? crossword = Crossword.crossword(width: 50, height: 50); + expect(crossword.valid, isTrue); - expect(crossword.valid, true); + final topLeft = Location.at(0, 0); - // Above the top of the board - final crossword1 = crossword.addWord( - direction: Direction.down, - location: Location.at(0, -1), - word: 'this', - requireOverlap: false, - ); - expect(crossword1, isNull); + crossword = crossword.addWord( + direction: Direction.across, + location: topLeft, + word: 'this', + requireOverlap: false, + ); + if (crossword == null) fail("crossword shouldn't be null"); + expect(crossword.valid, true); - // To the left of the board - final crossword2 = crossword.addWord( - direction: Direction.down, - location: Location.at(-1, 0), - word: 'that', - requireOverlap: false, - ); - expect(crossword2, isNull); + final crossword2 = crossword.addWord( + direction: Direction.across, + location: topLeft, + word: 'that', + requireOverlap: false, + ); + expect(crossword2, isNull); + }, + ); - // To the right of the board - final crossword3 = crossword.addWord( - direction: Direction.down, - location: Location.at(51, 0), - word: 'this', - requireOverlap: false, - ); - expect(crossword3, isNull); + test( + 'Adding overlapping down words returns null with requireOverlap: false', + () { + Crossword? crossword = Crossword.crossword(width: 50, height: 50); + + expect(crossword.valid, true); + + final topLeft = Location.at(0, 0); + + crossword = + crossword + .addWord( + location: topLeft, + word: 'this', + direction: Direction.down, + requireOverlap: false, + )! + .addWord( + location: topLeft, + word: 'total', + direction: Direction.across, + requireOverlap: false, + )!; + + expect(crossword.valid, isTrue); + + final crossword2 = crossword.addWord( + direction: Direction.down, + location: topLeft, + word: 'that', + requireOverlap: false, + ); + expect(crossword2, isNull); + }, + ); - // Below the bottom of the board - final crossword4 = crossword.addWord( - direction: Direction.down, - location: Location.at(0, 51), - word: 'that', - requireOverlap: false, - ); - expect(crossword4, isNull); - }); + test( + 'Adding words out of bounds returns null with requireOverlap: false', + () { + final crossword = Crossword.crossword(width: 50, height: 50); + + expect(crossword.valid, true); + + // Above the top of the board + final crossword1 = crossword.addWord( + direction: Direction.down, + location: Location.at(0, -1), + word: 'this', + requireOverlap: false, + ); + expect(crossword1, isNull); + + // To the left of the board + final crossword2 = crossword.addWord( + direction: Direction.down, + location: Location.at(-1, 0), + word: 'that', + requireOverlap: false, + ); + expect(crossword2, isNull); + + // To the right of the board + final crossword3 = crossword.addWord( + direction: Direction.down, + location: Location.at(51, 0), + word: 'this', + requireOverlap: false, + ); + expect(crossword3, isNull); + + // Below the bottom of the board + final crossword4 = crossword.addWord( + direction: Direction.down, + location: Location.at(0, 51), + word: 'that', + requireOverlap: false, + ); + expect(crossword4, isNull); + }, + ); test('CrosswordPuzzleGame allows alternate play', () async { final topLeft = Location.at(0, 0); @@ -676,10 +725,16 @@ void main() { final re = RegExp('^[a-z]+\$'); final str = await rootBundle.loadString('assets/words.txt'); - final words = str.split('\n').toBuiltSet().rebuild((b) => b - ..map((str) => str.toLowerCase().trim()) - ..removeWhere((str) => str.length < 3) - ..removeWhere((str) => re.stringMatch(str) == null)); + final words = str + .split('\n') + .toBuiltSet() + .rebuild( + (b) => + b + ..map((str) => str.toLowerCase().trim()) + ..removeWhere((str) => str.length < 3) + ..removeWhere((str) => re.stringMatch(str) == null), + ); CrosswordPuzzleGame? puzzle = CrosswordPuzzleGame.from( crossword: crossword, @@ -702,17 +757,19 @@ void main() { } puzzle = puzzle.selectWord( - location: topLeft, - word: topLeftAcrossAlternates.first, - direction: Direction.across); + location: topLeft, + word: topLeftAcrossAlternates.first, + direction: Direction.across, + ); if (puzzle == null) { fail('puzzle should not be null'); } puzzle = puzzle.selectWord( - location: downBy4, - word: downBy4AcrossAlternates.first, - direction: Direction.across); + location: downBy4, + word: downBy4AcrossAlternates.first, + direction: Direction.across, + ); if (puzzle == null) { fail('puzzle should not be null'); } @@ -749,10 +806,16 @@ void main() { final re = RegExp('^[a-z]+\$'); final str = await rootBundle.loadString('assets/words.txt'); - final words = str.split('\n').toBuiltSet().rebuild((b) => b - ..map((str) => str.toLowerCase().trim()) - ..removeWhere((str) => str.length < 3) - ..removeWhere((str) => re.stringMatch(str) == null)); + final words = str + .split('\n') + .toBuiltSet() + .rebuild( + (b) => + b + ..map((str) => str.toLowerCase().trim()) + ..removeWhere((str) => str.length < 3) + ..removeWhere((str) => re.stringMatch(str) == null), + ); CrosswordPuzzleGame? puzzle = CrosswordPuzzleGame.from( crossword: crossword, @@ -760,19 +823,28 @@ void main() { ); puzzle = puzzle.selectWord( - location: topLeft, word: 'word', direction: Direction.across); + location: topLeft, + word: 'word', + direction: Direction.across, + ); if (puzzle == null) { fail('puzzle should not be null'); } puzzle = puzzle.selectWord( - location: topLeft, word: 'works', direction: Direction.down); + location: topLeft, + word: 'works', + direction: Direction.down, + ); if (puzzle == null) { fail('puzzle should not be null'); } puzzle = puzzle.selectWord( - location: downBy4, word: 'silent', direction: Direction.across); + location: downBy4, + word: 'silent', + direction: Direction.across, + ); if (puzzle == null) { fail('puzzle should not be null'); } diff --git a/github-client/codelab_rebuild.yaml b/github-client/codelab_rebuild.yaml index 0f42c2f9e8..b003ac869c 100644 --- a/github-client/codelab_rebuild.yaml +++ b/github-client/codelab_rebuild.yaml @@ -492,18 +492,18 @@ steps: // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - + import 'package:flutter/material.dart'; import 'github_oauth_credentials.dart'; import 'src/github_login.dart'; - + void main() { runApp(const MyApp()); } - + class MyApp extends StatelessWidget { const MyApp({super.key}); - + @override Widget build(BuildContext context) { return MaterialApp( @@ -516,25 +516,18 @@ steps: ); } } - + class MyHomePage extends StatelessWidget { const MyHomePage({super.key, required this.title}); final String title; - + @override Widget build(BuildContext context) { return GithubLoginWidget( builder: (context, httpClient) { return Scaffold( - appBar: AppBar( - title: Text(title), - elevation: 2, - ), - body: const Center( - child: Text( - 'You are logged in to GitHub!', - ), - ), + appBar: AppBar(title: Text(title), elevation: 2), + body: const Center(child: Text('You are logged in to GitHub!')), ); }, githubClientId: githubClientId, @@ -593,8 +586,9 @@ steps: import 'package:oauth2/oauth2.dart' as oauth2; import 'package:url_launcher/url_launcher.dart'; - final _authorizationEndpoint = - Uri.parse('https://github.com/login/oauth/authorize'); + final _authorizationEndpoint = Uri.parse( + 'https://github.com/login/oauth/authorize', + ); final _tokenEndpoint = Uri.parse('https://github.com/login/oauth/access_token'); class GithubLoginWidget extends StatefulWidget { @@ -614,8 +608,8 @@ steps: State createState() => _GithubLoginState(); } - typedef AuthenticatedBuilder = Widget Function( - BuildContext context, oauth2.Client client); + typedef AuthenticatedBuilder = + Widget Function(BuildContext context, oauth2.Client client); class _GithubLoginState extends State { HttpServer? _redirectServer; @@ -629,10 +623,7 @@ steps: } return Scaffold( - appBar: AppBar( - title: const Text('Github Login'), - elevation: 2, - ), + appBar: AppBar(title: const Text('Github Login'), elevation: 2), body: Center( child: ElevatedButton( onPressed: () async { @@ -640,7 +631,8 @@ steps: // Bind to an ephemeral port on localhost _redirectServer = await HttpServer.bind('localhost', 0); var authenticatedHttpClient = await _getOAuth2Client( - Uri.parse('http://localhost:${_redirectServer!.port}/auth')); + Uri.parse('http://localhost:${_redirectServer!.port}/auth'), + ); setState(() { _client = authenticatedHttpClient; }); @@ -654,8 +646,9 @@ steps: Future _getOAuth2Client(Uri redirectUrl) async { if (widget.githubClientId.isEmpty || widget.githubClientSecret.isEmpty) { throw const GithubLoginException( - 'githubClientId and githubClientSecret must be not empty. ' - 'See `lib/github_oauth_credentials.dart` for more detail.'); + 'githubClientId and githubClientSecret must be not empty. ' + 'See `lib/github_oauth_credentials.dart` for more detail.', + ); } var grant = oauth2.AuthorizationCodeGrant( widget.githubClientId, @@ -664,13 +657,16 @@ steps: secret: widget.githubClientSecret, httpClient: _JsonAcceptingHttpClient(), ); - var authorizationUrl = - grant.getAuthorizationUrl(redirectUrl, scopes: widget.githubScopes); + var authorizationUrl = grant.getAuthorizationUrl( + redirectUrl, + scopes: widget.githubScopes, + ); await _redirect(authorizationUrl); var responseQueryParameters = await _listen(); - var client = - await grant.handleAuthorizationResponse(responseQueryParameters); + var client = await grant.handleAuthorizationResponse( + responseQueryParameters, + ); return client; } @@ -799,28 +795,18 @@ steps: import 'github_oauth_credentials.dart'; import 'src/github_login.dart'; - @@ -44,16 +46,23 @@ class MyHomePage extends StatelessWidget { + @@ -44,9 +46,20 @@ class MyHomePage extends StatelessWidget { Widget build(BuildContext context) { return GithubLoginWidget( builder: (context, httpClient) { - return Scaffold( - - appBar: AppBar( - - title: Text(title), - - elevation: 2, - - ), - - body: const Center( - - child: Text( - - 'You are logged in to GitHub!', - - ), - - ), + - appBar: AppBar(title: Text(title), elevation: 2), + - body: const Center(child: Text('You are logged in to GitHub!')), + return FutureBuilder( + future: viewerDetail(httpClient.credentials.accessToken), + builder: (context, snapshot) { + return Scaffold( - + appBar: AppBar( - + title: Text(title), - + elevation: 2, - + ), + + appBar: AppBar(title: Text(title), elevation: 2), + body: Center( + child: Text( + snapshot.hasData @@ -833,7 +819,7 @@ steps: ); }, githubClientId: githubClientId, - @@ -62,3 +71,8 @@ class MyHomePage extends StatelessWidget { + @@ -55,3 +68,8 @@ class MyHomePage extends StatelessWidget { ); } } @@ -913,23 +899,23 @@ steps: // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - + import 'package:flutter/material.dart'; import 'package:fluttericon/octicons_icons.dart'; import 'package:github/github.dart'; import 'package:url_launcher/url_launcher_string.dart'; - + class GitHubSummary extends StatefulWidget { const GitHubSummary({required this.gitHub, super.key}); final GitHub gitHub; - + @override State createState() => _GitHubSummaryState(); } - + class _GitHubSummaryState extends State { int _selectedIndex = 0; - + @override Widget build(BuildContext context) { return Row( @@ -973,24 +959,24 @@ steps: ); } } - + class RepositoriesList extends StatefulWidget { const RepositoriesList({required this.gitHub, super.key}); final GitHub gitHub; - + @override State createState() => _RepositoriesListState(); } - + class _RepositoriesListState extends State { @override initState() { super.initState(); _repositories = widget.gitHub.repositories.listRepositories().toList(); } - + late Future> _repositories; - + @override Widget build(BuildContext context) { return FutureBuilder>( @@ -1008,8 +994,9 @@ steps: itemBuilder: (context, index) { var repository = repositories[index]; return ListTile( - title: - Text('${repository.owner?.login ?? ''}/${repository.name}'), + title: Text( + '${repository.owner?.login ?? ''}/${repository.name}', + ), subtitle: Text(repository.description), onTap: () => _launchUrl(this, repository.htmlUrl), ); @@ -1020,24 +1007,24 @@ steps: ); } } - + class AssignedIssuesList extends StatefulWidget { const AssignedIssuesList({required this.gitHub, super.key}); final GitHub gitHub; - + @override State createState() => _AssignedIssuesListState(); } - + class _AssignedIssuesListState extends State { @override initState() { super.initState(); _assignedIssues = widget.gitHub.issues.listByUser().toList(); } - + late Future> _assignedIssues; - + @override Widget build(BuildContext context) { return FutureBuilder>( @@ -1056,9 +1043,11 @@ steps: var assignedIssue = assignedIssues[index]; return ListTile( title: Text(assignedIssue.title), - subtitle: Text('${_nameWithOwner(assignedIssue)} ' - 'Issue #${assignedIssue.number} ' - 'opened by ${assignedIssue.user?.login ?? ''}'), + subtitle: Text( + '${_nameWithOwner(assignedIssue)} ' + 'Issue #${assignedIssue.number} ' + 'opened by ${assignedIssue.user?.login ?? ''}', + ), onTap: () => _launchUrl(this, assignedIssue.htmlUrl), ); }, @@ -1067,32 +1056,33 @@ steps: }, ); } - + String _nameWithOwner(Issue assignedIssue) { final endIndex = assignedIssue.url.lastIndexOf('/issues/'); return assignedIssue.url.substring(29, endIndex); } } - + class PullRequestsList extends StatefulWidget { const PullRequestsList({required this.gitHub, super.key}); final GitHub gitHub; - + @override State createState() => _PullRequestsListState(); } - + class _PullRequestsListState extends State { @override initState() { super.initState(); - _pullRequests = widget.gitHub.pullRequests - .list(RepositorySlug('flutter', 'flutter')) - .toList(); + _pullRequests = + widget.gitHub.pullRequests + .list(RepositorySlug('flutter', 'flutter')) + .toList(); } - + late Future> _pullRequests; - + @override Widget build(BuildContext context) { return FutureBuilder>( @@ -1111,10 +1101,12 @@ steps: var pullRequest = pullRequests[index]; return ListTile( title: Text(pullRequest.title ?? ''), - subtitle: Text('flutter/flutter ' - 'PR #${pullRequest.number} ' - 'opened by ${pullRequest.user?.login ?? ''} ' - '(${pullRequest.state?.toLowerCase() ?? ''})'), + subtitle: Text( + 'flutter/flutter ' + 'PR #${pullRequest.number} ' + 'opened by ${pullRequest.user?.login ?? ''} ' + '(${pullRequest.state?.toLowerCase() ?? ''})', + ), onTap: () => _launchUrl(this, pullRequest.htmlUrl ?? ''), ); }, @@ -1124,7 +1116,7 @@ steps: ); } } - + Future _launchUrl(State state, String url) async { if (await canLaunchUrlString(url)) { await launchUrlString(url); @@ -1132,18 +1124,19 @@ steps: if (state.mounted) { return showDialog( context: state.context, - builder: (context) => AlertDialog( - title: const Text('Navigation error'), - content: Text('Could not launch $url'), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: const Text('Close'), + builder: + (context) => AlertDialog( + title: const Text('Navigation error'), + content: Text('Could not launch $url'), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Close'), + ), + ], ), - ], - ), ); } } @@ -1161,7 +1154,7 @@ steps: void main() { runApp(const MyApp()); - @@ -48,23 +49,14 @@ class MyHomePage extends StatelessWidget { + @@ -48,20 +49,11 @@ class MyHomePage extends StatelessWidget { return GithubLoginWidget( builder: (context, httpClient) { WindowToFront.activate(); @@ -1169,10 +1162,7 @@ steps: - future: viewerDetail(httpClient.credentials.accessToken), - builder: (context, snapshot) { - return Scaffold( - - appBar: AppBar( - - title: Text(title), - - elevation: 2, - - ), + - appBar: AppBar(title: Text(title), elevation: 2), - body: Center( - child: Text( - snapshot.hasData @@ -1183,17 +1173,14 @@ steps: - ); - }, + return Scaffold( - + appBar: AppBar( - + title: Text(title), - + elevation: 2, - + ), + + appBar: AppBar(title: Text(title), elevation: 2), + body: GitHubSummary( + gitHub: _getGitHub(httpClient.credentials.accessToken), + ), ); }, githubClientId: githubClientId, - @@ -74,7 +66,6 @@ class MyHomePage extends StatelessWidget { + @@ -71,7 +63,6 @@ class MyHomePage extends StatelessWidget { } } diff --git a/github-client/step_03/lib/main.dart b/github-client/step_03/lib/main.dart index daa28234e5..68f891357d 100644 --- a/github-client/step_03/lib/main.dart +++ b/github-client/step_03/lib/main.dart @@ -43,7 +43,6 @@ class MyApp extends StatelessWidget { // This works for code too, not just values: Most code changes can be // tested with just a hot reload. colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - useMaterial3: true, ), home: const MyHomePage(title: 'Flutter Demo Home Page'), ); @@ -119,9 +118,7 @@ class _MyHomePageState extends State { // wireframe for each widget. mainAxisAlignment: MainAxisAlignment.center, children: [ - const Text( - 'You have pushed the button this many times:', - ), + const Text('You have pushed the button this many times:'), Text( '$_counter', style: Theme.of(context).textTheme.headlineMedium, diff --git a/github-client/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/github-client/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 10c1cab4d6..9d8da8ebce 100644 --- a/github-client/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/github-client/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/github-client/step_03/pubspec.yaml b/github-client/step_03/pubspec.yaml index facd84d0b1..6bddde2c65 100644 --- a/github-client/step_03/pubspec.yaml +++ b/github-client/step_03/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/github-client/step_04/lib/main.dart b/github-client/step_04/lib/main.dart index 3a8f559623..f5adc7fc7e 100644 --- a/github-client/step_04/lib/main.dart +++ b/github-client/step_04/lib/main.dart @@ -45,15 +45,8 @@ class MyHomePage extends StatelessWidget { return GithubLoginWidget( builder: (context, httpClient) { return Scaffold( - appBar: AppBar( - title: Text(title), - elevation: 2, - ), - body: const Center( - child: Text( - 'You are logged in to GitHub!', - ), - ), + appBar: AppBar(title: Text(title), elevation: 2), + body: const Center(child: Text('You are logged in to GitHub!')), ); }, githubClientId: githubClientId, diff --git a/github-client/step_04/lib/src/github_login.dart b/github-client/step_04/lib/src/github_login.dart index fbd47c777d..a641e5242a 100644 --- a/github-client/step_04/lib/src/github_login.dart +++ b/github-client/step_04/lib/src/github_login.dart @@ -19,8 +19,9 @@ import 'package:http/http.dart' as http; import 'package:oauth2/oauth2.dart' as oauth2; import 'package:url_launcher/url_launcher.dart'; -final _authorizationEndpoint = - Uri.parse('https://github.com/login/oauth/authorize'); +final _authorizationEndpoint = Uri.parse( + 'https://github.com/login/oauth/authorize', +); final _tokenEndpoint = Uri.parse('https://github.com/login/oauth/access_token'); class GithubLoginWidget extends StatefulWidget { @@ -40,8 +41,8 @@ class GithubLoginWidget extends StatefulWidget { State createState() => _GithubLoginState(); } -typedef AuthenticatedBuilder = Widget Function( - BuildContext context, oauth2.Client client); +typedef AuthenticatedBuilder = + Widget Function(BuildContext context, oauth2.Client client); class _GithubLoginState extends State { HttpServer? _redirectServer; @@ -55,10 +56,7 @@ class _GithubLoginState extends State { } return Scaffold( - appBar: AppBar( - title: const Text('Github Login'), - elevation: 2, - ), + appBar: AppBar(title: const Text('Github Login'), elevation: 2), body: Center( child: ElevatedButton( onPressed: () async { @@ -66,7 +64,8 @@ class _GithubLoginState extends State { // Bind to an ephemeral port on localhost _redirectServer = await HttpServer.bind('localhost', 0); var authenticatedHttpClient = await _getOAuth2Client( - Uri.parse('http://localhost:${_redirectServer!.port}/auth')); + Uri.parse('http://localhost:${_redirectServer!.port}/auth'), + ); setState(() { _client = authenticatedHttpClient; }); @@ -80,8 +79,9 @@ class _GithubLoginState extends State { Future _getOAuth2Client(Uri redirectUrl) async { if (widget.githubClientId.isEmpty || widget.githubClientSecret.isEmpty) { throw const GithubLoginException( - 'githubClientId and githubClientSecret must be not empty. ' - 'See `lib/github_oauth_credentials.dart` for more detail.'); + 'githubClientId and githubClientSecret must be not empty. ' + 'See `lib/github_oauth_credentials.dart` for more detail.', + ); } var grant = oauth2.AuthorizationCodeGrant( widget.githubClientId, @@ -90,13 +90,16 @@ class _GithubLoginState extends State { secret: widget.githubClientSecret, httpClient: _JsonAcceptingHttpClient(), ); - var authorizationUrl = - grant.getAuthorizationUrl(redirectUrl, scopes: widget.githubScopes); + var authorizationUrl = grant.getAuthorizationUrl( + redirectUrl, + scopes: widget.githubScopes, + ); await _redirect(authorizationUrl); var responseQueryParameters = await _listen(); - var client = - await grant.handleAuthorizationResponse(responseQueryParameters); + var client = await grant.handleAuthorizationResponse( + responseQueryParameters, + ); return client; } diff --git a/github-client/step_04/macos/Podfile b/github-client/step_04/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/github-client/step_04/macos/Podfile +++ b/github-client/step_04/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/github-client/step_04/macos/Runner.xcodeproj/project.pbxproj b/github-client/step_04/macos/Runner.xcodeproj/project.pbxproj index af440e5b9c..2b796296d4 100644 --- a/github-client/step_04/macos/Runner.xcodeproj/project.pbxproj +++ b/github-client/step_04/macos/Runner.xcodeproj/project.pbxproj @@ -27,8 +27,8 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - BEF2F44DD8F5EDFB7AD9C993 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF7E3DBD1FA6D99A3E6DF1A2 /* Pods_Runner.framework */; }; - ED5F92818AAA0F32CEEA425B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 066EC4C23592E4D327345ECB /* Pods_RunnerTests.framework */; }; + A5330EE58F034FED44250CD0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB99E36B06AC68A5DB7EAD49 /* Pods_Runner.framework */; }; + FB9E3738B45CD12639A1AAC1 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D35D055D72AB0F8B78B8F6F /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 066EC4C23592E4D327345ECB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 152D713CB689CFF6EBFA1009 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 36EC87CEE9E7D05330625E48 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 4082123DDE0E49FF65F13074 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6D1E88BAC0CA943CD7D78BFB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 6F8B3CD530E3ED7E71E30EFF /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6AE587FD6454ED174D0EA82E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 6BCB791BAD37933DB238433A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 6D35D055D72AB0F8B78B8F6F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - BF7E3DBD1FA6D99A3E6DF1A2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BFE29A966FEC2A4E346AC495 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AAC7126A16009C420268784C /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + BB99E36B06AC68A5DB7EAD49 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DCA868809F21E8BE1EBF4C51 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + DDBD1DADAA25C6E7F7357EED /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + E9E1B8AF144AEBAABBFA9E50 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - ED5F92818AAA0F32CEEA425B /* Pods_RunnerTests.framework in Frameworks */, + FB9E3738B45CD12639A1AAC1 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BEF2F44DD8F5EDFB7AD9C993 /* Pods_Runner.framework in Frameworks */, + A5330EE58F034FED44250CD0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 63F670B7315A8B6548A9B07A /* Pods */, + D3682F0A5A844F09B54CA21F /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 63F670B7315A8B6548A9B07A /* Pods */ = { + D3682F0A5A844F09B54CA21F /* Pods */ = { isa = PBXGroup; children = ( - 4082123DDE0E49FF65F13074 /* Pods-Runner.debug.xcconfig */, - 6D1E88BAC0CA943CD7D78BFB /* Pods-Runner.release.xcconfig */, - 36EC87CEE9E7D05330625E48 /* Pods-Runner.profile.xcconfig */, - 6F8B3CD530E3ED7E71E30EFF /* Pods-RunnerTests.debug.xcconfig */, - BFE29A966FEC2A4E346AC495 /* Pods-RunnerTests.release.xcconfig */, - 152D713CB689CFF6EBFA1009 /* Pods-RunnerTests.profile.xcconfig */, + DDBD1DADAA25C6E7F7357EED /* Pods-Runner.debug.xcconfig */, + 6BCB791BAD37933DB238433A /* Pods-Runner.release.xcconfig */, + DCA868809F21E8BE1EBF4C51 /* Pods-Runner.profile.xcconfig */, + AAC7126A16009C420268784C /* Pods-RunnerTests.debug.xcconfig */, + E9E1B8AF144AEBAABBFA9E50 /* Pods-RunnerTests.release.xcconfig */, + 6AE587FD6454ED174D0EA82E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - BF7E3DBD1FA6D99A3E6DF1A2 /* Pods_Runner.framework */, - 066EC4C23592E4D327345ECB /* Pods_RunnerTests.framework */, + BB99E36B06AC68A5DB7EAD49 /* Pods_Runner.framework */, + 6D35D055D72AB0F8B78B8F6F /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D237B8B46A9A37E755283FB5 /* [CP] Check Pods Manifest.lock */, + 106C995F2ADB41EDF7F17688 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - FAB99822AABBC3EBD23703F6 /* [CP] Check Pods Manifest.lock */, + A35EC3A9B48D40AAA7977239 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 01B82EF908B479DA59BA1208 /* [CP] Embed Pods Frameworks */, + C86BE7F7095C0CCC91209690 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,21 +323,26 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 01B82EF908B479DA59BA1208 /* [CP] Embed Pods Frameworks */ = { + 106C995F2ADB41EDF7F17688 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -378,7 +383,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - D237B8B46A9A37E755283FB5 /* [CP] Check Pods Manifest.lock */ = { + A35EC3A9B48D40AAA7977239 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,33 +398,28 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - FAB99822AABBC3EBD23703F6 /* [CP] Check Pods Manifest.lock */ = { + C86BE7F7095C0CCC91209690 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6F8B3CD530E3ED7E71E30EFF /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = AAC7126A16009C420268784C /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BFE29A966FEC2A4E346AC495 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = E9E1B8AF144AEBAABBFA9E50 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 152D713CB689CFF6EBFA1009 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6AE587FD6454ED174D0EA82E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/github-client/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/github-client/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 10c1cab4d6..9d8da8ebce 100644 --- a/github-client/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/github-client/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/github-client/step_04/pubspec.yaml b/github-client/step_04/pubspec.yaml index 66962b8472..9091ee516c 100644 --- a/github-client/step_04/pubspec.yaml +++ b/github-client/step_04/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/github-client/step_05/lib/main.dart b/github-client/step_05/lib/main.dart index 74ccba2c7c..db731fd962 100644 --- a/github-client/step_05/lib/main.dart +++ b/github-client/step_05/lib/main.dart @@ -50,10 +50,7 @@ class MyHomePage extends StatelessWidget { future: viewerDetail(httpClient.credentials.accessToken), builder: (context, snapshot) { return Scaffold( - appBar: AppBar( - title: Text(title), - elevation: 2, - ), + appBar: AppBar(title: Text(title), elevation: 2), body: Center( child: Text( snapshot.hasData diff --git a/github-client/step_05/lib/src/github_login.dart b/github-client/step_05/lib/src/github_login.dart index fbd47c777d..a641e5242a 100644 --- a/github-client/step_05/lib/src/github_login.dart +++ b/github-client/step_05/lib/src/github_login.dart @@ -19,8 +19,9 @@ import 'package:http/http.dart' as http; import 'package:oauth2/oauth2.dart' as oauth2; import 'package:url_launcher/url_launcher.dart'; -final _authorizationEndpoint = - Uri.parse('https://github.com/login/oauth/authorize'); +final _authorizationEndpoint = Uri.parse( + 'https://github.com/login/oauth/authorize', +); final _tokenEndpoint = Uri.parse('https://github.com/login/oauth/access_token'); class GithubLoginWidget extends StatefulWidget { @@ -40,8 +41,8 @@ class GithubLoginWidget extends StatefulWidget { State createState() => _GithubLoginState(); } -typedef AuthenticatedBuilder = Widget Function( - BuildContext context, oauth2.Client client); +typedef AuthenticatedBuilder = + Widget Function(BuildContext context, oauth2.Client client); class _GithubLoginState extends State { HttpServer? _redirectServer; @@ -55,10 +56,7 @@ class _GithubLoginState extends State { } return Scaffold( - appBar: AppBar( - title: const Text('Github Login'), - elevation: 2, - ), + appBar: AppBar(title: const Text('Github Login'), elevation: 2), body: Center( child: ElevatedButton( onPressed: () async { @@ -66,7 +64,8 @@ class _GithubLoginState extends State { // Bind to an ephemeral port on localhost _redirectServer = await HttpServer.bind('localhost', 0); var authenticatedHttpClient = await _getOAuth2Client( - Uri.parse('http://localhost:${_redirectServer!.port}/auth')); + Uri.parse('http://localhost:${_redirectServer!.port}/auth'), + ); setState(() { _client = authenticatedHttpClient; }); @@ -80,8 +79,9 @@ class _GithubLoginState extends State { Future _getOAuth2Client(Uri redirectUrl) async { if (widget.githubClientId.isEmpty || widget.githubClientSecret.isEmpty) { throw const GithubLoginException( - 'githubClientId and githubClientSecret must be not empty. ' - 'See `lib/github_oauth_credentials.dart` for more detail.'); + 'githubClientId and githubClientSecret must be not empty. ' + 'See `lib/github_oauth_credentials.dart` for more detail.', + ); } var grant = oauth2.AuthorizationCodeGrant( widget.githubClientId, @@ -90,13 +90,16 @@ class _GithubLoginState extends State { secret: widget.githubClientSecret, httpClient: _JsonAcceptingHttpClient(), ); - var authorizationUrl = - grant.getAuthorizationUrl(redirectUrl, scopes: widget.githubScopes); + var authorizationUrl = grant.getAuthorizationUrl( + redirectUrl, + scopes: widget.githubScopes, + ); await _redirect(authorizationUrl); var responseQueryParameters = await _listen(); - var client = - await grant.handleAuthorizationResponse(responseQueryParameters); + var client = await grant.handleAuthorizationResponse( + responseQueryParameters, + ); return client; } diff --git a/github-client/step_05/macos/Podfile b/github-client/step_05/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/github-client/step_05/macos/Podfile +++ b/github-client/step_05/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/github-client/step_05/macos/Runner.xcodeproj/project.pbxproj b/github-client/step_05/macos/Runner.xcodeproj/project.pbxproj index af440e5b9c..2b796296d4 100644 --- a/github-client/step_05/macos/Runner.xcodeproj/project.pbxproj +++ b/github-client/step_05/macos/Runner.xcodeproj/project.pbxproj @@ -27,8 +27,8 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - BEF2F44DD8F5EDFB7AD9C993 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF7E3DBD1FA6D99A3E6DF1A2 /* Pods_Runner.framework */; }; - ED5F92818AAA0F32CEEA425B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 066EC4C23592E4D327345ECB /* Pods_RunnerTests.framework */; }; + A5330EE58F034FED44250CD0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB99E36B06AC68A5DB7EAD49 /* Pods_Runner.framework */; }; + FB9E3738B45CD12639A1AAC1 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D35D055D72AB0F8B78B8F6F /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 066EC4C23592E4D327345ECB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 152D713CB689CFF6EBFA1009 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 36EC87CEE9E7D05330625E48 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 4082123DDE0E49FF65F13074 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6D1E88BAC0CA943CD7D78BFB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 6F8B3CD530E3ED7E71E30EFF /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6AE587FD6454ED174D0EA82E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 6BCB791BAD37933DB238433A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 6D35D055D72AB0F8B78B8F6F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - BF7E3DBD1FA6D99A3E6DF1A2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BFE29A966FEC2A4E346AC495 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AAC7126A16009C420268784C /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + BB99E36B06AC68A5DB7EAD49 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DCA868809F21E8BE1EBF4C51 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + DDBD1DADAA25C6E7F7357EED /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + E9E1B8AF144AEBAABBFA9E50 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - ED5F92818AAA0F32CEEA425B /* Pods_RunnerTests.framework in Frameworks */, + FB9E3738B45CD12639A1AAC1 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BEF2F44DD8F5EDFB7AD9C993 /* Pods_Runner.framework in Frameworks */, + A5330EE58F034FED44250CD0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 63F670B7315A8B6548A9B07A /* Pods */, + D3682F0A5A844F09B54CA21F /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 63F670B7315A8B6548A9B07A /* Pods */ = { + D3682F0A5A844F09B54CA21F /* Pods */ = { isa = PBXGroup; children = ( - 4082123DDE0E49FF65F13074 /* Pods-Runner.debug.xcconfig */, - 6D1E88BAC0CA943CD7D78BFB /* Pods-Runner.release.xcconfig */, - 36EC87CEE9E7D05330625E48 /* Pods-Runner.profile.xcconfig */, - 6F8B3CD530E3ED7E71E30EFF /* Pods-RunnerTests.debug.xcconfig */, - BFE29A966FEC2A4E346AC495 /* Pods-RunnerTests.release.xcconfig */, - 152D713CB689CFF6EBFA1009 /* Pods-RunnerTests.profile.xcconfig */, + DDBD1DADAA25C6E7F7357EED /* Pods-Runner.debug.xcconfig */, + 6BCB791BAD37933DB238433A /* Pods-Runner.release.xcconfig */, + DCA868809F21E8BE1EBF4C51 /* Pods-Runner.profile.xcconfig */, + AAC7126A16009C420268784C /* Pods-RunnerTests.debug.xcconfig */, + E9E1B8AF144AEBAABBFA9E50 /* Pods-RunnerTests.release.xcconfig */, + 6AE587FD6454ED174D0EA82E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - BF7E3DBD1FA6D99A3E6DF1A2 /* Pods_Runner.framework */, - 066EC4C23592E4D327345ECB /* Pods_RunnerTests.framework */, + BB99E36B06AC68A5DB7EAD49 /* Pods_Runner.framework */, + 6D35D055D72AB0F8B78B8F6F /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D237B8B46A9A37E755283FB5 /* [CP] Check Pods Manifest.lock */, + 106C995F2ADB41EDF7F17688 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - FAB99822AABBC3EBD23703F6 /* [CP] Check Pods Manifest.lock */, + A35EC3A9B48D40AAA7977239 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 01B82EF908B479DA59BA1208 /* [CP] Embed Pods Frameworks */, + C86BE7F7095C0CCC91209690 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,21 +323,26 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 01B82EF908B479DA59BA1208 /* [CP] Embed Pods Frameworks */ = { + 106C995F2ADB41EDF7F17688 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -378,7 +383,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - D237B8B46A9A37E755283FB5 /* [CP] Check Pods Manifest.lock */ = { + A35EC3A9B48D40AAA7977239 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,33 +398,28 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - FAB99822AABBC3EBD23703F6 /* [CP] Check Pods Manifest.lock */ = { + C86BE7F7095C0CCC91209690 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6F8B3CD530E3ED7E71E30EFF /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = AAC7126A16009C420268784C /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BFE29A966FEC2A4E346AC495 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = E9E1B8AF144AEBAABBFA9E50 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 152D713CB689CFF6EBFA1009 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6AE587FD6454ED174D0EA82E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/github-client/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/github-client/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 10c1cab4d6..9d8da8ebce 100644 --- a/github-client/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/github-client/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/github-client/step_05/pubspec.yaml b/github-client/step_05/pubspec.yaml index 35f3d65225..13e43b5f33 100644 --- a/github-client/step_05/pubspec.yaml +++ b/github-client/step_05/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/github-client/step_06/lib/main.dart b/github-client/step_06/lib/main.dart index 1ce442fc82..d78f48e519 100644 --- a/github-client/step_06/lib/main.dart +++ b/github-client/step_06/lib/main.dart @@ -52,10 +52,7 @@ class MyHomePage extends StatelessWidget { future: viewerDetail(httpClient.credentials.accessToken), builder: (context, snapshot) { return Scaffold( - appBar: AppBar( - title: Text(title), - elevation: 2, - ), + appBar: AppBar(title: Text(title), elevation: 2), body: Center( child: Text( snapshot.hasData diff --git a/github-client/step_06/lib/src/github_login.dart b/github-client/step_06/lib/src/github_login.dart index fbd47c777d..a641e5242a 100644 --- a/github-client/step_06/lib/src/github_login.dart +++ b/github-client/step_06/lib/src/github_login.dart @@ -19,8 +19,9 @@ import 'package:http/http.dart' as http; import 'package:oauth2/oauth2.dart' as oauth2; import 'package:url_launcher/url_launcher.dart'; -final _authorizationEndpoint = - Uri.parse('https://github.com/login/oauth/authorize'); +final _authorizationEndpoint = Uri.parse( + 'https://github.com/login/oauth/authorize', +); final _tokenEndpoint = Uri.parse('https://github.com/login/oauth/access_token'); class GithubLoginWidget extends StatefulWidget { @@ -40,8 +41,8 @@ class GithubLoginWidget extends StatefulWidget { State createState() => _GithubLoginState(); } -typedef AuthenticatedBuilder = Widget Function( - BuildContext context, oauth2.Client client); +typedef AuthenticatedBuilder = + Widget Function(BuildContext context, oauth2.Client client); class _GithubLoginState extends State { HttpServer? _redirectServer; @@ -55,10 +56,7 @@ class _GithubLoginState extends State { } return Scaffold( - appBar: AppBar( - title: const Text('Github Login'), - elevation: 2, - ), + appBar: AppBar(title: const Text('Github Login'), elevation: 2), body: Center( child: ElevatedButton( onPressed: () async { @@ -66,7 +64,8 @@ class _GithubLoginState extends State { // Bind to an ephemeral port on localhost _redirectServer = await HttpServer.bind('localhost', 0); var authenticatedHttpClient = await _getOAuth2Client( - Uri.parse('http://localhost:${_redirectServer!.port}/auth')); + Uri.parse('http://localhost:${_redirectServer!.port}/auth'), + ); setState(() { _client = authenticatedHttpClient; }); @@ -80,8 +79,9 @@ class _GithubLoginState extends State { Future _getOAuth2Client(Uri redirectUrl) async { if (widget.githubClientId.isEmpty || widget.githubClientSecret.isEmpty) { throw const GithubLoginException( - 'githubClientId and githubClientSecret must be not empty. ' - 'See `lib/github_oauth_credentials.dart` for more detail.'); + 'githubClientId and githubClientSecret must be not empty. ' + 'See `lib/github_oauth_credentials.dart` for more detail.', + ); } var grant = oauth2.AuthorizationCodeGrant( widget.githubClientId, @@ -90,13 +90,16 @@ class _GithubLoginState extends State { secret: widget.githubClientSecret, httpClient: _JsonAcceptingHttpClient(), ); - var authorizationUrl = - grant.getAuthorizationUrl(redirectUrl, scopes: widget.githubScopes); + var authorizationUrl = grant.getAuthorizationUrl( + redirectUrl, + scopes: widget.githubScopes, + ); await _redirect(authorizationUrl); var responseQueryParameters = await _listen(); - var client = - await grant.handleAuthorizationResponse(responseQueryParameters); + var client = await grant.handleAuthorizationResponse( + responseQueryParameters, + ); return client; } diff --git a/github-client/step_06/macos/Podfile b/github-client/step_06/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/github-client/step_06/macos/Podfile +++ b/github-client/step_06/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/github-client/step_06/macos/Runner.xcodeproj/project.pbxproj b/github-client/step_06/macos/Runner.xcodeproj/project.pbxproj index af440e5b9c..2b796296d4 100644 --- a/github-client/step_06/macos/Runner.xcodeproj/project.pbxproj +++ b/github-client/step_06/macos/Runner.xcodeproj/project.pbxproj @@ -27,8 +27,8 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - BEF2F44DD8F5EDFB7AD9C993 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF7E3DBD1FA6D99A3E6DF1A2 /* Pods_Runner.framework */; }; - ED5F92818AAA0F32CEEA425B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 066EC4C23592E4D327345ECB /* Pods_RunnerTests.framework */; }; + A5330EE58F034FED44250CD0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB99E36B06AC68A5DB7EAD49 /* Pods_Runner.framework */; }; + FB9E3738B45CD12639A1AAC1 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D35D055D72AB0F8B78B8F6F /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 066EC4C23592E4D327345ECB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 152D713CB689CFF6EBFA1009 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 36EC87CEE9E7D05330625E48 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 4082123DDE0E49FF65F13074 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6D1E88BAC0CA943CD7D78BFB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 6F8B3CD530E3ED7E71E30EFF /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6AE587FD6454ED174D0EA82E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 6BCB791BAD37933DB238433A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 6D35D055D72AB0F8B78B8F6F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - BF7E3DBD1FA6D99A3E6DF1A2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BFE29A966FEC2A4E346AC495 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AAC7126A16009C420268784C /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + BB99E36B06AC68A5DB7EAD49 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DCA868809F21E8BE1EBF4C51 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + DDBD1DADAA25C6E7F7357EED /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + E9E1B8AF144AEBAABBFA9E50 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - ED5F92818AAA0F32CEEA425B /* Pods_RunnerTests.framework in Frameworks */, + FB9E3738B45CD12639A1AAC1 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BEF2F44DD8F5EDFB7AD9C993 /* Pods_Runner.framework in Frameworks */, + A5330EE58F034FED44250CD0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 63F670B7315A8B6548A9B07A /* Pods */, + D3682F0A5A844F09B54CA21F /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 63F670B7315A8B6548A9B07A /* Pods */ = { + D3682F0A5A844F09B54CA21F /* Pods */ = { isa = PBXGroup; children = ( - 4082123DDE0E49FF65F13074 /* Pods-Runner.debug.xcconfig */, - 6D1E88BAC0CA943CD7D78BFB /* Pods-Runner.release.xcconfig */, - 36EC87CEE9E7D05330625E48 /* Pods-Runner.profile.xcconfig */, - 6F8B3CD530E3ED7E71E30EFF /* Pods-RunnerTests.debug.xcconfig */, - BFE29A966FEC2A4E346AC495 /* Pods-RunnerTests.release.xcconfig */, - 152D713CB689CFF6EBFA1009 /* Pods-RunnerTests.profile.xcconfig */, + DDBD1DADAA25C6E7F7357EED /* Pods-Runner.debug.xcconfig */, + 6BCB791BAD37933DB238433A /* Pods-Runner.release.xcconfig */, + DCA868809F21E8BE1EBF4C51 /* Pods-Runner.profile.xcconfig */, + AAC7126A16009C420268784C /* Pods-RunnerTests.debug.xcconfig */, + E9E1B8AF144AEBAABBFA9E50 /* Pods-RunnerTests.release.xcconfig */, + 6AE587FD6454ED174D0EA82E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - BF7E3DBD1FA6D99A3E6DF1A2 /* Pods_Runner.framework */, - 066EC4C23592E4D327345ECB /* Pods_RunnerTests.framework */, + BB99E36B06AC68A5DB7EAD49 /* Pods_Runner.framework */, + 6D35D055D72AB0F8B78B8F6F /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D237B8B46A9A37E755283FB5 /* [CP] Check Pods Manifest.lock */, + 106C995F2ADB41EDF7F17688 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - FAB99822AABBC3EBD23703F6 /* [CP] Check Pods Manifest.lock */, + A35EC3A9B48D40AAA7977239 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 01B82EF908B479DA59BA1208 /* [CP] Embed Pods Frameworks */, + C86BE7F7095C0CCC91209690 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,21 +323,26 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 01B82EF908B479DA59BA1208 /* [CP] Embed Pods Frameworks */ = { + 106C995F2ADB41EDF7F17688 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -378,7 +383,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - D237B8B46A9A37E755283FB5 /* [CP] Check Pods Manifest.lock */ = { + A35EC3A9B48D40AAA7977239 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,33 +398,28 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - FAB99822AABBC3EBD23703F6 /* [CP] Check Pods Manifest.lock */ = { + C86BE7F7095C0CCC91209690 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6F8B3CD530E3ED7E71E30EFF /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = AAC7126A16009C420268784C /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BFE29A966FEC2A4E346AC495 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = E9E1B8AF144AEBAABBFA9E50 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 152D713CB689CFF6EBFA1009 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6AE587FD6454ED174D0EA82E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/github-client/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/github-client/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 10c1cab4d6..9d8da8ebce 100644 --- a/github-client/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/github-client/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/github-client/step_06/pubspec.yaml b/github-client/step_06/pubspec.yaml index b6c7dc2b42..fedf5570ef 100644 --- a/github-client/step_06/pubspec.yaml +++ b/github-client/step_06/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/github-client/step_07/lib/main.dart b/github-client/step_07/lib/main.dart index 96e5956646..4a4cee116b 100644 --- a/github-client/step_07/lib/main.dart +++ b/github-client/step_07/lib/main.dart @@ -50,10 +50,7 @@ class MyHomePage extends StatelessWidget { builder: (context, httpClient) { WindowToFront.activate(); return Scaffold( - appBar: AppBar( - title: Text(title), - elevation: 2, - ), + appBar: AppBar(title: Text(title), elevation: 2), body: GitHubSummary( gitHub: _getGitHub(httpClient.credentials.accessToken), ), diff --git a/github-client/step_07/lib/src/github_login.dart b/github-client/step_07/lib/src/github_login.dart index fbd47c777d..a641e5242a 100644 --- a/github-client/step_07/lib/src/github_login.dart +++ b/github-client/step_07/lib/src/github_login.dart @@ -19,8 +19,9 @@ import 'package:http/http.dart' as http; import 'package:oauth2/oauth2.dart' as oauth2; import 'package:url_launcher/url_launcher.dart'; -final _authorizationEndpoint = - Uri.parse('https://github.com/login/oauth/authorize'); +final _authorizationEndpoint = Uri.parse( + 'https://github.com/login/oauth/authorize', +); final _tokenEndpoint = Uri.parse('https://github.com/login/oauth/access_token'); class GithubLoginWidget extends StatefulWidget { @@ -40,8 +41,8 @@ class GithubLoginWidget extends StatefulWidget { State createState() => _GithubLoginState(); } -typedef AuthenticatedBuilder = Widget Function( - BuildContext context, oauth2.Client client); +typedef AuthenticatedBuilder = + Widget Function(BuildContext context, oauth2.Client client); class _GithubLoginState extends State { HttpServer? _redirectServer; @@ -55,10 +56,7 @@ class _GithubLoginState extends State { } return Scaffold( - appBar: AppBar( - title: const Text('Github Login'), - elevation: 2, - ), + appBar: AppBar(title: const Text('Github Login'), elevation: 2), body: Center( child: ElevatedButton( onPressed: () async { @@ -66,7 +64,8 @@ class _GithubLoginState extends State { // Bind to an ephemeral port on localhost _redirectServer = await HttpServer.bind('localhost', 0); var authenticatedHttpClient = await _getOAuth2Client( - Uri.parse('http://localhost:${_redirectServer!.port}/auth')); + Uri.parse('http://localhost:${_redirectServer!.port}/auth'), + ); setState(() { _client = authenticatedHttpClient; }); @@ -80,8 +79,9 @@ class _GithubLoginState extends State { Future _getOAuth2Client(Uri redirectUrl) async { if (widget.githubClientId.isEmpty || widget.githubClientSecret.isEmpty) { throw const GithubLoginException( - 'githubClientId and githubClientSecret must be not empty. ' - 'See `lib/github_oauth_credentials.dart` for more detail.'); + 'githubClientId and githubClientSecret must be not empty. ' + 'See `lib/github_oauth_credentials.dart` for more detail.', + ); } var grant = oauth2.AuthorizationCodeGrant( widget.githubClientId, @@ -90,13 +90,16 @@ class _GithubLoginState extends State { secret: widget.githubClientSecret, httpClient: _JsonAcceptingHttpClient(), ); - var authorizationUrl = - grant.getAuthorizationUrl(redirectUrl, scopes: widget.githubScopes); + var authorizationUrl = grant.getAuthorizationUrl( + redirectUrl, + scopes: widget.githubScopes, + ); await _redirect(authorizationUrl); var responseQueryParameters = await _listen(); - var client = - await grant.handleAuthorizationResponse(responseQueryParameters); + var client = await grant.handleAuthorizationResponse( + responseQueryParameters, + ); return client; } diff --git a/github-client/step_07/lib/src/github_summary.dart b/github-client/step_07/lib/src/github_summary.dart index f0b7c7d3b1..f65b4c93dd 100644 --- a/github-client/step_07/lib/src/github_summary.dart +++ b/github-client/step_07/lib/src/github_summary.dart @@ -106,8 +106,9 @@ class _RepositoriesListState extends State { itemBuilder: (context, index) { var repository = repositories[index]; return ListTile( - title: - Text('${repository.owner?.login ?? ''}/${repository.name}'), + title: Text( + '${repository.owner?.login ?? ''}/${repository.name}', + ), subtitle: Text(repository.description), onTap: () => _launchUrl(this, repository.htmlUrl), ); @@ -154,9 +155,11 @@ class _AssignedIssuesListState extends State { var assignedIssue = assignedIssues[index]; return ListTile( title: Text(assignedIssue.title), - subtitle: Text('${_nameWithOwner(assignedIssue)} ' - 'Issue #${assignedIssue.number} ' - 'opened by ${assignedIssue.user?.login ?? ''}'), + subtitle: Text( + '${_nameWithOwner(assignedIssue)} ' + 'Issue #${assignedIssue.number} ' + 'opened by ${assignedIssue.user?.login ?? ''}', + ), onTap: () => _launchUrl(this, assignedIssue.htmlUrl), ); }, @@ -184,9 +187,10 @@ class _PullRequestsListState extends State { @override initState() { super.initState(); - _pullRequests = widget.gitHub.pullRequests - .list(RepositorySlug('flutter', 'flutter')) - .toList(); + _pullRequests = + widget.gitHub.pullRequests + .list(RepositorySlug('flutter', 'flutter')) + .toList(); } late Future> _pullRequests; @@ -209,10 +213,12 @@ class _PullRequestsListState extends State { var pullRequest = pullRequests[index]; return ListTile( title: Text(pullRequest.title ?? ''), - subtitle: Text('flutter/flutter ' - 'PR #${pullRequest.number} ' - 'opened by ${pullRequest.user?.login ?? ''} ' - '(${pullRequest.state?.toLowerCase() ?? ''})'), + subtitle: Text( + 'flutter/flutter ' + 'PR #${pullRequest.number} ' + 'opened by ${pullRequest.user?.login ?? ''} ' + '(${pullRequest.state?.toLowerCase() ?? ''})', + ), onTap: () => _launchUrl(this, pullRequest.htmlUrl ?? ''), ); }, @@ -230,18 +236,19 @@ Future _launchUrl(State state, String url) async { if (state.mounted) { return showDialog( context: state.context, - builder: (context) => AlertDialog( - title: const Text('Navigation error'), - content: Text('Could not launch $url'), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: const Text('Close'), + builder: + (context) => AlertDialog( + title: const Text('Navigation error'), + content: Text('Could not launch $url'), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Close'), + ), + ], ), - ], - ), ); } } diff --git a/github-client/step_07/macos/Podfile b/github-client/step_07/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/github-client/step_07/macos/Podfile +++ b/github-client/step_07/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/github-client/step_07/macos/Runner.xcodeproj/project.pbxproj b/github-client/step_07/macos/Runner.xcodeproj/project.pbxproj index af440e5b9c..2b796296d4 100644 --- a/github-client/step_07/macos/Runner.xcodeproj/project.pbxproj +++ b/github-client/step_07/macos/Runner.xcodeproj/project.pbxproj @@ -27,8 +27,8 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - BEF2F44DD8F5EDFB7AD9C993 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF7E3DBD1FA6D99A3E6DF1A2 /* Pods_Runner.framework */; }; - ED5F92818AAA0F32CEEA425B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 066EC4C23592E4D327345ECB /* Pods_RunnerTests.framework */; }; + A5330EE58F034FED44250CD0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB99E36B06AC68A5DB7EAD49 /* Pods_Runner.framework */; }; + FB9E3738B45CD12639A1AAC1 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D35D055D72AB0F8B78B8F6F /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 066EC4C23592E4D327345ECB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 152D713CB689CFF6EBFA1009 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +78,16 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 36EC87CEE9E7D05330625E48 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 4082123DDE0E49FF65F13074 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6D1E88BAC0CA943CD7D78BFB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 6F8B3CD530E3ED7E71E30EFF /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6AE587FD6454ED174D0EA82E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 6BCB791BAD37933DB238433A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 6D35D055D72AB0F8B78B8F6F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - BF7E3DBD1FA6D99A3E6DF1A2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BFE29A966FEC2A4E346AC495 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AAC7126A16009C420268784C /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + BB99E36B06AC68A5DB7EAD49 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DCA868809F21E8BE1EBF4C51 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + DDBD1DADAA25C6E7F7357EED /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + E9E1B8AF144AEBAABBFA9E50 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - ED5F92818AAA0F32CEEA425B /* Pods_RunnerTests.framework in Frameworks */, + FB9E3738B45CD12639A1AAC1 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BEF2F44DD8F5EDFB7AD9C993 /* Pods_Runner.framework in Frameworks */, + A5330EE58F034FED44250CD0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -137,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 63F670B7315A8B6548A9B07A /* Pods */, + D3682F0A5A844F09B54CA21F /* Pods */, ); sourceTree = ""; }; @@ -185,15 +185,15 @@ path = Runner; sourceTree = ""; }; - 63F670B7315A8B6548A9B07A /* Pods */ = { + D3682F0A5A844F09B54CA21F /* Pods */ = { isa = PBXGroup; children = ( - 4082123DDE0E49FF65F13074 /* Pods-Runner.debug.xcconfig */, - 6D1E88BAC0CA943CD7D78BFB /* Pods-Runner.release.xcconfig */, - 36EC87CEE9E7D05330625E48 /* Pods-Runner.profile.xcconfig */, - 6F8B3CD530E3ED7E71E30EFF /* Pods-RunnerTests.debug.xcconfig */, - BFE29A966FEC2A4E346AC495 /* Pods-RunnerTests.release.xcconfig */, - 152D713CB689CFF6EBFA1009 /* Pods-RunnerTests.profile.xcconfig */, + DDBD1DADAA25C6E7F7357EED /* Pods-Runner.debug.xcconfig */, + 6BCB791BAD37933DB238433A /* Pods-Runner.release.xcconfig */, + DCA868809F21E8BE1EBF4C51 /* Pods-Runner.profile.xcconfig */, + AAC7126A16009C420268784C /* Pods-RunnerTests.debug.xcconfig */, + E9E1B8AF144AEBAABBFA9E50 /* Pods-RunnerTests.release.xcconfig */, + 6AE587FD6454ED174D0EA82E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - BF7E3DBD1FA6D99A3E6DF1A2 /* Pods_Runner.framework */, - 066EC4C23592E4D327345ECB /* Pods_RunnerTests.framework */, + BB99E36B06AC68A5DB7EAD49 /* Pods_Runner.framework */, + 6D35D055D72AB0F8B78B8F6F /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - D237B8B46A9A37E755283FB5 /* [CP] Check Pods Manifest.lock */, + 106C995F2ADB41EDF7F17688 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - FAB99822AABBC3EBD23703F6 /* [CP] Check Pods Manifest.lock */, + A35EC3A9B48D40AAA7977239 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 01B82EF908B479DA59BA1208 /* [CP] Embed Pods Frameworks */, + C86BE7F7095C0CCC91209690 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,21 +323,26 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 01B82EF908B479DA59BA1208 /* [CP] Embed Pods Frameworks */ = { + 106C995F2ADB41EDF7F17688 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { @@ -378,7 +383,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - D237B8B46A9A37E755283FB5 /* [CP] Check Pods Manifest.lock */ = { + A35EC3A9B48D40AAA7977239 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -393,33 +398,28 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - FAB99822AABBC3EBD23703F6 /* [CP] Check Pods Manifest.lock */ = { + C86BE7F7095C0CCC91209690 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6F8B3CD530E3ED7E71E30EFF /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = AAC7126A16009C420268784C /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BFE29A966FEC2A4E346AC495 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = E9E1B8AF144AEBAABBFA9E50 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 152D713CB689CFF6EBFA1009 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6AE587FD6454ED174D0EA82E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/github-client/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/github-client/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 10c1cab4d6..9d8da8ebce 100644 --- a/github-client/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/github-client/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/github-client/step_07/pubspec.yaml b/github-client/step_07/pubspec.yaml index 7a3c5f8a58..425c033f52 100644 --- a/github-client/step_07/pubspec.yaml +++ b/github-client/step_07/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/github-client/window_to_front/pubspec.yaml b/github-client/window_to_front/pubspec.yaml index 06a36d02b2..7e4c04475a 100644 --- a/github-client/window_to_front/pubspec.yaml +++ b/github-client/window_to_front/pubspec.yaml @@ -18,7 +18,7 @@ version: 0.0.1 homepage: environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 flutter: '>=3.3.0' dependencies: diff --git a/google-maps-in-flutter/codelab_rebuild.yaml b/google-maps-in-flutter/codelab_rebuild.yaml index 66d92d6e39..b5874e15c9 100644 --- a/google-maps-in-flutter/codelab_rebuild.yaml +++ b/google-maps-in-flutter/codelab_rebuild.yaml @@ -47,8 +47,8 @@ steps: } ] } - - name: Patch android/app/build.gradle - path: google_maps_in_flutter/android/app/build.gradle + - name: Patch android/app/build.gradle.kts + path: google_maps_in_flutter/android/app/build.gradle.kts patch-u: | --- b/google-maps-in-flutter/step_3/android/app/build.gradle +++ a/google-maps-in-flutter/step_3/android/app/build.gradle @@ -149,30 +149,6 @@ steps: - name: flutter pub upgrade path: google_maps_in_flutter flutter: pub upgrade - - name: Patch android/settings.gradle - path: google_maps_in_flutter/android/settings.gradle - patch-u: | - --- b/boring_to_beautiful/step_01/android/settings.gradle - +++ a/boring_to_beautiful/step_01/android/settings.gradle - @@ -18,7 +18,7 @@ pluginManagement { - - plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - - id "com.android.application" version "8.1.0" apply false - + id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false - } - - name: Patch - path: google_maps_in_flutter/android/gradle/wrapper/gradle-wrapper.properties - patch-u: | - --- b/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties - +++ a/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties - @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME - distributionPath=wrapper/dists - zipStoreBase=GRADLE_USER_HOME - zipStorePath=wrapper/dists - -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip - +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip - name: build Android platforms: [ macos ] path: google_maps_in_flutter @@ -292,20 +268,12 @@ steps: @override Widget build(BuildContext context) { return MaterialApp( - theme: ThemeData( - colorSchemeSeed: Colors.green[700], - ), + theme: ThemeData(colorSchemeSeed: Colors.green[700]), home: Scaffold( - appBar: AppBar( - title: const Text('Maps Sample App'), - elevation: 2, - ), + appBar: AppBar(title: const Text('Maps Sample App'), elevation: 2), body: GoogleMap( onMapCreated: _onMapCreated, - initialCameraPosition: CameraPosition( - target: _center, - zoom: 11.0, - ), + initialCameraPosition: CameraPosition(target: _center, zoom: 11.0), ), ), ); @@ -1279,30 +1247,27 @@ steps: * See the License for the specific language governing permissions and * limitations under the License. */ - + import 'dart:convert'; - + import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart' show rootBundle; import 'package:http/http.dart' as http; import 'package:json_annotation/json_annotation.dart'; - + part 'locations.g.dart'; - + @JsonSerializable() class LatLng { - LatLng({ - required this.lat, - required this.lng, - }); - + LatLng({required this.lat, required this.lng}); + factory LatLng.fromJson(Map json) => _$LatLngFromJson(json); Map toJson() => _$LatLngToJson(this); - + final double lat; final double lng; } - + @JsonSerializable() class Region { Region({ @@ -1311,16 +1276,16 @@ steps: required this.name, required this.zoom, }); - + factory Region.fromJson(Map json) => _$RegionFromJson(json); Map toJson() => _$RegionToJson(this); - + final LatLng coords; final String id; final String name; final double zoom; } - + @JsonSerializable() class Office { Office({ @@ -1333,10 +1298,10 @@ steps: required this.phone, required this.region, }); - + factory Office.fromJson(Map json) => _$OfficeFromJson(json); Map toJson() => _$OfficeToJson(this); - + final String address; final String id; final String image; @@ -1346,43 +1311,40 @@ steps: final String phone; final String region; } - + @JsonSerializable() class Locations { - Locations({ - required this.offices, - required this.regions, - }); - + Locations({required this.offices, required this.regions}); + factory Locations.fromJson(Map json) => _$LocationsFromJson(json); Map toJson() => _$LocationsToJson(this); - + final List offices; final List regions; } - + Future getGoogleOffices() async { const googleLocationsURL = 'https://about.google/static/data/locations.json'; - + // Retrieve the locations of Google offices try { final response = await http.get(Uri.parse(googleLocationsURL)); if (response.statusCode == 200) { return Locations.fromJson( - json.decode(response.body) as Map); + json.decode(response.body) as Map, + ); } } catch (e) { if (kDebugMode) { print(e); } } - + // Fallback for when the above HTTP request fails. return Locations.fromJson( - json.decode( - await rootBundle.loadString('assets/locations.json'), - ) as Map, + json.decode(await rootBundle.loadString('assets/locations.json')) + as Map, ); } - name: Patch lib/main.dart @@ -1398,7 +1360,7 @@ steps: void main() { runApp(const MyApp()); - @@ -29,12 +30,23 @@ class MyApp extends StatefulWidget { + @@ -29,12 +30,20 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { @@ -1417,10 +1379,7 @@ steps: + final marker = Marker( + markerId: MarkerId(office.name), + position: LatLng(office.lat, office.lng), - + infoWindow: InfoWindow( - + title: office.name, - + snippet: office.address, - + ), + + infoWindow: InfoWindow(title: office.name, snippet: office.address), + ); + _markers[office.name] = marker; + } @@ -1428,23 +1387,22 @@ steps: } @override - @@ -45,15 +57,16 @@ class _MyAppState extends State { - ), + @@ -42,10 +51,17 @@ class _MyAppState extends State { + return MaterialApp( + theme: ThemeData(colorSchemeSeed: Colors.green[700]), home: Scaffold( - appBar: AppBar( - - title: const Text('Maps Sample App'), + - appBar: AppBar(title: const Text('Maps Sample App'), elevation: 2), + + appBar: AppBar( + title: const Text('Google Office Locations'), - elevation: 2, - ), + + elevation: 2, + + ), body: GoogleMap( onMapCreated: _onMapCreated, - - initialCameraPosition: CameraPosition( - - target: _center, - - zoom: 11.0, + - initialCameraPosition: CameraPosition(target: _center, zoom: 11.0), + initialCameraPosition: const CameraPosition( + target: LatLng(0, 0), + zoom: 2, - ), + + ), + markers: _markers.values.toSet(), ), ), @@ -1460,12 +1418,15 @@ steps: # see https://flutter.dev/to/font-from-package + assets: + - assets/locations.json - - name: flutter doctor + - name: Flutter pub get path: google_maps_in_flutter - flutter: doctor + flutter: pub get - name: Run build_runner path: google_maps_in_flutter dart: run build_runner build + - name: format locations.g.dart + path: google_maps_in_flutter + dart: format lib/src/locations.g.dart - name: Patch lib/src/locations.g.dart path: google_maps_in_flutter/lib/src/locations.g.dart patch-u: | diff --git a/google-maps-in-flutter/step_3/android/.gitignore b/google-maps-in-flutter/step_3/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/google-maps-in-flutter/step_3/android/.gitignore +++ b/google-maps-in-flutter/step_3/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/google-maps-in-flutter/step_3/android/app/build.gradle b/google-maps-in-flutter/step_3/android/app/build.gradle deleted file mode 100644 index ff699ddc54..0000000000 --- a/google-maps-in-flutter/step_3/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.google_maps_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.google_maps_in_flutter" - // Minimum Android version for Google Maps SDK - // https://developers.google.com/maps/flutter-package/config#android - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/google-maps-in-flutter/step_3/android/app/build.gradle.kts b/google-maps-in-flutter/step_3/android/app/build.gradle.kts new file mode 100644 index 0000000000..eef6a54622 --- /dev/null +++ b/google-maps-in-flutter/step_3/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.google_maps_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.google_maps_in_flutter" + // Minimum Android version for Google Maps SDK + // https://developers.google.com/maps/flutter-package/config#android + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/google-maps-in-flutter/step_3/android/app/src/main/kotlin/com/example/google_maps_in_flutter/MainActivity.kt b/google-maps-in-flutter/step_3/android/app/src/main/kotlin/com/example/google_maps_in_flutter/MainActivity.kt index 6d114a9167..b5b7a72224 100644 --- a/google-maps-in-flutter/step_3/android/app/src/main/kotlin/com/example/google_maps_in_flutter/MainActivity.kt +++ b/google-maps-in-flutter/step_3/android/app/src/main/kotlin/com/example/google_maps_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.google_maps_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/google-maps-in-flutter/step_3/android/build.gradle b/google-maps-in-flutter/step_3/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/google-maps-in-flutter/step_3/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/google-maps-in-flutter/step_3/android/build.gradle.kts b/google-maps-in-flutter/step_3/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/google-maps-in-flutter/step_3/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/google-maps-in-flutter/step_3/android/gradle.properties b/google-maps-in-flutter/step_3/android/gradle.properties index 2597170821..f018a61817 100644 --- a/google-maps-in-flutter/step_3/android/gradle.properties +++ b/google-maps-in-flutter/step_3/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/google-maps-in-flutter/step_3/android/gradle/wrapper/gradle-wrapper.properties b/google-maps-in-flutter/step_3/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/google-maps-in-flutter/step_3/android/gradle/wrapper/gradle-wrapper.properties +++ b/google-maps-in-flutter/step_3/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/google-maps-in-flutter/step_3/android/settings.gradle b/google-maps-in-flutter/step_3/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/google-maps-in-flutter/step_3/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/google-maps-in-flutter/step_3/android/settings.gradle.kts b/google-maps-in-flutter/step_3/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/google-maps-in-flutter/step_3/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/google-maps-in-flutter/step_3/ios/Podfile b/google-maps-in-flutter/step_3/ios/Podfile index f0e7de1f75..0f7f6d3141 100644 --- a/google-maps-in-flutter/step_3/ios/Podfile +++ b/google-maps-in-flutter/step_3/ios/Podfile @@ -30,7 +30,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/google-maps-in-flutter/step_3/ios/Runner.xcodeproj/project.pbxproj b/google-maps-in-flutter/step_3/ios/Runner.xcodeproj/project.pbxproj index d2eb8073e7..e8bd96f0b4 100644 --- a/google-maps-in-flutter/step_3/ios/Runner.xcodeproj/project.pbxproj +++ b/google-maps-in-flutter/step_3/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 2F0AF9657026A2C736A0A0F4 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70C206AA1B07B10EB933A8AC /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 462645F421CF6F5709CB5965 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3FD617CE3C5BF35F9D547BE /* Pods_Runner.framework */; }; - 580AA0D25A4475F6D25FD171 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49E35B93C604F52B52408B33 /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + FB8A34ABAF3EDA6CC39E62F2 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09FD8EA2BB34394C2E526A4B /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,17 +42,21 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0EAA917302853F368A1D675E /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 09FD8EA2BB34394C2E526A4B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 155EDDEE063C2869E05C230B /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 49E35B93C604F52B52408B33 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A47B967C261C40AD8AA9E79 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 63C680EA9E3B00B5095CDD6A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 70C206AA1B07B10EB933A8AC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 876471173AA416BE226AF133 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 7B15A2ACCAA35ADF3583A513 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 89358DDC6907ADCB33473F00 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +64,15 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9898E5D215649EFCE46DF274 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - A685A54F8B7A2B591BA1252A /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - BB74C589A2CC4CA6E0195216 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - D3FD617CE3C5BF35F9D547BE /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F9E1E6803B5E3957928F685A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + B86005470E3798B09B39F2CC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 931F79D152AF7C50424C7EF1 /* Frameworks */ = { + 8C51810B3ED822F707A4A073 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 580AA0D25A4475F6D25FD171 /* Pods_RunnerTests.framework in Frameworks */, + FB8A34ABAF3EDA6CC39E62F2 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,42 +80,42 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 462645F421CF6F5709CB5965 /* Pods_Runner.framework in Frameworks */, + 2F0AF9657026A2C736A0A0F4 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 331C8082294A63A400263BE5 /* RunnerTests */ = { + 1F9FE5D262EE80C4CCE5EEAA /* Pods */ = { isa = PBXGroup; children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, + B86005470E3798B09B39F2CC /* Pods-Runner.debug.xcconfig */, + 63C680EA9E3B00B5095CDD6A /* Pods-Runner.release.xcconfig */, + 155EDDEE063C2869E05C230B /* Pods-Runner.profile.xcconfig */, + 5A47B967C261C40AD8AA9E79 /* Pods-RunnerTests.debug.xcconfig */, + 89358DDC6907ADCB33473F00 /* Pods-RunnerTests.release.xcconfig */, + 7B15A2ACCAA35ADF3583A513 /* Pods-RunnerTests.profile.xcconfig */, ); - path = RunnerTests; + name = Pods; + path = Pods; sourceTree = ""; }; - 66E9B737754A093D9D31DA41 /* Frameworks */ = { + 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( - D3FD617CE3C5BF35F9D547BE /* Pods_Runner.framework */, - 49E35B93C604F52B52408B33 /* Pods_RunnerTests.framework */, + 331C807B294A618700263BE5 /* RunnerTests.swift */, ); - name = Frameworks; + path = RunnerTests; sourceTree = ""; }; - 7B1C599D5770F4A66EB3CA5E /* Pods */ = { + 8ABD6DF20A430562B8268FC7 /* Frameworks */ = { isa = PBXGroup; children = ( - A685A54F8B7A2B591BA1252A /* Pods-Runner.debug.xcconfig */, - 876471173AA416BE226AF133 /* Pods-Runner.release.xcconfig */, - F9E1E6803B5E3957928F685A /* Pods-Runner.profile.xcconfig */, - 0EAA917302853F368A1D675E /* Pods-RunnerTests.debug.xcconfig */, - 9898E5D215649EFCE46DF274 /* Pods-RunnerTests.release.xcconfig */, - BB74C589A2CC4CA6E0195216 /* Pods-RunnerTests.profile.xcconfig */, + 70C206AA1B07B10EB933A8AC /* Pods_Runner.framework */, + 09FD8EA2BB34394C2E526A4B /* Pods_RunnerTests.framework */, ); - name = Pods; - path = Pods; + name = Frameworks; sourceTree = ""; }; 9740EEB11CF90186004384FC /* Flutter */ = { @@ -136,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 7B1C599D5770F4A66EB3CA5E /* Pods */, - 66E9B737754A093D9D31DA41 /* Frameworks */, + 1F9FE5D262EE80C4CCE5EEAA /* Pods */, + 8ABD6DF20A430562B8268FC7 /* Frameworks */, ); sourceTree = ""; }; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 33E508A5827E67F25FF63586 /* [CP] Check Pods Manifest.lock */, + 9609B247113AAF9F74FFE2CE /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 931F79D152AF7C50424C7EF1 /* Frameworks */, + 8C51810B3ED822F707A4A073 /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 7A9476FF8E33C1DF2E8721AA /* [CP] Check Pods Manifest.lock */, + 681FCB8D7A7B000690114022 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 580CB409F68ECF82130A62EA /* [CP] Copy Pods Resources */, + 68B55A2EC95B2A99072EB146 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -270,45 +270,45 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 33E508A5827E67F25FF63586 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 681FCB8D7A7B000690114022 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 580CB409F68ECF82130A62EA /* [CP] Copy Pods Resources */ = { + 68B55A2EC95B2A99072EB146 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,7 +325,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 7A9476FF8E33C1DF2E8721AA /* [CP] Check Pods Manifest.lock */ = { + 9609B247113AAF9F74FFE2CE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,7 +340,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0EAA917302853F368A1D675E /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 5A47B967C261C40AD8AA9E79 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9898E5D215649EFCE46DF274 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 89358DDC6907ADCB33473F00 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BB74C589A2CC4CA6E0195216 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 7B15A2ACCAA35ADF3583A513 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/google-maps-in-flutter/step_3/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/google-maps-in-flutter/step_3/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/google-maps-in-flutter/step_3/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/google-maps-in-flutter/step_3/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/google-maps-in-flutter/step_3/lib/main.dart b/google-maps-in-flutter/step_3/lib/main.dart index b4d67e5f23..160467cd96 100644 --- a/google-maps-in-flutter/step_3/lib/main.dart +++ b/google-maps-in-flutter/step_3/lib/main.dart @@ -45,7 +45,6 @@ class MyApp extends StatelessWidget { // This works for code too, not just values: Most code changes can be // tested with just a hot reload. colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - useMaterial3: true, ), home: const MyHomePage(title: 'Flutter Demo Home Page'), ); @@ -121,9 +120,7 @@ class _MyHomePageState extends State { // wireframe for each widget. mainAxisAlignment: MainAxisAlignment.center, children: [ - const Text( - 'You have pushed the button this many times:', - ), + const Text('You have pushed the button this many times:'), Text( '$_counter', style: Theme.of(context).textTheme.headlineMedium, diff --git a/google-maps-in-flutter/step_3/pubspec.yaml b/google-maps-in-flutter/step_3/pubspec.yaml index 8245c35f55..ee7adbd841 100644 --- a/google-maps-in-flutter/step_3/pubspec.yaml +++ b/google-maps-in-flutter/step_3/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/google-maps-in-flutter/step_4/android/.gitignore b/google-maps-in-flutter/step_4/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/google-maps-in-flutter/step_4/android/.gitignore +++ b/google-maps-in-flutter/step_4/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/google-maps-in-flutter/step_4/android/app/build.gradle b/google-maps-in-flutter/step_4/android/app/build.gradle deleted file mode 100644 index ff699ddc54..0000000000 --- a/google-maps-in-flutter/step_4/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.google_maps_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.google_maps_in_flutter" - // Minimum Android version for Google Maps SDK - // https://developers.google.com/maps/flutter-package/config#android - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/google-maps-in-flutter/step_4/android/app/build.gradle.kts b/google-maps-in-flutter/step_4/android/app/build.gradle.kts new file mode 100644 index 0000000000..eef6a54622 --- /dev/null +++ b/google-maps-in-flutter/step_4/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.google_maps_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.google_maps_in_flutter" + // Minimum Android version for Google Maps SDK + // https://developers.google.com/maps/flutter-package/config#android + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/google-maps-in-flutter/step_4/android/app/src/main/kotlin/com/example/google_maps_in_flutter/MainActivity.kt b/google-maps-in-flutter/step_4/android/app/src/main/kotlin/com/example/google_maps_in_flutter/MainActivity.kt index 6d114a9167..b5b7a72224 100644 --- a/google-maps-in-flutter/step_4/android/app/src/main/kotlin/com/example/google_maps_in_flutter/MainActivity.kt +++ b/google-maps-in-flutter/step_4/android/app/src/main/kotlin/com/example/google_maps_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.google_maps_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/google-maps-in-flutter/step_4/android/build.gradle b/google-maps-in-flutter/step_4/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/google-maps-in-flutter/step_4/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/google-maps-in-flutter/step_4/android/build.gradle.kts b/google-maps-in-flutter/step_4/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/google-maps-in-flutter/step_4/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/google-maps-in-flutter/step_4/android/gradle.properties b/google-maps-in-flutter/step_4/android/gradle.properties index 2597170821..f018a61817 100644 --- a/google-maps-in-flutter/step_4/android/gradle.properties +++ b/google-maps-in-flutter/step_4/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/google-maps-in-flutter/step_4/android/gradle/wrapper/gradle-wrapper.properties b/google-maps-in-flutter/step_4/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/google-maps-in-flutter/step_4/android/gradle/wrapper/gradle-wrapper.properties +++ b/google-maps-in-flutter/step_4/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/google-maps-in-flutter/step_4/android/settings.gradle b/google-maps-in-flutter/step_4/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/google-maps-in-flutter/step_4/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/google-maps-in-flutter/step_4/android/settings.gradle.kts b/google-maps-in-flutter/step_4/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/google-maps-in-flutter/step_4/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/google-maps-in-flutter/step_4/ios/Podfile b/google-maps-in-flutter/step_4/ios/Podfile index f0e7de1f75..0f7f6d3141 100644 --- a/google-maps-in-flutter/step_4/ios/Podfile +++ b/google-maps-in-flutter/step_4/ios/Podfile @@ -30,7 +30,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/google-maps-in-flutter/step_4/ios/Runner.xcodeproj/project.pbxproj b/google-maps-in-flutter/step_4/ios/Runner.xcodeproj/project.pbxproj index d2eb8073e7..e8bd96f0b4 100644 --- a/google-maps-in-flutter/step_4/ios/Runner.xcodeproj/project.pbxproj +++ b/google-maps-in-flutter/step_4/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 2F0AF9657026A2C736A0A0F4 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70C206AA1B07B10EB933A8AC /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 462645F421CF6F5709CB5965 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3FD617CE3C5BF35F9D547BE /* Pods_Runner.framework */; }; - 580AA0D25A4475F6D25FD171 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49E35B93C604F52B52408B33 /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + FB8A34ABAF3EDA6CC39E62F2 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09FD8EA2BB34394C2E526A4B /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,17 +42,21 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0EAA917302853F368A1D675E /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 09FD8EA2BB34394C2E526A4B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 155EDDEE063C2869E05C230B /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 49E35B93C604F52B52408B33 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A47B967C261C40AD8AA9E79 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 63C680EA9E3B00B5095CDD6A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 70C206AA1B07B10EB933A8AC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 876471173AA416BE226AF133 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 7B15A2ACCAA35ADF3583A513 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 89358DDC6907ADCB33473F00 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +64,15 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9898E5D215649EFCE46DF274 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - A685A54F8B7A2B591BA1252A /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - BB74C589A2CC4CA6E0195216 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - D3FD617CE3C5BF35F9D547BE /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F9E1E6803B5E3957928F685A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + B86005470E3798B09B39F2CC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 931F79D152AF7C50424C7EF1 /* Frameworks */ = { + 8C51810B3ED822F707A4A073 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 580AA0D25A4475F6D25FD171 /* Pods_RunnerTests.framework in Frameworks */, + FB8A34ABAF3EDA6CC39E62F2 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,42 +80,42 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 462645F421CF6F5709CB5965 /* Pods_Runner.framework in Frameworks */, + 2F0AF9657026A2C736A0A0F4 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 331C8082294A63A400263BE5 /* RunnerTests */ = { + 1F9FE5D262EE80C4CCE5EEAA /* Pods */ = { isa = PBXGroup; children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, + B86005470E3798B09B39F2CC /* Pods-Runner.debug.xcconfig */, + 63C680EA9E3B00B5095CDD6A /* Pods-Runner.release.xcconfig */, + 155EDDEE063C2869E05C230B /* Pods-Runner.profile.xcconfig */, + 5A47B967C261C40AD8AA9E79 /* Pods-RunnerTests.debug.xcconfig */, + 89358DDC6907ADCB33473F00 /* Pods-RunnerTests.release.xcconfig */, + 7B15A2ACCAA35ADF3583A513 /* Pods-RunnerTests.profile.xcconfig */, ); - path = RunnerTests; + name = Pods; + path = Pods; sourceTree = ""; }; - 66E9B737754A093D9D31DA41 /* Frameworks */ = { + 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( - D3FD617CE3C5BF35F9D547BE /* Pods_Runner.framework */, - 49E35B93C604F52B52408B33 /* Pods_RunnerTests.framework */, + 331C807B294A618700263BE5 /* RunnerTests.swift */, ); - name = Frameworks; + path = RunnerTests; sourceTree = ""; }; - 7B1C599D5770F4A66EB3CA5E /* Pods */ = { + 8ABD6DF20A430562B8268FC7 /* Frameworks */ = { isa = PBXGroup; children = ( - A685A54F8B7A2B591BA1252A /* Pods-Runner.debug.xcconfig */, - 876471173AA416BE226AF133 /* Pods-Runner.release.xcconfig */, - F9E1E6803B5E3957928F685A /* Pods-Runner.profile.xcconfig */, - 0EAA917302853F368A1D675E /* Pods-RunnerTests.debug.xcconfig */, - 9898E5D215649EFCE46DF274 /* Pods-RunnerTests.release.xcconfig */, - BB74C589A2CC4CA6E0195216 /* Pods-RunnerTests.profile.xcconfig */, + 70C206AA1B07B10EB933A8AC /* Pods_Runner.framework */, + 09FD8EA2BB34394C2E526A4B /* Pods_RunnerTests.framework */, ); - name = Pods; - path = Pods; + name = Frameworks; sourceTree = ""; }; 9740EEB11CF90186004384FC /* Flutter */ = { @@ -136,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 7B1C599D5770F4A66EB3CA5E /* Pods */, - 66E9B737754A093D9D31DA41 /* Frameworks */, + 1F9FE5D262EE80C4CCE5EEAA /* Pods */, + 8ABD6DF20A430562B8268FC7 /* Frameworks */, ); sourceTree = ""; }; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 33E508A5827E67F25FF63586 /* [CP] Check Pods Manifest.lock */, + 9609B247113AAF9F74FFE2CE /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 931F79D152AF7C50424C7EF1 /* Frameworks */, + 8C51810B3ED822F707A4A073 /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 7A9476FF8E33C1DF2E8721AA /* [CP] Check Pods Manifest.lock */, + 681FCB8D7A7B000690114022 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 580CB409F68ECF82130A62EA /* [CP] Copy Pods Resources */, + 68B55A2EC95B2A99072EB146 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -270,45 +270,45 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 33E508A5827E67F25FF63586 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 681FCB8D7A7B000690114022 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 580CB409F68ECF82130A62EA /* [CP] Copy Pods Resources */ = { + 68B55A2EC95B2A99072EB146 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,7 +325,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 7A9476FF8E33C1DF2E8721AA /* [CP] Check Pods Manifest.lock */ = { + 9609B247113AAF9F74FFE2CE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,7 +340,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0EAA917302853F368A1D675E /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 5A47B967C261C40AD8AA9E79 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9898E5D215649EFCE46DF274 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 89358DDC6907ADCB33473F00 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BB74C589A2CC4CA6E0195216 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 7B15A2ACCAA35ADF3583A513 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/google-maps-in-flutter/step_4/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/google-maps-in-flutter/step_4/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/google-maps-in-flutter/step_4/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/google-maps-in-flutter/step_4/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/google-maps-in-flutter/step_4/lib/main.dart b/google-maps-in-flutter/step_4/lib/main.dart index 3b42107a69..3f43d2961e 100644 --- a/google-maps-in-flutter/step_4/lib/main.dart +++ b/google-maps-in-flutter/step_4/lib/main.dart @@ -40,20 +40,12 @@ class _MyAppState extends State { @override Widget build(BuildContext context) { return MaterialApp( - theme: ThemeData( - colorSchemeSeed: Colors.green[700], - ), + theme: ThemeData(colorSchemeSeed: Colors.green[700]), home: Scaffold( - appBar: AppBar( - title: const Text('Maps Sample App'), - elevation: 2, - ), + appBar: AppBar(title: const Text('Maps Sample App'), elevation: 2), body: GoogleMap( onMapCreated: _onMapCreated, - initialCameraPosition: CameraPosition( - target: _center, - zoom: 11.0, - ), + initialCameraPosition: CameraPosition(target: _center, zoom: 11.0), ), ), ); diff --git a/google-maps-in-flutter/step_4/pubspec.yaml b/google-maps-in-flutter/step_4/pubspec.yaml index 8245c35f55..ee7adbd841 100644 --- a/google-maps-in-flutter/step_4/pubspec.yaml +++ b/google-maps-in-flutter/step_4/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/google-maps-in-flutter/step_5/android/.gitignore b/google-maps-in-flutter/step_5/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/google-maps-in-flutter/step_5/android/.gitignore +++ b/google-maps-in-flutter/step_5/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/google-maps-in-flutter/step_5/android/app/build.gradle b/google-maps-in-flutter/step_5/android/app/build.gradle deleted file mode 100644 index ff699ddc54..0000000000 --- a/google-maps-in-flutter/step_5/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.google_maps_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.google_maps_in_flutter" - // Minimum Android version for Google Maps SDK - // https://developers.google.com/maps/flutter-package/config#android - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/google-maps-in-flutter/step_5/android/app/build.gradle.kts b/google-maps-in-flutter/step_5/android/app/build.gradle.kts new file mode 100644 index 0000000000..eef6a54622 --- /dev/null +++ b/google-maps-in-flutter/step_5/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.google_maps_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.google_maps_in_flutter" + // Minimum Android version for Google Maps SDK + // https://developers.google.com/maps/flutter-package/config#android + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/google-maps-in-flutter/step_5/android/app/src/main/kotlin/com/example/google_maps_in_flutter/MainActivity.kt b/google-maps-in-flutter/step_5/android/app/src/main/kotlin/com/example/google_maps_in_flutter/MainActivity.kt index 6d114a9167..b5b7a72224 100644 --- a/google-maps-in-flutter/step_5/android/app/src/main/kotlin/com/example/google_maps_in_flutter/MainActivity.kt +++ b/google-maps-in-flutter/step_5/android/app/src/main/kotlin/com/example/google_maps_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.google_maps_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/google-maps-in-flutter/step_5/android/build.gradle b/google-maps-in-flutter/step_5/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/google-maps-in-flutter/step_5/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/google-maps-in-flutter/step_5/android/build.gradle.kts b/google-maps-in-flutter/step_5/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/google-maps-in-flutter/step_5/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/google-maps-in-flutter/step_5/android/gradle.properties b/google-maps-in-flutter/step_5/android/gradle.properties index 2597170821..f018a61817 100644 --- a/google-maps-in-flutter/step_5/android/gradle.properties +++ b/google-maps-in-flutter/step_5/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/google-maps-in-flutter/step_5/android/gradle/wrapper/gradle-wrapper.properties b/google-maps-in-flutter/step_5/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/google-maps-in-flutter/step_5/android/gradle/wrapper/gradle-wrapper.properties +++ b/google-maps-in-flutter/step_5/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/google-maps-in-flutter/step_5/android/settings.gradle b/google-maps-in-flutter/step_5/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/google-maps-in-flutter/step_5/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/google-maps-in-flutter/step_5/android/settings.gradle.kts b/google-maps-in-flutter/step_5/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/google-maps-in-flutter/step_5/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/google-maps-in-flutter/step_5/ios/Podfile b/google-maps-in-flutter/step_5/ios/Podfile index f0e7de1f75..0f7f6d3141 100644 --- a/google-maps-in-flutter/step_5/ios/Podfile +++ b/google-maps-in-flutter/step_5/ios/Podfile @@ -30,7 +30,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/google-maps-in-flutter/step_5/ios/Runner.xcodeproj/project.pbxproj b/google-maps-in-flutter/step_5/ios/Runner.xcodeproj/project.pbxproj index d2eb8073e7..e8bd96f0b4 100644 --- a/google-maps-in-flutter/step_5/ios/Runner.xcodeproj/project.pbxproj +++ b/google-maps-in-flutter/step_5/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 2F0AF9657026A2C736A0A0F4 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70C206AA1B07B10EB933A8AC /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 462645F421CF6F5709CB5965 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3FD617CE3C5BF35F9D547BE /* Pods_Runner.framework */; }; - 580AA0D25A4475F6D25FD171 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49E35B93C604F52B52408B33 /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + FB8A34ABAF3EDA6CC39E62F2 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09FD8EA2BB34394C2E526A4B /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,17 +42,21 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0EAA917302853F368A1D675E /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 09FD8EA2BB34394C2E526A4B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 155EDDEE063C2869E05C230B /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 49E35B93C604F52B52408B33 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A47B967C261C40AD8AA9E79 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 63C680EA9E3B00B5095CDD6A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 70C206AA1B07B10EB933A8AC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 876471173AA416BE226AF133 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 7B15A2ACCAA35ADF3583A513 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 89358DDC6907ADCB33473F00 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +64,15 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9898E5D215649EFCE46DF274 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - A685A54F8B7A2B591BA1252A /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - BB74C589A2CC4CA6E0195216 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - D3FD617CE3C5BF35F9D547BE /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F9E1E6803B5E3957928F685A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + B86005470E3798B09B39F2CC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 931F79D152AF7C50424C7EF1 /* Frameworks */ = { + 8C51810B3ED822F707A4A073 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 580AA0D25A4475F6D25FD171 /* Pods_RunnerTests.framework in Frameworks */, + FB8A34ABAF3EDA6CC39E62F2 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,42 +80,42 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 462645F421CF6F5709CB5965 /* Pods_Runner.framework in Frameworks */, + 2F0AF9657026A2C736A0A0F4 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 331C8082294A63A400263BE5 /* RunnerTests */ = { + 1F9FE5D262EE80C4CCE5EEAA /* Pods */ = { isa = PBXGroup; children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, + B86005470E3798B09B39F2CC /* Pods-Runner.debug.xcconfig */, + 63C680EA9E3B00B5095CDD6A /* Pods-Runner.release.xcconfig */, + 155EDDEE063C2869E05C230B /* Pods-Runner.profile.xcconfig */, + 5A47B967C261C40AD8AA9E79 /* Pods-RunnerTests.debug.xcconfig */, + 89358DDC6907ADCB33473F00 /* Pods-RunnerTests.release.xcconfig */, + 7B15A2ACCAA35ADF3583A513 /* Pods-RunnerTests.profile.xcconfig */, ); - path = RunnerTests; + name = Pods; + path = Pods; sourceTree = ""; }; - 66E9B737754A093D9D31DA41 /* Frameworks */ = { + 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( - D3FD617CE3C5BF35F9D547BE /* Pods_Runner.framework */, - 49E35B93C604F52B52408B33 /* Pods_RunnerTests.framework */, + 331C807B294A618700263BE5 /* RunnerTests.swift */, ); - name = Frameworks; + path = RunnerTests; sourceTree = ""; }; - 7B1C599D5770F4A66EB3CA5E /* Pods */ = { + 8ABD6DF20A430562B8268FC7 /* Frameworks */ = { isa = PBXGroup; children = ( - A685A54F8B7A2B591BA1252A /* Pods-Runner.debug.xcconfig */, - 876471173AA416BE226AF133 /* Pods-Runner.release.xcconfig */, - F9E1E6803B5E3957928F685A /* Pods-Runner.profile.xcconfig */, - 0EAA917302853F368A1D675E /* Pods-RunnerTests.debug.xcconfig */, - 9898E5D215649EFCE46DF274 /* Pods-RunnerTests.release.xcconfig */, - BB74C589A2CC4CA6E0195216 /* Pods-RunnerTests.profile.xcconfig */, + 70C206AA1B07B10EB933A8AC /* Pods_Runner.framework */, + 09FD8EA2BB34394C2E526A4B /* Pods_RunnerTests.framework */, ); - name = Pods; - path = Pods; + name = Frameworks; sourceTree = ""; }; 9740EEB11CF90186004384FC /* Flutter */ = { @@ -136,8 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 7B1C599D5770F4A66EB3CA5E /* Pods */, - 66E9B737754A093D9D31DA41 /* Frameworks */, + 1F9FE5D262EE80C4CCE5EEAA /* Pods */, + 8ABD6DF20A430562B8268FC7 /* Frameworks */, ); sourceTree = ""; }; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 33E508A5827E67F25FF63586 /* [CP] Check Pods Manifest.lock */, + 9609B247113AAF9F74FFE2CE /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 931F79D152AF7C50424C7EF1 /* Frameworks */, + 8C51810B3ED822F707A4A073 /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 7A9476FF8E33C1DF2E8721AA /* [CP] Check Pods Manifest.lock */, + 681FCB8D7A7B000690114022 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 580CB409F68ECF82130A62EA /* [CP] Copy Pods Resources */, + 68B55A2EC95B2A99072EB146 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -270,45 +270,45 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 33E508A5827E67F25FF63586 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 681FCB8D7A7B000690114022 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 580CB409F68ECF82130A62EA /* [CP] Copy Pods Resources */ = { + 68B55A2EC95B2A99072EB146 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -325,7 +325,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 7A9476FF8E33C1DF2E8721AA /* [CP] Check Pods Manifest.lock */ = { + 9609B247113AAF9F74FFE2CE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,7 +340,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0EAA917302853F368A1D675E /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 5A47B967C261C40AD8AA9E79 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9898E5D215649EFCE46DF274 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 89358DDC6907ADCB33473F00 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BB74C589A2CC4CA6E0195216 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 7B15A2ACCAA35ADF3583A513 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/google-maps-in-flutter/step_5/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/google-maps-in-flutter/step_5/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/google-maps-in-flutter/step_5/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/google-maps-in-flutter/step_5/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/google-maps-in-flutter/step_5/lib/main.dart b/google-maps-in-flutter/step_5/lib/main.dart index e5e7536a97..39082b4f16 100644 --- a/google-maps-in-flutter/step_5/lib/main.dart +++ b/google-maps-in-flutter/step_5/lib/main.dart @@ -39,10 +39,7 @@ class _MyAppState extends State { final marker = Marker( markerId: MarkerId(office.name), position: LatLng(office.lat, office.lng), - infoWindow: InfoWindow( - title: office.name, - snippet: office.address, - ), + infoWindow: InfoWindow(title: office.name, snippet: office.address), ); _markers[office.name] = marker; } @@ -52,9 +49,7 @@ class _MyAppState extends State { @override Widget build(BuildContext context) { return MaterialApp( - theme: ThemeData( - colorSchemeSeed: Colors.green[700], - ), + theme: ThemeData(colorSchemeSeed: Colors.green[700]), home: Scaffold( appBar: AppBar( title: const Text('Google Office Locations'), diff --git a/google-maps-in-flutter/step_5/lib/src/locations.dart b/google-maps-in-flutter/step_5/lib/src/locations.dart index 8b36f93449..cdc4a01ac8 100644 --- a/google-maps-in-flutter/step_5/lib/src/locations.dart +++ b/google-maps-in-flutter/step_5/lib/src/locations.dart @@ -25,10 +25,7 @@ part 'locations.g.dart'; @JsonSerializable() class LatLng { - LatLng({ - required this.lat, - required this.lng, - }); + LatLng({required this.lat, required this.lng}); factory LatLng.fromJson(Map json) => _$LatLngFromJson(json); Map toJson() => _$LatLngToJson(this); @@ -83,10 +80,7 @@ class Office { @JsonSerializable() class Locations { - Locations({ - required this.offices, - required this.regions, - }); + Locations({required this.offices, required this.regions}); factory Locations.fromJson(Map json) => _$LocationsFromJson(json); @@ -104,7 +98,8 @@ Future getGoogleOffices() async { final response = await http.get(Uri.parse(googleLocationsURL)); if (response.statusCode == 200) { return Locations.fromJson( - json.decode(response.body) as Map); + json.decode(response.body) as Map, + ); } } catch (e) { if (kDebugMode) { @@ -114,8 +109,7 @@ Future getGoogleOffices() async { // Fallback for when the above HTTP request fails. return Locations.fromJson( - json.decode( - await rootBundle.loadString('assets/locations.json'), - ) as Map, + json.decode(await rootBundle.loadString('assets/locations.json')) + as Map, ); } diff --git a/google-maps-in-flutter/step_5/lib/src/locations.g.dart b/google-maps-in-flutter/step_5/lib/src/locations.g.dart index 64cd86d81d..685fbd1d14 100644 --- a/google-maps-in-flutter/step_5/lib/src/locations.g.dart +++ b/google-maps-in-flutter/step_5/lib/src/locations.g.dart @@ -23,61 +23,63 @@ part of 'locations.dart'; // ************************************************************************** LatLng _$LatLngFromJson(Map json) => LatLng( - lat: (json['lat'] as num).toDouble(), - lng: (json['lng'] as num).toDouble(), - ); + lat: (json['lat'] as num).toDouble(), + lng: (json['lng'] as num).toDouble(), +); Map _$LatLngToJson(LatLng instance) => { - 'lat': instance.lat, - 'lng': instance.lng, - }; + 'lat': instance.lat, + 'lng': instance.lng, +}; Region _$RegionFromJson(Map json) => Region( - coords: LatLng.fromJson(json['coords'] as Map), - id: json['id'] as String, - name: json['name'] as String, - zoom: (json['zoom'] as num).toDouble(), - ); + coords: LatLng.fromJson(json['coords'] as Map), + id: json['id'] as String, + name: json['name'] as String, + zoom: (json['zoom'] as num).toDouble(), +); Map _$RegionToJson(Region instance) => { - 'coords': instance.coords, - 'id': instance.id, - 'name': instance.name, - 'zoom': instance.zoom, - }; + 'coords': instance.coords, + 'id': instance.id, + 'name': instance.name, + 'zoom': instance.zoom, +}; Office _$OfficeFromJson(Map json) => Office( - address: json['address'] as String, - id: json['id'] as String, - image: json['image'] as String, - lat: (json['lat'] as num).toDouble(), - lng: (json['lng'] as num).toDouble(), - name: json['name'] as String, - phone: json['phone'] as String, - region: json['region'] as String, - ); + address: json['address'] as String, + id: json['id'] as String, + image: json['image'] as String, + lat: (json['lat'] as num).toDouble(), + lng: (json['lng'] as num).toDouble(), + name: json['name'] as String, + phone: json['phone'] as String, + region: json['region'] as String, +); Map _$OfficeToJson(Office instance) => { - 'address': instance.address, - 'id': instance.id, - 'image': instance.image, - 'lat': instance.lat, - 'lng': instance.lng, - 'name': instance.name, - 'phone': instance.phone, - 'region': instance.region, - }; + 'address': instance.address, + 'id': instance.id, + 'image': instance.image, + 'lat': instance.lat, + 'lng': instance.lng, + 'name': instance.name, + 'phone': instance.phone, + 'region': instance.region, +}; Locations _$LocationsFromJson(Map json) => Locations( - offices: (json['offices'] as List) + offices: + (json['offices'] as List) .map((e) => Office.fromJson(e as Map)) .toList(), - regions: (json['regions'] as List) + regions: + (json['regions'] as List) .map((e) => Region.fromJson(e as Map)) .toList(), - ); +); Map _$LocationsToJson(Locations instance) => { - 'offices': instance.offices, - 'regions': instance.regions, - }; + 'offices': instance.offices, + 'regions': instance.regions, +}; diff --git a/google-maps-in-flutter/step_5/pubspec.yaml b/google-maps-in-flutter/step_5/pubspec.yaml index 95f86d0d5b..9dcadb2c69 100644 --- a/google-maps-in-flutter/step_5/pubspec.yaml +++ b/google-maps-in-flutter/step_5/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/haiku_generator/finished/lib/app.dart b/haiku_generator/finished/lib/app.dart index 0c2bb9d44a..8115a6918f 100644 --- a/haiku_generator/finished/lib/app.dart +++ b/haiku_generator/finished/lib/app.dart @@ -47,21 +47,18 @@ class HaikuPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: Center( child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - buildTopView(), - const SizedBox( - height: 10.0, - ), - buildBottomView() - ], - )), + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + buildTopView(), + const SizedBox(height: 10.0), + buildBottomView(), + ], + ), + ), ), ); } @@ -71,26 +68,23 @@ class HaikuPageState extends State { children: [ Text( subTitle, - style: const TextStyle( - fontSize: 18, - color: Colors.black, - ), + style: const TextStyle(fontSize: 18, color: Colors.black), ), SizedBox( width: 150.0, child: DropdownButton( - items: listProduct.map((Product value) { - return DropdownMenuItem( - value: value, - child: Text(value.productName), - ); - }).toList(), - hint: Text(productName.toString(), - style: const TextStyle(color: Colors.deepPurpleAccent)), - underline: Container( - height: 1, - color: Colors.deepPurpleAccent, + items: + listProduct.map((Product value) { + return DropdownMenuItem( + value: value, + child: Text(value.productName), + ); + }).toList(), + hint: Text( + productName.toString(), + style: const TextStyle(color: Colors.deepPurpleAccent), ), + underline: Container(height: 1, color: Colors.deepPurpleAccent), onChanged: (value) { setState(() { productName = value!.productName; @@ -116,45 +110,46 @@ class HaikuPageState extends State { fontWeight: FontWeight.w500, ), ), - ) + ), ], ); } Expanded buildBottomView() { return Expanded( - child: haikuText.isNotEmpty - ? Container( - decoration: BoxDecoration( - color: Colors.amberAccent.shade100, - borderRadius: BorderRadius.circular(8), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: SizedBox( - width: double.maxFinite, - child: Text( - haikuText, - style: const TextStyle( - color: Colors.black, - fontSize: 18, - fontWeight: FontWeight.w300, + child: + haikuText.isNotEmpty + ? Container( + decoration: BoxDecoration( + color: Colors.amberAccent.shade100, + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + width: double.maxFinite, + child: Text( + haikuText, + style: const TextStyle( + color: Colors.black, + fontSize: 18, + fontWeight: FontWeight.w300, + ), ), ), ), - ), - ) - : ShimmerLoadingAnim( - isLoading: true, - child: Container( - height: double.maxFinite, - width: double.maxFinite, - decoration: BoxDecoration( - color: const Color(0xFFE5E5E5), - borderRadius: BorderRadius.circular(8), + ) + : ShimmerLoadingAnim( + isLoading: true, + child: Container( + height: double.maxFinite, + width: double.maxFinite, + decoration: BoxDecoration( + color: const Color(0xFFE5E5E5), + borderRadius: BorderRadius.circular(8), + ), ), ), - ), ); } } diff --git a/haiku_generator/finished/lib/data/repositories/poem_repository_impl.dart b/haiku_generator/finished/lib/data/repositories/poem_repository_impl.dart index 56db2bcc5c..bc797f40c0 100644 --- a/haiku_generator/finished/lib/data/repositories/poem_repository_impl.dart +++ b/haiku_generator/finished/lib/data/repositories/poem_repository_impl.dart @@ -12,7 +12,8 @@ class PoemRepositoryImpl implements PoemRepository { const haikuCount = 5; final url = Uri.parse( - 'https://generativelanguage.googleapis.com/v1beta2/models/chat-bison-001:generateMessage?key=$apiKey'); + 'https://generativelanguage.googleapis.com/v1beta2/models/chat-bison-001:generateMessage?key=$apiKey', + ); final headers = {'Content-Type': 'application/json'}; final body = jsonEncode({ "prompt": { @@ -22,13 +23,13 @@ class PoemRepositoryImpl implements PoemRepository { "input": {"content": "Write a haiku about Google Photos."}, "output": { "content": - "Google Photos, my friend\nA journey of a lifetime\nCaptured in pixels" - } - } + "Google Photos, my friend\nA journey of a lifetime\nCaptured in pixels", + }, + }, ], "messages": [ - {"content": "Write a cool, long haiku of for $productName"} - ] + {"content": "Write a cool, long haiku of for $productName"}, + ], }, "candidate_count": haikuCount, "temperature": 1, diff --git a/haiku_generator/finished/lib/data/repositories/product_repository_impl.dart b/haiku_generator/finished/lib/data/repositories/product_repository_impl.dart index 0f2027c54c..7dbffb7d55 100644 --- a/haiku_generator/finished/lib/data/repositories/product_repository_impl.dart +++ b/haiku_generator/finished/lib/data/repositories/product_repository_impl.dart @@ -11,7 +11,7 @@ class ProductRepositoryImpl implements ProductRepository { {'productName': 'YouTube'}, {'productName': 'Android'}, {'productName': 'Google Maps'}, - {'productName': 'GMail'} + {'productName': 'GMail'}, ]; return dummyData.map((item) => Product.fromMap(item)).toList(); } diff --git a/haiku_generator/finished/lib/domain/models/product.dart b/haiku_generator/finished/lib/domain/models/product.dart index b5091f8201..43fdb68250 100644 --- a/haiku_generator/finished/lib/domain/models/product.dart +++ b/haiku_generator/finished/lib/domain/models/product.dart @@ -4,11 +4,9 @@ class Product { Product(this.productName); Product.fromMap(Map json) - : productName = json['productName']; + : productName = json['productName']; Map toMap() { - return { - 'productName': productName, - }; + return {'productName': productName}; } } diff --git a/haiku_generator/finished/lib/widgets/shimmer_gradient.dart b/haiku_generator/finished/lib/widgets/shimmer_gradient.dart index 03d815b57a..5e9de7419a 100644 --- a/haiku_generator/finished/lib/widgets/shimmer_gradient.dart +++ b/haiku_generator/finished/lib/widgets/shimmer_gradient.dart @@ -1,16 +1,8 @@ import 'package:flutter/material.dart'; LinearGradient shimmerGradient = const LinearGradient( - colors: [ - Color(0xFFEBEBF4), - Color(0xFFF4F4F4), - Color(0xFFEBEBF4), - ], - stops: [ - 0.1, - 0.3, - 0.4, - ], + colors: [Color(0xFFEBEBF4), Color(0xFFF4F4F4), Color(0xFFEBEBF4)], + stops: [0.1, 0.3, 0.4], begin: Alignment(-1.0, -0.3), end: Alignment(1.0, 0.3), ); diff --git a/haiku_generator/finished/lib/widgets/shimmer_loading.dart b/haiku_generator/finished/lib/widgets/shimmer_loading.dart index 4611994d12..12eb051bbf 100644 --- a/haiku_generator/finished/lib/widgets/shimmer_loading.dart +++ b/haiku_generator/finished/lib/widgets/shimmer_loading.dart @@ -1,11 +1,7 @@ import 'package:flutter/material.dart'; class Shimmer extends StatefulWidget { - const Shimmer({ - super.key, - required this.linearGradient, - this.child, - }); + const Shimmer({super.key, required this.linearGradient, this.child}); static ShimmerState? of(BuildContext context) { return context.findAncestorStateOfType(); @@ -36,13 +32,12 @@ class ShimmerState extends State with SingleTickerProviderStateMixin { } LinearGradient get gradient => LinearGradient( - colors: widget.linearGradient.colors, - stops: widget.linearGradient.stops, - begin: widget.linearGradient.begin, - end: widget.linearGradient.end, - transform: - SlidingGradientTransform(slidePercent: shimmerController.value), - ); + colors: widget.linearGradient.colors, + stops: widget.linearGradient.stops, + begin: widget.linearGradient.begin, + end: widget.linearGradient.end, + transform: SlidingGradientTransform(slidePercent: shimmerController.value), + ); bool get isSized { if (context.findRenderObject() != null) { @@ -71,9 +66,7 @@ class ShimmerState extends State with SingleTickerProviderStateMixin { } class SlidingGradientTransform extends GradientTransform { - const SlidingGradientTransform({ - required this.slidePercent, - }); + const SlidingGradientTransform({required this.slidePercent}); final double slidePercent; diff --git a/haiku_generator/finished/lib/widgets/shimmer_loading_anim.dart b/haiku_generator/finished/lib/widgets/shimmer_loading_anim.dart index 3dfeda37bb..72b9697804 100644 --- a/haiku_generator/finished/lib/widgets/shimmer_loading_anim.dart +++ b/haiku_generator/finished/lib/widgets/shimmer_loading_anim.dart @@ -4,8 +4,11 @@ import 'shimmer_gradient.dart'; import 'shimmer_loading.dart'; class ShimmerLoadingAnim extends StatelessWidget { - const ShimmerLoadingAnim( - {super.key, required this.child, this.isLoading = false}); + const ShimmerLoadingAnim({ + super.key, + required this.child, + this.isLoading = false, + }); final Widget child; final bool isLoading; @@ -14,10 +17,7 @@ class ShimmerLoadingAnim extends StatelessWidget { Widget build(BuildContext context) { return Shimmer( linearGradient: shimmerGradient, - child: ShimmerLoading( - isLoading: isLoading, - child: child, - ), + child: ShimmerLoading(isLoading: isLoading, child: child), ); } } diff --git a/haiku_generator/finished/pubspec.yaml b/haiku_generator/finished/pubspec.yaml index 88907674f1..568dbed7d7 100644 --- a/haiku_generator/finished/pubspec.yaml +++ b/haiku_generator/finished/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/haiku_generator/step0/lib/app.dart b/haiku_generator/step0/lib/app.dart index 0c2bb9d44a..8115a6918f 100644 --- a/haiku_generator/step0/lib/app.dart +++ b/haiku_generator/step0/lib/app.dart @@ -47,21 +47,18 @@ class HaikuPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: Center( child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - buildTopView(), - const SizedBox( - height: 10.0, - ), - buildBottomView() - ], - )), + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + buildTopView(), + const SizedBox(height: 10.0), + buildBottomView(), + ], + ), + ), ), ); } @@ -71,26 +68,23 @@ class HaikuPageState extends State { children: [ Text( subTitle, - style: const TextStyle( - fontSize: 18, - color: Colors.black, - ), + style: const TextStyle(fontSize: 18, color: Colors.black), ), SizedBox( width: 150.0, child: DropdownButton( - items: listProduct.map((Product value) { - return DropdownMenuItem( - value: value, - child: Text(value.productName), - ); - }).toList(), - hint: Text(productName.toString(), - style: const TextStyle(color: Colors.deepPurpleAccent)), - underline: Container( - height: 1, - color: Colors.deepPurpleAccent, + items: + listProduct.map((Product value) { + return DropdownMenuItem( + value: value, + child: Text(value.productName), + ); + }).toList(), + hint: Text( + productName.toString(), + style: const TextStyle(color: Colors.deepPurpleAccent), ), + underline: Container(height: 1, color: Colors.deepPurpleAccent), onChanged: (value) { setState(() { productName = value!.productName; @@ -116,45 +110,46 @@ class HaikuPageState extends State { fontWeight: FontWeight.w500, ), ), - ) + ), ], ); } Expanded buildBottomView() { return Expanded( - child: haikuText.isNotEmpty - ? Container( - decoration: BoxDecoration( - color: Colors.amberAccent.shade100, - borderRadius: BorderRadius.circular(8), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: SizedBox( - width: double.maxFinite, - child: Text( - haikuText, - style: const TextStyle( - color: Colors.black, - fontSize: 18, - fontWeight: FontWeight.w300, + child: + haikuText.isNotEmpty + ? Container( + decoration: BoxDecoration( + color: Colors.amberAccent.shade100, + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + width: double.maxFinite, + child: Text( + haikuText, + style: const TextStyle( + color: Colors.black, + fontSize: 18, + fontWeight: FontWeight.w300, + ), ), ), ), - ), - ) - : ShimmerLoadingAnim( - isLoading: true, - child: Container( - height: double.maxFinite, - width: double.maxFinite, - decoration: BoxDecoration( - color: const Color(0xFFE5E5E5), - borderRadius: BorderRadius.circular(8), + ) + : ShimmerLoadingAnim( + isLoading: true, + child: Container( + height: double.maxFinite, + width: double.maxFinite, + decoration: BoxDecoration( + color: const Color(0xFFE5E5E5), + borderRadius: BorderRadius.circular(8), + ), ), ), - ), ); } } diff --git a/haiku_generator/step0/lib/domain/models/product.dart b/haiku_generator/step0/lib/domain/models/product.dart index b5091f8201..43fdb68250 100644 --- a/haiku_generator/step0/lib/domain/models/product.dart +++ b/haiku_generator/step0/lib/domain/models/product.dart @@ -4,11 +4,9 @@ class Product { Product(this.productName); Product.fromMap(Map json) - : productName = json['productName']; + : productName = json['productName']; Map toMap() { - return { - 'productName': productName, - }; + return {'productName': productName}; } } diff --git a/haiku_generator/step0/lib/widgets/shimmer_gradient.dart b/haiku_generator/step0/lib/widgets/shimmer_gradient.dart index 03d815b57a..5e9de7419a 100644 --- a/haiku_generator/step0/lib/widgets/shimmer_gradient.dart +++ b/haiku_generator/step0/lib/widgets/shimmer_gradient.dart @@ -1,16 +1,8 @@ import 'package:flutter/material.dart'; LinearGradient shimmerGradient = const LinearGradient( - colors: [ - Color(0xFFEBEBF4), - Color(0xFFF4F4F4), - Color(0xFFEBEBF4), - ], - stops: [ - 0.1, - 0.3, - 0.4, - ], + colors: [Color(0xFFEBEBF4), Color(0xFFF4F4F4), Color(0xFFEBEBF4)], + stops: [0.1, 0.3, 0.4], begin: Alignment(-1.0, -0.3), end: Alignment(1.0, 0.3), ); diff --git a/haiku_generator/step0/lib/widgets/shimmer_loading.dart b/haiku_generator/step0/lib/widgets/shimmer_loading.dart index 4611994d12..12eb051bbf 100644 --- a/haiku_generator/step0/lib/widgets/shimmer_loading.dart +++ b/haiku_generator/step0/lib/widgets/shimmer_loading.dart @@ -1,11 +1,7 @@ import 'package:flutter/material.dart'; class Shimmer extends StatefulWidget { - const Shimmer({ - super.key, - required this.linearGradient, - this.child, - }); + const Shimmer({super.key, required this.linearGradient, this.child}); static ShimmerState? of(BuildContext context) { return context.findAncestorStateOfType(); @@ -36,13 +32,12 @@ class ShimmerState extends State with SingleTickerProviderStateMixin { } LinearGradient get gradient => LinearGradient( - colors: widget.linearGradient.colors, - stops: widget.linearGradient.stops, - begin: widget.linearGradient.begin, - end: widget.linearGradient.end, - transform: - SlidingGradientTransform(slidePercent: shimmerController.value), - ); + colors: widget.linearGradient.colors, + stops: widget.linearGradient.stops, + begin: widget.linearGradient.begin, + end: widget.linearGradient.end, + transform: SlidingGradientTransform(slidePercent: shimmerController.value), + ); bool get isSized { if (context.findRenderObject() != null) { @@ -71,9 +66,7 @@ class ShimmerState extends State with SingleTickerProviderStateMixin { } class SlidingGradientTransform extends GradientTransform { - const SlidingGradientTransform({ - required this.slidePercent, - }); + const SlidingGradientTransform({required this.slidePercent}); final double slidePercent; diff --git a/haiku_generator/step0/lib/widgets/shimmer_loading_anim.dart b/haiku_generator/step0/lib/widgets/shimmer_loading_anim.dart index 3dfeda37bb..72b9697804 100644 --- a/haiku_generator/step0/lib/widgets/shimmer_loading_anim.dart +++ b/haiku_generator/step0/lib/widgets/shimmer_loading_anim.dart @@ -4,8 +4,11 @@ import 'shimmer_gradient.dart'; import 'shimmer_loading.dart'; class ShimmerLoadingAnim extends StatelessWidget { - const ShimmerLoadingAnim( - {super.key, required this.child, this.isLoading = false}); + const ShimmerLoadingAnim({ + super.key, + required this.child, + this.isLoading = false, + }); final Widget child; final bool isLoading; @@ -14,10 +17,7 @@ class ShimmerLoadingAnim extends StatelessWidget { Widget build(BuildContext context) { return Shimmer( linearGradient: shimmerGradient, - child: ShimmerLoading( - isLoading: isLoading, - child: child, - ), + child: ShimmerLoading(isLoading: isLoading, child: child), ); } } diff --git a/haiku_generator/step0/pubspec.yaml b/haiku_generator/step0/pubspec.yaml index 88907674f1..568dbed7d7 100644 --- a/haiku_generator/step0/pubspec.yaml +++ b/haiku_generator/step0/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/haiku_generator/step1/lib/app.dart b/haiku_generator/step1/lib/app.dart index 0c2bb9d44a..8115a6918f 100644 --- a/haiku_generator/step1/lib/app.dart +++ b/haiku_generator/step1/lib/app.dart @@ -47,21 +47,18 @@ class HaikuPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: Center( child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - buildTopView(), - const SizedBox( - height: 10.0, - ), - buildBottomView() - ], - )), + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + buildTopView(), + const SizedBox(height: 10.0), + buildBottomView(), + ], + ), + ), ), ); } @@ -71,26 +68,23 @@ class HaikuPageState extends State { children: [ Text( subTitle, - style: const TextStyle( - fontSize: 18, - color: Colors.black, - ), + style: const TextStyle(fontSize: 18, color: Colors.black), ), SizedBox( width: 150.0, child: DropdownButton( - items: listProduct.map((Product value) { - return DropdownMenuItem( - value: value, - child: Text(value.productName), - ); - }).toList(), - hint: Text(productName.toString(), - style: const TextStyle(color: Colors.deepPurpleAccent)), - underline: Container( - height: 1, - color: Colors.deepPurpleAccent, + items: + listProduct.map((Product value) { + return DropdownMenuItem( + value: value, + child: Text(value.productName), + ); + }).toList(), + hint: Text( + productName.toString(), + style: const TextStyle(color: Colors.deepPurpleAccent), ), + underline: Container(height: 1, color: Colors.deepPurpleAccent), onChanged: (value) { setState(() { productName = value!.productName; @@ -116,45 +110,46 @@ class HaikuPageState extends State { fontWeight: FontWeight.w500, ), ), - ) + ), ], ); } Expanded buildBottomView() { return Expanded( - child: haikuText.isNotEmpty - ? Container( - decoration: BoxDecoration( - color: Colors.amberAccent.shade100, - borderRadius: BorderRadius.circular(8), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: SizedBox( - width: double.maxFinite, - child: Text( - haikuText, - style: const TextStyle( - color: Colors.black, - fontSize: 18, - fontWeight: FontWeight.w300, + child: + haikuText.isNotEmpty + ? Container( + decoration: BoxDecoration( + color: Colors.amberAccent.shade100, + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + width: double.maxFinite, + child: Text( + haikuText, + style: const TextStyle( + color: Colors.black, + fontSize: 18, + fontWeight: FontWeight.w300, + ), ), ), ), - ), - ) - : ShimmerLoadingAnim( - isLoading: true, - child: Container( - height: double.maxFinite, - width: double.maxFinite, - decoration: BoxDecoration( - color: const Color(0xFFE5E5E5), - borderRadius: BorderRadius.circular(8), + ) + : ShimmerLoadingAnim( + isLoading: true, + child: Container( + height: double.maxFinite, + width: double.maxFinite, + decoration: BoxDecoration( + color: const Color(0xFFE5E5E5), + borderRadius: BorderRadius.circular(8), + ), ), ), - ), ); } } diff --git a/haiku_generator/step1/lib/domain/models/product.dart b/haiku_generator/step1/lib/domain/models/product.dart index b5091f8201..43fdb68250 100644 --- a/haiku_generator/step1/lib/domain/models/product.dart +++ b/haiku_generator/step1/lib/domain/models/product.dart @@ -4,11 +4,9 @@ class Product { Product(this.productName); Product.fromMap(Map json) - : productName = json['productName']; + : productName = json['productName']; Map toMap() { - return { - 'productName': productName, - }; + return {'productName': productName}; } } diff --git a/haiku_generator/step1/lib/widgets/shimmer_gradient.dart b/haiku_generator/step1/lib/widgets/shimmer_gradient.dart index 03d815b57a..5e9de7419a 100644 --- a/haiku_generator/step1/lib/widgets/shimmer_gradient.dart +++ b/haiku_generator/step1/lib/widgets/shimmer_gradient.dart @@ -1,16 +1,8 @@ import 'package:flutter/material.dart'; LinearGradient shimmerGradient = const LinearGradient( - colors: [ - Color(0xFFEBEBF4), - Color(0xFFF4F4F4), - Color(0xFFEBEBF4), - ], - stops: [ - 0.1, - 0.3, - 0.4, - ], + colors: [Color(0xFFEBEBF4), Color(0xFFF4F4F4), Color(0xFFEBEBF4)], + stops: [0.1, 0.3, 0.4], begin: Alignment(-1.0, -0.3), end: Alignment(1.0, 0.3), ); diff --git a/haiku_generator/step1/lib/widgets/shimmer_loading.dart b/haiku_generator/step1/lib/widgets/shimmer_loading.dart index 4611994d12..12eb051bbf 100644 --- a/haiku_generator/step1/lib/widgets/shimmer_loading.dart +++ b/haiku_generator/step1/lib/widgets/shimmer_loading.dart @@ -1,11 +1,7 @@ import 'package:flutter/material.dart'; class Shimmer extends StatefulWidget { - const Shimmer({ - super.key, - required this.linearGradient, - this.child, - }); + const Shimmer({super.key, required this.linearGradient, this.child}); static ShimmerState? of(BuildContext context) { return context.findAncestorStateOfType(); @@ -36,13 +32,12 @@ class ShimmerState extends State with SingleTickerProviderStateMixin { } LinearGradient get gradient => LinearGradient( - colors: widget.linearGradient.colors, - stops: widget.linearGradient.stops, - begin: widget.linearGradient.begin, - end: widget.linearGradient.end, - transform: - SlidingGradientTransform(slidePercent: shimmerController.value), - ); + colors: widget.linearGradient.colors, + stops: widget.linearGradient.stops, + begin: widget.linearGradient.begin, + end: widget.linearGradient.end, + transform: SlidingGradientTransform(slidePercent: shimmerController.value), + ); bool get isSized { if (context.findRenderObject() != null) { @@ -71,9 +66,7 @@ class ShimmerState extends State with SingleTickerProviderStateMixin { } class SlidingGradientTransform extends GradientTransform { - const SlidingGradientTransform({ - required this.slidePercent, - }); + const SlidingGradientTransform({required this.slidePercent}); final double slidePercent; diff --git a/haiku_generator/step1/lib/widgets/shimmer_loading_anim.dart b/haiku_generator/step1/lib/widgets/shimmer_loading_anim.dart index 3dfeda37bb..72b9697804 100644 --- a/haiku_generator/step1/lib/widgets/shimmer_loading_anim.dart +++ b/haiku_generator/step1/lib/widgets/shimmer_loading_anim.dart @@ -4,8 +4,11 @@ import 'shimmer_gradient.dart'; import 'shimmer_loading.dart'; class ShimmerLoadingAnim extends StatelessWidget { - const ShimmerLoadingAnim( - {super.key, required this.child, this.isLoading = false}); + const ShimmerLoadingAnim({ + super.key, + required this.child, + this.isLoading = false, + }); final Widget child; final bool isLoading; @@ -14,10 +17,7 @@ class ShimmerLoadingAnim extends StatelessWidget { Widget build(BuildContext context) { return Shimmer( linearGradient: shimmerGradient, - child: ShimmerLoading( - isLoading: isLoading, - child: child, - ), + child: ShimmerLoading(isLoading: isLoading, child: child), ); } } diff --git a/haiku_generator/step1/pubspec.yaml b/haiku_generator/step1/pubspec.yaml index 88907674f1..568dbed7d7 100644 --- a/haiku_generator/step1/pubspec.yaml +++ b/haiku_generator/step1/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/haiku_generator/step2/lib/app.dart b/haiku_generator/step2/lib/app.dart index a56bfb311d..8115a6918f 100644 --- a/haiku_generator/step2/lib/app.dart +++ b/haiku_generator/step2/lib/app.dart @@ -47,21 +47,18 @@ class HaikuPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: Center( child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - buildTopView(), - const SizedBox( - height: 10.0, - ), - buildBottomView() - ], - )), + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + buildTopView(), + const SizedBox(height: 10.0), + buildBottomView(), + ], + ), + ), ), ); } @@ -71,26 +68,23 @@ class HaikuPageState extends State { children: [ Text( subTitle, - style: const TextStyle( - fontSize: 18, - color: Colors.black, - ), + style: const TextStyle(fontSize: 18, color: Colors.black), ), SizedBox( width: 150.0, child: DropdownButton( - items: listProduct.map((Product value) { - return DropdownMenuItem( - value: value, - child: Text(value.productName), - ); - }).toList(), - hint: Text(productName.toString(), - style: const TextStyle(color: Colors.deepPurpleAccent)), - underline: Container( - height: 1, - color: Colors.deepPurpleAccent, + items: + listProduct.map((Product value) { + return DropdownMenuItem( + value: value, + child: Text(value.productName), + ); + }).toList(), + hint: Text( + productName.toString(), + style: const TextStyle(color: Colors.deepPurpleAccent), ), + underline: Container(height: 1, color: Colors.deepPurpleAccent), onChanged: (value) { setState(() { productName = value!.productName; @@ -123,38 +117,39 @@ class HaikuPageState extends State { Expanded buildBottomView() { return Expanded( - child: haikuText.isNotEmpty - ? Container( - decoration: BoxDecoration( - color: Colors.amberAccent.shade100, - borderRadius: BorderRadius.circular(8), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: SizedBox( - width: double.maxFinite, - child: Text( - haikuText, - style: const TextStyle( - color: Colors.black, - fontSize: 18, - fontWeight: FontWeight.w300, + child: + haikuText.isNotEmpty + ? Container( + decoration: BoxDecoration( + color: Colors.amberAccent.shade100, + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + width: double.maxFinite, + child: Text( + haikuText, + style: const TextStyle( + color: Colors.black, + fontSize: 18, + fontWeight: FontWeight.w300, + ), ), ), ), - ), - ) - : ShimmerLoadingAnim( - isLoading: true, - child: Container( - height: double.maxFinite, - width: double.maxFinite, - decoration: BoxDecoration( - color: const Color(0xFFE5E5E5), - borderRadius: BorderRadius.circular(8), + ) + : ShimmerLoadingAnim( + isLoading: true, + child: Container( + height: double.maxFinite, + width: double.maxFinite, + decoration: BoxDecoration( + color: const Color(0xFFE5E5E5), + borderRadius: BorderRadius.circular(8), + ), ), ), - ), ); } } diff --git a/haiku_generator/step2/lib/data/repositories/product_repository_impl.dart b/haiku_generator/step2/lib/data/repositories/product_repository_impl.dart index 0f2027c54c..7dbffb7d55 100644 --- a/haiku_generator/step2/lib/data/repositories/product_repository_impl.dart +++ b/haiku_generator/step2/lib/data/repositories/product_repository_impl.dart @@ -11,7 +11,7 @@ class ProductRepositoryImpl implements ProductRepository { {'productName': 'YouTube'}, {'productName': 'Android'}, {'productName': 'Google Maps'}, - {'productName': 'GMail'} + {'productName': 'GMail'}, ]; return dummyData.map((item) => Product.fromMap(item)).toList(); } diff --git a/haiku_generator/step2/lib/domain/models/product.dart b/haiku_generator/step2/lib/domain/models/product.dart index b5091f8201..43fdb68250 100644 --- a/haiku_generator/step2/lib/domain/models/product.dart +++ b/haiku_generator/step2/lib/domain/models/product.dart @@ -4,11 +4,9 @@ class Product { Product(this.productName); Product.fromMap(Map json) - : productName = json['productName']; + : productName = json['productName']; Map toMap() { - return { - 'productName': productName, - }; + return {'productName': productName}; } } diff --git a/haiku_generator/step2/lib/widgets/shimmer_gradient.dart b/haiku_generator/step2/lib/widgets/shimmer_gradient.dart index 03d815b57a..5e9de7419a 100644 --- a/haiku_generator/step2/lib/widgets/shimmer_gradient.dart +++ b/haiku_generator/step2/lib/widgets/shimmer_gradient.dart @@ -1,16 +1,8 @@ import 'package:flutter/material.dart'; LinearGradient shimmerGradient = const LinearGradient( - colors: [ - Color(0xFFEBEBF4), - Color(0xFFF4F4F4), - Color(0xFFEBEBF4), - ], - stops: [ - 0.1, - 0.3, - 0.4, - ], + colors: [Color(0xFFEBEBF4), Color(0xFFF4F4F4), Color(0xFFEBEBF4)], + stops: [0.1, 0.3, 0.4], begin: Alignment(-1.0, -0.3), end: Alignment(1.0, 0.3), ); diff --git a/haiku_generator/step2/lib/widgets/shimmer_loading.dart b/haiku_generator/step2/lib/widgets/shimmer_loading.dart index 4611994d12..12eb051bbf 100644 --- a/haiku_generator/step2/lib/widgets/shimmer_loading.dart +++ b/haiku_generator/step2/lib/widgets/shimmer_loading.dart @@ -1,11 +1,7 @@ import 'package:flutter/material.dart'; class Shimmer extends StatefulWidget { - const Shimmer({ - super.key, - required this.linearGradient, - this.child, - }); + const Shimmer({super.key, required this.linearGradient, this.child}); static ShimmerState? of(BuildContext context) { return context.findAncestorStateOfType(); @@ -36,13 +32,12 @@ class ShimmerState extends State with SingleTickerProviderStateMixin { } LinearGradient get gradient => LinearGradient( - colors: widget.linearGradient.colors, - stops: widget.linearGradient.stops, - begin: widget.linearGradient.begin, - end: widget.linearGradient.end, - transform: - SlidingGradientTransform(slidePercent: shimmerController.value), - ); + colors: widget.linearGradient.colors, + stops: widget.linearGradient.stops, + begin: widget.linearGradient.begin, + end: widget.linearGradient.end, + transform: SlidingGradientTransform(slidePercent: shimmerController.value), + ); bool get isSized { if (context.findRenderObject() != null) { @@ -71,9 +66,7 @@ class ShimmerState extends State with SingleTickerProviderStateMixin { } class SlidingGradientTransform extends GradientTransform { - const SlidingGradientTransform({ - required this.slidePercent, - }); + const SlidingGradientTransform({required this.slidePercent}); final double slidePercent; diff --git a/haiku_generator/step2/lib/widgets/shimmer_loading_anim.dart b/haiku_generator/step2/lib/widgets/shimmer_loading_anim.dart index 3dfeda37bb..72b9697804 100644 --- a/haiku_generator/step2/lib/widgets/shimmer_loading_anim.dart +++ b/haiku_generator/step2/lib/widgets/shimmer_loading_anim.dart @@ -4,8 +4,11 @@ import 'shimmer_gradient.dart'; import 'shimmer_loading.dart'; class ShimmerLoadingAnim extends StatelessWidget { - const ShimmerLoadingAnim( - {super.key, required this.child, this.isLoading = false}); + const ShimmerLoadingAnim({ + super.key, + required this.child, + this.isLoading = false, + }); final Widget child; final bool isLoading; @@ -14,10 +17,7 @@ class ShimmerLoadingAnim extends StatelessWidget { Widget build(BuildContext context) { return Shimmer( linearGradient: shimmerGradient, - child: ShimmerLoading( - isLoading: isLoading, - child: child, - ), + child: ShimmerLoading(isLoading: isLoading, child: child), ); } } diff --git a/haiku_generator/step2/pubspec.yaml b/haiku_generator/step2/pubspec.yaml index 88907674f1..568dbed7d7 100644 --- a/haiku_generator/step2/pubspec.yaml +++ b/haiku_generator/step2/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/haiku_generator/step3/lib/app.dart b/haiku_generator/step3/lib/app.dart index a56bfb311d..8115a6918f 100644 --- a/haiku_generator/step3/lib/app.dart +++ b/haiku_generator/step3/lib/app.dart @@ -47,21 +47,18 @@ class HaikuPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: Center( child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - buildTopView(), - const SizedBox( - height: 10.0, - ), - buildBottomView() - ], - )), + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + buildTopView(), + const SizedBox(height: 10.0), + buildBottomView(), + ], + ), + ), ), ); } @@ -71,26 +68,23 @@ class HaikuPageState extends State { children: [ Text( subTitle, - style: const TextStyle( - fontSize: 18, - color: Colors.black, - ), + style: const TextStyle(fontSize: 18, color: Colors.black), ), SizedBox( width: 150.0, child: DropdownButton( - items: listProduct.map((Product value) { - return DropdownMenuItem( - value: value, - child: Text(value.productName), - ); - }).toList(), - hint: Text(productName.toString(), - style: const TextStyle(color: Colors.deepPurpleAccent)), - underline: Container( - height: 1, - color: Colors.deepPurpleAccent, + items: + listProduct.map((Product value) { + return DropdownMenuItem( + value: value, + child: Text(value.productName), + ); + }).toList(), + hint: Text( + productName.toString(), + style: const TextStyle(color: Colors.deepPurpleAccent), ), + underline: Container(height: 1, color: Colors.deepPurpleAccent), onChanged: (value) { setState(() { productName = value!.productName; @@ -123,38 +117,39 @@ class HaikuPageState extends State { Expanded buildBottomView() { return Expanded( - child: haikuText.isNotEmpty - ? Container( - decoration: BoxDecoration( - color: Colors.amberAccent.shade100, - borderRadius: BorderRadius.circular(8), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: SizedBox( - width: double.maxFinite, - child: Text( - haikuText, - style: const TextStyle( - color: Colors.black, - fontSize: 18, - fontWeight: FontWeight.w300, + child: + haikuText.isNotEmpty + ? Container( + decoration: BoxDecoration( + color: Colors.amberAccent.shade100, + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + width: double.maxFinite, + child: Text( + haikuText, + style: const TextStyle( + color: Colors.black, + fontSize: 18, + fontWeight: FontWeight.w300, + ), ), ), ), - ), - ) - : ShimmerLoadingAnim( - isLoading: true, - child: Container( - height: double.maxFinite, - width: double.maxFinite, - decoration: BoxDecoration( - color: const Color(0xFFE5E5E5), - borderRadius: BorderRadius.circular(8), + ) + : ShimmerLoadingAnim( + isLoading: true, + child: Container( + height: double.maxFinite, + width: double.maxFinite, + decoration: BoxDecoration( + color: const Color(0xFFE5E5E5), + borderRadius: BorderRadius.circular(8), + ), ), ), - ), ); } } diff --git a/haiku_generator/step3/lib/data/repositories/poem_repository_impl.dart b/haiku_generator/step3/lib/data/repositories/poem_repository_impl.dart index 56db2bcc5c..bc797f40c0 100644 --- a/haiku_generator/step3/lib/data/repositories/poem_repository_impl.dart +++ b/haiku_generator/step3/lib/data/repositories/poem_repository_impl.dart @@ -12,7 +12,8 @@ class PoemRepositoryImpl implements PoemRepository { const haikuCount = 5; final url = Uri.parse( - 'https://generativelanguage.googleapis.com/v1beta2/models/chat-bison-001:generateMessage?key=$apiKey'); + 'https://generativelanguage.googleapis.com/v1beta2/models/chat-bison-001:generateMessage?key=$apiKey', + ); final headers = {'Content-Type': 'application/json'}; final body = jsonEncode({ "prompt": { @@ -22,13 +23,13 @@ class PoemRepositoryImpl implements PoemRepository { "input": {"content": "Write a haiku about Google Photos."}, "output": { "content": - "Google Photos, my friend\nA journey of a lifetime\nCaptured in pixels" - } - } + "Google Photos, my friend\nA journey of a lifetime\nCaptured in pixels", + }, + }, ], "messages": [ - {"content": "Write a cool, long haiku of for $productName"} - ] + {"content": "Write a cool, long haiku of for $productName"}, + ], }, "candidate_count": haikuCount, "temperature": 1, diff --git a/haiku_generator/step3/lib/data/repositories/product_repository_impl.dart b/haiku_generator/step3/lib/data/repositories/product_repository_impl.dart index 0f2027c54c..7dbffb7d55 100644 --- a/haiku_generator/step3/lib/data/repositories/product_repository_impl.dart +++ b/haiku_generator/step3/lib/data/repositories/product_repository_impl.dart @@ -11,7 +11,7 @@ class ProductRepositoryImpl implements ProductRepository { {'productName': 'YouTube'}, {'productName': 'Android'}, {'productName': 'Google Maps'}, - {'productName': 'GMail'} + {'productName': 'GMail'}, ]; return dummyData.map((item) => Product.fromMap(item)).toList(); } diff --git a/haiku_generator/step3/lib/domain/models/product.dart b/haiku_generator/step3/lib/domain/models/product.dart index b5091f8201..43fdb68250 100644 --- a/haiku_generator/step3/lib/domain/models/product.dart +++ b/haiku_generator/step3/lib/domain/models/product.dart @@ -4,11 +4,9 @@ class Product { Product(this.productName); Product.fromMap(Map json) - : productName = json['productName']; + : productName = json['productName']; Map toMap() { - return { - 'productName': productName, - }; + return {'productName': productName}; } } diff --git a/haiku_generator/step3/lib/widgets/shimmer_gradient.dart b/haiku_generator/step3/lib/widgets/shimmer_gradient.dart index 03d815b57a..5e9de7419a 100644 --- a/haiku_generator/step3/lib/widgets/shimmer_gradient.dart +++ b/haiku_generator/step3/lib/widgets/shimmer_gradient.dart @@ -1,16 +1,8 @@ import 'package:flutter/material.dart'; LinearGradient shimmerGradient = const LinearGradient( - colors: [ - Color(0xFFEBEBF4), - Color(0xFFF4F4F4), - Color(0xFFEBEBF4), - ], - stops: [ - 0.1, - 0.3, - 0.4, - ], + colors: [Color(0xFFEBEBF4), Color(0xFFF4F4F4), Color(0xFFEBEBF4)], + stops: [0.1, 0.3, 0.4], begin: Alignment(-1.0, -0.3), end: Alignment(1.0, 0.3), ); diff --git a/haiku_generator/step3/lib/widgets/shimmer_loading.dart b/haiku_generator/step3/lib/widgets/shimmer_loading.dart index 4611994d12..12eb051bbf 100644 --- a/haiku_generator/step3/lib/widgets/shimmer_loading.dart +++ b/haiku_generator/step3/lib/widgets/shimmer_loading.dart @@ -1,11 +1,7 @@ import 'package:flutter/material.dart'; class Shimmer extends StatefulWidget { - const Shimmer({ - super.key, - required this.linearGradient, - this.child, - }); + const Shimmer({super.key, required this.linearGradient, this.child}); static ShimmerState? of(BuildContext context) { return context.findAncestorStateOfType(); @@ -36,13 +32,12 @@ class ShimmerState extends State with SingleTickerProviderStateMixin { } LinearGradient get gradient => LinearGradient( - colors: widget.linearGradient.colors, - stops: widget.linearGradient.stops, - begin: widget.linearGradient.begin, - end: widget.linearGradient.end, - transform: - SlidingGradientTransform(slidePercent: shimmerController.value), - ); + colors: widget.linearGradient.colors, + stops: widget.linearGradient.stops, + begin: widget.linearGradient.begin, + end: widget.linearGradient.end, + transform: SlidingGradientTransform(slidePercent: shimmerController.value), + ); bool get isSized { if (context.findRenderObject() != null) { @@ -71,9 +66,7 @@ class ShimmerState extends State with SingleTickerProviderStateMixin { } class SlidingGradientTransform extends GradientTransform { - const SlidingGradientTransform({ - required this.slidePercent, - }); + const SlidingGradientTransform({required this.slidePercent}); final double slidePercent; diff --git a/haiku_generator/step3/lib/widgets/shimmer_loading_anim.dart b/haiku_generator/step3/lib/widgets/shimmer_loading_anim.dart index 3dfeda37bb..72b9697804 100644 --- a/haiku_generator/step3/lib/widgets/shimmer_loading_anim.dart +++ b/haiku_generator/step3/lib/widgets/shimmer_loading_anim.dart @@ -4,8 +4,11 @@ import 'shimmer_gradient.dart'; import 'shimmer_loading.dart'; class ShimmerLoadingAnim extends StatelessWidget { - const ShimmerLoadingAnim( - {super.key, required this.child, this.isLoading = false}); + const ShimmerLoadingAnim({ + super.key, + required this.child, + this.isLoading = false, + }); final Widget child; final bool isLoading; @@ -14,10 +17,7 @@ class ShimmerLoadingAnim extends StatelessWidget { Widget build(BuildContext context) { return Shimmer( linearGradient: shimmerGradient, - child: ShimmerLoading( - isLoading: isLoading, - child: child, - ), + child: ShimmerLoading(isLoading: isLoading, child: child), ); } } diff --git a/haiku_generator/step3/pubspec.yaml b/haiku_generator/step3/pubspec.yaml index 88907674f1..568dbed7d7 100644 --- a/haiku_generator/step3/pubspec.yaml +++ b/haiku_generator/step3/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/homescreen_codelab/step_03/lib/article_screen.dart b/homescreen_codelab/step_03/lib/article_screen.dart index 318ad4a180..a354515c4f 100644 --- a/homescreen_codelab/step_03/lib/article_screen.dart +++ b/homescreen_codelab/step_03/lib/article_screen.dart @@ -5,10 +5,7 @@ import 'news_data.dart'; class ArticleScreen extends StatefulWidget { final NewsArticle article; - const ArticleScreen({ - super.key, - required this.article, - }); + const ArticleScreen({super.key, required this.article}); @override State createState() => _ArticleScreenState(); @@ -19,15 +16,17 @@ class _ArticleScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(widget.article.title), - titleTextStyle: const TextStyle( - fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black)), + title: Text(widget.article.title), + titleTextStyle: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), floatingActionButton: FloatingActionButton.extended( onPressed: () { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Updating home screen widget...'), - ), + const SnackBar(content: Text('Updating home screen widget...')), ); }, label: const Text('Update Homescreen'), @@ -52,18 +51,13 @@ class _ArticleScreenState extends State { } class LineChart extends StatelessWidget { - const LineChart({ - super.key, - }); + const LineChart({super.key}); @override Widget build(BuildContext context) { return CustomPaint( painter: LineChartPainter(), - child: const SizedBox( - height: 200, - width: 200, - ), + child: const SizedBox(height: 200, width: 200), ); } } @@ -71,20 +65,23 @@ class LineChart extends StatelessWidget { class LineChartPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { - final axisPaint = Paint() - ..color = Colors.black - ..strokeWidth = 2 - ..style = PaintingStyle.stroke; - - final dataPaint = Paint() - ..color = Colors.blue - ..strokeWidth = 2 - ..style = PaintingStyle.stroke; - - final markingLinePaint = Paint() - ..color = Colors.red - ..strokeWidth = 2 - ..style = PaintingStyle.stroke; + final axisPaint = + Paint() + ..color = Colors.black + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; + + final dataPaint = + Paint() + ..color = Colors.blue + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; + + final markingLinePaint = + Paint() + ..color = Colors.red + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; final mockDataPoints = [ const Offset(15, 155), @@ -99,14 +96,16 @@ class LineChartPainter extends CustomPainter { const Offset(200, -10), ]; - final axis = Path() - ..moveTo(0, 0) - ..lineTo(0, size.height) - ..lineTo(size.width, size.height); + final axis = + Path() + ..moveTo(0, 0) + ..lineTo(0, size.height) + ..lineTo(size.width, size.height); - final markingLine = Path() - ..moveTo(-10, 50) - ..lineTo(size.width + 10, 50); + final markingLine = + Path() + ..moveTo(-10, 50) + ..lineTo(size.width + 10, 50); final data = Path()..moveTo(1, 180); diff --git a/homescreen_codelab/step_03/lib/home_screen.dart b/homescreen_codelab/step_03/lib/home_screen.dart index 49a6afc64e..fc8afbf228 100644 --- a/homescreen_codelab/step_03/lib/home_screen.dart +++ b/homescreen_codelab/step_03/lib/home_screen.dart @@ -13,35 +13,38 @@ class _MyHomePageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Top Stories'), - centerTitle: false, - titleTextStyle: const TextStyle( - fontSize: 30, - fontWeight: FontWeight.bold, - color: Colors.black)), - body: ListView.separated( - separatorBuilder: (context, idx) { - return const Divider(); - }, - itemCount: getNewsStories().length, - itemBuilder: (context, idx) { - final article = getNewsStories()[idx]; - return ListTile( - key: Key('$idx ${article.hashCode}'), - title: Text(article.title), - subtitle: Text(article.description), - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) { - return ArticleScreen(article: article); - }, - ), - ); - }, - ); - }, - )); + appBar: AppBar( + title: const Text('Top Stories'), + centerTitle: false, + titleTextStyle: const TextStyle( + fontSize: 30, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + body: ListView.separated( + separatorBuilder: (context, idx) { + return const Divider(); + }, + itemCount: getNewsStories().length, + itemBuilder: (context, idx) { + final article = getNewsStories()[idx]; + return ListTile( + key: Key('$idx ${article.hashCode}'), + title: Text(article.title), + subtitle: Text(article.description), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) { + return ArticleScreen(article: article); + }, + ), + ); + }, + ); + }, + ), + ); } } diff --git a/homescreen_codelab/step_03/lib/main.dart b/homescreen_codelab/step_03/lib/main.dart index 2610ae27ab..54005a1ff7 100644 --- a/homescreen_codelab/step_03/lib/main.dart +++ b/homescreen_codelab/step_03/lib/main.dart @@ -15,14 +15,13 @@ class MyApp extends StatelessWidget { return MaterialApp( theme: ThemeData( appBarTheme: AppBarTheme( - backgroundColor: ColorScheme.fromSeed(seedColor: Colors.deepPurple) - .primaryContainer, + backgroundColor: + ColorScheme.fromSeed( + seedColor: Colors.deepPurple, + ).primaryContainer, ), textTheme: const TextTheme( - titleMedium: TextStyle( - fontFamily: 'Chewy', - fontSize: 20, - ), + titleMedium: TextStyle(fontFamily: 'Chewy', fontSize: 20), ), ), home: const MyHomePage(), diff --git a/homescreen_codelab/step_03/lib/news_data.dart b/homescreen_codelab/step_03/lib/news_data.dart index 17df63fa12..783c03e598 100644 --- a/homescreen_codelab/step_03/lib/news_data.dart +++ b/homescreen_codelab/step_03/lib/news_data.dart @@ -35,6 +35,6 @@ List getNewsStories() { title: 'Flutter DAU surpasses 10 billion', description: 'There are more Flutter users than there are human beings. What gives?', - ) + ), ]; } diff --git a/homescreen_codelab/step_03/pubspec.yaml b/homescreen_codelab/step_03/pubspec.yaml index 98f42548d5..d8252f3430 100644 --- a/homescreen_codelab/step_03/pubspec.yaml +++ b/homescreen_codelab/step_03/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/homescreen_codelab/step_04/lib/article_screen.dart b/homescreen_codelab/step_04/lib/article_screen.dart index 032da5b9a6..cb745aa3ae 100644 --- a/homescreen_codelab/step_04/lib/article_screen.dart +++ b/homescreen_codelab/step_04/lib/article_screen.dart @@ -7,10 +7,7 @@ import 'news_data.dart'; class ArticleScreen extends StatefulWidget { final NewsArticle article; - const ArticleScreen({ - super.key, - required this.article, - }); + const ArticleScreen({super.key, required this.article}); @override State createState() => _ArticleScreenState(); @@ -21,14 +18,18 @@ class _ArticleScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(widget.article.title), - titleTextStyle: const TextStyle( - fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black)), + title: Text(widget.article.title), + titleTextStyle: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), floatingActionButton: FloatingActionButton.extended( onPressed: () { - ScaffoldMessenger.of(context).showSnackBar(const SnackBar( - content: Text('Updating home screen widget...'), - )); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Updating home screen widget...')), + ); // New: call updateHeadline updateHeadline(widget.article); }, @@ -54,18 +55,13 @@ class _ArticleScreenState extends State { } class LineChart extends StatelessWidget { - const LineChart({ - super.key, - }); + const LineChart({super.key}); @override Widget build(BuildContext context) { return CustomPaint( painter: LineChartPainter(), - child: const SizedBox( - height: 200, - width: 200, - ), + child: const SizedBox(height: 200, width: 200), ); } } @@ -73,20 +69,23 @@ class LineChart extends StatelessWidget { class LineChartPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { - final axisPaint = Paint() - ..color = Colors.black - ..strokeWidth = 2 - ..style = PaintingStyle.stroke; - - final dataPaint = Paint() - ..color = Colors.blue - ..strokeWidth = 2 - ..style = PaintingStyle.stroke; - - final markingLinePaint = Paint() - ..color = Colors.red - ..strokeWidth = 2 - ..style = PaintingStyle.stroke; + final axisPaint = + Paint() + ..color = Colors.black + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; + + final dataPaint = + Paint() + ..color = Colors.blue + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; + + final markingLinePaint = + Paint() + ..color = Colors.red + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; final mockDataPoints = [ const Offset(15, 155), @@ -101,14 +100,16 @@ class LineChartPainter extends CustomPainter { const Offset(200, -10), ]; - final axis = Path() - ..moveTo(0, 0) - ..lineTo(0, size.height) - ..lineTo(size.width, size.height); + final axis = + Path() + ..moveTo(0, 0) + ..lineTo(0, size.height) + ..lineTo(size.width, size.height); - final markingLine = Path() - ..moveTo(-10, 50) - ..lineTo(size.width + 10, 50); + final markingLine = + Path() + ..moveTo(-10, 50) + ..lineTo(size.width + 10, 50); final data = Path()..moveTo(1, 180); diff --git a/homescreen_codelab/step_04/lib/home_screen.dart b/homescreen_codelab/step_04/lib/home_screen.dart index c09b58c85c..91ee7c69c6 100644 --- a/homescreen_codelab/step_04/lib/home_screen.dart +++ b/homescreen_codelab/step_04/lib/home_screen.dart @@ -22,7 +22,9 @@ void updateHeadline(NewsArticle newHeadline) { // Save the headline data to the widget HomeWidget.saveWidgetData('headline_title', newHeadline.title); HomeWidget.saveWidgetData( - 'headline_description', newHeadline.description); + 'headline_description', + newHeadline.description, + ); HomeWidget.updateWidget( iOSName: iOSWidgetName, androidName: androidWidgetName, @@ -46,35 +48,38 @@ class _MyHomePageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Top Stories'), - centerTitle: false, - titleTextStyle: const TextStyle( - fontSize: 30, - fontWeight: FontWeight.bold, - color: Colors.black)), - body: ListView.separated( - separatorBuilder: (context, idx) { - return const Divider(); - }, - itemCount: getNewsStories().length, - itemBuilder: (context, idx) { - final article = getNewsStories()[idx]; - return ListTile( - key: Key('$idx ${article.hashCode}'), - title: Text(article.title), - subtitle: Text(article.description), - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) { - return ArticleScreen(article: article); - }, - ), - ); - }, - ); - }, - )); + appBar: AppBar( + title: const Text('Top Stories'), + centerTitle: false, + titleTextStyle: const TextStyle( + fontSize: 30, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + body: ListView.separated( + separatorBuilder: (context, idx) { + return const Divider(); + }, + itemCount: getNewsStories().length, + itemBuilder: (context, idx) { + final article = getNewsStories()[idx]; + return ListTile( + key: Key('$idx ${article.hashCode}'), + title: Text(article.title), + subtitle: Text(article.description), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) { + return ArticleScreen(article: article); + }, + ), + ); + }, + ); + }, + ), + ); } } diff --git a/homescreen_codelab/step_04/lib/main.dart b/homescreen_codelab/step_04/lib/main.dart index 2610ae27ab..54005a1ff7 100644 --- a/homescreen_codelab/step_04/lib/main.dart +++ b/homescreen_codelab/step_04/lib/main.dart @@ -15,14 +15,13 @@ class MyApp extends StatelessWidget { return MaterialApp( theme: ThemeData( appBarTheme: AppBarTheme( - backgroundColor: ColorScheme.fromSeed(seedColor: Colors.deepPurple) - .primaryContainer, + backgroundColor: + ColorScheme.fromSeed( + seedColor: Colors.deepPurple, + ).primaryContainer, ), textTheme: const TextTheme( - titleMedium: TextStyle( - fontFamily: 'Chewy', - fontSize: 20, - ), + titleMedium: TextStyle(fontFamily: 'Chewy', fontSize: 20), ), ), home: const MyHomePage(), diff --git a/homescreen_codelab/step_04/lib/news_data.dart b/homescreen_codelab/step_04/lib/news_data.dart index f06d24ef15..0299927168 100644 --- a/homescreen_codelab/step_04/lib/news_data.dart +++ b/homescreen_codelab/step_04/lib/news_data.dart @@ -33,6 +33,6 @@ List getNewsStories() { title: 'Flutter DAU surpasses 10 billion', description: 'There are more Flutter users than there are human beings. What gives?', - ) + ), ]; } diff --git a/homescreen_codelab/step_04/pubspec.yaml b/homescreen_codelab/step_04/pubspec.yaml index 1113515836..1ee2292f20 100644 --- a/homescreen_codelab/step_04/pubspec.yaml +++ b/homescreen_codelab/step_04/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/homescreen_codelab/step_05/lib/article_screen.dart b/homescreen_codelab/step_05/lib/article_screen.dart index 271da26e94..4079bbd534 100644 --- a/homescreen_codelab/step_05/lib/article_screen.dart +++ b/homescreen_codelab/step_05/lib/article_screen.dart @@ -6,10 +6,7 @@ import 'news_data.dart'; class ArticleScreen extends StatefulWidget { final NewsArticle article; - const ArticleScreen({ - super.key, - required this.article, - }); + const ArticleScreen({super.key, required this.article}); @override State createState() => _ArticleScreenState(); @@ -20,14 +17,18 @@ class _ArticleScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(widget.article.title), - titleTextStyle: const TextStyle( - fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black)), + title: Text(widget.article.title), + titleTextStyle: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), floatingActionButton: FloatingActionButton.extended( onPressed: () { - ScaffoldMessenger.of(context).showSnackBar(const SnackBar( - content: Text('Updating home screen widget...'), - )); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Updating home screen widget...')), + ); // New: call updateHeadline updateHeadline(widget.article); }, @@ -53,18 +54,13 @@ class _ArticleScreenState extends State { } class LineChart extends StatelessWidget { - const LineChart({ - super.key, - }); + const LineChart({super.key}); @override Widget build(BuildContext context) { return CustomPaint( painter: LineChartPainter(), - child: const SizedBox( - height: 200, - width: 200, - ), + child: const SizedBox(height: 200, width: 200), ); } } @@ -72,20 +68,23 @@ class LineChart extends StatelessWidget { class LineChartPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { - final axisPaint = Paint() - ..color = Colors.black - ..strokeWidth = 2 - ..style = PaintingStyle.stroke; - - final dataPaint = Paint() - ..color = Colors.blue - ..strokeWidth = 2 - ..style = PaintingStyle.stroke; - - final markingLinePaint = Paint() - ..color = Colors.red - ..strokeWidth = 2 - ..style = PaintingStyle.stroke; + final axisPaint = + Paint() + ..color = Colors.black + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; + + final dataPaint = + Paint() + ..color = Colors.blue + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; + + final markingLinePaint = + Paint() + ..color = Colors.red + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; final mockDataPoints = [ const Offset(15, 155), @@ -100,14 +99,16 @@ class LineChartPainter extends CustomPainter { const Offset(200, -10), ]; - final axis = Path() - ..moveTo(0, 0) - ..lineTo(0, size.height) - ..lineTo(size.width, size.height); + final axis = + Path() + ..moveTo(0, 0) + ..lineTo(0, size.height) + ..lineTo(size.width, size.height); - final markingLine = Path() - ..moveTo(-10, 50) - ..lineTo(size.width + 10, 50); + final markingLine = + Path() + ..moveTo(-10, 50) + ..lineTo(size.width + 10, 50); final data = Path()..moveTo(1, 180); diff --git a/homescreen_codelab/step_05/lib/home_screen.dart b/homescreen_codelab/step_05/lib/home_screen.dart index e9736bf1ca..d4493d5f64 100644 --- a/homescreen_codelab/step_05/lib/home_screen.dart +++ b/homescreen_codelab/step_05/lib/home_screen.dart @@ -18,7 +18,9 @@ class MyHomePage extends StatefulWidget { void updateHeadline(NewsArticle newHeadline) { HomeWidget.saveWidgetData('headline_title', newHeadline.title); HomeWidget.saveWidgetData( - 'headline_description', newHeadline.description); + 'headline_description', + newHeadline.description, + ); HomeWidget.updateWidget( iOSName: iOSWidgetName, androidName: androidWidgetName, @@ -39,35 +41,38 @@ class _MyHomePageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Top Stories'), - centerTitle: false, - titleTextStyle: const TextStyle( - fontSize: 30, - fontWeight: FontWeight.bold, - color: Colors.black)), - body: ListView.separated( - separatorBuilder: (context, idx) { - return const Divider(); - }, - itemCount: getNewsStories().length, - itemBuilder: (context, idx) { - final article = getNewsStories()[idx]; - return ListTile( - key: Key('$idx ${article.hashCode}'), - title: Text(article.title), - subtitle: Text(article.description), - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) { - return ArticleScreen(article: article); - }, - ), - ); - }, - ); - }, - )); + appBar: AppBar( + title: const Text('Top Stories'), + centerTitle: false, + titleTextStyle: const TextStyle( + fontSize: 30, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + body: ListView.separated( + separatorBuilder: (context, idx) { + return const Divider(); + }, + itemCount: getNewsStories().length, + itemBuilder: (context, idx) { + final article = getNewsStories()[idx]; + return ListTile( + key: Key('$idx ${article.hashCode}'), + title: Text(article.title), + subtitle: Text(article.description), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) { + return ArticleScreen(article: article); + }, + ), + ); + }, + ); + }, + ), + ); } } diff --git a/homescreen_codelab/step_05/lib/main.dart b/homescreen_codelab/step_05/lib/main.dart index 2610ae27ab..54005a1ff7 100644 --- a/homescreen_codelab/step_05/lib/main.dart +++ b/homescreen_codelab/step_05/lib/main.dart @@ -15,14 +15,13 @@ class MyApp extends StatelessWidget { return MaterialApp( theme: ThemeData( appBarTheme: AppBarTheme( - backgroundColor: ColorScheme.fromSeed(seedColor: Colors.deepPurple) - .primaryContainer, + backgroundColor: + ColorScheme.fromSeed( + seedColor: Colors.deepPurple, + ).primaryContainer, ), textTheme: const TextTheme( - titleMedium: TextStyle( - fontFamily: 'Chewy', - fontSize: 20, - ), + titleMedium: TextStyle(fontFamily: 'Chewy', fontSize: 20), ), ), home: const MyHomePage(), diff --git a/homescreen_codelab/step_05/lib/news_data.dart b/homescreen_codelab/step_05/lib/news_data.dart index 17df63fa12..783c03e598 100644 --- a/homescreen_codelab/step_05/lib/news_data.dart +++ b/homescreen_codelab/step_05/lib/news_data.dart @@ -35,6 +35,6 @@ List getNewsStories() { title: 'Flutter DAU surpasses 10 billion', description: 'There are more Flutter users than there are human beings. What gives?', - ) + ), ]; } diff --git a/homescreen_codelab/step_05/pubspec.yaml b/homescreen_codelab/step_05/pubspec.yaml index 1113515836..1ee2292f20 100644 --- a/homescreen_codelab/step_05/pubspec.yaml +++ b/homescreen_codelab/step_05/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/homescreen_codelab/step_06/lib/article_screen.dart b/homescreen_codelab/step_06/lib/article_screen.dart index 5de5745dbd..3bd835444f 100644 --- a/homescreen_codelab/step_06/lib/article_screen.dart +++ b/homescreen_codelab/step_06/lib/article_screen.dart @@ -8,10 +8,7 @@ import 'news_data.dart'; class ArticleScreen extends StatefulWidget { final NewsArticle article; - const ArticleScreen({ - super.key, - required this.article, - }); + const ArticleScreen({super.key, required this.article}); @override State createState() => _ArticleScreenState(); @@ -26,20 +23,22 @@ class _ArticleScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: Text(widget.article.title), - ), + appBar: AppBar(title: Text(widget.article.title)), // New: add this FloatingActionButton floatingActionButton: FloatingActionButton.extended( onPressed: () async { if (_globalKey.currentContext != null) { - var path = await HomeWidget.renderFlutterWidget( - const LineChart(), - key: 'filename', - logicalSize: _globalKey.currentContext!.size!, - pixelRatio: - MediaQuery.of(_globalKey.currentContext!).devicePixelRatio, - ) as String; + var path = + await HomeWidget.renderFlutterWidget( + const LineChart(), + key: 'filename', + logicalSize: _globalKey.currentContext!.size!, + pixelRatio: + MediaQuery.of( + _globalKey.currentContext!, + ).devicePixelRatio, + ) + as String; setState(() { imagePath = path; }); @@ -72,18 +71,13 @@ class _ArticleScreenState extends State { } class LineChart extends StatelessWidget { - const LineChart({ - super.key, - }); + const LineChart({super.key}); @override Widget build(BuildContext context) { return CustomPaint( painter: LineChartPainter(), - child: const SizedBox( - height: 200, - width: 200, - ), + child: const SizedBox(height: 200, width: 200), ); } } @@ -91,20 +85,23 @@ class LineChart extends StatelessWidget { class LineChartPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { - final axisPaint = Paint() - ..color = Colors.black - ..strokeWidth = 2 - ..style = PaintingStyle.stroke; - - final dataPaint = Paint() - ..color = Colors.blue - ..strokeWidth = 2 - ..style = PaintingStyle.stroke; - - final markingLinePaint = Paint() - ..color = Colors.red - ..strokeWidth = 2 - ..style = PaintingStyle.stroke; + final axisPaint = + Paint() + ..color = Colors.black + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; + + final dataPaint = + Paint() + ..color = Colors.blue + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; + + final markingLinePaint = + Paint() + ..color = Colors.red + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; final mockDataPoints = [ const Offset(15, 155), @@ -119,14 +116,16 @@ class LineChartPainter extends CustomPainter { const Offset(200, -10), ]; - final axis = Path() - ..moveTo(0, 0) - ..lineTo(0, size.height) - ..lineTo(size.width, size.height); + final axis = + Path() + ..moveTo(0, 0) + ..lineTo(0, size.height) + ..lineTo(size.width, size.height); - final markingLine = Path() - ..moveTo(-10, 50) - ..lineTo(size.width + 10, 50); + final markingLine = + Path() + ..moveTo(-10, 50) + ..lineTo(size.width + 10, 50); final data = Path()..moveTo(1, 180); diff --git a/homescreen_codelab/step_06/lib/home_screen.dart b/homescreen_codelab/step_06/lib/home_screen.dart index e9736bf1ca..d4493d5f64 100644 --- a/homescreen_codelab/step_06/lib/home_screen.dart +++ b/homescreen_codelab/step_06/lib/home_screen.dart @@ -18,7 +18,9 @@ class MyHomePage extends StatefulWidget { void updateHeadline(NewsArticle newHeadline) { HomeWidget.saveWidgetData('headline_title', newHeadline.title); HomeWidget.saveWidgetData( - 'headline_description', newHeadline.description); + 'headline_description', + newHeadline.description, + ); HomeWidget.updateWidget( iOSName: iOSWidgetName, androidName: androidWidgetName, @@ -39,35 +41,38 @@ class _MyHomePageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Top Stories'), - centerTitle: false, - titleTextStyle: const TextStyle( - fontSize: 30, - fontWeight: FontWeight.bold, - color: Colors.black)), - body: ListView.separated( - separatorBuilder: (context, idx) { - return const Divider(); - }, - itemCount: getNewsStories().length, - itemBuilder: (context, idx) { - final article = getNewsStories()[idx]; - return ListTile( - key: Key('$idx ${article.hashCode}'), - title: Text(article.title), - subtitle: Text(article.description), - onTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) { - return ArticleScreen(article: article); - }, - ), - ); - }, - ); - }, - )); + appBar: AppBar( + title: const Text('Top Stories'), + centerTitle: false, + titleTextStyle: const TextStyle( + fontSize: 30, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + body: ListView.separated( + separatorBuilder: (context, idx) { + return const Divider(); + }, + itemCount: getNewsStories().length, + itemBuilder: (context, idx) { + final article = getNewsStories()[idx]; + return ListTile( + key: Key('$idx ${article.hashCode}'), + title: Text(article.title), + subtitle: Text(article.description), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) { + return ArticleScreen(article: article); + }, + ), + ); + }, + ); + }, + ), + ); } } diff --git a/homescreen_codelab/step_06/lib/main.dart b/homescreen_codelab/step_06/lib/main.dart index 2610ae27ab..54005a1ff7 100644 --- a/homescreen_codelab/step_06/lib/main.dart +++ b/homescreen_codelab/step_06/lib/main.dart @@ -15,14 +15,13 @@ class MyApp extends StatelessWidget { return MaterialApp( theme: ThemeData( appBarTheme: AppBarTheme( - backgroundColor: ColorScheme.fromSeed(seedColor: Colors.deepPurple) - .primaryContainer, + backgroundColor: + ColorScheme.fromSeed( + seedColor: Colors.deepPurple, + ).primaryContainer, ), textTheme: const TextTheme( - titleMedium: TextStyle( - fontFamily: 'Chewy', - fontSize: 20, - ), + titleMedium: TextStyle(fontFamily: 'Chewy', fontSize: 20), ), ), home: const MyHomePage(), diff --git a/homescreen_codelab/step_06/lib/news_data.dart b/homescreen_codelab/step_06/lib/news_data.dart index f06d24ef15..0299927168 100644 --- a/homescreen_codelab/step_06/lib/news_data.dart +++ b/homescreen_codelab/step_06/lib/news_data.dart @@ -33,6 +33,6 @@ List getNewsStories() { title: 'Flutter DAU surpasses 10 billion', description: 'There are more Flutter users than there are human beings. What gives?', - ) + ), ]; } diff --git a/homescreen_codelab/step_06/pubspec.yaml b/homescreen_codelab/step_06/pubspec.yaml index 1113515836..1ee2292f20 100644 --- a/homescreen_codelab/step_06/pubspec.yaml +++ b/homescreen_codelab/step_06/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/in_app_purchases/codelab_rebuild.yaml b/in_app_purchases/codelab_rebuild.yaml index 2d838ee8f3..cc4c3d6b13 100644 --- a/in_app_purchases/codelab_rebuild.yaml +++ b/in_app_purchases/codelab_rebuild.yaml @@ -54,7 +54,7 @@ steps: include: ../../../analysis_options.yaml - name: Remove app/README.md rm: steps/app/README.md - - name: Patch app/ios/Runner/Info.plis + - name: Patch app/ios/Runner/Info.plist path: steps/app/ios/Runner/Info.plist patch-u: | --- b/in_app_purchases/step_00/app/ios/Runner/Info.plist @@ -89,24 +89,11 @@ steps: # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' - - name: Patch app/android/settings.gradle - path: steps/app/android/settings.gradle + - name: Patch app/android/app/build.gradle.kts + path: steps/app/android/app/build.gradle.kts patch-u: | - --- b/in_app_purchases/step_00/app/android/settings.gradle - +++ a/in_app_purchases/step_00/app/android/settings.gradle - @@ -18,7 +18,7 @@ pluginManagement { - - plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - - id "com.android.application" version "8.1.0" apply false - + id "com.android.application" version "8.2.1" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false - } - - name: Patch app/android/app/build.gradle - path: steps/app/android/app/build.gradle - patch-u: | - --- b/in_app_purchases/step_00/app/android/app/build.gradle - +++ a/in_app_purchases/step_00/app/android/app/build.gradle + --- b/in_app_purchases/step_00/app/android/app/build.gradle.kts + +++ a/in_app_purchases/step_00/app/android/app/build.gradle.kts @@ -22,9 +22,8 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). @@ -15890,38 +15877,30 @@ steps: return MultiProvider( providers: [ ChangeNotifierProvider( - create: (_) => FirebaseNotifier()), + create: (_) => FirebaseNotifier(), + ), ChangeNotifierProvider(create: (_) => DashCounter()), ChangeNotifierProvider( - create: (context) => DashUpgrades( - context.read(), - context.read(), - ), + create: + (context) => DashUpgrades( + context.read(), + context.read(), + ), ), ChangeNotifierProvider( create: (context) => IAPRepo(context.read()), ), ChangeNotifierProvider( - create: (context) => DashPurchases( - context.read(), - ), + create: (context) => DashPurchases(context.read()), ), ], child: Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: _widgetOptions[_selectedIndex], bottomNavigationBar: BottomNavigationBar( items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon(Icons.shop), - label: 'Purchase', - ), + BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'), + BottomNavigationBarItem(icon: Icon(Icons.shop), label: 'Purchase'), ], currentIndex: _selectedIndex, selectedItemColor: Colors.amber[800], @@ -16092,9 +16071,7 @@ steps: _buy(tim); } - void _buy( - Upgrade upgrade, - ) { + void _buy(Upgrade upgrade) { if (counter.count < upgrade.cost) return; counter.addAutoIncrement( @@ -16226,11 +16203,7 @@ steps: - name: Add app/lib/model/firebase_state.dart path: steps/app/lib/model/firebase_state.dart replace-contents: | - enum FirebaseState { - loading, - available, - notAvailable, - } + enum FirebaseState { loading, available, notAvailable } - name: Add map/lib/model/past_purchase.dart path: steps/app/lib/model/past_purchase.dart replace-contents: | @@ -16238,22 +16211,11 @@ steps: import '../constants.dart'; - enum PurchaseType { - subscriptionPurchase, - nonSubscriptionPurchase, - } + enum PurchaseType { subscriptionPurchase, nonSubscriptionPurchase } - enum Store { - googlePlay, - appStore, - } + enum Store { googlePlay, appStore } - enum Status { - pending, - completed, - active, - expired, - } + enum Status { pending, completed, active, expired } @immutable class PastPurchase { @@ -16269,25 +16231,25 @@ steps: return switch (productId) { storeKeyConsumable => 'Consumable', storeKeySubscription => 'Subscription', - _ => productId + _ => productId, }; } PastPurchase.fromJson(Map json) - : type = _typeFromString(json['type'] as String), - store = _storeFromString(json['iapSource'] as String), - orderId = json['orderId'] as String, - productId = json['productId'] as String, - purchaseDate = DateTime.now(), - expiryDate = null, - status = _statusFromString(json['status'] as String); + : type = _typeFromString(json['type'] as String), + store = _storeFromString(json['iapSource'] as String), + orderId = json['orderId'] as String, + productId = json['productId'] as String, + purchaseDate = DateTime.now(), + expiryDate = null, + status = _statusFromString(json['status'] as String); } PurchaseType _typeFromString(String type) { return switch (type) { 'nonSubscription' => PurchaseType.subscriptionPurchase, 'subscription' => PurchaseType.nonSubscriptionPurchase, - _ => throw ArgumentError.value(type, '$type is not a supported type') + _ => throw ArgumentError.value(type, '$type is not a supported type'), }; } @@ -16295,7 +16257,7 @@ steps: return switch (store) { 'googleplay' => Store.googlePlay, 'appstore' => Store.appStore, - _ => throw ArgumentError.value(store, '$store is not a supported store') + _ => throw ArgumentError.value(store, '$store is not a supported store'), }; } @@ -16305,17 +16267,13 @@ steps: 'completed' => Status.completed, 'active' => Status.active, 'expired' => Status.expired, - _ => throw ArgumentError.value(status, '$status is not a supported status') + _ => throw ArgumentError.value(status, '$status is not a supported status'), }; } - name: Add app/lib/model/purchasable_product.dart path: steps/app/lib/model/purchasable_product.dart replace-contents: | - enum ProductStatus { - purchasable, - purchased, - pending, - } + enum ProductStatus { purchasable, purchased, pending } class PurchasableProduct { final String title; @@ -16324,16 +16282,12 @@ steps: ProductStatus status; PurchasableProduct(this.title, this.description, this.price) - : status = ProductStatus.purchasable; + : status = ProductStatus.purchasable; } - name: Add app/lib/model/store_state.dart path: steps/app/lib/model/store_state.dart replace-contents: | - enum StoreState { - loading, - available, - notAvailable, - } + enum StoreState { loading, available, notAvailable } - name: Mkdir app/lib/pages mkdir: steps/app/lib/pages - name: Add app/lib/pages/home_page.dart @@ -16354,10 +16308,7 @@ steps: Widget build(BuildContext context) { return const Column( children: [ - Expanded( - flex: 2, - child: DashClickerWidget(), - ), + Expanded(flex: 2, child: DashClickerWidget()), Expanded(child: UpgradeList()), ], ); @@ -16377,10 +16328,12 @@ steps: InkWell( // Don't listen as we don't need a rebuild when the count changes onTap: Provider.of(context, listen: false).increment, - child: Image.asset(context.read().beautifiedDash - ? 'assets/dash.png' - : 'assets/dash_old.png'), - ) + child: Image.asset( + context.read().beautifiedDash + ? 'assets/dash.png' + : 'assets/dash_old.png', + ), + ), ], ), ); @@ -16401,8 +16354,9 @@ steps: style: DefaultTextStyle.of(context).style, children: [ TextSpan( - text: counter.countString, - style: const TextStyle(fontWeight: FontWeight.bold)), + text: counter.countString, + style: const TextStyle(fontWeight: FontWeight.bold), + ), const TextSpan(text: ' times!'), ], ), @@ -16416,13 +16370,15 @@ steps: @override Widget build(BuildContext context) { var upgrades = context.watch(); - return ListView(children: [ - _UpgradeWidget( - upgrade: upgrades.tim, - title: 'Tim Sneath', - onPressed: upgrades.addTim, - ), - ]); + return ListView( + children: [ + _UpgradeWidget( + upgrade: upgrades.tim, + title: 'Tim Sneath', + onPressed: upgrades.addTim, + ), + ], + ); } } @@ -16440,25 +16396,20 @@ steps: @override Widget build(BuildContext context) { return InkWell( - onTap: onPressed, - child: ListTile( - leading: Center( - widthFactor: 1, - child: Text( - upgrade.count.toString(), - ), - ), - title: Text( - title, - style: !upgrade.purchasable - ? const TextStyle(color: Colors.redAccent) - : null, - ), - subtitle: Text('Produces ${upgrade.work} dashes per second'), - trailing: Text( - '${NumberFormat.compact().format(upgrade.cost)} dashes', - ), - )); + onTap: onPressed, + child: ListTile( + leading: Center(widthFactor: 1, child: Text(upgrade.count.toString())), + title: Text( + title, + style: + !upgrade.purchasable + ? const TextStyle(color: Colors.redAccent) + : null, + ), + subtitle: Text('Produces ${upgrade.work} dashes per second'), + trailing: Text('${NumberFormat.compact().format(upgrade.cost)} dashes'), + ), + ); } } - name: Add app/lib/pages/login_page.dart @@ -16477,17 +16428,16 @@ steps: var firebaseNotifier = context.watch(); if (firebaseNotifier.isLoggingIn) { - return const Center( - child: Text('Logging in...'), - ); + return const Center(child: Text('Logging in...')); } return Center( - child: FilledButton( - onPressed: () { - firebaseNotifier.login(); - }, - child: const Text('Login'), - )); + child: FilledButton( + onPressed: () { + firebaseNotifier.login(); + }, + child: const Text('Login'), + ), + ); } } - name: Add app/lib/pages/purchase_page.dart @@ -16517,17 +16467,20 @@ steps: case StoreState.notAvailable: storeWidget = _PurchasesNotAvailable(); } - return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - storeWidget, - const Padding( - padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), - child: Text( - 'Past purchases', - style: TextStyle(fontWeight: FontWeight.bold), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + storeWidget, + const Padding( + padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), + child: Text( + 'Past purchases', + style: TextStyle(fontWeight: FontWeight.bold), + ), ), - ), - const PastPurchasesWidget(), - ]); + const PastPurchasesWidget(), + ], + ); } } @@ -16551,13 +16504,17 @@ steps: var purchases = context.watch(); var products = purchases.products; return Column( - children: products - .map((product) => _PurchaseWidget( - product: product, - onPressed: () { - purchases.buy(product); - })) - .toList(), + children: + products + .map( + (product) => _PurchaseWidget( + product: product, + onPressed: () { + purchases.buy(product); + }, + ), + ) + .toList(), ); } } @@ -16566,10 +16523,7 @@ steps: final PurchasableProduct product; final VoidCallback onPressed; - const _PurchaseWidget({ - required this.product, - required this.onPressed, - }); + const _PurchaseWidget({required this.product, required this.onPressed}); @override Widget build(BuildContext context) { @@ -16578,21 +16532,20 @@ steps: title += ' (purchased)'; } return InkWell( - onTap: onPressed, - child: ListTile( - title: Text( - title, - ), - subtitle: Text(product.description), - trailing: Text(_trailing()), - )); + onTap: onPressed, + child: ListTile( + title: Text(title), + subtitle: Text(product.description), + trailing: Text(_trailing()), + ), + ); } String _trailing() { return switch (product.status) { ProductStatus.purchasable => product.price, ProductStatus.purchased => 'purchased', - ProductStatus.pending => 'buying...' + ProductStatus.pending => 'buying...', }; } } @@ -16606,10 +16559,11 @@ steps: return ListView.separated( shrinkWrap: true, itemCount: purchases.length, - itemBuilder: (context, index) => ListTile( - title: Text(purchases[index].title), - subtitle: Text(purchases[index].status.toString()), - ), + itemBuilder: + (context, index) => ListTile( + title: Text(purchases[index].title), + subtitle: Text(purchases[index].status.toString()), + ), separatorBuilder: (context, index) => const Divider(), ); } @@ -16668,19 +16622,23 @@ steps: hasUpgrade = false; return; } - var purchaseStream = _firestore - .collection('purchases') - .where('userId', isEqualTo: user.uid) - .snapshots(); + var purchaseStream = + _firestore + .collection('purchases') + .where('userId', isEqualTo: user.uid) + .snapshots(); _purchaseSubscription = purchaseStream.listen((snapshot) { - purchases = snapshot.docs.map((document) { - var data = document.data(); - return PastPurchase.fromJson(data); - }).toList(); + purchases = + snapshot.docs.map((document) { + var data = document.data(); + return PastPurchase.fromJson(data); + }).toList(); - hasActiveSubscription = purchases.any((element) => - element.productId == storeKeySubscription && - element.status != Status.expired); + hasActiveSubscription = purchases.any( + (element) => + element.productId == storeKeySubscription && + element.status != Status.expired, + ); hasUpgrade = purchases.any( (element) => element.productId == storeKeyUpgrade, @@ -16917,10 +16875,7 @@ steps: import 'products.dart'; - enum IAPSource { - googleplay, - appstore, - } + enum IAPSource { googleplay, appstore } abstract class Purchase { final IAPSource iapSource; @@ -16945,8 +16900,9 @@ steps: 'orderId': Value(stringValue: orderId), 'productId': Value(stringValue: productId), 'userId': Value(stringValue: userId), - 'purchaseDate': - Value(timestampValue: purchaseDate.toUtc().toIso8601String()), + 'purchaseDate': Value( + timestampValue: purchaseDate.toUtc().toIso8601String(), + ), 'type': Value(stringValue: type.name), }; } @@ -16955,46 +16911,51 @@ steps: static Purchase fromDocument(Document e) { final type = ProductType.values.firstWhere( - (element) => element.name == e.fields!['type']!.stringValue); + (element) => element.name == e.fields!['type']!.stringValue, + ); switch (type) { case ProductType.subscription: return SubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: SubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), - expiryDate: DateTime.tryParse( - e.fields!['expiryDate']?.timestampValue ?? '') ?? + (element) => element.name == e.fields!['status']!.stringValue, + ), + expiryDate: + DateTime.tryParse( + e.fields!['expiryDate']?.timestampValue ?? '', + ) ?? DateTime.now(), ); case ProductType.nonSubscription: return NonSubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: NonSubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), + (element) => element.name == e.fields!['status']!.stringValue, + ), ); } } } - enum NonSubscriptionStatus { - pending, - completed, - cancelled, - } + enum NonSubscriptionStatus { pending, completed, cancelled } enum SubscriptionStatus { pending, active, expired } @@ -17014,17 +16975,13 @@ steps: @override Map toDocument() { final doc = super.toDocument(); - doc.addAll({ - 'status': Value(stringValue: status.name), - }); + doc.addAll({'status': Value(stringValue: status.name)}); return doc; } @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -17068,9 +17025,7 @@ steps: @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -17102,9 +17057,10 @@ steps: writes: [ Write( update: Document( - fields: purchaseData.toDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.toDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), ), ], ), @@ -17120,9 +17076,10 @@ steps: writes: [ Write( update: Document( - fields: purchaseData.updateDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.updateDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), updateMask: DocumentMask(fieldPaths: ['status']), ), ], @@ -17153,10 +17110,7 @@ steps: const ProductData(this.productId, this.type); } - enum ProductType { - subscription, - nonSubscription, - } + enum ProductType { subscription, nonSubscription } const productDataMap = { 'dash_consumable_2k': ProductData( @@ -17227,9 +17181,9 @@ steps: runApp(const MyApp()); } @@ -66,6 +80,7 @@ class _MyHomePageState extends State { - create: (context) => DashPurchases( - context.read(), - ), + ), + ChangeNotifierProvider( + create: (context) => DashPurchases(context.read()), + lazy: false, ), ], @@ -17304,7 +17258,7 @@ steps: patch-u: | --- b/in_app_purchases/step_07/app/test/widget_test.dart +++ a/in_app_purchases/step_07/app/test/widget_test.dart - @@ -1,9 +1,65 @@ + @@ -1,9 +1,66 @@ import 'package:dashclicker/main.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:in_app_purchase/in_app_purchase.dart'; @@ -17320,8 +17274,10 @@ steps: + +class TestIAPConnection implements InAppPurchase { + @override - + Future buyConsumable( - + {required PurchaseParam purchaseParam, bool autoConsume = true}) { + + Future buyConsumable({ + + required PurchaseParam purchaseParam, + + bool autoConsume = true, + + }) { + return Future.value(false); + } + @@ -17342,10 +17298,9 @@ steps: + + @override + Future queryProductDetails(Set identifiers) { - + return Future.value(ProductDetailsResponse( - + productDetails: [], - + notFoundIDs: [], - + )); + + return Future.value( + + ProductDetailsResponse(productDetails: [], notFoundIDs: []), + + ); + } + + @override @@ -17446,7 +17401,7 @@ steps: } @override - @@ -46,18 +57,42 @@ class DashPurchases extends ChangeNotifier { + @@ -46,18 +57,45 @@ class DashPurchases extends ChangeNotifier { } Future buy(PurchasableProduct product) async { @@ -17466,12 +17421,15 @@ steps: + await iapConnection.buyNonConsumable(purchaseParam: purchaseParam); + default: + throw ArgumentError.value( - + product.productDetails, '${product.id} is not a known product'); + + product.productDetails, + + '${product.id} is not a known product', + + ); + } + } + + Future _onPurchaseUpdate( - + List purchaseDetailsList) async { + + List purchaseDetailsList, + + ) async { + for (var purchaseDetails in purchaseDetailsList) { + await _handlePurchase(purchaseDetails); + } @@ -17503,14 +17461,10 @@ steps: patch-u: | --- b/in_app_purchases/step_08/app/lib/model/purchasable_product.dart +++ a/in_app_purchases/step_08/app/lib/model/purchasable_product.dart - @@ -1,3 +1,5 @@ + @@ -1,11 +1,14 @@ +import 'package:in_app_purchase/in_app_purchase.dart'; + - enum ProductStatus { - purchasable, - purchased, - @@ -5,11 +7,12 @@ enum ProductStatus { - } + enum ProductStatus { purchasable, purchased, pending } class PurchasableProduct { - final String title; @@ -17524,7 +17478,7 @@ steps: + ProductDetails productDetails; - PurchasableProduct(this.title, this.description, this.price) - - : status = ProductStatus.purchasable; + - : status = ProductStatus.purchasable; + PurchasableProduct(this.productDetails) : status = ProductStatus.purchasable; } - name: Copy to step_08 @@ -17541,14 +17495,19 @@ steps: patch-u: | --- b/in_app_purchases/step_09/app/lib/main.dart +++ a/in_app_purchases/step_09/app/lib/main.dart - @@ -79,6 +79,7 @@ class _MyHomePageState extends State { + @@ -79,7 +79,11 @@ class _MyHomePageState extends State { + create: (context) => IAPRepo(context.read()), + ), ChangeNotifierProvider( - create: (context) => DashPurchases( - context.read(), - + context.read(), - ), + - create: (context) => DashPurchases(context.read()), + + create: + + (context) => DashPurchases( + + context.read(), + + context.read(), + + ), lazy: false, ), + ], - name: Patch app/lib/logic/dash_purchases.dart path: steps/app/lib/logic/dash_purchases.dart patch-u: | @@ -17585,7 +17544,7 @@ steps: final purchaseUpdated = iapConnection.purchaseStream; _subscription = purchaseUpdated.listen( _onPurchaseUpdate, - @@ -80,13 +84,19 @@ class DashPurchases extends ChangeNotifier { + @@ -83,13 +87,19 @@ class DashPurchases extends ChangeNotifier { Future _handlePurchase(PurchaseDetails purchaseDetails) async { if (purchaseDetails.status == PurchaseStatus.purchased) { @@ -17612,7 +17571,7 @@ steps: } } - @@ -95,6 +105,30 @@ class DashPurchases extends ChangeNotifier { + @@ -98,6 +108,30 @@ class DashPurchases extends ChangeNotifier { } } @@ -17697,7 +17656,7 @@ steps: patch-u: | --- b/in_app_purchases/step_09/dart-backend/bin/server.dart +++ a/in_app_purchases/step_09/dart-backend/bin/server.dart - @@ -2,12 +2,119 @@ + @@ -2,12 +2,111 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. @@ -17722,36 +17681,33 @@ steps: + // Configure Android Publisher API access + final serviceAccountGooglePlay = + File('assets/service-account-google-play.json').readAsStringSync(); - + final clientCredentialsGooglePlay = - + auth.ServiceAccountCredentials.fromJson(serviceAccountGooglePlay); - + final clientGooglePlay = - + await auth.clientViaServiceAccount(clientCredentialsGooglePlay, [ - + ap.AndroidPublisherApi.androidpublisherScope, - + ]); + + final clientCredentialsGooglePlay = auth.ServiceAccountCredentials.fromJson( + + serviceAccountGooglePlay, + + ); + + final clientGooglePlay = await auth.clientViaServiceAccount( + + clientCredentialsGooglePlay, + + [ap.AndroidPublisherApi.androidpublisherScope], + + ); + final androidPublisher = ap.AndroidPublisherApi(clientGooglePlay); + + // Configure Firestore API access + final serviceAccountFirebase = + File('assets/service-account-firebase.json').readAsStringSync(); - + final clientCredentialsFirebase = - + auth.ServiceAccountCredentials.fromJson(serviceAccountFirebase); - + final clientFirebase = - + await auth.clientViaServiceAccount(clientCredentialsFirebase, [ - + fs.FirestoreApi.cloudPlatformScope, - + ]); + + final clientCredentialsFirebase = auth.ServiceAccountCredentials.fromJson( + + serviceAccountFirebase, + + ); + + final clientFirebase = await auth.clientViaServiceAccount( + + clientCredentialsFirebase, + + [fs.FirestoreApi.cloudPlatformScope], + + ); + final firestoreApi = fs.FirestoreApi(clientFirebase); + final dynamic json = jsonDecode(serviceAccountFirebase); + final projectId = json['project_id'] as String; + final iapRepository = IapRepository(firestoreApi, projectId); + + return { - + 'google_play': GooglePlayPurchaseHandler( - + androidPublisher, - + iapRepository, - + ), - + 'app_store': AppStorePurchaseHandler( - + iapRepository, - + ), + + 'google_play': GooglePlayPurchaseHandler(androidPublisher, iapRepository), + + 'app_store': AppStorePurchaseHandler(iapRepository), + }; +} + @@ -17794,19 +17750,14 @@ steps: await serveHandler(router.call); } + - +({ - + String userId, - + String source, - + ProductData productData, - + String token, - +}) getPurchaseData(dynamic payload) { - + if (payload - + case { - + 'userId': String userId, - + 'source': String source, - + 'productId': String productId, - + 'verificationData': String token, - + }) { + +({String userId, String source, ProductData productData, String token}) + +getPurchaseData(dynamic payload) { + + if (payload case { + + 'userId': String userId, + + 'source': String source, + + 'productId': String productId, + + 'verificationData': String token, + + }) { + return ( + userId: userId, + source: source, @@ -17832,15 +17783,10 @@ steps: class AppStorePurchaseHandler extends PurchaseHandler { final IapRepository iapRepository; - AppStorePurchaseHandler( - this.iapRepository, - ); + AppStorePurchaseHandler(this.iapRepository); final _iTunesAPI = ITunesApi( - ITunesHttpClient( - ITunesEnvironment.sandbox(), - loggingEnabled: true, - ), + ITunesHttpClient(ITunesEnvironment.sandbox(), loggingEnabled: true), ); @override @@ -17883,30 +17829,37 @@ steps: } switch (product.type) { case ProductType.nonSubscription: - await iapRepository.createOrUpdatePurchase(NonSubscriptionPurchase( - userId: userId, - productId: receipt.productId ?? '', - iapSource: IAPSource.appstore, - orderId: receipt.originalTransactionId ?? '', - purchaseDate: DateTime.fromMillisecondsSinceEpoch( - int.parse(receipt.originalPurchaseDateMs ?? '0')), - type: product.type, - status: NonSubscriptionStatus.completed, - )); + await iapRepository.createOrUpdatePurchase( + NonSubscriptionPurchase( + userId: userId, + productId: receipt.productId ?? '', + iapSource: IAPSource.appstore, + orderId: receipt.originalTransactionId ?? '', + purchaseDate: DateTime.fromMillisecondsSinceEpoch( + int.parse(receipt.originalPurchaseDateMs ?? '0'), + ), + type: product.type, + status: NonSubscriptionStatus.completed, + ), + ); break; case ProductType.subscription: - await iapRepository.createOrUpdatePurchase(SubscriptionPurchase( - userId: userId, - productId: receipt.productId ?? '', - iapSource: IAPSource.appstore, - orderId: receipt.originalTransactionId ?? '', - purchaseDate: DateTime.fromMillisecondsSinceEpoch( - int.parse(receipt.originalPurchaseDateMs ?? '0')), - type: product.type, - expiryDate: DateTime.fromMillisecondsSinceEpoch( - int.parse(receipt.expiresDateMs ?? '0')), - status: SubscriptionStatus.active, - )); + await iapRepository.createOrUpdatePurchase( + SubscriptionPurchase( + userId: userId, + productId: receipt.productId ?? '', + iapSource: IAPSource.appstore, + orderId: receipt.originalTransactionId ?? '', + purchaseDate: DateTime.fromMillisecondsSinceEpoch( + int.parse(receipt.originalPurchaseDateMs ?? '0'), + ), + type: product.type, + expiryDate: DateTime.fromMillisecondsSinceEpoch( + int.parse(receipt.expiresDateMs ?? '0'), + ), + status: SubscriptionStatus.active, + ), + ); break; } } @@ -17933,10 +17886,7 @@ steps: final ap.AndroidPublisherApi androidPublisher; final IapRepository iapRepository; - GooglePlayPurchaseHandler( - this.androidPublisher, - this.iapRepository, - ); + GooglePlayPurchaseHandler(this.androidPublisher, this.iapRepository); /// Handle non-subscription purchases (one time purchases). /// @@ -18163,12 +18113,12 @@ steps: patch-u: | --- b/in_app_purchases/step_10/app/lib/main.dart +++ a/in_app_purchases/step_10/app/lib/main.dart - @@ -80,6 +80,7 @@ class _MyHomePageState extends State { - create: (context) => DashPurchases( - context.read(), - context.read(), - + context.read(), - ), + @@ -83,6 +83,7 @@ class _MyHomePageState extends State { + (context) => DashPurchases( + context.read(), + context.read(), + + context.read(), + ), lazy: false, ), - name: Patch app/lib/logic/dash_purchases.dart @@ -18215,7 +18165,7 @@ steps: super.dispose(); } - @@ -136,4 +139,54 @@ class DashPurchases extends ChangeNotifier { + @@ -139,4 +142,59 @@ class DashPurchases extends ChangeNotifier { void _updateStreamOnError(dynamic error) { //Handle error here } @@ -18226,12 +18176,16 @@ steps: + // Get a list of purchasable products for the subscription and upgrade. + // This should be 1 per type. + if (products.isNotEmpty) { - + subscriptions = products - + .where((element) => element.productDetails.id == storeKeySubscription) - + .toList(); - + upgrades = products - + .where((element) => element.productDetails.id == storeKeyUpgrade) - + .toList(); + + subscriptions = + + products + + .where( + + (element) => element.productDetails.id == storeKeySubscription, + + ) + + .toList(); + + upgrades = + + products + + .where((element) => element.productDetails.id == storeKeyUpgrade) + + .toList(); + } + + // Set the subscription in the counter logic and show/hide purchased on the @@ -18254,10 +18208,11 @@ steps: + _beautifiedDashUpgrade = iapRepo.hasUpgrade; + for (var element in upgrades) { + _updateStatus( - + element, - + _beautifiedDashUpgrade - + ? ProductStatus.purchased - + : ProductStatus.purchasable); + + element, + + _beautifiedDashUpgrade + + ? ProductStatus.purchased + + : ProductStatus.purchasable, + + ); + } + notifyListeners(); + } @@ -18293,12 +18248,19 @@ steps: import 'package:googleapis_auth/auth_io.dart' as auth; import 'package:shelf/shelf.dart'; import 'package:shelf_router/shelf_router.dart'; - @@ -28,9 +31,13 @@ Future> _createPurchaseHandlers() async { - final clientGooglePlay = - await auth.clientViaServiceAccount(clientCredentialsGooglePlay, [ - ap.AndroidPublisherApi.androidpublisherScope, - + pubsub.PubsubApi.cloudPlatformScope, - ]); + @@ -26,12 +29,16 @@ Future> _createPurchaseHandlers() async { + final clientCredentialsGooglePlay = auth.ServiceAccountCredentials.fromJson( + serviceAccountGooglePlay, + ); + - final clientGooglePlay = await auth.clientViaServiceAccount( + - clientCredentialsGooglePlay, + - [ap.AndroidPublisherApi.androidpublisherScope], + - ); + + final clientGooglePlay = await auth + + .clientViaServiceAccount(clientCredentialsGooglePlay, [ + + ap.AndroidPublisherApi.androidpublisherScope, + + pubsub.PubsubApi.cloudPlatformScope, + + ]); final androidPublisher = ap.AndroidPublisherApi(clientGooglePlay); + // Pub/Sub API to receive on purchase events from Google Play @@ -18307,7 +18269,7 @@ steps: // Configure Firestore API access final serviceAccountFirebase = File('assets/service-account-firebase.json').readAsStringSync(); - @@ -45,13 +52,43 @@ Future> _createPurchaseHandlers() async { + @@ -47,9 +54,41 @@ Future> _createPurchaseHandlers() async { final projectId = json['project_id'] as String; final iapRepository = IapRepository(firestoreApi, projectId); @@ -18340,15 +18302,14 @@ steps: + ); + return { - 'google_play': GooglePlayPurchaseHandler( - androidPublisher, - iapRepository, + - 'google_play': GooglePlayPurchaseHandler(androidPublisher, iapRepository), + - 'app_store': AppStorePurchaseHandler(iapRepository), + + 'google_play': GooglePlayPurchaseHandler( + + androidPublisher, + + iapRepository, + pubsubApi, - ), - 'app_store': AppStorePurchaseHandler( - iapRepository, - + appStoreServerAPI, - ), + + ), + + 'app_store': AppStorePurchaseHandler(iapRepository, appStoreServerAPI), }; } - name: Patch dart-backend/lib/app_store_purchase_handler.dart @@ -18356,7 +18317,7 @@ steps: patch-u: | --- b/in_app_purchases/step_10/dart-backend/lib/app_store_purchase_handler.dart +++ a/in_app_purchases/step_10/dart-backend/lib/app_store_purchase_handler.dart - @@ -7,12 +7,22 @@ import 'iap_repository.dart'; + @@ -7,10 +7,19 @@ import 'iap_repository.dart'; import 'products.dart'; import 'purchase_handler.dart'; @@ -18367,11 +18328,8 @@ steps: final IapRepository iapRepository; + final AppStoreServerAPI appStoreServerAPI; - AppStorePurchaseHandler( - this.iapRepository, - - ); - + this.appStoreServerAPI, - + ) { + - AppStorePurchaseHandler(this.iapRepository); + + AppStorePurchaseHandler(this.iapRepository, this.appStoreServerAPI) { + // Poll Subscription status every 10 seconds. + Timer.periodic(Duration(seconds: 10), (_) { + _pullStatus(); @@ -18379,8 +18337,8 @@ steps: + } final _iTunesAPI = ITunesApi( - ITunesHttpClient( - @@ -94,4 +104,45 @@ class AppStorePurchaseHandler extends PurchaseHandler { + ITunesHttpClient(ITunesEnvironment.sandbox(), loggingEnabled: true), + @@ -96,4 +105,53 @@ class AppStorePurchaseHandler extends PurchaseHandler { return false; } } @@ -18392,35 +18350,43 @@ steps: + print('Polling App Store'); + final purchases = await iapRepository.getPurchases(); + // filter for App Store subscriptions - + final appStoreSubscriptions = purchases.where((element) => - + element.type == ProductType.subscription && - + element.iapSource == IAPSource.appstore); + + final appStoreSubscriptions = purchases.where( + + (element) => + + element.type == ProductType.subscription && + + element.iapSource == IAPSource.appstore, + + ); + for (final purchase in appStoreSubscriptions) { - + final status = - + await appStoreServerAPI.getAllSubscriptionStatuses(purchase.orderId); + + final status = await appStoreServerAPI.getAllSubscriptionStatuses( + + purchase.orderId, + + ); + // Obtain all subscriptions for the order id. + for (final subscription in status.data) { + // Last transaction contains the subscription status. + for (final transaction in subscription.lastTransactions) { + final expirationDate = DateTime.fromMillisecondsSinceEpoch( - + transaction.transactionInfo.expiresDate ?? 0); + + transaction.transactionInfo.expiresDate ?? 0, + + ); + // Check if subscription has expired. + final isExpired = expirationDate.isBefore(DateTime.now()); + print('Expiration Date: $expirationDate - isExpired: $isExpired'); + // Update the subscription status with the new expiration date and status. - + await iapRepository.updatePurchase(SubscriptionPurchase( - + userId: null, - + productId: transaction.transactionInfo.productId, - + iapSource: IAPSource.appstore, - + orderId: transaction.originalTransactionId, - + purchaseDate: DateTime.fromMillisecondsSinceEpoch( - + transaction.transactionInfo.originalPurchaseDate), - + type: ProductType.subscription, - + expiryDate: expirationDate, - + status: isExpired - + ? SubscriptionStatus.expired - + : SubscriptionStatus.active, - + )); + + await iapRepository.updatePurchase( + + SubscriptionPurchase( + + userId: null, + + productId: transaction.transactionInfo.productId, + + iapSource: IAPSource.appstore, + + orderId: transaction.originalTransactionId, + + purchaseDate: DateTime.fromMillisecondsSinceEpoch( + + transaction.transactionInfo.originalPurchaseDate, + + ), + + type: ProductType.subscription, + + expiryDate: expirationDate, + + status: + + isExpired + + ? SubscriptionStatus.expired + + : SubscriptionStatus.active, + + ), + + ); + } + } + } @@ -18440,16 +18406,16 @@ steps: import 'constants.dart'; import 'iap_repository.dart'; - @@ -10,11 +12,18 @@ import 'purchase_handler.dart'; + @@ -10,8 +12,18 @@ import 'purchase_handler.dart'; class GooglePlayPurchaseHandler extends PurchaseHandler { final ap.AndroidPublisherApi androidPublisher; final IapRepository iapRepository; + final pubsub.PubsubApi pubsubApi; - GooglePlayPurchaseHandler( - this.androidPublisher, - this.iapRepository, - - ); + - GooglePlayPurchaseHandler(this.androidPublisher, this.iapRepository); + + GooglePlayPurchaseHandler( + + this.androidPublisher, + + this.iapRepository, + this.pubsubApi, + ) { + // Poll messages from Pub/Sub every 10 seconds @@ -18460,7 +18426,7 @@ steps: /// Handle non-subscription purchases (one time purchases). /// - @@ -148,6 +157,89 @@ class GooglePlayPurchaseHandler extends PurchaseHandler { + @@ -145,6 +157,85 @@ class GooglePlayPurchaseHandler extends PurchaseHandler { } return false; } @@ -18469,9 +18435,7 @@ steps: + /// Called every 10 seconds + Future _pullMessageFromPubSub() async { + print('Polling Google Play messages'); - + final request = pubsub.PullRequest( - + maxMessages: 1000, - + ); + + final request = pubsub.PullRequest(maxMessages: 1000); + final topicName = + 'projects/$googlePlayProjectName/subscriptions/$googlePlayPubsubBillingTopic-sub'; + final pullResponse = await pubsubApi.projects.subscriptions.pull( @@ -18537,9 +18501,7 @@ steps: + /// ACK Messages from Pub/Sub + Future _ackMessage(String id) async { + print('ACK Message'); - + final request = pubsub.AcknowledgeRequest( - + ackIds: [id], - + ); + + final request = pubsub.AcknowledgeRequest(ackIds: [id]); + final subscriptionName = + 'projects/$googlePlayProjectName/subscriptions/$googlePlayPubsubBillingTopic-sub'; + await pubsubApi.projects.subscriptions.acknowledge( @@ -18562,9 +18524,9 @@ steps: - name: Patch app/lib/logic/dash_purchases.dart path: steps/app/lib/logic/dash_purchases.dart patch-u: | - --- b/in_app_purchases/step_11/app/lib/logic/dash_purchases.dart - +++ a/in_app_purchases/step_11/app/lib/logic/dash_purchases.dart - @@ -184,8 +184,8 @@ class DashPurchases extends ChangeNotifier { + --- b/in_app_purchases/complete/app/lib/logic/dash_purchases.dart + +++ a/in_app_purchases/complete/app/lib/logic/dash_purchases.dart + @@ -192,8 +192,8 @@ class DashPurchases extends ChangeNotifier { } void _updateStatus(PurchasableProduct product, ProductStatus status) { diff --git a/in_app_purchases/complete/app/android/.gitignore b/in_app_purchases/complete/app/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/in_app_purchases/complete/app/android/.gitignore +++ b/in_app_purchases/complete/app/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/in_app_purchases/complete/app/android/app/build.gradle b/in_app_purchases/complete/app/android/app/build.gradle deleted file mode 100644 index 149d49474c..0000000000 --- a/in_app_purchases/complete/app/android/app/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.dashclicker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.dashclicker" - // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/in_app_purchases/complete/app/android/app/build.gradle.kts b/in_app_purchases/complete/app/android/app/build.gradle.kts new file mode 100644 index 0000000000..f9fb424ffc --- /dev/null +++ b/in_app_purchases/complete/app/android/app/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.dashclicker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.dashclicker" + // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/in_app_purchases/complete/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt b/in_app_purchases/complete/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt index 2879c0343b..c136c711c8 100644 --- a/in_app_purchases/complete/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt +++ b/in_app_purchases/complete/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.dashclicker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/in_app_purchases/complete/app/android/build.gradle b/in_app_purchases/complete/app/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/in_app_purchases/complete/app/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/in_app_purchases/complete/app/android/build.gradle.kts b/in_app_purchases/complete/app/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/in_app_purchases/complete/app/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/in_app_purchases/complete/app/android/gradle.properties b/in_app_purchases/complete/app/android/gradle.properties index 2597170821..f018a61817 100644 --- a/in_app_purchases/complete/app/android/gradle.properties +++ b/in_app_purchases/complete/app/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/in_app_purchases/complete/app/android/gradle/wrapper/gradle-wrapper.properties b/in_app_purchases/complete/app/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/in_app_purchases/complete/app/android/gradle/wrapper/gradle-wrapper.properties +++ b/in_app_purchases/complete/app/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/in_app_purchases/complete/app/android/settings.gradle b/in_app_purchases/complete/app/android/settings.gradle deleted file mode 100644 index a42444ded0..0000000000 --- a/in_app_purchases/complete/app/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.2.1" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/in_app_purchases/complete/app/android/settings.gradle.kts b/in_app_purchases/complete/app/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/in_app_purchases/complete/app/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/in_app_purchases/complete/app/ios/Podfile b/in_app_purchases/complete/app/ios/Podfile index 0a27aa76d9..263294aa35 100644 --- a/in_app_purchases/complete/app/ios/Podfile +++ b/in_app_purchases/complete/app/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/in_app_purchases/complete/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/in_app_purchases/complete/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/in_app_purchases/complete/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/in_app_purchases/complete/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/in_app_purchases/complete/app/lib/logic/dash_purchases.dart b/in_app_purchases/complete/app/lib/logic/dash_purchases.dart index c73eaa4c56..e6024ef4ba 100644 --- a/in_app_purchases/complete/app/lib/logic/dash_purchases.dart +++ b/in_app_purchases/complete/app/lib/logic/dash_purchases.dart @@ -73,12 +73,15 @@ class DashPurchases extends ChangeNotifier { await iapConnection.buyNonConsumable(purchaseParam: purchaseParam); default: throw ArgumentError.value( - product.productDetails, '${product.id} is not a known product'); + product.productDetails, + '${product.id} is not a known product', + ); } } Future _onPurchaseUpdate( - List purchaseDetailsList) async { + List purchaseDetailsList, + ) async { for (var purchaseDetails in purchaseDetailsList) { await _handlePurchase(purchaseDetails); } @@ -146,12 +149,16 @@ class DashPurchases extends ChangeNotifier { // Get a list of purchasable products for the subscription and upgrade. // This should be 1 per type. if (products.isNotEmpty) { - subscriptions = products - .where((element) => element.productDetails.id == storeKeySubscription) - .toList(); - upgrades = products - .where((element) => element.productDetails.id == storeKeyUpgrade) - .toList(); + subscriptions = + products + .where( + (element) => element.productDetails.id == storeKeySubscription, + ) + .toList(); + upgrades = + products + .where((element) => element.productDetails.id == storeKeyUpgrade) + .toList(); } // Set the subscription in the counter logic and show/hide purchased on the @@ -174,10 +181,11 @@ class DashPurchases extends ChangeNotifier { _beautifiedDashUpgrade = iapRepo.hasUpgrade; for (var element in upgrades) { _updateStatus( - element, - _beautifiedDashUpgrade - ? ProductStatus.purchased - : ProductStatus.purchasable); + element, + _beautifiedDashUpgrade + ? ProductStatus.purchased + : ProductStatus.purchasable, + ); } notifyListeners(); } diff --git a/in_app_purchases/complete/app/lib/logic/dash_upgrades.dart b/in_app_purchases/complete/app/lib/logic/dash_upgrades.dart index 826aec517a..f6201177f5 100644 --- a/in_app_purchases/complete/app/lib/logic/dash_upgrades.dart +++ b/in_app_purchases/complete/app/lib/logic/dash_upgrades.dart @@ -37,9 +37,7 @@ class DashUpgrades extends ChangeNotifier { _buy(tim); } - void _buy( - Upgrade upgrade, - ) { + void _buy(Upgrade upgrade) { if (counter.count < upgrade.cost) return; counter.addAutoIncrement( diff --git a/in_app_purchases/complete/app/lib/main.dart b/in_app_purchases/complete/app/lib/main.dart index f4b5ce594f..e63ae7f47d 100644 --- a/in_app_purchases/complete/app/lib/main.dart +++ b/in_app_purchases/complete/app/lib/main.dart @@ -65,41 +65,36 @@ class _MyHomePageState extends State { return MultiProvider( providers: [ ChangeNotifierProvider( - create: (_) => FirebaseNotifier()), + create: (_) => FirebaseNotifier(), + ), ChangeNotifierProvider(create: (_) => DashCounter()), ChangeNotifierProvider( - create: (context) => DashUpgrades( - context.read(), - context.read(), - ), + create: + (context) => DashUpgrades( + context.read(), + context.read(), + ), ), ChangeNotifierProvider( create: (context) => IAPRepo(context.read()), ), ChangeNotifierProvider( - create: (context) => DashPurchases( - context.read(), - context.read(), - context.read(), - ), + create: + (context) => DashPurchases( + context.read(), + context.read(), + context.read(), + ), lazy: false, ), ], child: Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: _widgetOptions[_selectedIndex], bottomNavigationBar: BottomNavigationBar( items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon(Icons.shop), - label: 'Purchase', - ), + BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'), + BottomNavigationBarItem(icon: Icon(Icons.shop), label: 'Purchase'), ], currentIndex: _selectedIndex, selectedItemColor: Colors.amber[800], diff --git a/in_app_purchases/complete/app/lib/model/firebase_state.dart b/in_app_purchases/complete/app/lib/model/firebase_state.dart index 1a04db5438..9fc7102e99 100644 --- a/in_app_purchases/complete/app/lib/model/firebase_state.dart +++ b/in_app_purchases/complete/app/lib/model/firebase_state.dart @@ -1,5 +1 @@ -enum FirebaseState { - loading, - available, - notAvailable, -} +enum FirebaseState { loading, available, notAvailable } diff --git a/in_app_purchases/complete/app/lib/model/past_purchase.dart b/in_app_purchases/complete/app/lib/model/past_purchase.dart index 42f412481d..63142b1be7 100644 --- a/in_app_purchases/complete/app/lib/model/past_purchase.dart +++ b/in_app_purchases/complete/app/lib/model/past_purchase.dart @@ -2,22 +2,11 @@ import 'package:flutter/widgets.dart'; import '../constants.dart'; -enum PurchaseType { - subscriptionPurchase, - nonSubscriptionPurchase, -} +enum PurchaseType { subscriptionPurchase, nonSubscriptionPurchase } -enum Store { - googlePlay, - appStore, -} +enum Store { googlePlay, appStore } -enum Status { - pending, - completed, - active, - expired, -} +enum Status { pending, completed, active, expired } @immutable class PastPurchase { @@ -33,25 +22,25 @@ class PastPurchase { return switch (productId) { storeKeyConsumable => 'Consumable', storeKeySubscription => 'Subscription', - _ => productId + _ => productId, }; } PastPurchase.fromJson(Map json) - : type = _typeFromString(json['type'] as String), - store = _storeFromString(json['iapSource'] as String), - orderId = json['orderId'] as String, - productId = json['productId'] as String, - purchaseDate = DateTime.now(), - expiryDate = null, - status = _statusFromString(json['status'] as String); + : type = _typeFromString(json['type'] as String), + store = _storeFromString(json['iapSource'] as String), + orderId = json['orderId'] as String, + productId = json['productId'] as String, + purchaseDate = DateTime.now(), + expiryDate = null, + status = _statusFromString(json['status'] as String); } PurchaseType _typeFromString(String type) { return switch (type) { 'nonSubscription' => PurchaseType.subscriptionPurchase, 'subscription' => PurchaseType.nonSubscriptionPurchase, - _ => throw ArgumentError.value(type, '$type is not a supported type') + _ => throw ArgumentError.value(type, '$type is not a supported type'), }; } @@ -59,7 +48,7 @@ Store _storeFromString(String store) { return switch (store) { 'googleplay' => Store.googlePlay, 'appstore' => Store.appStore, - _ => throw ArgumentError.value(store, '$store is not a supported store') + _ => throw ArgumentError.value(store, '$store is not a supported store'), }; } @@ -69,6 +58,6 @@ Status _statusFromString(String status) { 'completed' => Status.completed, 'active' => Status.active, 'expired' => Status.expired, - _ => throw ArgumentError.value(status, '$status is not a supported status') + _ => throw ArgumentError.value(status, '$status is not a supported status'), }; } diff --git a/in_app_purchases/complete/app/lib/model/purchasable_product.dart b/in_app_purchases/complete/app/lib/model/purchasable_product.dart index 9abe078e52..e2b8b81970 100644 --- a/in_app_purchases/complete/app/lib/model/purchasable_product.dart +++ b/in_app_purchases/complete/app/lib/model/purchasable_product.dart @@ -1,10 +1,6 @@ import 'package:in_app_purchase/in_app_purchase.dart'; -enum ProductStatus { - purchasable, - purchased, - pending, -} +enum ProductStatus { purchasable, purchased, pending } class PurchasableProduct { String get id => productDetails.id; diff --git a/in_app_purchases/complete/app/lib/model/store_state.dart b/in_app_purchases/complete/app/lib/model/store_state.dart index a4f1490b60..a299611086 100644 --- a/in_app_purchases/complete/app/lib/model/store_state.dart +++ b/in_app_purchases/complete/app/lib/model/store_state.dart @@ -1,5 +1 @@ -enum StoreState { - loading, - available, - notAvailable, -} +enum StoreState { loading, available, notAvailable } diff --git a/in_app_purchases/complete/app/lib/pages/home_page.dart b/in_app_purchases/complete/app/lib/pages/home_page.dart index 57087c5f24..83d674703b 100644 --- a/in_app_purchases/complete/app/lib/pages/home_page.dart +++ b/in_app_purchases/complete/app/lib/pages/home_page.dart @@ -13,10 +13,7 @@ class HomePage extends StatelessWidget { Widget build(BuildContext context) { return const Column( children: [ - Expanded( - flex: 2, - child: DashClickerWidget(), - ), + Expanded(flex: 2, child: DashClickerWidget()), Expanded(child: UpgradeList()), ], ); @@ -36,10 +33,12 @@ class DashClickerWidget extends StatelessWidget { InkWell( // Don't listen as we don't need a rebuild when the count changes onTap: Provider.of(context, listen: false).increment, - child: Image.asset(context.read().beautifiedDash - ? 'assets/dash.png' - : 'assets/dash_old.png'), - ) + child: Image.asset( + context.read().beautifiedDash + ? 'assets/dash.png' + : 'assets/dash_old.png', + ), + ), ], ), ); @@ -60,8 +59,9 @@ class CounterStateWidget extends StatelessWidget { style: DefaultTextStyle.of(context).style, children: [ TextSpan( - text: counter.countString, - style: const TextStyle(fontWeight: FontWeight.bold)), + text: counter.countString, + style: const TextStyle(fontWeight: FontWeight.bold), + ), const TextSpan(text: ' times!'), ], ), @@ -75,13 +75,15 @@ class UpgradeList extends StatelessWidget { @override Widget build(BuildContext context) { var upgrades = context.watch(); - return ListView(children: [ - _UpgradeWidget( - upgrade: upgrades.tim, - title: 'Tim Sneath', - onPressed: upgrades.addTim, - ), - ]); + return ListView( + children: [ + _UpgradeWidget( + upgrade: upgrades.tim, + title: 'Tim Sneath', + onPressed: upgrades.addTim, + ), + ], + ); } } @@ -99,24 +101,19 @@ class _UpgradeWidget extends StatelessWidget { @override Widget build(BuildContext context) { return InkWell( - onTap: onPressed, - child: ListTile( - leading: Center( - widthFactor: 1, - child: Text( - upgrade.count.toString(), - ), - ), - title: Text( - title, - style: !upgrade.purchasable - ? const TextStyle(color: Colors.redAccent) - : null, - ), - subtitle: Text('Produces ${upgrade.work} dashes per second'), - trailing: Text( - '${NumberFormat.compact().format(upgrade.cost)} dashes', - ), - )); + onTap: onPressed, + child: ListTile( + leading: Center(widthFactor: 1, child: Text(upgrade.count.toString())), + title: Text( + title, + style: + !upgrade.purchasable + ? const TextStyle(color: Colors.redAccent) + : null, + ), + subtitle: Text('Produces ${upgrade.work} dashes per second'), + trailing: Text('${NumberFormat.compact().format(upgrade.cost)} dashes'), + ), + ); } } diff --git a/in_app_purchases/complete/app/lib/pages/login_page.dart b/in_app_purchases/complete/app/lib/pages/login_page.dart index f0bc7dbc45..655da8b403 100644 --- a/in_app_purchases/complete/app/lib/pages/login_page.dart +++ b/in_app_purchases/complete/app/lib/pages/login_page.dart @@ -11,16 +11,15 @@ class LoginPage extends StatelessWidget { var firebaseNotifier = context.watch(); if (firebaseNotifier.isLoggingIn) { - return const Center( - child: Text('Logging in...'), - ); + return const Center(child: Text('Logging in...')); } return Center( - child: FilledButton( - onPressed: () { - firebaseNotifier.login(); - }, - child: const Text('Login'), - )); + child: FilledButton( + onPressed: () { + firebaseNotifier.login(); + }, + child: const Text('Login'), + ), + ); } } diff --git a/in_app_purchases/complete/app/lib/pages/purchase_page.dart b/in_app_purchases/complete/app/lib/pages/purchase_page.dart index 85470b24fb..97eee25f38 100644 --- a/in_app_purchases/complete/app/lib/pages/purchase_page.dart +++ b/in_app_purchases/complete/app/lib/pages/purchase_page.dart @@ -36,17 +36,20 @@ class PurchasePage extends StatelessWidget { case StoreState.notAvailable: storeWidget = _PurchasesNotAvailable(); } - return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - storeWidget, - const Padding( - padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), - child: Text( - 'Past purchases', - style: TextStyle(fontWeight: FontWeight.bold), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + storeWidget, + const Padding( + padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), + child: Text( + 'Past purchases', + style: TextStyle(fontWeight: FontWeight.bold), + ), ), - ), - const PastPurchasesWidget(), - ]); + const PastPurchasesWidget(), + ], + ); } } @@ -70,13 +73,17 @@ class _PurchaseList extends StatelessWidget { var purchases = context.watch(); var products = purchases.products; return Column( - children: products - .map((product) => _PurchaseWidget( - product: product, - onPressed: () { - purchases.buy(product); - })) - .toList(), + children: + products + .map( + (product) => _PurchaseWidget( + product: product, + onPressed: () { + purchases.buy(product); + }, + ), + ) + .toList(), ); } } @@ -85,10 +92,7 @@ class _PurchaseWidget extends StatelessWidget { final PurchasableProduct product; final VoidCallback onPressed; - const _PurchaseWidget({ - required this.product, - required this.onPressed, - }); + const _PurchaseWidget({required this.product, required this.onPressed}); @override Widget build(BuildContext context) { @@ -97,21 +101,20 @@ class _PurchaseWidget extends StatelessWidget { title += ' (purchased)'; } return InkWell( - onTap: onPressed, - child: ListTile( - title: Text( - title, - ), - subtitle: Text(product.description), - trailing: Text(_trailing()), - )); + onTap: onPressed, + child: ListTile( + title: Text(title), + subtitle: Text(product.description), + trailing: Text(_trailing()), + ), + ); } String _trailing() { return switch (product.status) { ProductStatus.purchasable => product.price, ProductStatus.purchased => 'purchased', - ProductStatus.pending => 'buying...' + ProductStatus.pending => 'buying...', }; } } @@ -125,10 +128,11 @@ class PastPurchasesWidget extends StatelessWidget { return ListView.separated( shrinkWrap: true, itemCount: purchases.length, - itemBuilder: (context, index) => ListTile( - title: Text(purchases[index].title), - subtitle: Text(purchases[index].status.toString()), - ), + itemBuilder: + (context, index) => ListTile( + title: Text(purchases[index].title), + subtitle: Text(purchases[index].status.toString()), + ), separatorBuilder: (context, index) => const Divider(), ); } diff --git a/in_app_purchases/complete/app/lib/repo/iap_repo.dart b/in_app_purchases/complete/app/lib/repo/iap_repo.dart index f238a98c39..67e3f137ba 100644 --- a/in_app_purchases/complete/app/lib/repo/iap_repo.dart +++ b/in_app_purchases/complete/app/lib/repo/iap_repo.dart @@ -47,19 +47,23 @@ class IAPRepo extends ChangeNotifier { hasUpgrade = false; return; } - var purchaseStream = _firestore - .collection('purchases') - .where('userId', isEqualTo: user.uid) - .snapshots(); + var purchaseStream = + _firestore + .collection('purchases') + .where('userId', isEqualTo: user.uid) + .snapshots(); _purchaseSubscription = purchaseStream.listen((snapshot) { - purchases = snapshot.docs.map((document) { - var data = document.data(); - return PastPurchase.fromJson(data); - }).toList(); + purchases = + snapshot.docs.map((document) { + var data = document.data(); + return PastPurchase.fromJson(data); + }).toList(); - hasActiveSubscription = purchases.any((element) => - element.productId == storeKeySubscription && - element.status != Status.expired); + hasActiveSubscription = purchases.any( + (element) => + element.productId == storeKeySubscription && + element.status != Status.expired, + ); hasUpgrade = purchases.any( (element) => element.productId == storeKeyUpgrade, diff --git a/in_app_purchases/complete/app/pubspec.yaml b/in_app_purchases/complete/app/pubspec.yaml index 518e415ab2..04baea6b35 100644 --- a/in_app_purchases/complete/app/pubspec.yaml +++ b/in_app_purchases/complete/app/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/in_app_purchases/complete/app/test/widget_test.dart b/in_app_purchases/complete/app/test/widget_test.dart index cd48c00478..ce165ef6de 100644 --- a/in_app_purchases/complete/app/test/widget_test.dart +++ b/in_app_purchases/complete/app/test/widget_test.dart @@ -13,8 +13,10 @@ void main() { class TestIAPConnection implements InAppPurchase { @override - Future buyConsumable( - {required PurchaseParam purchaseParam, bool autoConsume = true}) { + Future buyConsumable({ + required PurchaseParam purchaseParam, + bool autoConsume = true, + }) { return Future.value(false); } @@ -35,10 +37,9 @@ class TestIAPConnection implements InAppPurchase { @override Future queryProductDetails(Set identifiers) { - return Future.value(ProductDetailsResponse( - productDetails: [], - notFoundIDs: [], - )); + return Future.value( + ProductDetailsResponse(productDetails: [], notFoundIDs: []), + ); } @override diff --git a/in_app_purchases/complete/dart-backend/bin/server.dart b/in_app_purchases/complete/dart-backend/bin/server.dart index 8eb019f5f9..0007cf9ad2 100644 --- a/in_app_purchases/complete/dart-backend/bin/server.dart +++ b/in_app_purchases/complete/dart-backend/bin/server.dart @@ -26,13 +26,14 @@ Future> _createPurchaseHandlers() async { // Configure Android Publisher API access final serviceAccountGooglePlay = File('assets/service-account-google-play.json').readAsStringSync(); - final clientCredentialsGooglePlay = - auth.ServiceAccountCredentials.fromJson(serviceAccountGooglePlay); - final clientGooglePlay = - await auth.clientViaServiceAccount(clientCredentialsGooglePlay, [ - ap.AndroidPublisherApi.androidpublisherScope, - pubsub.PubsubApi.cloudPlatformScope, - ]); + final clientCredentialsGooglePlay = auth.ServiceAccountCredentials.fromJson( + serviceAccountGooglePlay, + ); + final clientGooglePlay = await auth + .clientViaServiceAccount(clientCredentialsGooglePlay, [ + ap.AndroidPublisherApi.androidpublisherScope, + pubsub.PubsubApi.cloudPlatformScope, + ]); final androidPublisher = ap.AndroidPublisherApi(clientGooglePlay); // Pub/Sub API to receive on purchase events from Google Play @@ -41,12 +42,13 @@ Future> _createPurchaseHandlers() async { // Configure Firestore API access final serviceAccountFirebase = File('assets/service-account-firebase.json').readAsStringSync(); - final clientCredentialsFirebase = - auth.ServiceAccountCredentials.fromJson(serviceAccountFirebase); - final clientFirebase = - await auth.clientViaServiceAccount(clientCredentialsFirebase, [ - fs.FirestoreApi.cloudPlatformScope, - ]); + final clientCredentialsFirebase = auth.ServiceAccountCredentials.fromJson( + serviceAccountFirebase, + ); + final clientFirebase = await auth.clientViaServiceAccount( + clientCredentialsFirebase, + [fs.FirestoreApi.cloudPlatformScope], + ); final firestoreApi = fs.FirestoreApi(clientFirebase); final dynamic json = jsonDecode(serviceAccountFirebase); final projectId = json['project_id'] as String; @@ -86,10 +88,7 @@ Future> _createPurchaseHandlers() async { iapRepository, pubsubApi, ), - 'app_store': AppStorePurchaseHandler( - iapRepository, - appStoreServerAPI, - ), + 'app_store': AppStorePurchaseHandler(iapRepository, appStoreServerAPI), }; } @@ -132,19 +131,14 @@ Future main() async { await serveHandler(router.call); } -({ - String userId, - String source, - ProductData productData, - String token, -}) getPurchaseData(dynamic payload) { - if (payload - case { - 'userId': String userId, - 'source': String source, - 'productId': String productId, - 'verificationData': String token, - }) { +({String userId, String source, ProductData productData, String token}) +getPurchaseData(dynamic payload) { + if (payload case { + 'userId': String userId, + 'source': String source, + 'productId': String productId, + 'verificationData': String token, + }) { return ( userId: userId, source: source, diff --git a/in_app_purchases/complete/dart-backend/lib/app_store_purchase_handler.dart b/in_app_purchases/complete/dart-backend/lib/app_store_purchase_handler.dart index 440bbb10ec..b4789d3462 100644 --- a/in_app_purchases/complete/dart-backend/lib/app_store_purchase_handler.dart +++ b/in_app_purchases/complete/dart-backend/lib/app_store_purchase_handler.dart @@ -14,10 +14,7 @@ class AppStorePurchaseHandler extends PurchaseHandler { final IapRepository iapRepository; final AppStoreServerAPI appStoreServerAPI; - AppStorePurchaseHandler( - this.iapRepository, - this.appStoreServerAPI, - ) { + AppStorePurchaseHandler(this.iapRepository, this.appStoreServerAPI) { // Poll Subscription status every 10 seconds. Timer.periodic(Duration(seconds: 10), (_) { _pullStatus(); @@ -25,10 +22,7 @@ class AppStorePurchaseHandler extends PurchaseHandler { } final _iTunesAPI = ITunesApi( - ITunesHttpClient( - ITunesEnvironment.sandbox(), - loggingEnabled: true, - ), + ITunesHttpClient(ITunesEnvironment.sandbox(), loggingEnabled: true), ); @override @@ -71,30 +65,37 @@ class AppStorePurchaseHandler extends PurchaseHandler { } switch (product.type) { case ProductType.nonSubscription: - await iapRepository.createOrUpdatePurchase(NonSubscriptionPurchase( - userId: userId, - productId: receipt.productId ?? '', - iapSource: IAPSource.appstore, - orderId: receipt.originalTransactionId ?? '', - purchaseDate: DateTime.fromMillisecondsSinceEpoch( - int.parse(receipt.originalPurchaseDateMs ?? '0')), - type: product.type, - status: NonSubscriptionStatus.completed, - )); + await iapRepository.createOrUpdatePurchase( + NonSubscriptionPurchase( + userId: userId, + productId: receipt.productId ?? '', + iapSource: IAPSource.appstore, + orderId: receipt.originalTransactionId ?? '', + purchaseDate: DateTime.fromMillisecondsSinceEpoch( + int.parse(receipt.originalPurchaseDateMs ?? '0'), + ), + type: product.type, + status: NonSubscriptionStatus.completed, + ), + ); break; case ProductType.subscription: - await iapRepository.createOrUpdatePurchase(SubscriptionPurchase( - userId: userId, - productId: receipt.productId ?? '', - iapSource: IAPSource.appstore, - orderId: receipt.originalTransactionId ?? '', - purchaseDate: DateTime.fromMillisecondsSinceEpoch( - int.parse(receipt.originalPurchaseDateMs ?? '0')), - type: product.type, - expiryDate: DateTime.fromMillisecondsSinceEpoch( - int.parse(receipt.expiresDateMs ?? '0')), - status: SubscriptionStatus.active, - )); + await iapRepository.createOrUpdatePurchase( + SubscriptionPurchase( + userId: userId, + productId: receipt.productId ?? '', + iapSource: IAPSource.appstore, + orderId: receipt.originalTransactionId ?? '', + purchaseDate: DateTime.fromMillisecondsSinceEpoch( + int.parse(receipt.originalPurchaseDateMs ?? '0'), + ), + type: product.type, + expiryDate: DateTime.fromMillisecondsSinceEpoch( + int.parse(receipt.expiresDateMs ?? '0'), + ), + status: SubscriptionStatus.active, + ), + ); break; } } @@ -112,35 +113,43 @@ class AppStorePurchaseHandler extends PurchaseHandler { print('Polling App Store'); final purchases = await iapRepository.getPurchases(); // filter for App Store subscriptions - final appStoreSubscriptions = purchases.where((element) => - element.type == ProductType.subscription && - element.iapSource == IAPSource.appstore); + final appStoreSubscriptions = purchases.where( + (element) => + element.type == ProductType.subscription && + element.iapSource == IAPSource.appstore, + ); for (final purchase in appStoreSubscriptions) { - final status = - await appStoreServerAPI.getAllSubscriptionStatuses(purchase.orderId); + final status = await appStoreServerAPI.getAllSubscriptionStatuses( + purchase.orderId, + ); // Obtain all subscriptions for the order id. for (final subscription in status.data) { // Last transaction contains the subscription status. for (final transaction in subscription.lastTransactions) { final expirationDate = DateTime.fromMillisecondsSinceEpoch( - transaction.transactionInfo.expiresDate ?? 0); + transaction.transactionInfo.expiresDate ?? 0, + ); // Check if subscription has expired. final isExpired = expirationDate.isBefore(DateTime.now()); print('Expiration Date: $expirationDate - isExpired: $isExpired'); // Update the subscription status with the new expiration date and status. - await iapRepository.updatePurchase(SubscriptionPurchase( - userId: null, - productId: transaction.transactionInfo.productId, - iapSource: IAPSource.appstore, - orderId: transaction.originalTransactionId, - purchaseDate: DateTime.fromMillisecondsSinceEpoch( - transaction.transactionInfo.originalPurchaseDate), - type: ProductType.subscription, - expiryDate: expirationDate, - status: isExpired - ? SubscriptionStatus.expired - : SubscriptionStatus.active, - )); + await iapRepository.updatePurchase( + SubscriptionPurchase( + userId: null, + productId: transaction.transactionInfo.productId, + iapSource: IAPSource.appstore, + orderId: transaction.originalTransactionId, + purchaseDate: DateTime.fromMillisecondsSinceEpoch( + transaction.transactionInfo.originalPurchaseDate, + ), + type: ProductType.subscription, + expiryDate: expirationDate, + status: + isExpired + ? SubscriptionStatus.expired + : SubscriptionStatus.active, + ), + ); } } } diff --git a/in_app_purchases/complete/dart-backend/lib/google_play_purchase_handler.dart b/in_app_purchases/complete/dart-backend/lib/google_play_purchase_handler.dart index b77ca0e461..ead67e4603 100644 --- a/in_app_purchases/complete/dart-backend/lib/google_play_purchase_handler.dart +++ b/in_app_purchases/complete/dart-backend/lib/google_play_purchase_handler.dart @@ -162,9 +162,7 @@ class GooglePlayPurchaseHandler extends PurchaseHandler { /// Called every 10 seconds Future _pullMessageFromPubSub() async { print('Polling Google Play messages'); - final request = pubsub.PullRequest( - maxMessages: 1000, - ); + final request = pubsub.PullRequest(maxMessages: 1000); final topicName = 'projects/$googlePlayProjectName/subscriptions/$googlePlayPubsubBillingTopic-sub'; final pullResponse = await pubsubApi.projects.subscriptions.pull( @@ -230,9 +228,7 @@ class GooglePlayPurchaseHandler extends PurchaseHandler { /// ACK Messages from Pub/Sub Future _ackMessage(String id) async { print('ACK Message'); - final request = pubsub.AcknowledgeRequest( - ackIds: [id], - ); + final request = pubsub.AcknowledgeRequest(ackIds: [id]); final subscriptionName = 'projects/$googlePlayProjectName/subscriptions/$googlePlayPubsubBillingTopic-sub'; await pubsubApi.projects.subscriptions.acknowledge( diff --git a/in_app_purchases/complete/dart-backend/lib/iap_repository.dart b/in_app_purchases/complete/dart-backend/lib/iap_repository.dart index 1856f31c95..98a0d6ace6 100644 --- a/in_app_purchases/complete/dart-backend/lib/iap_repository.dart +++ b/in_app_purchases/complete/dart-backend/lib/iap_repository.dart @@ -2,10 +2,7 @@ import 'package:googleapis/firestore/v1.dart'; import 'products.dart'; -enum IAPSource { - googleplay, - appstore, -} +enum IAPSource { googleplay, appstore } abstract class Purchase { final IAPSource iapSource; @@ -30,8 +27,9 @@ abstract class Purchase { 'orderId': Value(stringValue: orderId), 'productId': Value(stringValue: productId), 'userId': Value(stringValue: userId), - 'purchaseDate': - Value(timestampValue: purchaseDate.toUtc().toIso8601String()), + 'purchaseDate': Value( + timestampValue: purchaseDate.toUtc().toIso8601String(), + ), 'type': Value(stringValue: type.name), }; } @@ -40,46 +38,51 @@ abstract class Purchase { static Purchase fromDocument(Document e) { final type = ProductType.values.firstWhere( - (element) => element.name == e.fields!['type']!.stringValue); + (element) => element.name == e.fields!['type']!.stringValue, + ); switch (type) { case ProductType.subscription: return SubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: SubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), - expiryDate: DateTime.tryParse( - e.fields!['expiryDate']?.timestampValue ?? '') ?? + (element) => element.name == e.fields!['status']!.stringValue, + ), + expiryDate: + DateTime.tryParse( + e.fields!['expiryDate']?.timestampValue ?? '', + ) ?? DateTime.now(), ); case ProductType.nonSubscription: return NonSubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: NonSubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), + (element) => element.name == e.fields!['status']!.stringValue, + ), ); } } } -enum NonSubscriptionStatus { - pending, - completed, - cancelled, -} +enum NonSubscriptionStatus { pending, completed, cancelled } enum SubscriptionStatus { pending, active, expired } @@ -99,17 +102,13 @@ class NonSubscriptionPurchase extends Purchase { @override Map toDocument() { final doc = super.toDocument(); - doc.addAll({ - 'status': Value(stringValue: status.name), - }); + doc.addAll({'status': Value(stringValue: status.name)}); return doc; } @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -153,9 +152,7 @@ class SubscriptionPurchase extends Purchase { @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -187,9 +184,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.toDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.toDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), ), ], ), @@ -205,9 +203,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.updateDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.updateDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), updateMask: DocumentMask(fieldPaths: ['status']), ), ], diff --git a/in_app_purchases/complete/dart-backend/lib/products.dart b/in_app_purchases/complete/dart-backend/lib/products.dart index d6baaeb9ca..921ffd8da9 100644 --- a/in_app_purchases/complete/dart-backend/lib/products.dart +++ b/in_app_purchases/complete/dart-backend/lib/products.dart @@ -5,10 +5,7 @@ class ProductData { const ProductData(this.productId, this.type); } -enum ProductType { - subscription, - nonSubscription, -} +enum ProductType { subscription, nonSubscription } const productDataMap = { 'dash_consumable_2k': ProductData( diff --git a/in_app_purchases/complete/dart-backend/pubspec.yaml b/in_app_purchases/complete/dart-backend/pubspec.yaml index af254ee049..68a14f2c1e 100644 --- a/in_app_purchases/complete/dart-backend/pubspec.yaml +++ b/in_app_purchases/complete/dart-backend/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.0.0 # repository: https://github.com/my_org/my_repo environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: app_store_server_sdk: ^1.2.9 diff --git a/in_app_purchases/step_00/app/android/.gitignore b/in_app_purchases/step_00/app/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/in_app_purchases/step_00/app/android/.gitignore +++ b/in_app_purchases/step_00/app/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/in_app_purchases/step_00/app/android/app/build.gradle b/in_app_purchases/step_00/app/android/app/build.gradle deleted file mode 100644 index 149d49474c..0000000000 --- a/in_app_purchases/step_00/app/android/app/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.dashclicker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.dashclicker" - // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/in_app_purchases/step_00/app/android/app/build.gradle.kts b/in_app_purchases/step_00/app/android/app/build.gradle.kts new file mode 100644 index 0000000000..f9fb424ffc --- /dev/null +++ b/in_app_purchases/step_00/app/android/app/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.dashclicker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.dashclicker" + // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/in_app_purchases/step_00/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt b/in_app_purchases/step_00/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt index 2879c0343b..c136c711c8 100644 --- a/in_app_purchases/step_00/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt +++ b/in_app_purchases/step_00/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.dashclicker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/in_app_purchases/step_00/app/android/build.gradle b/in_app_purchases/step_00/app/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/in_app_purchases/step_00/app/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/in_app_purchases/step_00/app/android/build.gradle.kts b/in_app_purchases/step_00/app/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/in_app_purchases/step_00/app/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/in_app_purchases/step_00/app/android/gradle.properties b/in_app_purchases/step_00/app/android/gradle.properties index 2597170821..f018a61817 100644 --- a/in_app_purchases/step_00/app/android/gradle.properties +++ b/in_app_purchases/step_00/app/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/in_app_purchases/step_00/app/android/gradle/wrapper/gradle-wrapper.properties b/in_app_purchases/step_00/app/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/in_app_purchases/step_00/app/android/gradle/wrapper/gradle-wrapper.properties +++ b/in_app_purchases/step_00/app/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/in_app_purchases/step_00/app/android/settings.gradle b/in_app_purchases/step_00/app/android/settings.gradle deleted file mode 100644 index a42444ded0..0000000000 --- a/in_app_purchases/step_00/app/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.2.1" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/in_app_purchases/step_00/app/android/settings.gradle.kts b/in_app_purchases/step_00/app/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/in_app_purchases/step_00/app/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/in_app_purchases/step_00/app/ios/Podfile b/in_app_purchases/step_00/app/ios/Podfile index 0a27aa76d9..263294aa35 100644 --- a/in_app_purchases/step_00/app/ios/Podfile +++ b/in_app_purchases/step_00/app/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/in_app_purchases/step_00/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/in_app_purchases/step_00/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/in_app_purchases/step_00/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/in_app_purchases/step_00/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/in_app_purchases/step_00/app/lib/logic/dash_upgrades.dart b/in_app_purchases/step_00/app/lib/logic/dash_upgrades.dart index 826aec517a..f6201177f5 100644 --- a/in_app_purchases/step_00/app/lib/logic/dash_upgrades.dart +++ b/in_app_purchases/step_00/app/lib/logic/dash_upgrades.dart @@ -37,9 +37,7 @@ class DashUpgrades extends ChangeNotifier { _buy(tim); } - void _buy( - Upgrade upgrade, - ) { + void _buy(Upgrade upgrade) { if (counter.count < upgrade.cost) return; counter.addAutoIncrement( diff --git a/in_app_purchases/step_00/app/lib/main.dart b/in_app_purchases/step_00/app/lib/main.dart index 4443bcf3ae..f8ed19d034 100644 --- a/in_app_purchases/step_00/app/lib/main.dart +++ b/in_app_purchases/step_00/app/lib/main.dart @@ -51,38 +51,30 @@ class _MyHomePageState extends State { return MultiProvider( providers: [ ChangeNotifierProvider( - create: (_) => FirebaseNotifier()), + create: (_) => FirebaseNotifier(), + ), ChangeNotifierProvider(create: (_) => DashCounter()), ChangeNotifierProvider( - create: (context) => DashUpgrades( - context.read(), - context.read(), - ), + create: + (context) => DashUpgrades( + context.read(), + context.read(), + ), ), ChangeNotifierProvider( create: (context) => IAPRepo(context.read()), ), ChangeNotifierProvider( - create: (context) => DashPurchases( - context.read(), - ), + create: (context) => DashPurchases(context.read()), ), ], child: Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: _widgetOptions[_selectedIndex], bottomNavigationBar: BottomNavigationBar( items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon(Icons.shop), - label: 'Purchase', - ), + BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'), + BottomNavigationBarItem(icon: Icon(Icons.shop), label: 'Purchase'), ], currentIndex: _selectedIndex, selectedItemColor: Colors.amber[800], diff --git a/in_app_purchases/step_00/app/lib/model/firebase_state.dart b/in_app_purchases/step_00/app/lib/model/firebase_state.dart index 1a04db5438..9fc7102e99 100644 --- a/in_app_purchases/step_00/app/lib/model/firebase_state.dart +++ b/in_app_purchases/step_00/app/lib/model/firebase_state.dart @@ -1,5 +1 @@ -enum FirebaseState { - loading, - available, - notAvailable, -} +enum FirebaseState { loading, available, notAvailable } diff --git a/in_app_purchases/step_00/app/lib/model/past_purchase.dart b/in_app_purchases/step_00/app/lib/model/past_purchase.dart index 42f412481d..63142b1be7 100644 --- a/in_app_purchases/step_00/app/lib/model/past_purchase.dart +++ b/in_app_purchases/step_00/app/lib/model/past_purchase.dart @@ -2,22 +2,11 @@ import 'package:flutter/widgets.dart'; import '../constants.dart'; -enum PurchaseType { - subscriptionPurchase, - nonSubscriptionPurchase, -} +enum PurchaseType { subscriptionPurchase, nonSubscriptionPurchase } -enum Store { - googlePlay, - appStore, -} +enum Store { googlePlay, appStore } -enum Status { - pending, - completed, - active, - expired, -} +enum Status { pending, completed, active, expired } @immutable class PastPurchase { @@ -33,25 +22,25 @@ class PastPurchase { return switch (productId) { storeKeyConsumable => 'Consumable', storeKeySubscription => 'Subscription', - _ => productId + _ => productId, }; } PastPurchase.fromJson(Map json) - : type = _typeFromString(json['type'] as String), - store = _storeFromString(json['iapSource'] as String), - orderId = json['orderId'] as String, - productId = json['productId'] as String, - purchaseDate = DateTime.now(), - expiryDate = null, - status = _statusFromString(json['status'] as String); + : type = _typeFromString(json['type'] as String), + store = _storeFromString(json['iapSource'] as String), + orderId = json['orderId'] as String, + productId = json['productId'] as String, + purchaseDate = DateTime.now(), + expiryDate = null, + status = _statusFromString(json['status'] as String); } PurchaseType _typeFromString(String type) { return switch (type) { 'nonSubscription' => PurchaseType.subscriptionPurchase, 'subscription' => PurchaseType.nonSubscriptionPurchase, - _ => throw ArgumentError.value(type, '$type is not a supported type') + _ => throw ArgumentError.value(type, '$type is not a supported type'), }; } @@ -59,7 +48,7 @@ Store _storeFromString(String store) { return switch (store) { 'googleplay' => Store.googlePlay, 'appstore' => Store.appStore, - _ => throw ArgumentError.value(store, '$store is not a supported store') + _ => throw ArgumentError.value(store, '$store is not a supported store'), }; } @@ -69,6 +58,6 @@ Status _statusFromString(String status) { 'completed' => Status.completed, 'active' => Status.active, 'expired' => Status.expired, - _ => throw ArgumentError.value(status, '$status is not a supported status') + _ => throw ArgumentError.value(status, '$status is not a supported status'), }; } diff --git a/in_app_purchases/step_00/app/lib/model/purchasable_product.dart b/in_app_purchases/step_00/app/lib/model/purchasable_product.dart index 873e488056..46f1aaa0c6 100644 --- a/in_app_purchases/step_00/app/lib/model/purchasable_product.dart +++ b/in_app_purchases/step_00/app/lib/model/purchasable_product.dart @@ -1,8 +1,4 @@ -enum ProductStatus { - purchasable, - purchased, - pending, -} +enum ProductStatus { purchasable, purchased, pending } class PurchasableProduct { final String title; @@ -11,5 +7,5 @@ class PurchasableProduct { ProductStatus status; PurchasableProduct(this.title, this.description, this.price) - : status = ProductStatus.purchasable; + : status = ProductStatus.purchasable; } diff --git a/in_app_purchases/step_00/app/lib/model/store_state.dart b/in_app_purchases/step_00/app/lib/model/store_state.dart index a4f1490b60..a299611086 100644 --- a/in_app_purchases/step_00/app/lib/model/store_state.dart +++ b/in_app_purchases/step_00/app/lib/model/store_state.dart @@ -1,5 +1 @@ -enum StoreState { - loading, - available, - notAvailable, -} +enum StoreState { loading, available, notAvailable } diff --git a/in_app_purchases/step_00/app/lib/pages/home_page.dart b/in_app_purchases/step_00/app/lib/pages/home_page.dart index 57087c5f24..83d674703b 100644 --- a/in_app_purchases/step_00/app/lib/pages/home_page.dart +++ b/in_app_purchases/step_00/app/lib/pages/home_page.dart @@ -13,10 +13,7 @@ class HomePage extends StatelessWidget { Widget build(BuildContext context) { return const Column( children: [ - Expanded( - flex: 2, - child: DashClickerWidget(), - ), + Expanded(flex: 2, child: DashClickerWidget()), Expanded(child: UpgradeList()), ], ); @@ -36,10 +33,12 @@ class DashClickerWidget extends StatelessWidget { InkWell( // Don't listen as we don't need a rebuild when the count changes onTap: Provider.of(context, listen: false).increment, - child: Image.asset(context.read().beautifiedDash - ? 'assets/dash.png' - : 'assets/dash_old.png'), - ) + child: Image.asset( + context.read().beautifiedDash + ? 'assets/dash.png' + : 'assets/dash_old.png', + ), + ), ], ), ); @@ -60,8 +59,9 @@ class CounterStateWidget extends StatelessWidget { style: DefaultTextStyle.of(context).style, children: [ TextSpan( - text: counter.countString, - style: const TextStyle(fontWeight: FontWeight.bold)), + text: counter.countString, + style: const TextStyle(fontWeight: FontWeight.bold), + ), const TextSpan(text: ' times!'), ], ), @@ -75,13 +75,15 @@ class UpgradeList extends StatelessWidget { @override Widget build(BuildContext context) { var upgrades = context.watch(); - return ListView(children: [ - _UpgradeWidget( - upgrade: upgrades.tim, - title: 'Tim Sneath', - onPressed: upgrades.addTim, - ), - ]); + return ListView( + children: [ + _UpgradeWidget( + upgrade: upgrades.tim, + title: 'Tim Sneath', + onPressed: upgrades.addTim, + ), + ], + ); } } @@ -99,24 +101,19 @@ class _UpgradeWidget extends StatelessWidget { @override Widget build(BuildContext context) { return InkWell( - onTap: onPressed, - child: ListTile( - leading: Center( - widthFactor: 1, - child: Text( - upgrade.count.toString(), - ), - ), - title: Text( - title, - style: !upgrade.purchasable - ? const TextStyle(color: Colors.redAccent) - : null, - ), - subtitle: Text('Produces ${upgrade.work} dashes per second'), - trailing: Text( - '${NumberFormat.compact().format(upgrade.cost)} dashes', - ), - )); + onTap: onPressed, + child: ListTile( + leading: Center(widthFactor: 1, child: Text(upgrade.count.toString())), + title: Text( + title, + style: + !upgrade.purchasable + ? const TextStyle(color: Colors.redAccent) + : null, + ), + subtitle: Text('Produces ${upgrade.work} dashes per second'), + trailing: Text('${NumberFormat.compact().format(upgrade.cost)} dashes'), + ), + ); } } diff --git a/in_app_purchases/step_00/app/lib/pages/login_page.dart b/in_app_purchases/step_00/app/lib/pages/login_page.dart index f0bc7dbc45..655da8b403 100644 --- a/in_app_purchases/step_00/app/lib/pages/login_page.dart +++ b/in_app_purchases/step_00/app/lib/pages/login_page.dart @@ -11,16 +11,15 @@ class LoginPage extends StatelessWidget { var firebaseNotifier = context.watch(); if (firebaseNotifier.isLoggingIn) { - return const Center( - child: Text('Logging in...'), - ); + return const Center(child: Text('Logging in...')); } return Center( - child: FilledButton( - onPressed: () { - firebaseNotifier.login(); - }, - child: const Text('Login'), - )); + child: FilledButton( + onPressed: () { + firebaseNotifier.login(); + }, + child: const Text('Login'), + ), + ); } } diff --git a/in_app_purchases/step_00/app/lib/pages/purchase_page.dart b/in_app_purchases/step_00/app/lib/pages/purchase_page.dart index 7b4c011173..5b27d88137 100644 --- a/in_app_purchases/step_00/app/lib/pages/purchase_page.dart +++ b/in_app_purchases/step_00/app/lib/pages/purchase_page.dart @@ -22,17 +22,20 @@ class PurchasePage extends StatelessWidget { case StoreState.notAvailable: storeWidget = _PurchasesNotAvailable(); } - return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - storeWidget, - const Padding( - padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), - child: Text( - 'Past purchases', - style: TextStyle(fontWeight: FontWeight.bold), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + storeWidget, + const Padding( + padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), + child: Text( + 'Past purchases', + style: TextStyle(fontWeight: FontWeight.bold), + ), ), - ), - const PastPurchasesWidget(), - ]); + const PastPurchasesWidget(), + ], + ); } } @@ -56,13 +59,17 @@ class _PurchaseList extends StatelessWidget { var purchases = context.watch(); var products = purchases.products; return Column( - children: products - .map((product) => _PurchaseWidget( - product: product, - onPressed: () { - purchases.buy(product); - })) - .toList(), + children: + products + .map( + (product) => _PurchaseWidget( + product: product, + onPressed: () { + purchases.buy(product); + }, + ), + ) + .toList(), ); } } @@ -71,10 +78,7 @@ class _PurchaseWidget extends StatelessWidget { final PurchasableProduct product; final VoidCallback onPressed; - const _PurchaseWidget({ - required this.product, - required this.onPressed, - }); + const _PurchaseWidget({required this.product, required this.onPressed}); @override Widget build(BuildContext context) { @@ -83,21 +87,20 @@ class _PurchaseWidget extends StatelessWidget { title += ' (purchased)'; } return InkWell( - onTap: onPressed, - child: ListTile( - title: Text( - title, - ), - subtitle: Text(product.description), - trailing: Text(_trailing()), - )); + onTap: onPressed, + child: ListTile( + title: Text(title), + subtitle: Text(product.description), + trailing: Text(_trailing()), + ), + ); } String _trailing() { return switch (product.status) { ProductStatus.purchasable => product.price, ProductStatus.purchased => 'purchased', - ProductStatus.pending => 'buying...' + ProductStatus.pending => 'buying...', }; } } @@ -111,10 +114,11 @@ class PastPurchasesWidget extends StatelessWidget { return ListView.separated( shrinkWrap: true, itemCount: purchases.length, - itemBuilder: (context, index) => ListTile( - title: Text(purchases[index].title), - subtitle: Text(purchases[index].status.toString()), - ), + itemBuilder: + (context, index) => ListTile( + title: Text(purchases[index].title), + subtitle: Text(purchases[index].status.toString()), + ), separatorBuilder: (context, index) => const Divider(), ); } diff --git a/in_app_purchases/step_00/app/lib/repo/iap_repo.dart b/in_app_purchases/step_00/app/lib/repo/iap_repo.dart index f238a98c39..67e3f137ba 100644 --- a/in_app_purchases/step_00/app/lib/repo/iap_repo.dart +++ b/in_app_purchases/step_00/app/lib/repo/iap_repo.dart @@ -47,19 +47,23 @@ class IAPRepo extends ChangeNotifier { hasUpgrade = false; return; } - var purchaseStream = _firestore - .collection('purchases') - .where('userId', isEqualTo: user.uid) - .snapshots(); + var purchaseStream = + _firestore + .collection('purchases') + .where('userId', isEqualTo: user.uid) + .snapshots(); _purchaseSubscription = purchaseStream.listen((snapshot) { - purchases = snapshot.docs.map((document) { - var data = document.data(); - return PastPurchase.fromJson(data); - }).toList(); + purchases = + snapshot.docs.map((document) { + var data = document.data(); + return PastPurchase.fromJson(data); + }).toList(); - hasActiveSubscription = purchases.any((element) => - element.productId == storeKeySubscription && - element.status != Status.expired); + hasActiveSubscription = purchases.any( + (element) => + element.productId == storeKeySubscription && + element.status != Status.expired, + ); hasUpgrade = purchases.any( (element) => element.productId == storeKeyUpgrade, diff --git a/in_app_purchases/step_00/app/pubspec.yaml b/in_app_purchases/step_00/app/pubspec.yaml index 9890590547..f3c5535a8b 100644 --- a/in_app_purchases/step_00/app/pubspec.yaml +++ b/in_app_purchases/step_00/app/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/in_app_purchases/step_00/dart-backend/lib/iap_repository.dart b/in_app_purchases/step_00/dart-backend/lib/iap_repository.dart index 1856f31c95..98a0d6ace6 100644 --- a/in_app_purchases/step_00/dart-backend/lib/iap_repository.dart +++ b/in_app_purchases/step_00/dart-backend/lib/iap_repository.dart @@ -2,10 +2,7 @@ import 'package:googleapis/firestore/v1.dart'; import 'products.dart'; -enum IAPSource { - googleplay, - appstore, -} +enum IAPSource { googleplay, appstore } abstract class Purchase { final IAPSource iapSource; @@ -30,8 +27,9 @@ abstract class Purchase { 'orderId': Value(stringValue: orderId), 'productId': Value(stringValue: productId), 'userId': Value(stringValue: userId), - 'purchaseDate': - Value(timestampValue: purchaseDate.toUtc().toIso8601String()), + 'purchaseDate': Value( + timestampValue: purchaseDate.toUtc().toIso8601String(), + ), 'type': Value(stringValue: type.name), }; } @@ -40,46 +38,51 @@ abstract class Purchase { static Purchase fromDocument(Document e) { final type = ProductType.values.firstWhere( - (element) => element.name == e.fields!['type']!.stringValue); + (element) => element.name == e.fields!['type']!.stringValue, + ); switch (type) { case ProductType.subscription: return SubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: SubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), - expiryDate: DateTime.tryParse( - e.fields!['expiryDate']?.timestampValue ?? '') ?? + (element) => element.name == e.fields!['status']!.stringValue, + ), + expiryDate: + DateTime.tryParse( + e.fields!['expiryDate']?.timestampValue ?? '', + ) ?? DateTime.now(), ); case ProductType.nonSubscription: return NonSubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: NonSubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), + (element) => element.name == e.fields!['status']!.stringValue, + ), ); } } } -enum NonSubscriptionStatus { - pending, - completed, - cancelled, -} +enum NonSubscriptionStatus { pending, completed, cancelled } enum SubscriptionStatus { pending, active, expired } @@ -99,17 +102,13 @@ class NonSubscriptionPurchase extends Purchase { @override Map toDocument() { final doc = super.toDocument(); - doc.addAll({ - 'status': Value(stringValue: status.name), - }); + doc.addAll({'status': Value(stringValue: status.name)}); return doc; } @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -153,9 +152,7 @@ class SubscriptionPurchase extends Purchase { @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -187,9 +184,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.toDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.toDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), ), ], ), @@ -205,9 +203,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.updateDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.updateDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), updateMask: DocumentMask(fieldPaths: ['status']), ), ], diff --git a/in_app_purchases/step_00/dart-backend/lib/products.dart b/in_app_purchases/step_00/dart-backend/lib/products.dart index d6baaeb9ca..921ffd8da9 100644 --- a/in_app_purchases/step_00/dart-backend/lib/products.dart +++ b/in_app_purchases/step_00/dart-backend/lib/products.dart @@ -5,10 +5,7 @@ class ProductData { const ProductData(this.productId, this.type); } -enum ProductType { - subscription, - nonSubscription, -} +enum ProductType { subscription, nonSubscription } const productDataMap = { 'dash_consumable_2k': ProductData( diff --git a/in_app_purchases/step_00/dart-backend/pubspec.yaml b/in_app_purchases/step_00/dart-backend/pubspec.yaml index af254ee049..68a14f2c1e 100644 --- a/in_app_purchases/step_00/dart-backend/pubspec.yaml +++ b/in_app_purchases/step_00/dart-backend/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.0.0 # repository: https://github.com/my_org/my_repo environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: app_store_server_sdk: ^1.2.9 diff --git a/in_app_purchases/step_03/app/android/.gitignore b/in_app_purchases/step_03/app/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/in_app_purchases/step_03/app/android/.gitignore +++ b/in_app_purchases/step_03/app/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/in_app_purchases/step_03/app/android/app/build.gradle b/in_app_purchases/step_03/app/android/app/build.gradle deleted file mode 100644 index 149d49474c..0000000000 --- a/in_app_purchases/step_03/app/android/app/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.dashclicker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.dashclicker" - // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/in_app_purchases/step_03/app/android/app/build.gradle.kts b/in_app_purchases/step_03/app/android/app/build.gradle.kts new file mode 100644 index 0000000000..f9fb424ffc --- /dev/null +++ b/in_app_purchases/step_03/app/android/app/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.dashclicker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.dashclicker" + // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/in_app_purchases/step_03/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt b/in_app_purchases/step_03/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt index 2879c0343b..c136c711c8 100644 --- a/in_app_purchases/step_03/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt +++ b/in_app_purchases/step_03/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.dashclicker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/in_app_purchases/step_03/app/android/build.gradle b/in_app_purchases/step_03/app/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/in_app_purchases/step_03/app/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/in_app_purchases/step_03/app/android/build.gradle.kts b/in_app_purchases/step_03/app/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/in_app_purchases/step_03/app/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/in_app_purchases/step_03/app/android/gradle.properties b/in_app_purchases/step_03/app/android/gradle.properties index 2597170821..f018a61817 100644 --- a/in_app_purchases/step_03/app/android/gradle.properties +++ b/in_app_purchases/step_03/app/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/in_app_purchases/step_03/app/android/gradle/wrapper/gradle-wrapper.properties b/in_app_purchases/step_03/app/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/in_app_purchases/step_03/app/android/gradle/wrapper/gradle-wrapper.properties +++ b/in_app_purchases/step_03/app/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/in_app_purchases/step_03/app/android/settings.gradle b/in_app_purchases/step_03/app/android/settings.gradle deleted file mode 100644 index a42444ded0..0000000000 --- a/in_app_purchases/step_03/app/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.2.1" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/in_app_purchases/step_03/app/android/settings.gradle.kts b/in_app_purchases/step_03/app/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/in_app_purchases/step_03/app/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/in_app_purchases/step_03/app/ios/Podfile b/in_app_purchases/step_03/app/ios/Podfile index 0a27aa76d9..263294aa35 100644 --- a/in_app_purchases/step_03/app/ios/Podfile +++ b/in_app_purchases/step_03/app/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/in_app_purchases/step_03/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/in_app_purchases/step_03/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/in_app_purchases/step_03/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/in_app_purchases/step_03/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/in_app_purchases/step_03/app/lib/logic/dash_upgrades.dart b/in_app_purchases/step_03/app/lib/logic/dash_upgrades.dart index 826aec517a..f6201177f5 100644 --- a/in_app_purchases/step_03/app/lib/logic/dash_upgrades.dart +++ b/in_app_purchases/step_03/app/lib/logic/dash_upgrades.dart @@ -37,9 +37,7 @@ class DashUpgrades extends ChangeNotifier { _buy(tim); } - void _buy( - Upgrade upgrade, - ) { + void _buy(Upgrade upgrade) { if (counter.count < upgrade.cost) return; counter.addAutoIncrement( diff --git a/in_app_purchases/step_03/app/lib/main.dart b/in_app_purchases/step_03/app/lib/main.dart index 4443bcf3ae..f8ed19d034 100644 --- a/in_app_purchases/step_03/app/lib/main.dart +++ b/in_app_purchases/step_03/app/lib/main.dart @@ -51,38 +51,30 @@ class _MyHomePageState extends State { return MultiProvider( providers: [ ChangeNotifierProvider( - create: (_) => FirebaseNotifier()), + create: (_) => FirebaseNotifier(), + ), ChangeNotifierProvider(create: (_) => DashCounter()), ChangeNotifierProvider( - create: (context) => DashUpgrades( - context.read(), - context.read(), - ), + create: + (context) => DashUpgrades( + context.read(), + context.read(), + ), ), ChangeNotifierProvider( create: (context) => IAPRepo(context.read()), ), ChangeNotifierProvider( - create: (context) => DashPurchases( - context.read(), - ), + create: (context) => DashPurchases(context.read()), ), ], child: Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: _widgetOptions[_selectedIndex], bottomNavigationBar: BottomNavigationBar( items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon(Icons.shop), - label: 'Purchase', - ), + BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'), + BottomNavigationBarItem(icon: Icon(Icons.shop), label: 'Purchase'), ], currentIndex: _selectedIndex, selectedItemColor: Colors.amber[800], diff --git a/in_app_purchases/step_03/app/lib/model/firebase_state.dart b/in_app_purchases/step_03/app/lib/model/firebase_state.dart index 1a04db5438..9fc7102e99 100644 --- a/in_app_purchases/step_03/app/lib/model/firebase_state.dart +++ b/in_app_purchases/step_03/app/lib/model/firebase_state.dart @@ -1,5 +1 @@ -enum FirebaseState { - loading, - available, - notAvailable, -} +enum FirebaseState { loading, available, notAvailable } diff --git a/in_app_purchases/step_03/app/lib/model/past_purchase.dart b/in_app_purchases/step_03/app/lib/model/past_purchase.dart index 42f412481d..63142b1be7 100644 --- a/in_app_purchases/step_03/app/lib/model/past_purchase.dart +++ b/in_app_purchases/step_03/app/lib/model/past_purchase.dart @@ -2,22 +2,11 @@ import 'package:flutter/widgets.dart'; import '../constants.dart'; -enum PurchaseType { - subscriptionPurchase, - nonSubscriptionPurchase, -} +enum PurchaseType { subscriptionPurchase, nonSubscriptionPurchase } -enum Store { - googlePlay, - appStore, -} +enum Store { googlePlay, appStore } -enum Status { - pending, - completed, - active, - expired, -} +enum Status { pending, completed, active, expired } @immutable class PastPurchase { @@ -33,25 +22,25 @@ class PastPurchase { return switch (productId) { storeKeyConsumable => 'Consumable', storeKeySubscription => 'Subscription', - _ => productId + _ => productId, }; } PastPurchase.fromJson(Map json) - : type = _typeFromString(json['type'] as String), - store = _storeFromString(json['iapSource'] as String), - orderId = json['orderId'] as String, - productId = json['productId'] as String, - purchaseDate = DateTime.now(), - expiryDate = null, - status = _statusFromString(json['status'] as String); + : type = _typeFromString(json['type'] as String), + store = _storeFromString(json['iapSource'] as String), + orderId = json['orderId'] as String, + productId = json['productId'] as String, + purchaseDate = DateTime.now(), + expiryDate = null, + status = _statusFromString(json['status'] as String); } PurchaseType _typeFromString(String type) { return switch (type) { 'nonSubscription' => PurchaseType.subscriptionPurchase, 'subscription' => PurchaseType.nonSubscriptionPurchase, - _ => throw ArgumentError.value(type, '$type is not a supported type') + _ => throw ArgumentError.value(type, '$type is not a supported type'), }; } @@ -59,7 +48,7 @@ Store _storeFromString(String store) { return switch (store) { 'googleplay' => Store.googlePlay, 'appstore' => Store.appStore, - _ => throw ArgumentError.value(store, '$store is not a supported store') + _ => throw ArgumentError.value(store, '$store is not a supported store'), }; } @@ -69,6 +58,6 @@ Status _statusFromString(String status) { 'completed' => Status.completed, 'active' => Status.active, 'expired' => Status.expired, - _ => throw ArgumentError.value(status, '$status is not a supported status') + _ => throw ArgumentError.value(status, '$status is not a supported status'), }; } diff --git a/in_app_purchases/step_03/app/lib/model/purchasable_product.dart b/in_app_purchases/step_03/app/lib/model/purchasable_product.dart index 873e488056..46f1aaa0c6 100644 --- a/in_app_purchases/step_03/app/lib/model/purchasable_product.dart +++ b/in_app_purchases/step_03/app/lib/model/purchasable_product.dart @@ -1,8 +1,4 @@ -enum ProductStatus { - purchasable, - purchased, - pending, -} +enum ProductStatus { purchasable, purchased, pending } class PurchasableProduct { final String title; @@ -11,5 +7,5 @@ class PurchasableProduct { ProductStatus status; PurchasableProduct(this.title, this.description, this.price) - : status = ProductStatus.purchasable; + : status = ProductStatus.purchasable; } diff --git a/in_app_purchases/step_03/app/lib/model/store_state.dart b/in_app_purchases/step_03/app/lib/model/store_state.dart index a4f1490b60..a299611086 100644 --- a/in_app_purchases/step_03/app/lib/model/store_state.dart +++ b/in_app_purchases/step_03/app/lib/model/store_state.dart @@ -1,5 +1 @@ -enum StoreState { - loading, - available, - notAvailable, -} +enum StoreState { loading, available, notAvailable } diff --git a/in_app_purchases/step_03/app/lib/pages/home_page.dart b/in_app_purchases/step_03/app/lib/pages/home_page.dart index 57087c5f24..83d674703b 100644 --- a/in_app_purchases/step_03/app/lib/pages/home_page.dart +++ b/in_app_purchases/step_03/app/lib/pages/home_page.dart @@ -13,10 +13,7 @@ class HomePage extends StatelessWidget { Widget build(BuildContext context) { return const Column( children: [ - Expanded( - flex: 2, - child: DashClickerWidget(), - ), + Expanded(flex: 2, child: DashClickerWidget()), Expanded(child: UpgradeList()), ], ); @@ -36,10 +33,12 @@ class DashClickerWidget extends StatelessWidget { InkWell( // Don't listen as we don't need a rebuild when the count changes onTap: Provider.of(context, listen: false).increment, - child: Image.asset(context.read().beautifiedDash - ? 'assets/dash.png' - : 'assets/dash_old.png'), - ) + child: Image.asset( + context.read().beautifiedDash + ? 'assets/dash.png' + : 'assets/dash_old.png', + ), + ), ], ), ); @@ -60,8 +59,9 @@ class CounterStateWidget extends StatelessWidget { style: DefaultTextStyle.of(context).style, children: [ TextSpan( - text: counter.countString, - style: const TextStyle(fontWeight: FontWeight.bold)), + text: counter.countString, + style: const TextStyle(fontWeight: FontWeight.bold), + ), const TextSpan(text: ' times!'), ], ), @@ -75,13 +75,15 @@ class UpgradeList extends StatelessWidget { @override Widget build(BuildContext context) { var upgrades = context.watch(); - return ListView(children: [ - _UpgradeWidget( - upgrade: upgrades.tim, - title: 'Tim Sneath', - onPressed: upgrades.addTim, - ), - ]); + return ListView( + children: [ + _UpgradeWidget( + upgrade: upgrades.tim, + title: 'Tim Sneath', + onPressed: upgrades.addTim, + ), + ], + ); } } @@ -99,24 +101,19 @@ class _UpgradeWidget extends StatelessWidget { @override Widget build(BuildContext context) { return InkWell( - onTap: onPressed, - child: ListTile( - leading: Center( - widthFactor: 1, - child: Text( - upgrade.count.toString(), - ), - ), - title: Text( - title, - style: !upgrade.purchasable - ? const TextStyle(color: Colors.redAccent) - : null, - ), - subtitle: Text('Produces ${upgrade.work} dashes per second'), - trailing: Text( - '${NumberFormat.compact().format(upgrade.cost)} dashes', - ), - )); + onTap: onPressed, + child: ListTile( + leading: Center(widthFactor: 1, child: Text(upgrade.count.toString())), + title: Text( + title, + style: + !upgrade.purchasable + ? const TextStyle(color: Colors.redAccent) + : null, + ), + subtitle: Text('Produces ${upgrade.work} dashes per second'), + trailing: Text('${NumberFormat.compact().format(upgrade.cost)} dashes'), + ), + ); } } diff --git a/in_app_purchases/step_03/app/lib/pages/login_page.dart b/in_app_purchases/step_03/app/lib/pages/login_page.dart index f0bc7dbc45..655da8b403 100644 --- a/in_app_purchases/step_03/app/lib/pages/login_page.dart +++ b/in_app_purchases/step_03/app/lib/pages/login_page.dart @@ -11,16 +11,15 @@ class LoginPage extends StatelessWidget { var firebaseNotifier = context.watch(); if (firebaseNotifier.isLoggingIn) { - return const Center( - child: Text('Logging in...'), - ); + return const Center(child: Text('Logging in...')); } return Center( - child: FilledButton( - onPressed: () { - firebaseNotifier.login(); - }, - child: const Text('Login'), - )); + child: FilledButton( + onPressed: () { + firebaseNotifier.login(); + }, + child: const Text('Login'), + ), + ); } } diff --git a/in_app_purchases/step_03/app/lib/pages/purchase_page.dart b/in_app_purchases/step_03/app/lib/pages/purchase_page.dart index 7b4c011173..5b27d88137 100644 --- a/in_app_purchases/step_03/app/lib/pages/purchase_page.dart +++ b/in_app_purchases/step_03/app/lib/pages/purchase_page.dart @@ -22,17 +22,20 @@ class PurchasePage extends StatelessWidget { case StoreState.notAvailable: storeWidget = _PurchasesNotAvailable(); } - return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - storeWidget, - const Padding( - padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), - child: Text( - 'Past purchases', - style: TextStyle(fontWeight: FontWeight.bold), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + storeWidget, + const Padding( + padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), + child: Text( + 'Past purchases', + style: TextStyle(fontWeight: FontWeight.bold), + ), ), - ), - const PastPurchasesWidget(), - ]); + const PastPurchasesWidget(), + ], + ); } } @@ -56,13 +59,17 @@ class _PurchaseList extends StatelessWidget { var purchases = context.watch(); var products = purchases.products; return Column( - children: products - .map((product) => _PurchaseWidget( - product: product, - onPressed: () { - purchases.buy(product); - })) - .toList(), + children: + products + .map( + (product) => _PurchaseWidget( + product: product, + onPressed: () { + purchases.buy(product); + }, + ), + ) + .toList(), ); } } @@ -71,10 +78,7 @@ class _PurchaseWidget extends StatelessWidget { final PurchasableProduct product; final VoidCallback onPressed; - const _PurchaseWidget({ - required this.product, - required this.onPressed, - }); + const _PurchaseWidget({required this.product, required this.onPressed}); @override Widget build(BuildContext context) { @@ -83,21 +87,20 @@ class _PurchaseWidget extends StatelessWidget { title += ' (purchased)'; } return InkWell( - onTap: onPressed, - child: ListTile( - title: Text( - title, - ), - subtitle: Text(product.description), - trailing: Text(_trailing()), - )); + onTap: onPressed, + child: ListTile( + title: Text(title), + subtitle: Text(product.description), + trailing: Text(_trailing()), + ), + ); } String _trailing() { return switch (product.status) { ProductStatus.purchasable => product.price, ProductStatus.purchased => 'purchased', - ProductStatus.pending => 'buying...' + ProductStatus.pending => 'buying...', }; } } @@ -111,10 +114,11 @@ class PastPurchasesWidget extends StatelessWidget { return ListView.separated( shrinkWrap: true, itemCount: purchases.length, - itemBuilder: (context, index) => ListTile( - title: Text(purchases[index].title), - subtitle: Text(purchases[index].status.toString()), - ), + itemBuilder: + (context, index) => ListTile( + title: Text(purchases[index].title), + subtitle: Text(purchases[index].status.toString()), + ), separatorBuilder: (context, index) => const Divider(), ); } diff --git a/in_app_purchases/step_03/app/lib/repo/iap_repo.dart b/in_app_purchases/step_03/app/lib/repo/iap_repo.dart index f238a98c39..67e3f137ba 100644 --- a/in_app_purchases/step_03/app/lib/repo/iap_repo.dart +++ b/in_app_purchases/step_03/app/lib/repo/iap_repo.dart @@ -47,19 +47,23 @@ class IAPRepo extends ChangeNotifier { hasUpgrade = false; return; } - var purchaseStream = _firestore - .collection('purchases') - .where('userId', isEqualTo: user.uid) - .snapshots(); + var purchaseStream = + _firestore + .collection('purchases') + .where('userId', isEqualTo: user.uid) + .snapshots(); _purchaseSubscription = purchaseStream.listen((snapshot) { - purchases = snapshot.docs.map((document) { - var data = document.data(); - return PastPurchase.fromJson(data); - }).toList(); + purchases = + snapshot.docs.map((document) { + var data = document.data(); + return PastPurchase.fromJson(data); + }).toList(); - hasActiveSubscription = purchases.any((element) => - element.productId == storeKeySubscription && - element.status != Status.expired); + hasActiveSubscription = purchases.any( + (element) => + element.productId == storeKeySubscription && + element.status != Status.expired, + ); hasUpgrade = purchases.any( (element) => element.productId == storeKeyUpgrade, diff --git a/in_app_purchases/step_03/app/pubspec.yaml b/in_app_purchases/step_03/app/pubspec.yaml index 518e415ab2..04baea6b35 100644 --- a/in_app_purchases/step_03/app/pubspec.yaml +++ b/in_app_purchases/step_03/app/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/in_app_purchases/step_03/dart-backend/lib/iap_repository.dart b/in_app_purchases/step_03/dart-backend/lib/iap_repository.dart index 1856f31c95..98a0d6ace6 100644 --- a/in_app_purchases/step_03/dart-backend/lib/iap_repository.dart +++ b/in_app_purchases/step_03/dart-backend/lib/iap_repository.dart @@ -2,10 +2,7 @@ import 'package:googleapis/firestore/v1.dart'; import 'products.dart'; -enum IAPSource { - googleplay, - appstore, -} +enum IAPSource { googleplay, appstore } abstract class Purchase { final IAPSource iapSource; @@ -30,8 +27,9 @@ abstract class Purchase { 'orderId': Value(stringValue: orderId), 'productId': Value(stringValue: productId), 'userId': Value(stringValue: userId), - 'purchaseDate': - Value(timestampValue: purchaseDate.toUtc().toIso8601String()), + 'purchaseDate': Value( + timestampValue: purchaseDate.toUtc().toIso8601String(), + ), 'type': Value(stringValue: type.name), }; } @@ -40,46 +38,51 @@ abstract class Purchase { static Purchase fromDocument(Document e) { final type = ProductType.values.firstWhere( - (element) => element.name == e.fields!['type']!.stringValue); + (element) => element.name == e.fields!['type']!.stringValue, + ); switch (type) { case ProductType.subscription: return SubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: SubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), - expiryDate: DateTime.tryParse( - e.fields!['expiryDate']?.timestampValue ?? '') ?? + (element) => element.name == e.fields!['status']!.stringValue, + ), + expiryDate: + DateTime.tryParse( + e.fields!['expiryDate']?.timestampValue ?? '', + ) ?? DateTime.now(), ); case ProductType.nonSubscription: return NonSubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: NonSubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), + (element) => element.name == e.fields!['status']!.stringValue, + ), ); } } } -enum NonSubscriptionStatus { - pending, - completed, - cancelled, -} +enum NonSubscriptionStatus { pending, completed, cancelled } enum SubscriptionStatus { pending, active, expired } @@ -99,17 +102,13 @@ class NonSubscriptionPurchase extends Purchase { @override Map toDocument() { final doc = super.toDocument(); - doc.addAll({ - 'status': Value(stringValue: status.name), - }); + doc.addAll({'status': Value(stringValue: status.name)}); return doc; } @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -153,9 +152,7 @@ class SubscriptionPurchase extends Purchase { @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -187,9 +184,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.toDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.toDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), ), ], ), @@ -205,9 +203,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.updateDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.updateDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), updateMask: DocumentMask(fieldPaths: ['status']), ), ], diff --git a/in_app_purchases/step_03/dart-backend/lib/products.dart b/in_app_purchases/step_03/dart-backend/lib/products.dart index d6baaeb9ca..921ffd8da9 100644 --- a/in_app_purchases/step_03/dart-backend/lib/products.dart +++ b/in_app_purchases/step_03/dart-backend/lib/products.dart @@ -5,10 +5,7 @@ class ProductData { const ProductData(this.productId, this.type); } -enum ProductType { - subscription, - nonSubscription, -} +enum ProductType { subscription, nonSubscription } const productDataMap = { 'dash_consumable_2k': ProductData( diff --git a/in_app_purchases/step_03/dart-backend/pubspec.yaml b/in_app_purchases/step_03/dart-backend/pubspec.yaml index af254ee049..68a14f2c1e 100644 --- a/in_app_purchases/step_03/dart-backend/pubspec.yaml +++ b/in_app_purchases/step_03/dart-backend/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.0.0 # repository: https://github.com/my_org/my_repo environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: app_store_server_sdk: ^1.2.9 diff --git a/in_app_purchases/step_07/app/android/.gitignore b/in_app_purchases/step_07/app/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/in_app_purchases/step_07/app/android/.gitignore +++ b/in_app_purchases/step_07/app/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/in_app_purchases/step_07/app/android/app/build.gradle b/in_app_purchases/step_07/app/android/app/build.gradle deleted file mode 100644 index 149d49474c..0000000000 --- a/in_app_purchases/step_07/app/android/app/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.dashclicker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.dashclicker" - // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/in_app_purchases/step_07/app/android/app/build.gradle.kts b/in_app_purchases/step_07/app/android/app/build.gradle.kts new file mode 100644 index 0000000000..f9fb424ffc --- /dev/null +++ b/in_app_purchases/step_07/app/android/app/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.dashclicker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.dashclicker" + // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/in_app_purchases/step_07/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt b/in_app_purchases/step_07/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt index 2879c0343b..c136c711c8 100644 --- a/in_app_purchases/step_07/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt +++ b/in_app_purchases/step_07/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.dashclicker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/in_app_purchases/step_07/app/android/build.gradle b/in_app_purchases/step_07/app/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/in_app_purchases/step_07/app/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/in_app_purchases/step_07/app/android/build.gradle.kts b/in_app_purchases/step_07/app/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/in_app_purchases/step_07/app/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/in_app_purchases/step_07/app/android/gradle.properties b/in_app_purchases/step_07/app/android/gradle.properties index 2597170821..f018a61817 100644 --- a/in_app_purchases/step_07/app/android/gradle.properties +++ b/in_app_purchases/step_07/app/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/in_app_purchases/step_07/app/android/gradle/wrapper/gradle-wrapper.properties b/in_app_purchases/step_07/app/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/in_app_purchases/step_07/app/android/gradle/wrapper/gradle-wrapper.properties +++ b/in_app_purchases/step_07/app/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/in_app_purchases/step_07/app/android/settings.gradle b/in_app_purchases/step_07/app/android/settings.gradle deleted file mode 100644 index a42444ded0..0000000000 --- a/in_app_purchases/step_07/app/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.2.1" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/in_app_purchases/step_07/app/android/settings.gradle.kts b/in_app_purchases/step_07/app/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/in_app_purchases/step_07/app/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/in_app_purchases/step_07/app/ios/Podfile b/in_app_purchases/step_07/app/ios/Podfile index 0a27aa76d9..263294aa35 100644 --- a/in_app_purchases/step_07/app/ios/Podfile +++ b/in_app_purchases/step_07/app/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/in_app_purchases/step_07/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/in_app_purchases/step_07/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/in_app_purchases/step_07/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/in_app_purchases/step_07/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/in_app_purchases/step_07/app/lib/logic/dash_upgrades.dart b/in_app_purchases/step_07/app/lib/logic/dash_upgrades.dart index 826aec517a..f6201177f5 100644 --- a/in_app_purchases/step_07/app/lib/logic/dash_upgrades.dart +++ b/in_app_purchases/step_07/app/lib/logic/dash_upgrades.dart @@ -37,9 +37,7 @@ class DashUpgrades extends ChangeNotifier { _buy(tim); } - void _buy( - Upgrade upgrade, - ) { + void _buy(Upgrade upgrade) { if (counter.count < upgrade.cost) return; counter.addAutoIncrement( diff --git a/in_app_purchases/step_07/app/lib/main.dart b/in_app_purchases/step_07/app/lib/main.dart index c498369ea6..3f5f298388 100644 --- a/in_app_purchases/step_07/app/lib/main.dart +++ b/in_app_purchases/step_07/app/lib/main.dart @@ -65,39 +65,31 @@ class _MyHomePageState extends State { return MultiProvider( providers: [ ChangeNotifierProvider( - create: (_) => FirebaseNotifier()), + create: (_) => FirebaseNotifier(), + ), ChangeNotifierProvider(create: (_) => DashCounter()), ChangeNotifierProvider( - create: (context) => DashUpgrades( - context.read(), - context.read(), - ), + create: + (context) => DashUpgrades( + context.read(), + context.read(), + ), ), ChangeNotifierProvider( create: (context) => IAPRepo(context.read()), ), ChangeNotifierProvider( - create: (context) => DashPurchases( - context.read(), - ), + create: (context) => DashPurchases(context.read()), lazy: false, ), ], child: Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: _widgetOptions[_selectedIndex], bottomNavigationBar: BottomNavigationBar( items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon(Icons.shop), - label: 'Purchase', - ), + BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'), + BottomNavigationBarItem(icon: Icon(Icons.shop), label: 'Purchase'), ], currentIndex: _selectedIndex, selectedItemColor: Colors.amber[800], diff --git a/in_app_purchases/step_07/app/lib/model/firebase_state.dart b/in_app_purchases/step_07/app/lib/model/firebase_state.dart index 1a04db5438..9fc7102e99 100644 --- a/in_app_purchases/step_07/app/lib/model/firebase_state.dart +++ b/in_app_purchases/step_07/app/lib/model/firebase_state.dart @@ -1,5 +1 @@ -enum FirebaseState { - loading, - available, - notAvailable, -} +enum FirebaseState { loading, available, notAvailable } diff --git a/in_app_purchases/step_07/app/lib/model/past_purchase.dart b/in_app_purchases/step_07/app/lib/model/past_purchase.dart index 42f412481d..63142b1be7 100644 --- a/in_app_purchases/step_07/app/lib/model/past_purchase.dart +++ b/in_app_purchases/step_07/app/lib/model/past_purchase.dart @@ -2,22 +2,11 @@ import 'package:flutter/widgets.dart'; import '../constants.dart'; -enum PurchaseType { - subscriptionPurchase, - nonSubscriptionPurchase, -} +enum PurchaseType { subscriptionPurchase, nonSubscriptionPurchase } -enum Store { - googlePlay, - appStore, -} +enum Store { googlePlay, appStore } -enum Status { - pending, - completed, - active, - expired, -} +enum Status { pending, completed, active, expired } @immutable class PastPurchase { @@ -33,25 +22,25 @@ class PastPurchase { return switch (productId) { storeKeyConsumable => 'Consumable', storeKeySubscription => 'Subscription', - _ => productId + _ => productId, }; } PastPurchase.fromJson(Map json) - : type = _typeFromString(json['type'] as String), - store = _storeFromString(json['iapSource'] as String), - orderId = json['orderId'] as String, - productId = json['productId'] as String, - purchaseDate = DateTime.now(), - expiryDate = null, - status = _statusFromString(json['status'] as String); + : type = _typeFromString(json['type'] as String), + store = _storeFromString(json['iapSource'] as String), + orderId = json['orderId'] as String, + productId = json['productId'] as String, + purchaseDate = DateTime.now(), + expiryDate = null, + status = _statusFromString(json['status'] as String); } PurchaseType _typeFromString(String type) { return switch (type) { 'nonSubscription' => PurchaseType.subscriptionPurchase, 'subscription' => PurchaseType.nonSubscriptionPurchase, - _ => throw ArgumentError.value(type, '$type is not a supported type') + _ => throw ArgumentError.value(type, '$type is not a supported type'), }; } @@ -59,7 +48,7 @@ Store _storeFromString(String store) { return switch (store) { 'googleplay' => Store.googlePlay, 'appstore' => Store.appStore, - _ => throw ArgumentError.value(store, '$store is not a supported store') + _ => throw ArgumentError.value(store, '$store is not a supported store'), }; } @@ -69,6 +58,6 @@ Status _statusFromString(String status) { 'completed' => Status.completed, 'active' => Status.active, 'expired' => Status.expired, - _ => throw ArgumentError.value(status, '$status is not a supported status') + _ => throw ArgumentError.value(status, '$status is not a supported status'), }; } diff --git a/in_app_purchases/step_07/app/lib/model/purchasable_product.dart b/in_app_purchases/step_07/app/lib/model/purchasable_product.dart index 873e488056..46f1aaa0c6 100644 --- a/in_app_purchases/step_07/app/lib/model/purchasable_product.dart +++ b/in_app_purchases/step_07/app/lib/model/purchasable_product.dart @@ -1,8 +1,4 @@ -enum ProductStatus { - purchasable, - purchased, - pending, -} +enum ProductStatus { purchasable, purchased, pending } class PurchasableProduct { final String title; @@ -11,5 +7,5 @@ class PurchasableProduct { ProductStatus status; PurchasableProduct(this.title, this.description, this.price) - : status = ProductStatus.purchasable; + : status = ProductStatus.purchasable; } diff --git a/in_app_purchases/step_07/app/lib/model/store_state.dart b/in_app_purchases/step_07/app/lib/model/store_state.dart index a4f1490b60..a299611086 100644 --- a/in_app_purchases/step_07/app/lib/model/store_state.dart +++ b/in_app_purchases/step_07/app/lib/model/store_state.dart @@ -1,5 +1 @@ -enum StoreState { - loading, - available, - notAvailable, -} +enum StoreState { loading, available, notAvailable } diff --git a/in_app_purchases/step_07/app/lib/pages/home_page.dart b/in_app_purchases/step_07/app/lib/pages/home_page.dart index 57087c5f24..83d674703b 100644 --- a/in_app_purchases/step_07/app/lib/pages/home_page.dart +++ b/in_app_purchases/step_07/app/lib/pages/home_page.dart @@ -13,10 +13,7 @@ class HomePage extends StatelessWidget { Widget build(BuildContext context) { return const Column( children: [ - Expanded( - flex: 2, - child: DashClickerWidget(), - ), + Expanded(flex: 2, child: DashClickerWidget()), Expanded(child: UpgradeList()), ], ); @@ -36,10 +33,12 @@ class DashClickerWidget extends StatelessWidget { InkWell( // Don't listen as we don't need a rebuild when the count changes onTap: Provider.of(context, listen: false).increment, - child: Image.asset(context.read().beautifiedDash - ? 'assets/dash.png' - : 'assets/dash_old.png'), - ) + child: Image.asset( + context.read().beautifiedDash + ? 'assets/dash.png' + : 'assets/dash_old.png', + ), + ), ], ), ); @@ -60,8 +59,9 @@ class CounterStateWidget extends StatelessWidget { style: DefaultTextStyle.of(context).style, children: [ TextSpan( - text: counter.countString, - style: const TextStyle(fontWeight: FontWeight.bold)), + text: counter.countString, + style: const TextStyle(fontWeight: FontWeight.bold), + ), const TextSpan(text: ' times!'), ], ), @@ -75,13 +75,15 @@ class UpgradeList extends StatelessWidget { @override Widget build(BuildContext context) { var upgrades = context.watch(); - return ListView(children: [ - _UpgradeWidget( - upgrade: upgrades.tim, - title: 'Tim Sneath', - onPressed: upgrades.addTim, - ), - ]); + return ListView( + children: [ + _UpgradeWidget( + upgrade: upgrades.tim, + title: 'Tim Sneath', + onPressed: upgrades.addTim, + ), + ], + ); } } @@ -99,24 +101,19 @@ class _UpgradeWidget extends StatelessWidget { @override Widget build(BuildContext context) { return InkWell( - onTap: onPressed, - child: ListTile( - leading: Center( - widthFactor: 1, - child: Text( - upgrade.count.toString(), - ), - ), - title: Text( - title, - style: !upgrade.purchasable - ? const TextStyle(color: Colors.redAccent) - : null, - ), - subtitle: Text('Produces ${upgrade.work} dashes per second'), - trailing: Text( - '${NumberFormat.compact().format(upgrade.cost)} dashes', - ), - )); + onTap: onPressed, + child: ListTile( + leading: Center(widthFactor: 1, child: Text(upgrade.count.toString())), + title: Text( + title, + style: + !upgrade.purchasable + ? const TextStyle(color: Colors.redAccent) + : null, + ), + subtitle: Text('Produces ${upgrade.work} dashes per second'), + trailing: Text('${NumberFormat.compact().format(upgrade.cost)} dashes'), + ), + ); } } diff --git a/in_app_purchases/step_07/app/lib/pages/login_page.dart b/in_app_purchases/step_07/app/lib/pages/login_page.dart index f0bc7dbc45..655da8b403 100644 --- a/in_app_purchases/step_07/app/lib/pages/login_page.dart +++ b/in_app_purchases/step_07/app/lib/pages/login_page.dart @@ -11,16 +11,15 @@ class LoginPage extends StatelessWidget { var firebaseNotifier = context.watch(); if (firebaseNotifier.isLoggingIn) { - return const Center( - child: Text('Logging in...'), - ); + return const Center(child: Text('Logging in...')); } return Center( - child: FilledButton( - onPressed: () { - firebaseNotifier.login(); - }, - child: const Text('Login'), - )); + child: FilledButton( + onPressed: () { + firebaseNotifier.login(); + }, + child: const Text('Login'), + ), + ); } } diff --git a/in_app_purchases/step_07/app/lib/pages/purchase_page.dart b/in_app_purchases/step_07/app/lib/pages/purchase_page.dart index 7b4c011173..5b27d88137 100644 --- a/in_app_purchases/step_07/app/lib/pages/purchase_page.dart +++ b/in_app_purchases/step_07/app/lib/pages/purchase_page.dart @@ -22,17 +22,20 @@ class PurchasePage extends StatelessWidget { case StoreState.notAvailable: storeWidget = _PurchasesNotAvailable(); } - return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - storeWidget, - const Padding( - padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), - child: Text( - 'Past purchases', - style: TextStyle(fontWeight: FontWeight.bold), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + storeWidget, + const Padding( + padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), + child: Text( + 'Past purchases', + style: TextStyle(fontWeight: FontWeight.bold), + ), ), - ), - const PastPurchasesWidget(), - ]); + const PastPurchasesWidget(), + ], + ); } } @@ -56,13 +59,17 @@ class _PurchaseList extends StatelessWidget { var purchases = context.watch(); var products = purchases.products; return Column( - children: products - .map((product) => _PurchaseWidget( - product: product, - onPressed: () { - purchases.buy(product); - })) - .toList(), + children: + products + .map( + (product) => _PurchaseWidget( + product: product, + onPressed: () { + purchases.buy(product); + }, + ), + ) + .toList(), ); } } @@ -71,10 +78,7 @@ class _PurchaseWidget extends StatelessWidget { final PurchasableProduct product; final VoidCallback onPressed; - const _PurchaseWidget({ - required this.product, - required this.onPressed, - }); + const _PurchaseWidget({required this.product, required this.onPressed}); @override Widget build(BuildContext context) { @@ -83,21 +87,20 @@ class _PurchaseWidget extends StatelessWidget { title += ' (purchased)'; } return InkWell( - onTap: onPressed, - child: ListTile( - title: Text( - title, - ), - subtitle: Text(product.description), - trailing: Text(_trailing()), - )); + onTap: onPressed, + child: ListTile( + title: Text(title), + subtitle: Text(product.description), + trailing: Text(_trailing()), + ), + ); } String _trailing() { return switch (product.status) { ProductStatus.purchasable => product.price, ProductStatus.purchased => 'purchased', - ProductStatus.pending => 'buying...' + ProductStatus.pending => 'buying...', }; } } @@ -111,10 +114,11 @@ class PastPurchasesWidget extends StatelessWidget { return ListView.separated( shrinkWrap: true, itemCount: purchases.length, - itemBuilder: (context, index) => ListTile( - title: Text(purchases[index].title), - subtitle: Text(purchases[index].status.toString()), - ), + itemBuilder: + (context, index) => ListTile( + title: Text(purchases[index].title), + subtitle: Text(purchases[index].status.toString()), + ), separatorBuilder: (context, index) => const Divider(), ); } diff --git a/in_app_purchases/step_07/app/lib/repo/iap_repo.dart b/in_app_purchases/step_07/app/lib/repo/iap_repo.dart index f238a98c39..67e3f137ba 100644 --- a/in_app_purchases/step_07/app/lib/repo/iap_repo.dart +++ b/in_app_purchases/step_07/app/lib/repo/iap_repo.dart @@ -47,19 +47,23 @@ class IAPRepo extends ChangeNotifier { hasUpgrade = false; return; } - var purchaseStream = _firestore - .collection('purchases') - .where('userId', isEqualTo: user.uid) - .snapshots(); + var purchaseStream = + _firestore + .collection('purchases') + .where('userId', isEqualTo: user.uid) + .snapshots(); _purchaseSubscription = purchaseStream.listen((snapshot) { - purchases = snapshot.docs.map((document) { - var data = document.data(); - return PastPurchase.fromJson(data); - }).toList(); + purchases = + snapshot.docs.map((document) { + var data = document.data(); + return PastPurchase.fromJson(data); + }).toList(); - hasActiveSubscription = purchases.any((element) => - element.productId == storeKeySubscription && - element.status != Status.expired); + hasActiveSubscription = purchases.any( + (element) => + element.productId == storeKeySubscription && + element.status != Status.expired, + ); hasUpgrade = purchases.any( (element) => element.productId == storeKeyUpgrade, diff --git a/in_app_purchases/step_07/app/pubspec.yaml b/in_app_purchases/step_07/app/pubspec.yaml index 518e415ab2..04baea6b35 100644 --- a/in_app_purchases/step_07/app/pubspec.yaml +++ b/in_app_purchases/step_07/app/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/in_app_purchases/step_07/app/test/widget_test.dart b/in_app_purchases/step_07/app/test/widget_test.dart index cd48c00478..ce165ef6de 100644 --- a/in_app_purchases/step_07/app/test/widget_test.dart +++ b/in_app_purchases/step_07/app/test/widget_test.dart @@ -13,8 +13,10 @@ void main() { class TestIAPConnection implements InAppPurchase { @override - Future buyConsumable( - {required PurchaseParam purchaseParam, bool autoConsume = true}) { + Future buyConsumable({ + required PurchaseParam purchaseParam, + bool autoConsume = true, + }) { return Future.value(false); } @@ -35,10 +37,9 @@ class TestIAPConnection implements InAppPurchase { @override Future queryProductDetails(Set identifiers) { - return Future.value(ProductDetailsResponse( - productDetails: [], - notFoundIDs: [], - )); + return Future.value( + ProductDetailsResponse(productDetails: [], notFoundIDs: []), + ); } @override diff --git a/in_app_purchases/step_07/dart-backend/lib/iap_repository.dart b/in_app_purchases/step_07/dart-backend/lib/iap_repository.dart index 1856f31c95..98a0d6ace6 100644 --- a/in_app_purchases/step_07/dart-backend/lib/iap_repository.dart +++ b/in_app_purchases/step_07/dart-backend/lib/iap_repository.dart @@ -2,10 +2,7 @@ import 'package:googleapis/firestore/v1.dart'; import 'products.dart'; -enum IAPSource { - googleplay, - appstore, -} +enum IAPSource { googleplay, appstore } abstract class Purchase { final IAPSource iapSource; @@ -30,8 +27,9 @@ abstract class Purchase { 'orderId': Value(stringValue: orderId), 'productId': Value(stringValue: productId), 'userId': Value(stringValue: userId), - 'purchaseDate': - Value(timestampValue: purchaseDate.toUtc().toIso8601String()), + 'purchaseDate': Value( + timestampValue: purchaseDate.toUtc().toIso8601String(), + ), 'type': Value(stringValue: type.name), }; } @@ -40,46 +38,51 @@ abstract class Purchase { static Purchase fromDocument(Document e) { final type = ProductType.values.firstWhere( - (element) => element.name == e.fields!['type']!.stringValue); + (element) => element.name == e.fields!['type']!.stringValue, + ); switch (type) { case ProductType.subscription: return SubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: SubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), - expiryDate: DateTime.tryParse( - e.fields!['expiryDate']?.timestampValue ?? '') ?? + (element) => element.name == e.fields!['status']!.stringValue, + ), + expiryDate: + DateTime.tryParse( + e.fields!['expiryDate']?.timestampValue ?? '', + ) ?? DateTime.now(), ); case ProductType.nonSubscription: return NonSubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: NonSubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), + (element) => element.name == e.fields!['status']!.stringValue, + ), ); } } } -enum NonSubscriptionStatus { - pending, - completed, - cancelled, -} +enum NonSubscriptionStatus { pending, completed, cancelled } enum SubscriptionStatus { pending, active, expired } @@ -99,17 +102,13 @@ class NonSubscriptionPurchase extends Purchase { @override Map toDocument() { final doc = super.toDocument(); - doc.addAll({ - 'status': Value(stringValue: status.name), - }); + doc.addAll({'status': Value(stringValue: status.name)}); return doc; } @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -153,9 +152,7 @@ class SubscriptionPurchase extends Purchase { @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -187,9 +184,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.toDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.toDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), ), ], ), @@ -205,9 +203,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.updateDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.updateDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), updateMask: DocumentMask(fieldPaths: ['status']), ), ], diff --git a/in_app_purchases/step_07/dart-backend/lib/products.dart b/in_app_purchases/step_07/dart-backend/lib/products.dart index d6baaeb9ca..921ffd8da9 100644 --- a/in_app_purchases/step_07/dart-backend/lib/products.dart +++ b/in_app_purchases/step_07/dart-backend/lib/products.dart @@ -5,10 +5,7 @@ class ProductData { const ProductData(this.productId, this.type); } -enum ProductType { - subscription, - nonSubscription, -} +enum ProductType { subscription, nonSubscription } const productDataMap = { 'dash_consumable_2k': ProductData( diff --git a/in_app_purchases/step_07/dart-backend/pubspec.yaml b/in_app_purchases/step_07/dart-backend/pubspec.yaml index af254ee049..68a14f2c1e 100644 --- a/in_app_purchases/step_07/dart-backend/pubspec.yaml +++ b/in_app_purchases/step_07/dart-backend/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.0.0 # repository: https://github.com/my_org/my_repo environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: app_store_server_sdk: ^1.2.9 diff --git a/in_app_purchases/step_08/app/android/.gitignore b/in_app_purchases/step_08/app/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/in_app_purchases/step_08/app/android/.gitignore +++ b/in_app_purchases/step_08/app/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/in_app_purchases/step_08/app/android/app/build.gradle b/in_app_purchases/step_08/app/android/app/build.gradle deleted file mode 100644 index 149d49474c..0000000000 --- a/in_app_purchases/step_08/app/android/app/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.dashclicker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.dashclicker" - // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/in_app_purchases/step_08/app/android/app/build.gradle.kts b/in_app_purchases/step_08/app/android/app/build.gradle.kts new file mode 100644 index 0000000000..f9fb424ffc --- /dev/null +++ b/in_app_purchases/step_08/app/android/app/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.dashclicker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.dashclicker" + // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/in_app_purchases/step_08/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt b/in_app_purchases/step_08/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt index 2879c0343b..c136c711c8 100644 --- a/in_app_purchases/step_08/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt +++ b/in_app_purchases/step_08/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.dashclicker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/in_app_purchases/step_08/app/android/build.gradle b/in_app_purchases/step_08/app/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/in_app_purchases/step_08/app/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/in_app_purchases/step_08/app/android/build.gradle.kts b/in_app_purchases/step_08/app/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/in_app_purchases/step_08/app/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/in_app_purchases/step_08/app/android/gradle.properties b/in_app_purchases/step_08/app/android/gradle.properties index 2597170821..f018a61817 100644 --- a/in_app_purchases/step_08/app/android/gradle.properties +++ b/in_app_purchases/step_08/app/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/in_app_purchases/step_08/app/android/gradle/wrapper/gradle-wrapper.properties b/in_app_purchases/step_08/app/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/in_app_purchases/step_08/app/android/gradle/wrapper/gradle-wrapper.properties +++ b/in_app_purchases/step_08/app/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/in_app_purchases/step_08/app/android/settings.gradle b/in_app_purchases/step_08/app/android/settings.gradle deleted file mode 100644 index a42444ded0..0000000000 --- a/in_app_purchases/step_08/app/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.2.1" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/in_app_purchases/step_08/app/android/settings.gradle.kts b/in_app_purchases/step_08/app/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/in_app_purchases/step_08/app/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/in_app_purchases/step_08/app/ios/Podfile b/in_app_purchases/step_08/app/ios/Podfile index 0a27aa76d9..263294aa35 100644 --- a/in_app_purchases/step_08/app/ios/Podfile +++ b/in_app_purchases/step_08/app/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/in_app_purchases/step_08/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/in_app_purchases/step_08/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/in_app_purchases/step_08/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/in_app_purchases/step_08/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/in_app_purchases/step_08/app/lib/logic/dash_purchases.dart b/in_app_purchases/step_08/app/lib/logic/dash_purchases.dart index de187049ba..b114faedaf 100644 --- a/in_app_purchases/step_08/app/lib/logic/dash_purchases.dart +++ b/in_app_purchases/step_08/app/lib/logic/dash_purchases.dart @@ -66,12 +66,15 @@ class DashPurchases extends ChangeNotifier { await iapConnection.buyNonConsumable(purchaseParam: purchaseParam); default: throw ArgumentError.value( - product.productDetails, '${product.id} is not a known product'); + product.productDetails, + '${product.id} is not a known product', + ); } } Future _onPurchaseUpdate( - List purchaseDetailsList) async { + List purchaseDetailsList, + ) async { for (var purchaseDetails in purchaseDetailsList) { await _handlePurchase(purchaseDetails); } diff --git a/in_app_purchases/step_08/app/lib/logic/dash_upgrades.dart b/in_app_purchases/step_08/app/lib/logic/dash_upgrades.dart index 826aec517a..f6201177f5 100644 --- a/in_app_purchases/step_08/app/lib/logic/dash_upgrades.dart +++ b/in_app_purchases/step_08/app/lib/logic/dash_upgrades.dart @@ -37,9 +37,7 @@ class DashUpgrades extends ChangeNotifier { _buy(tim); } - void _buy( - Upgrade upgrade, - ) { + void _buy(Upgrade upgrade) { if (counter.count < upgrade.cost) return; counter.addAutoIncrement( diff --git a/in_app_purchases/step_08/app/lib/main.dart b/in_app_purchases/step_08/app/lib/main.dart index c498369ea6..3f5f298388 100644 --- a/in_app_purchases/step_08/app/lib/main.dart +++ b/in_app_purchases/step_08/app/lib/main.dart @@ -65,39 +65,31 @@ class _MyHomePageState extends State { return MultiProvider( providers: [ ChangeNotifierProvider( - create: (_) => FirebaseNotifier()), + create: (_) => FirebaseNotifier(), + ), ChangeNotifierProvider(create: (_) => DashCounter()), ChangeNotifierProvider( - create: (context) => DashUpgrades( - context.read(), - context.read(), - ), + create: + (context) => DashUpgrades( + context.read(), + context.read(), + ), ), ChangeNotifierProvider( create: (context) => IAPRepo(context.read()), ), ChangeNotifierProvider( - create: (context) => DashPurchases( - context.read(), - ), + create: (context) => DashPurchases(context.read()), lazy: false, ), ], child: Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: _widgetOptions[_selectedIndex], bottomNavigationBar: BottomNavigationBar( items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon(Icons.shop), - label: 'Purchase', - ), + BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'), + BottomNavigationBarItem(icon: Icon(Icons.shop), label: 'Purchase'), ], currentIndex: _selectedIndex, selectedItemColor: Colors.amber[800], diff --git a/in_app_purchases/step_08/app/lib/model/firebase_state.dart b/in_app_purchases/step_08/app/lib/model/firebase_state.dart index 1a04db5438..9fc7102e99 100644 --- a/in_app_purchases/step_08/app/lib/model/firebase_state.dart +++ b/in_app_purchases/step_08/app/lib/model/firebase_state.dart @@ -1,5 +1 @@ -enum FirebaseState { - loading, - available, - notAvailable, -} +enum FirebaseState { loading, available, notAvailable } diff --git a/in_app_purchases/step_08/app/lib/model/past_purchase.dart b/in_app_purchases/step_08/app/lib/model/past_purchase.dart index 42f412481d..63142b1be7 100644 --- a/in_app_purchases/step_08/app/lib/model/past_purchase.dart +++ b/in_app_purchases/step_08/app/lib/model/past_purchase.dart @@ -2,22 +2,11 @@ import 'package:flutter/widgets.dart'; import '../constants.dart'; -enum PurchaseType { - subscriptionPurchase, - nonSubscriptionPurchase, -} +enum PurchaseType { subscriptionPurchase, nonSubscriptionPurchase } -enum Store { - googlePlay, - appStore, -} +enum Store { googlePlay, appStore } -enum Status { - pending, - completed, - active, - expired, -} +enum Status { pending, completed, active, expired } @immutable class PastPurchase { @@ -33,25 +22,25 @@ class PastPurchase { return switch (productId) { storeKeyConsumable => 'Consumable', storeKeySubscription => 'Subscription', - _ => productId + _ => productId, }; } PastPurchase.fromJson(Map json) - : type = _typeFromString(json['type'] as String), - store = _storeFromString(json['iapSource'] as String), - orderId = json['orderId'] as String, - productId = json['productId'] as String, - purchaseDate = DateTime.now(), - expiryDate = null, - status = _statusFromString(json['status'] as String); + : type = _typeFromString(json['type'] as String), + store = _storeFromString(json['iapSource'] as String), + orderId = json['orderId'] as String, + productId = json['productId'] as String, + purchaseDate = DateTime.now(), + expiryDate = null, + status = _statusFromString(json['status'] as String); } PurchaseType _typeFromString(String type) { return switch (type) { 'nonSubscription' => PurchaseType.subscriptionPurchase, 'subscription' => PurchaseType.nonSubscriptionPurchase, - _ => throw ArgumentError.value(type, '$type is not a supported type') + _ => throw ArgumentError.value(type, '$type is not a supported type'), }; } @@ -59,7 +48,7 @@ Store _storeFromString(String store) { return switch (store) { 'googleplay' => Store.googlePlay, 'appstore' => Store.appStore, - _ => throw ArgumentError.value(store, '$store is not a supported store') + _ => throw ArgumentError.value(store, '$store is not a supported store'), }; } @@ -69,6 +58,6 @@ Status _statusFromString(String status) { 'completed' => Status.completed, 'active' => Status.active, 'expired' => Status.expired, - _ => throw ArgumentError.value(status, '$status is not a supported status') + _ => throw ArgumentError.value(status, '$status is not a supported status'), }; } diff --git a/in_app_purchases/step_08/app/lib/model/purchasable_product.dart b/in_app_purchases/step_08/app/lib/model/purchasable_product.dart index 9abe078e52..e2b8b81970 100644 --- a/in_app_purchases/step_08/app/lib/model/purchasable_product.dart +++ b/in_app_purchases/step_08/app/lib/model/purchasable_product.dart @@ -1,10 +1,6 @@ import 'package:in_app_purchase/in_app_purchase.dart'; -enum ProductStatus { - purchasable, - purchased, - pending, -} +enum ProductStatus { purchasable, purchased, pending } class PurchasableProduct { String get id => productDetails.id; diff --git a/in_app_purchases/step_08/app/lib/model/store_state.dart b/in_app_purchases/step_08/app/lib/model/store_state.dart index a4f1490b60..a299611086 100644 --- a/in_app_purchases/step_08/app/lib/model/store_state.dart +++ b/in_app_purchases/step_08/app/lib/model/store_state.dart @@ -1,5 +1 @@ -enum StoreState { - loading, - available, - notAvailable, -} +enum StoreState { loading, available, notAvailable } diff --git a/in_app_purchases/step_08/app/lib/pages/home_page.dart b/in_app_purchases/step_08/app/lib/pages/home_page.dart index 57087c5f24..83d674703b 100644 --- a/in_app_purchases/step_08/app/lib/pages/home_page.dart +++ b/in_app_purchases/step_08/app/lib/pages/home_page.dart @@ -13,10 +13,7 @@ class HomePage extends StatelessWidget { Widget build(BuildContext context) { return const Column( children: [ - Expanded( - flex: 2, - child: DashClickerWidget(), - ), + Expanded(flex: 2, child: DashClickerWidget()), Expanded(child: UpgradeList()), ], ); @@ -36,10 +33,12 @@ class DashClickerWidget extends StatelessWidget { InkWell( // Don't listen as we don't need a rebuild when the count changes onTap: Provider.of(context, listen: false).increment, - child: Image.asset(context.read().beautifiedDash - ? 'assets/dash.png' - : 'assets/dash_old.png'), - ) + child: Image.asset( + context.read().beautifiedDash + ? 'assets/dash.png' + : 'assets/dash_old.png', + ), + ), ], ), ); @@ -60,8 +59,9 @@ class CounterStateWidget extends StatelessWidget { style: DefaultTextStyle.of(context).style, children: [ TextSpan( - text: counter.countString, - style: const TextStyle(fontWeight: FontWeight.bold)), + text: counter.countString, + style: const TextStyle(fontWeight: FontWeight.bold), + ), const TextSpan(text: ' times!'), ], ), @@ -75,13 +75,15 @@ class UpgradeList extends StatelessWidget { @override Widget build(BuildContext context) { var upgrades = context.watch(); - return ListView(children: [ - _UpgradeWidget( - upgrade: upgrades.tim, - title: 'Tim Sneath', - onPressed: upgrades.addTim, - ), - ]); + return ListView( + children: [ + _UpgradeWidget( + upgrade: upgrades.tim, + title: 'Tim Sneath', + onPressed: upgrades.addTim, + ), + ], + ); } } @@ -99,24 +101,19 @@ class _UpgradeWidget extends StatelessWidget { @override Widget build(BuildContext context) { return InkWell( - onTap: onPressed, - child: ListTile( - leading: Center( - widthFactor: 1, - child: Text( - upgrade.count.toString(), - ), - ), - title: Text( - title, - style: !upgrade.purchasable - ? const TextStyle(color: Colors.redAccent) - : null, - ), - subtitle: Text('Produces ${upgrade.work} dashes per second'), - trailing: Text( - '${NumberFormat.compact().format(upgrade.cost)} dashes', - ), - )); + onTap: onPressed, + child: ListTile( + leading: Center(widthFactor: 1, child: Text(upgrade.count.toString())), + title: Text( + title, + style: + !upgrade.purchasable + ? const TextStyle(color: Colors.redAccent) + : null, + ), + subtitle: Text('Produces ${upgrade.work} dashes per second'), + trailing: Text('${NumberFormat.compact().format(upgrade.cost)} dashes'), + ), + ); } } diff --git a/in_app_purchases/step_08/app/lib/pages/login_page.dart b/in_app_purchases/step_08/app/lib/pages/login_page.dart index f0bc7dbc45..655da8b403 100644 --- a/in_app_purchases/step_08/app/lib/pages/login_page.dart +++ b/in_app_purchases/step_08/app/lib/pages/login_page.dart @@ -11,16 +11,15 @@ class LoginPage extends StatelessWidget { var firebaseNotifier = context.watch(); if (firebaseNotifier.isLoggingIn) { - return const Center( - child: Text('Logging in...'), - ); + return const Center(child: Text('Logging in...')); } return Center( - child: FilledButton( - onPressed: () { - firebaseNotifier.login(); - }, - child: const Text('Login'), - )); + child: FilledButton( + onPressed: () { + firebaseNotifier.login(); + }, + child: const Text('Login'), + ), + ); } } diff --git a/in_app_purchases/step_08/app/lib/pages/purchase_page.dart b/in_app_purchases/step_08/app/lib/pages/purchase_page.dart index 7b4c011173..5b27d88137 100644 --- a/in_app_purchases/step_08/app/lib/pages/purchase_page.dart +++ b/in_app_purchases/step_08/app/lib/pages/purchase_page.dart @@ -22,17 +22,20 @@ class PurchasePage extends StatelessWidget { case StoreState.notAvailable: storeWidget = _PurchasesNotAvailable(); } - return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - storeWidget, - const Padding( - padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), - child: Text( - 'Past purchases', - style: TextStyle(fontWeight: FontWeight.bold), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + storeWidget, + const Padding( + padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), + child: Text( + 'Past purchases', + style: TextStyle(fontWeight: FontWeight.bold), + ), ), - ), - const PastPurchasesWidget(), - ]); + const PastPurchasesWidget(), + ], + ); } } @@ -56,13 +59,17 @@ class _PurchaseList extends StatelessWidget { var purchases = context.watch(); var products = purchases.products; return Column( - children: products - .map((product) => _PurchaseWidget( - product: product, - onPressed: () { - purchases.buy(product); - })) - .toList(), + children: + products + .map( + (product) => _PurchaseWidget( + product: product, + onPressed: () { + purchases.buy(product); + }, + ), + ) + .toList(), ); } } @@ -71,10 +78,7 @@ class _PurchaseWidget extends StatelessWidget { final PurchasableProduct product; final VoidCallback onPressed; - const _PurchaseWidget({ - required this.product, - required this.onPressed, - }); + const _PurchaseWidget({required this.product, required this.onPressed}); @override Widget build(BuildContext context) { @@ -83,21 +87,20 @@ class _PurchaseWidget extends StatelessWidget { title += ' (purchased)'; } return InkWell( - onTap: onPressed, - child: ListTile( - title: Text( - title, - ), - subtitle: Text(product.description), - trailing: Text(_trailing()), - )); + onTap: onPressed, + child: ListTile( + title: Text(title), + subtitle: Text(product.description), + trailing: Text(_trailing()), + ), + ); } String _trailing() { return switch (product.status) { ProductStatus.purchasable => product.price, ProductStatus.purchased => 'purchased', - ProductStatus.pending => 'buying...' + ProductStatus.pending => 'buying...', }; } } @@ -111,10 +114,11 @@ class PastPurchasesWidget extends StatelessWidget { return ListView.separated( shrinkWrap: true, itemCount: purchases.length, - itemBuilder: (context, index) => ListTile( - title: Text(purchases[index].title), - subtitle: Text(purchases[index].status.toString()), - ), + itemBuilder: + (context, index) => ListTile( + title: Text(purchases[index].title), + subtitle: Text(purchases[index].status.toString()), + ), separatorBuilder: (context, index) => const Divider(), ); } diff --git a/in_app_purchases/step_08/app/lib/repo/iap_repo.dart b/in_app_purchases/step_08/app/lib/repo/iap_repo.dart index f238a98c39..67e3f137ba 100644 --- a/in_app_purchases/step_08/app/lib/repo/iap_repo.dart +++ b/in_app_purchases/step_08/app/lib/repo/iap_repo.dart @@ -47,19 +47,23 @@ class IAPRepo extends ChangeNotifier { hasUpgrade = false; return; } - var purchaseStream = _firestore - .collection('purchases') - .where('userId', isEqualTo: user.uid) - .snapshots(); + var purchaseStream = + _firestore + .collection('purchases') + .where('userId', isEqualTo: user.uid) + .snapshots(); _purchaseSubscription = purchaseStream.listen((snapshot) { - purchases = snapshot.docs.map((document) { - var data = document.data(); - return PastPurchase.fromJson(data); - }).toList(); + purchases = + snapshot.docs.map((document) { + var data = document.data(); + return PastPurchase.fromJson(data); + }).toList(); - hasActiveSubscription = purchases.any((element) => - element.productId == storeKeySubscription && - element.status != Status.expired); + hasActiveSubscription = purchases.any( + (element) => + element.productId == storeKeySubscription && + element.status != Status.expired, + ); hasUpgrade = purchases.any( (element) => element.productId == storeKeyUpgrade, diff --git a/in_app_purchases/step_08/app/pubspec.yaml b/in_app_purchases/step_08/app/pubspec.yaml index 518e415ab2..04baea6b35 100644 --- a/in_app_purchases/step_08/app/pubspec.yaml +++ b/in_app_purchases/step_08/app/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/in_app_purchases/step_08/app/test/widget_test.dart b/in_app_purchases/step_08/app/test/widget_test.dart index cd48c00478..ce165ef6de 100644 --- a/in_app_purchases/step_08/app/test/widget_test.dart +++ b/in_app_purchases/step_08/app/test/widget_test.dart @@ -13,8 +13,10 @@ void main() { class TestIAPConnection implements InAppPurchase { @override - Future buyConsumable( - {required PurchaseParam purchaseParam, bool autoConsume = true}) { + Future buyConsumable({ + required PurchaseParam purchaseParam, + bool autoConsume = true, + }) { return Future.value(false); } @@ -35,10 +37,9 @@ class TestIAPConnection implements InAppPurchase { @override Future queryProductDetails(Set identifiers) { - return Future.value(ProductDetailsResponse( - productDetails: [], - notFoundIDs: [], - )); + return Future.value( + ProductDetailsResponse(productDetails: [], notFoundIDs: []), + ); } @override diff --git a/in_app_purchases/step_08/dart-backend/lib/iap_repository.dart b/in_app_purchases/step_08/dart-backend/lib/iap_repository.dart index 1856f31c95..98a0d6ace6 100644 --- a/in_app_purchases/step_08/dart-backend/lib/iap_repository.dart +++ b/in_app_purchases/step_08/dart-backend/lib/iap_repository.dart @@ -2,10 +2,7 @@ import 'package:googleapis/firestore/v1.dart'; import 'products.dart'; -enum IAPSource { - googleplay, - appstore, -} +enum IAPSource { googleplay, appstore } abstract class Purchase { final IAPSource iapSource; @@ -30,8 +27,9 @@ abstract class Purchase { 'orderId': Value(stringValue: orderId), 'productId': Value(stringValue: productId), 'userId': Value(stringValue: userId), - 'purchaseDate': - Value(timestampValue: purchaseDate.toUtc().toIso8601String()), + 'purchaseDate': Value( + timestampValue: purchaseDate.toUtc().toIso8601String(), + ), 'type': Value(stringValue: type.name), }; } @@ -40,46 +38,51 @@ abstract class Purchase { static Purchase fromDocument(Document e) { final type = ProductType.values.firstWhere( - (element) => element.name == e.fields!['type']!.stringValue); + (element) => element.name == e.fields!['type']!.stringValue, + ); switch (type) { case ProductType.subscription: return SubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: SubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), - expiryDate: DateTime.tryParse( - e.fields!['expiryDate']?.timestampValue ?? '') ?? + (element) => element.name == e.fields!['status']!.stringValue, + ), + expiryDate: + DateTime.tryParse( + e.fields!['expiryDate']?.timestampValue ?? '', + ) ?? DateTime.now(), ); case ProductType.nonSubscription: return NonSubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: NonSubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), + (element) => element.name == e.fields!['status']!.stringValue, + ), ); } } } -enum NonSubscriptionStatus { - pending, - completed, - cancelled, -} +enum NonSubscriptionStatus { pending, completed, cancelled } enum SubscriptionStatus { pending, active, expired } @@ -99,17 +102,13 @@ class NonSubscriptionPurchase extends Purchase { @override Map toDocument() { final doc = super.toDocument(); - doc.addAll({ - 'status': Value(stringValue: status.name), - }); + doc.addAll({'status': Value(stringValue: status.name)}); return doc; } @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -153,9 +152,7 @@ class SubscriptionPurchase extends Purchase { @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -187,9 +184,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.toDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.toDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), ), ], ), @@ -205,9 +203,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.updateDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.updateDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), updateMask: DocumentMask(fieldPaths: ['status']), ), ], diff --git a/in_app_purchases/step_08/dart-backend/lib/products.dart b/in_app_purchases/step_08/dart-backend/lib/products.dart index d6baaeb9ca..921ffd8da9 100644 --- a/in_app_purchases/step_08/dart-backend/lib/products.dart +++ b/in_app_purchases/step_08/dart-backend/lib/products.dart @@ -5,10 +5,7 @@ class ProductData { const ProductData(this.productId, this.type); } -enum ProductType { - subscription, - nonSubscription, -} +enum ProductType { subscription, nonSubscription } const productDataMap = { 'dash_consumable_2k': ProductData( diff --git a/in_app_purchases/step_08/dart-backend/pubspec.yaml b/in_app_purchases/step_08/dart-backend/pubspec.yaml index af254ee049..68a14f2c1e 100644 --- a/in_app_purchases/step_08/dart-backend/pubspec.yaml +++ b/in_app_purchases/step_08/dart-backend/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.0.0 # repository: https://github.com/my_org/my_repo environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: app_store_server_sdk: ^1.2.9 diff --git a/in_app_purchases/step_09/app/android/.gitignore b/in_app_purchases/step_09/app/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/in_app_purchases/step_09/app/android/.gitignore +++ b/in_app_purchases/step_09/app/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/in_app_purchases/step_09/app/android/app/build.gradle b/in_app_purchases/step_09/app/android/app/build.gradle deleted file mode 100644 index 149d49474c..0000000000 --- a/in_app_purchases/step_09/app/android/app/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.dashclicker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.dashclicker" - // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/in_app_purchases/step_09/app/android/app/build.gradle.kts b/in_app_purchases/step_09/app/android/app/build.gradle.kts new file mode 100644 index 0000000000..f9fb424ffc --- /dev/null +++ b/in_app_purchases/step_09/app/android/app/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.dashclicker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.dashclicker" + // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/in_app_purchases/step_09/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt b/in_app_purchases/step_09/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt index 2879c0343b..c136c711c8 100644 --- a/in_app_purchases/step_09/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt +++ b/in_app_purchases/step_09/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.dashclicker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/in_app_purchases/step_09/app/android/build.gradle b/in_app_purchases/step_09/app/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/in_app_purchases/step_09/app/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/in_app_purchases/step_09/app/android/build.gradle.kts b/in_app_purchases/step_09/app/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/in_app_purchases/step_09/app/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/in_app_purchases/step_09/app/android/gradle.properties b/in_app_purchases/step_09/app/android/gradle.properties index 2597170821..f018a61817 100644 --- a/in_app_purchases/step_09/app/android/gradle.properties +++ b/in_app_purchases/step_09/app/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/in_app_purchases/step_09/app/android/gradle/wrapper/gradle-wrapper.properties b/in_app_purchases/step_09/app/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/in_app_purchases/step_09/app/android/gradle/wrapper/gradle-wrapper.properties +++ b/in_app_purchases/step_09/app/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/in_app_purchases/step_09/app/android/settings.gradle b/in_app_purchases/step_09/app/android/settings.gradle deleted file mode 100644 index a42444ded0..0000000000 --- a/in_app_purchases/step_09/app/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.2.1" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/in_app_purchases/step_09/app/android/settings.gradle.kts b/in_app_purchases/step_09/app/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/in_app_purchases/step_09/app/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/in_app_purchases/step_09/app/ios/Podfile b/in_app_purchases/step_09/app/ios/Podfile index 0a27aa76d9..263294aa35 100644 --- a/in_app_purchases/step_09/app/ios/Podfile +++ b/in_app_purchases/step_09/app/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/in_app_purchases/step_09/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/in_app_purchases/step_09/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/in_app_purchases/step_09/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/in_app_purchases/step_09/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/in_app_purchases/step_09/app/lib/logic/dash_purchases.dart b/in_app_purchases/step_09/app/lib/logic/dash_purchases.dart index 7803176552..d81ee593c5 100644 --- a/in_app_purchases/step_09/app/lib/logic/dash_purchases.dart +++ b/in_app_purchases/step_09/app/lib/logic/dash_purchases.dart @@ -70,12 +70,15 @@ class DashPurchases extends ChangeNotifier { await iapConnection.buyNonConsumable(purchaseParam: purchaseParam); default: throw ArgumentError.value( - product.productDetails, '${product.id} is not a known product'); + product.productDetails, + '${product.id} is not a known product', + ); } } Future _onPurchaseUpdate( - List purchaseDetailsList) async { + List purchaseDetailsList, + ) async { for (var purchaseDetails in purchaseDetailsList) { await _handlePurchase(purchaseDetails); } diff --git a/in_app_purchases/step_09/app/lib/logic/dash_upgrades.dart b/in_app_purchases/step_09/app/lib/logic/dash_upgrades.dart index 826aec517a..f6201177f5 100644 --- a/in_app_purchases/step_09/app/lib/logic/dash_upgrades.dart +++ b/in_app_purchases/step_09/app/lib/logic/dash_upgrades.dart @@ -37,9 +37,7 @@ class DashUpgrades extends ChangeNotifier { _buy(tim); } - void _buy( - Upgrade upgrade, - ) { + void _buy(Upgrade upgrade) { if (counter.count < upgrade.cost) return; counter.addAutoIncrement( diff --git a/in_app_purchases/step_09/app/lib/main.dart b/in_app_purchases/step_09/app/lib/main.dart index f156f7ee1c..9e0eadfe95 100644 --- a/in_app_purchases/step_09/app/lib/main.dart +++ b/in_app_purchases/step_09/app/lib/main.dart @@ -65,40 +65,35 @@ class _MyHomePageState extends State { return MultiProvider( providers: [ ChangeNotifierProvider( - create: (_) => FirebaseNotifier()), + create: (_) => FirebaseNotifier(), + ), ChangeNotifierProvider(create: (_) => DashCounter()), ChangeNotifierProvider( - create: (context) => DashUpgrades( - context.read(), - context.read(), - ), + create: + (context) => DashUpgrades( + context.read(), + context.read(), + ), ), ChangeNotifierProvider( create: (context) => IAPRepo(context.read()), ), ChangeNotifierProvider( - create: (context) => DashPurchases( - context.read(), - context.read(), - ), + create: + (context) => DashPurchases( + context.read(), + context.read(), + ), lazy: false, ), ], child: Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: _widgetOptions[_selectedIndex], bottomNavigationBar: BottomNavigationBar( items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon(Icons.shop), - label: 'Purchase', - ), + BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'), + BottomNavigationBarItem(icon: Icon(Icons.shop), label: 'Purchase'), ], currentIndex: _selectedIndex, selectedItemColor: Colors.amber[800], diff --git a/in_app_purchases/step_09/app/lib/model/firebase_state.dart b/in_app_purchases/step_09/app/lib/model/firebase_state.dart index 1a04db5438..9fc7102e99 100644 --- a/in_app_purchases/step_09/app/lib/model/firebase_state.dart +++ b/in_app_purchases/step_09/app/lib/model/firebase_state.dart @@ -1,5 +1 @@ -enum FirebaseState { - loading, - available, - notAvailable, -} +enum FirebaseState { loading, available, notAvailable } diff --git a/in_app_purchases/step_09/app/lib/model/past_purchase.dart b/in_app_purchases/step_09/app/lib/model/past_purchase.dart index 42f412481d..63142b1be7 100644 --- a/in_app_purchases/step_09/app/lib/model/past_purchase.dart +++ b/in_app_purchases/step_09/app/lib/model/past_purchase.dart @@ -2,22 +2,11 @@ import 'package:flutter/widgets.dart'; import '../constants.dart'; -enum PurchaseType { - subscriptionPurchase, - nonSubscriptionPurchase, -} +enum PurchaseType { subscriptionPurchase, nonSubscriptionPurchase } -enum Store { - googlePlay, - appStore, -} +enum Store { googlePlay, appStore } -enum Status { - pending, - completed, - active, - expired, -} +enum Status { pending, completed, active, expired } @immutable class PastPurchase { @@ -33,25 +22,25 @@ class PastPurchase { return switch (productId) { storeKeyConsumable => 'Consumable', storeKeySubscription => 'Subscription', - _ => productId + _ => productId, }; } PastPurchase.fromJson(Map json) - : type = _typeFromString(json['type'] as String), - store = _storeFromString(json['iapSource'] as String), - orderId = json['orderId'] as String, - productId = json['productId'] as String, - purchaseDate = DateTime.now(), - expiryDate = null, - status = _statusFromString(json['status'] as String); + : type = _typeFromString(json['type'] as String), + store = _storeFromString(json['iapSource'] as String), + orderId = json['orderId'] as String, + productId = json['productId'] as String, + purchaseDate = DateTime.now(), + expiryDate = null, + status = _statusFromString(json['status'] as String); } PurchaseType _typeFromString(String type) { return switch (type) { 'nonSubscription' => PurchaseType.subscriptionPurchase, 'subscription' => PurchaseType.nonSubscriptionPurchase, - _ => throw ArgumentError.value(type, '$type is not a supported type') + _ => throw ArgumentError.value(type, '$type is not a supported type'), }; } @@ -59,7 +48,7 @@ Store _storeFromString(String store) { return switch (store) { 'googleplay' => Store.googlePlay, 'appstore' => Store.appStore, - _ => throw ArgumentError.value(store, '$store is not a supported store') + _ => throw ArgumentError.value(store, '$store is not a supported store'), }; } @@ -69,6 +58,6 @@ Status _statusFromString(String status) { 'completed' => Status.completed, 'active' => Status.active, 'expired' => Status.expired, - _ => throw ArgumentError.value(status, '$status is not a supported status') + _ => throw ArgumentError.value(status, '$status is not a supported status'), }; } diff --git a/in_app_purchases/step_09/app/lib/model/purchasable_product.dart b/in_app_purchases/step_09/app/lib/model/purchasable_product.dart index 9abe078e52..e2b8b81970 100644 --- a/in_app_purchases/step_09/app/lib/model/purchasable_product.dart +++ b/in_app_purchases/step_09/app/lib/model/purchasable_product.dart @@ -1,10 +1,6 @@ import 'package:in_app_purchase/in_app_purchase.dart'; -enum ProductStatus { - purchasable, - purchased, - pending, -} +enum ProductStatus { purchasable, purchased, pending } class PurchasableProduct { String get id => productDetails.id; diff --git a/in_app_purchases/step_09/app/lib/model/store_state.dart b/in_app_purchases/step_09/app/lib/model/store_state.dart index a4f1490b60..a299611086 100644 --- a/in_app_purchases/step_09/app/lib/model/store_state.dart +++ b/in_app_purchases/step_09/app/lib/model/store_state.dart @@ -1,5 +1 @@ -enum StoreState { - loading, - available, - notAvailable, -} +enum StoreState { loading, available, notAvailable } diff --git a/in_app_purchases/step_09/app/lib/pages/home_page.dart b/in_app_purchases/step_09/app/lib/pages/home_page.dart index 57087c5f24..83d674703b 100644 --- a/in_app_purchases/step_09/app/lib/pages/home_page.dart +++ b/in_app_purchases/step_09/app/lib/pages/home_page.dart @@ -13,10 +13,7 @@ class HomePage extends StatelessWidget { Widget build(BuildContext context) { return const Column( children: [ - Expanded( - flex: 2, - child: DashClickerWidget(), - ), + Expanded(flex: 2, child: DashClickerWidget()), Expanded(child: UpgradeList()), ], ); @@ -36,10 +33,12 @@ class DashClickerWidget extends StatelessWidget { InkWell( // Don't listen as we don't need a rebuild when the count changes onTap: Provider.of(context, listen: false).increment, - child: Image.asset(context.read().beautifiedDash - ? 'assets/dash.png' - : 'assets/dash_old.png'), - ) + child: Image.asset( + context.read().beautifiedDash + ? 'assets/dash.png' + : 'assets/dash_old.png', + ), + ), ], ), ); @@ -60,8 +59,9 @@ class CounterStateWidget extends StatelessWidget { style: DefaultTextStyle.of(context).style, children: [ TextSpan( - text: counter.countString, - style: const TextStyle(fontWeight: FontWeight.bold)), + text: counter.countString, + style: const TextStyle(fontWeight: FontWeight.bold), + ), const TextSpan(text: ' times!'), ], ), @@ -75,13 +75,15 @@ class UpgradeList extends StatelessWidget { @override Widget build(BuildContext context) { var upgrades = context.watch(); - return ListView(children: [ - _UpgradeWidget( - upgrade: upgrades.tim, - title: 'Tim Sneath', - onPressed: upgrades.addTim, - ), - ]); + return ListView( + children: [ + _UpgradeWidget( + upgrade: upgrades.tim, + title: 'Tim Sneath', + onPressed: upgrades.addTim, + ), + ], + ); } } @@ -99,24 +101,19 @@ class _UpgradeWidget extends StatelessWidget { @override Widget build(BuildContext context) { return InkWell( - onTap: onPressed, - child: ListTile( - leading: Center( - widthFactor: 1, - child: Text( - upgrade.count.toString(), - ), - ), - title: Text( - title, - style: !upgrade.purchasable - ? const TextStyle(color: Colors.redAccent) - : null, - ), - subtitle: Text('Produces ${upgrade.work} dashes per second'), - trailing: Text( - '${NumberFormat.compact().format(upgrade.cost)} dashes', - ), - )); + onTap: onPressed, + child: ListTile( + leading: Center(widthFactor: 1, child: Text(upgrade.count.toString())), + title: Text( + title, + style: + !upgrade.purchasable + ? const TextStyle(color: Colors.redAccent) + : null, + ), + subtitle: Text('Produces ${upgrade.work} dashes per second'), + trailing: Text('${NumberFormat.compact().format(upgrade.cost)} dashes'), + ), + ); } } diff --git a/in_app_purchases/step_09/app/lib/pages/login_page.dart b/in_app_purchases/step_09/app/lib/pages/login_page.dart index f0bc7dbc45..655da8b403 100644 --- a/in_app_purchases/step_09/app/lib/pages/login_page.dart +++ b/in_app_purchases/step_09/app/lib/pages/login_page.dart @@ -11,16 +11,15 @@ class LoginPage extends StatelessWidget { var firebaseNotifier = context.watch(); if (firebaseNotifier.isLoggingIn) { - return const Center( - child: Text('Logging in...'), - ); + return const Center(child: Text('Logging in...')); } return Center( - child: FilledButton( - onPressed: () { - firebaseNotifier.login(); - }, - child: const Text('Login'), - )); + child: FilledButton( + onPressed: () { + firebaseNotifier.login(); + }, + child: const Text('Login'), + ), + ); } } diff --git a/in_app_purchases/step_09/app/lib/pages/purchase_page.dart b/in_app_purchases/step_09/app/lib/pages/purchase_page.dart index 85470b24fb..97eee25f38 100644 --- a/in_app_purchases/step_09/app/lib/pages/purchase_page.dart +++ b/in_app_purchases/step_09/app/lib/pages/purchase_page.dart @@ -36,17 +36,20 @@ class PurchasePage extends StatelessWidget { case StoreState.notAvailable: storeWidget = _PurchasesNotAvailable(); } - return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - storeWidget, - const Padding( - padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), - child: Text( - 'Past purchases', - style: TextStyle(fontWeight: FontWeight.bold), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + storeWidget, + const Padding( + padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), + child: Text( + 'Past purchases', + style: TextStyle(fontWeight: FontWeight.bold), + ), ), - ), - const PastPurchasesWidget(), - ]); + const PastPurchasesWidget(), + ], + ); } } @@ -70,13 +73,17 @@ class _PurchaseList extends StatelessWidget { var purchases = context.watch(); var products = purchases.products; return Column( - children: products - .map((product) => _PurchaseWidget( - product: product, - onPressed: () { - purchases.buy(product); - })) - .toList(), + children: + products + .map( + (product) => _PurchaseWidget( + product: product, + onPressed: () { + purchases.buy(product); + }, + ), + ) + .toList(), ); } } @@ -85,10 +92,7 @@ class _PurchaseWidget extends StatelessWidget { final PurchasableProduct product; final VoidCallback onPressed; - const _PurchaseWidget({ - required this.product, - required this.onPressed, - }); + const _PurchaseWidget({required this.product, required this.onPressed}); @override Widget build(BuildContext context) { @@ -97,21 +101,20 @@ class _PurchaseWidget extends StatelessWidget { title += ' (purchased)'; } return InkWell( - onTap: onPressed, - child: ListTile( - title: Text( - title, - ), - subtitle: Text(product.description), - trailing: Text(_trailing()), - )); + onTap: onPressed, + child: ListTile( + title: Text(title), + subtitle: Text(product.description), + trailing: Text(_trailing()), + ), + ); } String _trailing() { return switch (product.status) { ProductStatus.purchasable => product.price, ProductStatus.purchased => 'purchased', - ProductStatus.pending => 'buying...' + ProductStatus.pending => 'buying...', }; } } @@ -125,10 +128,11 @@ class PastPurchasesWidget extends StatelessWidget { return ListView.separated( shrinkWrap: true, itemCount: purchases.length, - itemBuilder: (context, index) => ListTile( - title: Text(purchases[index].title), - subtitle: Text(purchases[index].status.toString()), - ), + itemBuilder: + (context, index) => ListTile( + title: Text(purchases[index].title), + subtitle: Text(purchases[index].status.toString()), + ), separatorBuilder: (context, index) => const Divider(), ); } diff --git a/in_app_purchases/step_09/app/lib/repo/iap_repo.dart b/in_app_purchases/step_09/app/lib/repo/iap_repo.dart index f238a98c39..67e3f137ba 100644 --- a/in_app_purchases/step_09/app/lib/repo/iap_repo.dart +++ b/in_app_purchases/step_09/app/lib/repo/iap_repo.dart @@ -47,19 +47,23 @@ class IAPRepo extends ChangeNotifier { hasUpgrade = false; return; } - var purchaseStream = _firestore - .collection('purchases') - .where('userId', isEqualTo: user.uid) - .snapshots(); + var purchaseStream = + _firestore + .collection('purchases') + .where('userId', isEqualTo: user.uid) + .snapshots(); _purchaseSubscription = purchaseStream.listen((snapshot) { - purchases = snapshot.docs.map((document) { - var data = document.data(); - return PastPurchase.fromJson(data); - }).toList(); + purchases = + snapshot.docs.map((document) { + var data = document.data(); + return PastPurchase.fromJson(data); + }).toList(); - hasActiveSubscription = purchases.any((element) => - element.productId == storeKeySubscription && - element.status != Status.expired); + hasActiveSubscription = purchases.any( + (element) => + element.productId == storeKeySubscription && + element.status != Status.expired, + ); hasUpgrade = purchases.any( (element) => element.productId == storeKeyUpgrade, diff --git a/in_app_purchases/step_09/app/pubspec.yaml b/in_app_purchases/step_09/app/pubspec.yaml index 518e415ab2..04baea6b35 100644 --- a/in_app_purchases/step_09/app/pubspec.yaml +++ b/in_app_purchases/step_09/app/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/in_app_purchases/step_09/app/test/widget_test.dart b/in_app_purchases/step_09/app/test/widget_test.dart index cd48c00478..ce165ef6de 100644 --- a/in_app_purchases/step_09/app/test/widget_test.dart +++ b/in_app_purchases/step_09/app/test/widget_test.dart @@ -13,8 +13,10 @@ void main() { class TestIAPConnection implements InAppPurchase { @override - Future buyConsumable( - {required PurchaseParam purchaseParam, bool autoConsume = true}) { + Future buyConsumable({ + required PurchaseParam purchaseParam, + bool autoConsume = true, + }) { return Future.value(false); } @@ -35,10 +37,9 @@ class TestIAPConnection implements InAppPurchase { @override Future queryProductDetails(Set identifiers) { - return Future.value(ProductDetailsResponse( - productDetails: [], - notFoundIDs: [], - )); + return Future.value( + ProductDetailsResponse(productDetails: [], notFoundIDs: []), + ); } @override diff --git a/in_app_purchases/step_09/dart-backend/bin/server.dart b/in_app_purchases/step_09/dart-backend/bin/server.dart index 520e6f8ac5..69736a1abd 100644 --- a/in_app_purchases/step_09/dart-backend/bin/server.dart +++ b/in_app_purchases/step_09/dart-backend/bin/server.dart @@ -23,36 +23,33 @@ Future> _createPurchaseHandlers() async { // Configure Android Publisher API access final serviceAccountGooglePlay = File('assets/service-account-google-play.json').readAsStringSync(); - final clientCredentialsGooglePlay = - auth.ServiceAccountCredentials.fromJson(serviceAccountGooglePlay); - final clientGooglePlay = - await auth.clientViaServiceAccount(clientCredentialsGooglePlay, [ - ap.AndroidPublisherApi.androidpublisherScope, - ]); + final clientCredentialsGooglePlay = auth.ServiceAccountCredentials.fromJson( + serviceAccountGooglePlay, + ); + final clientGooglePlay = await auth.clientViaServiceAccount( + clientCredentialsGooglePlay, + [ap.AndroidPublisherApi.androidpublisherScope], + ); final androidPublisher = ap.AndroidPublisherApi(clientGooglePlay); // Configure Firestore API access final serviceAccountFirebase = File('assets/service-account-firebase.json').readAsStringSync(); - final clientCredentialsFirebase = - auth.ServiceAccountCredentials.fromJson(serviceAccountFirebase); - final clientFirebase = - await auth.clientViaServiceAccount(clientCredentialsFirebase, [ - fs.FirestoreApi.cloudPlatformScope, - ]); + final clientCredentialsFirebase = auth.ServiceAccountCredentials.fromJson( + serviceAccountFirebase, + ); + final clientFirebase = await auth.clientViaServiceAccount( + clientCredentialsFirebase, + [fs.FirestoreApi.cloudPlatformScope], + ); final firestoreApi = fs.FirestoreApi(clientFirebase); final dynamic json = jsonDecode(serviceAccountFirebase); final projectId = json['project_id'] as String; final iapRepository = IapRepository(firestoreApi, projectId); return { - 'google_play': GooglePlayPurchaseHandler( - androidPublisher, - iapRepository, - ), - 'app_store': AppStorePurchaseHandler( - iapRepository, - ), + 'google_play': GooglePlayPurchaseHandler(androidPublisher, iapRepository), + 'app_store': AppStorePurchaseHandler(iapRepository), }; } @@ -95,19 +92,14 @@ Future main() async { await serveHandler(router.call); } -({ - String userId, - String source, - ProductData productData, - String token, -}) getPurchaseData(dynamic payload) { - if (payload - case { - 'userId': String userId, - 'source': String source, - 'productId': String productId, - 'verificationData': String token, - }) { +({String userId, String source, ProductData productData, String token}) +getPurchaseData(dynamic payload) { + if (payload case { + 'userId': String userId, + 'source': String source, + 'productId': String productId, + 'verificationData': String token, + }) { return ( userId: userId, source: source, diff --git a/in_app_purchases/step_09/dart-backend/lib/app_store_purchase_handler.dart b/in_app_purchases/step_09/dart-backend/lib/app_store_purchase_handler.dart index 6b06decbb3..b69abc17c2 100644 --- a/in_app_purchases/step_09/dart-backend/lib/app_store_purchase_handler.dart +++ b/in_app_purchases/step_09/dart-backend/lib/app_store_purchase_handler.dart @@ -10,15 +10,10 @@ import 'purchase_handler.dart'; class AppStorePurchaseHandler extends PurchaseHandler { final IapRepository iapRepository; - AppStorePurchaseHandler( - this.iapRepository, - ); + AppStorePurchaseHandler(this.iapRepository); final _iTunesAPI = ITunesApi( - ITunesHttpClient( - ITunesEnvironment.sandbox(), - loggingEnabled: true, - ), + ITunesHttpClient(ITunesEnvironment.sandbox(), loggingEnabled: true), ); @override @@ -61,30 +56,37 @@ class AppStorePurchaseHandler extends PurchaseHandler { } switch (product.type) { case ProductType.nonSubscription: - await iapRepository.createOrUpdatePurchase(NonSubscriptionPurchase( - userId: userId, - productId: receipt.productId ?? '', - iapSource: IAPSource.appstore, - orderId: receipt.originalTransactionId ?? '', - purchaseDate: DateTime.fromMillisecondsSinceEpoch( - int.parse(receipt.originalPurchaseDateMs ?? '0')), - type: product.type, - status: NonSubscriptionStatus.completed, - )); + await iapRepository.createOrUpdatePurchase( + NonSubscriptionPurchase( + userId: userId, + productId: receipt.productId ?? '', + iapSource: IAPSource.appstore, + orderId: receipt.originalTransactionId ?? '', + purchaseDate: DateTime.fromMillisecondsSinceEpoch( + int.parse(receipt.originalPurchaseDateMs ?? '0'), + ), + type: product.type, + status: NonSubscriptionStatus.completed, + ), + ); break; case ProductType.subscription: - await iapRepository.createOrUpdatePurchase(SubscriptionPurchase( - userId: userId, - productId: receipt.productId ?? '', - iapSource: IAPSource.appstore, - orderId: receipt.originalTransactionId ?? '', - purchaseDate: DateTime.fromMillisecondsSinceEpoch( - int.parse(receipt.originalPurchaseDateMs ?? '0')), - type: product.type, - expiryDate: DateTime.fromMillisecondsSinceEpoch( - int.parse(receipt.expiresDateMs ?? '0')), - status: SubscriptionStatus.active, - )); + await iapRepository.createOrUpdatePurchase( + SubscriptionPurchase( + userId: userId, + productId: receipt.productId ?? '', + iapSource: IAPSource.appstore, + orderId: receipt.originalTransactionId ?? '', + purchaseDate: DateTime.fromMillisecondsSinceEpoch( + int.parse(receipt.originalPurchaseDateMs ?? '0'), + ), + type: product.type, + expiryDate: DateTime.fromMillisecondsSinceEpoch( + int.parse(receipt.expiresDateMs ?? '0'), + ), + status: SubscriptionStatus.active, + ), + ); break; } } diff --git a/in_app_purchases/step_09/dart-backend/lib/google_play_purchase_handler.dart b/in_app_purchases/step_09/dart-backend/lib/google_play_purchase_handler.dart index ea2aaa7045..ffb57823cd 100644 --- a/in_app_purchases/step_09/dart-backend/lib/google_play_purchase_handler.dart +++ b/in_app_purchases/step_09/dart-backend/lib/google_play_purchase_handler.dart @@ -11,10 +11,7 @@ class GooglePlayPurchaseHandler extends PurchaseHandler { final ap.AndroidPublisherApi androidPublisher; final IapRepository iapRepository; - GooglePlayPurchaseHandler( - this.androidPublisher, - this.iapRepository, - ); + GooglePlayPurchaseHandler(this.androidPublisher, this.iapRepository); /// Handle non-subscription purchases (one time purchases). /// diff --git a/in_app_purchases/step_09/dart-backend/lib/iap_repository.dart b/in_app_purchases/step_09/dart-backend/lib/iap_repository.dart index 1856f31c95..98a0d6ace6 100644 --- a/in_app_purchases/step_09/dart-backend/lib/iap_repository.dart +++ b/in_app_purchases/step_09/dart-backend/lib/iap_repository.dart @@ -2,10 +2,7 @@ import 'package:googleapis/firestore/v1.dart'; import 'products.dart'; -enum IAPSource { - googleplay, - appstore, -} +enum IAPSource { googleplay, appstore } abstract class Purchase { final IAPSource iapSource; @@ -30,8 +27,9 @@ abstract class Purchase { 'orderId': Value(stringValue: orderId), 'productId': Value(stringValue: productId), 'userId': Value(stringValue: userId), - 'purchaseDate': - Value(timestampValue: purchaseDate.toUtc().toIso8601String()), + 'purchaseDate': Value( + timestampValue: purchaseDate.toUtc().toIso8601String(), + ), 'type': Value(stringValue: type.name), }; } @@ -40,46 +38,51 @@ abstract class Purchase { static Purchase fromDocument(Document e) { final type = ProductType.values.firstWhere( - (element) => element.name == e.fields!['type']!.stringValue); + (element) => element.name == e.fields!['type']!.stringValue, + ); switch (type) { case ProductType.subscription: return SubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: SubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), - expiryDate: DateTime.tryParse( - e.fields!['expiryDate']?.timestampValue ?? '') ?? + (element) => element.name == e.fields!['status']!.stringValue, + ), + expiryDate: + DateTime.tryParse( + e.fields!['expiryDate']?.timestampValue ?? '', + ) ?? DateTime.now(), ); case ProductType.nonSubscription: return NonSubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: NonSubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), + (element) => element.name == e.fields!['status']!.stringValue, + ), ); } } } -enum NonSubscriptionStatus { - pending, - completed, - cancelled, -} +enum NonSubscriptionStatus { pending, completed, cancelled } enum SubscriptionStatus { pending, active, expired } @@ -99,17 +102,13 @@ class NonSubscriptionPurchase extends Purchase { @override Map toDocument() { final doc = super.toDocument(); - doc.addAll({ - 'status': Value(stringValue: status.name), - }); + doc.addAll({'status': Value(stringValue: status.name)}); return doc; } @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -153,9 +152,7 @@ class SubscriptionPurchase extends Purchase { @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -187,9 +184,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.toDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.toDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), ), ], ), @@ -205,9 +203,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.updateDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.updateDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), updateMask: DocumentMask(fieldPaths: ['status']), ), ], diff --git a/in_app_purchases/step_09/dart-backend/lib/products.dart b/in_app_purchases/step_09/dart-backend/lib/products.dart index d6baaeb9ca..921ffd8da9 100644 --- a/in_app_purchases/step_09/dart-backend/lib/products.dart +++ b/in_app_purchases/step_09/dart-backend/lib/products.dart @@ -5,10 +5,7 @@ class ProductData { const ProductData(this.productId, this.type); } -enum ProductType { - subscription, - nonSubscription, -} +enum ProductType { subscription, nonSubscription } const productDataMap = { 'dash_consumable_2k': ProductData( diff --git a/in_app_purchases/step_09/dart-backend/pubspec.yaml b/in_app_purchases/step_09/dart-backend/pubspec.yaml index af254ee049..68a14f2c1e 100644 --- a/in_app_purchases/step_09/dart-backend/pubspec.yaml +++ b/in_app_purchases/step_09/dart-backend/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.0.0 # repository: https://github.com/my_org/my_repo environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: app_store_server_sdk: ^1.2.9 diff --git a/in_app_purchases/step_10/app/android/.gitignore b/in_app_purchases/step_10/app/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/in_app_purchases/step_10/app/android/.gitignore +++ b/in_app_purchases/step_10/app/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/in_app_purchases/step_10/app/android/app/build.gradle b/in_app_purchases/step_10/app/android/app/build.gradle deleted file mode 100644 index 149d49474c..0000000000 --- a/in_app_purchases/step_10/app/android/app/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.dashclicker" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.dashclicker" - // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 - minSdk = 23 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/in_app_purchases/step_10/app/android/app/build.gradle.kts b/in_app_purchases/step_10/app/android/app/build.gradle.kts new file mode 100644 index 0000000000..f9fb424ffc --- /dev/null +++ b/in_app_purchases/step_10/app/android/app/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.dashclicker" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.dashclicker" + // Per https://firebase.google.com/support/release-notes/android firebase_auth requires minSdk 23 + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/in_app_purchases/step_10/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt b/in_app_purchases/step_10/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt index 2879c0343b..c136c711c8 100644 --- a/in_app_purchases/step_10/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt +++ b/in_app_purchases/step_10/app/android/app/src/main/kotlin/com/example/dashclicker/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.dashclicker import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/in_app_purchases/step_10/app/android/build.gradle b/in_app_purchases/step_10/app/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/in_app_purchases/step_10/app/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/in_app_purchases/step_10/app/android/build.gradle.kts b/in_app_purchases/step_10/app/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/in_app_purchases/step_10/app/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/in_app_purchases/step_10/app/android/gradle.properties b/in_app_purchases/step_10/app/android/gradle.properties index 2597170821..f018a61817 100644 --- a/in_app_purchases/step_10/app/android/gradle.properties +++ b/in_app_purchases/step_10/app/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/in_app_purchases/step_10/app/android/gradle/wrapper/gradle-wrapper.properties b/in_app_purchases/step_10/app/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/in_app_purchases/step_10/app/android/gradle/wrapper/gradle-wrapper.properties +++ b/in_app_purchases/step_10/app/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/in_app_purchases/step_10/app/android/settings.gradle b/in_app_purchases/step_10/app/android/settings.gradle deleted file mode 100644 index a42444ded0..0000000000 --- a/in_app_purchases/step_10/app/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.2.1" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/in_app_purchases/step_10/app/android/settings.gradle.kts b/in_app_purchases/step_10/app/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/in_app_purchases/step_10/app/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/in_app_purchases/step_10/app/ios/Podfile b/in_app_purchases/step_10/app/ios/Podfile index 0a27aa76d9..263294aa35 100644 --- a/in_app_purchases/step_10/app/ios/Podfile +++ b/in_app_purchases/step_10/app/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/in_app_purchases/step_10/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/in_app_purchases/step_10/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/in_app_purchases/step_10/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/in_app_purchases/step_10/app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/in_app_purchases/step_10/app/lib/logic/dash_purchases.dart b/in_app_purchases/step_10/app/lib/logic/dash_purchases.dart index a76c641b45..942230ea04 100644 --- a/in_app_purchases/step_10/app/lib/logic/dash_purchases.dart +++ b/in_app_purchases/step_10/app/lib/logic/dash_purchases.dart @@ -73,12 +73,15 @@ class DashPurchases extends ChangeNotifier { await iapConnection.buyNonConsumable(purchaseParam: purchaseParam); default: throw ArgumentError.value( - product.productDetails, '${product.id} is not a known product'); + product.productDetails, + '${product.id} is not a known product', + ); } } Future _onPurchaseUpdate( - List purchaseDetailsList) async { + List purchaseDetailsList, + ) async { for (var purchaseDetails in purchaseDetailsList) { await _handlePurchase(purchaseDetails); } @@ -146,12 +149,16 @@ class DashPurchases extends ChangeNotifier { // Get a list of purchasable products for the subscription and upgrade. // This should be 1 per type. if (products.isNotEmpty) { - subscriptions = products - .where((element) => element.productDetails.id == storeKeySubscription) - .toList(); - upgrades = products - .where((element) => element.productDetails.id == storeKeyUpgrade) - .toList(); + subscriptions = + products + .where( + (element) => element.productDetails.id == storeKeySubscription, + ) + .toList(); + upgrades = + products + .where((element) => element.productDetails.id == storeKeyUpgrade) + .toList(); } // Set the subscription in the counter logic and show/hide purchased on the @@ -174,10 +181,11 @@ class DashPurchases extends ChangeNotifier { _beautifiedDashUpgrade = iapRepo.hasUpgrade; for (var element in upgrades) { _updateStatus( - element, - _beautifiedDashUpgrade - ? ProductStatus.purchased - : ProductStatus.purchasable); + element, + _beautifiedDashUpgrade + ? ProductStatus.purchased + : ProductStatus.purchasable, + ); } notifyListeners(); } diff --git a/in_app_purchases/step_10/app/lib/logic/dash_upgrades.dart b/in_app_purchases/step_10/app/lib/logic/dash_upgrades.dart index 826aec517a..f6201177f5 100644 --- a/in_app_purchases/step_10/app/lib/logic/dash_upgrades.dart +++ b/in_app_purchases/step_10/app/lib/logic/dash_upgrades.dart @@ -37,9 +37,7 @@ class DashUpgrades extends ChangeNotifier { _buy(tim); } - void _buy( - Upgrade upgrade, - ) { + void _buy(Upgrade upgrade) { if (counter.count < upgrade.cost) return; counter.addAutoIncrement( diff --git a/in_app_purchases/step_10/app/lib/main.dart b/in_app_purchases/step_10/app/lib/main.dart index f4b5ce594f..e63ae7f47d 100644 --- a/in_app_purchases/step_10/app/lib/main.dart +++ b/in_app_purchases/step_10/app/lib/main.dart @@ -65,41 +65,36 @@ class _MyHomePageState extends State { return MultiProvider( providers: [ ChangeNotifierProvider( - create: (_) => FirebaseNotifier()), + create: (_) => FirebaseNotifier(), + ), ChangeNotifierProvider(create: (_) => DashCounter()), ChangeNotifierProvider( - create: (context) => DashUpgrades( - context.read(), - context.read(), - ), + create: + (context) => DashUpgrades( + context.read(), + context.read(), + ), ), ChangeNotifierProvider( create: (context) => IAPRepo(context.read()), ), ChangeNotifierProvider( - create: (context) => DashPurchases( - context.read(), - context.read(), - context.read(), - ), + create: + (context) => DashPurchases( + context.read(), + context.read(), + context.read(), + ), lazy: false, ), ], child: Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), + appBar: AppBar(title: Text(widget.title)), body: _widgetOptions[_selectedIndex], bottomNavigationBar: BottomNavigationBar( items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon(Icons.shop), - label: 'Purchase', - ), + BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'), + BottomNavigationBarItem(icon: Icon(Icons.shop), label: 'Purchase'), ], currentIndex: _selectedIndex, selectedItemColor: Colors.amber[800], diff --git a/in_app_purchases/step_10/app/lib/model/firebase_state.dart b/in_app_purchases/step_10/app/lib/model/firebase_state.dart index 1a04db5438..9fc7102e99 100644 --- a/in_app_purchases/step_10/app/lib/model/firebase_state.dart +++ b/in_app_purchases/step_10/app/lib/model/firebase_state.dart @@ -1,5 +1 @@ -enum FirebaseState { - loading, - available, - notAvailable, -} +enum FirebaseState { loading, available, notAvailable } diff --git a/in_app_purchases/step_10/app/lib/model/past_purchase.dart b/in_app_purchases/step_10/app/lib/model/past_purchase.dart index 42f412481d..63142b1be7 100644 --- a/in_app_purchases/step_10/app/lib/model/past_purchase.dart +++ b/in_app_purchases/step_10/app/lib/model/past_purchase.dart @@ -2,22 +2,11 @@ import 'package:flutter/widgets.dart'; import '../constants.dart'; -enum PurchaseType { - subscriptionPurchase, - nonSubscriptionPurchase, -} +enum PurchaseType { subscriptionPurchase, nonSubscriptionPurchase } -enum Store { - googlePlay, - appStore, -} +enum Store { googlePlay, appStore } -enum Status { - pending, - completed, - active, - expired, -} +enum Status { pending, completed, active, expired } @immutable class PastPurchase { @@ -33,25 +22,25 @@ class PastPurchase { return switch (productId) { storeKeyConsumable => 'Consumable', storeKeySubscription => 'Subscription', - _ => productId + _ => productId, }; } PastPurchase.fromJson(Map json) - : type = _typeFromString(json['type'] as String), - store = _storeFromString(json['iapSource'] as String), - orderId = json['orderId'] as String, - productId = json['productId'] as String, - purchaseDate = DateTime.now(), - expiryDate = null, - status = _statusFromString(json['status'] as String); + : type = _typeFromString(json['type'] as String), + store = _storeFromString(json['iapSource'] as String), + orderId = json['orderId'] as String, + productId = json['productId'] as String, + purchaseDate = DateTime.now(), + expiryDate = null, + status = _statusFromString(json['status'] as String); } PurchaseType _typeFromString(String type) { return switch (type) { 'nonSubscription' => PurchaseType.subscriptionPurchase, 'subscription' => PurchaseType.nonSubscriptionPurchase, - _ => throw ArgumentError.value(type, '$type is not a supported type') + _ => throw ArgumentError.value(type, '$type is not a supported type'), }; } @@ -59,7 +48,7 @@ Store _storeFromString(String store) { return switch (store) { 'googleplay' => Store.googlePlay, 'appstore' => Store.appStore, - _ => throw ArgumentError.value(store, '$store is not a supported store') + _ => throw ArgumentError.value(store, '$store is not a supported store'), }; } @@ -69,6 +58,6 @@ Status _statusFromString(String status) { 'completed' => Status.completed, 'active' => Status.active, 'expired' => Status.expired, - _ => throw ArgumentError.value(status, '$status is not a supported status') + _ => throw ArgumentError.value(status, '$status is not a supported status'), }; } diff --git a/in_app_purchases/step_10/app/lib/model/purchasable_product.dart b/in_app_purchases/step_10/app/lib/model/purchasable_product.dart index 9abe078e52..e2b8b81970 100644 --- a/in_app_purchases/step_10/app/lib/model/purchasable_product.dart +++ b/in_app_purchases/step_10/app/lib/model/purchasable_product.dart @@ -1,10 +1,6 @@ import 'package:in_app_purchase/in_app_purchase.dart'; -enum ProductStatus { - purchasable, - purchased, - pending, -} +enum ProductStatus { purchasable, purchased, pending } class PurchasableProduct { String get id => productDetails.id; diff --git a/in_app_purchases/step_10/app/lib/model/store_state.dart b/in_app_purchases/step_10/app/lib/model/store_state.dart index a4f1490b60..a299611086 100644 --- a/in_app_purchases/step_10/app/lib/model/store_state.dart +++ b/in_app_purchases/step_10/app/lib/model/store_state.dart @@ -1,5 +1 @@ -enum StoreState { - loading, - available, - notAvailable, -} +enum StoreState { loading, available, notAvailable } diff --git a/in_app_purchases/step_10/app/lib/pages/home_page.dart b/in_app_purchases/step_10/app/lib/pages/home_page.dart index 57087c5f24..83d674703b 100644 --- a/in_app_purchases/step_10/app/lib/pages/home_page.dart +++ b/in_app_purchases/step_10/app/lib/pages/home_page.dart @@ -13,10 +13,7 @@ class HomePage extends StatelessWidget { Widget build(BuildContext context) { return const Column( children: [ - Expanded( - flex: 2, - child: DashClickerWidget(), - ), + Expanded(flex: 2, child: DashClickerWidget()), Expanded(child: UpgradeList()), ], ); @@ -36,10 +33,12 @@ class DashClickerWidget extends StatelessWidget { InkWell( // Don't listen as we don't need a rebuild when the count changes onTap: Provider.of(context, listen: false).increment, - child: Image.asset(context.read().beautifiedDash - ? 'assets/dash.png' - : 'assets/dash_old.png'), - ) + child: Image.asset( + context.read().beautifiedDash + ? 'assets/dash.png' + : 'assets/dash_old.png', + ), + ), ], ), ); @@ -60,8 +59,9 @@ class CounterStateWidget extends StatelessWidget { style: DefaultTextStyle.of(context).style, children: [ TextSpan( - text: counter.countString, - style: const TextStyle(fontWeight: FontWeight.bold)), + text: counter.countString, + style: const TextStyle(fontWeight: FontWeight.bold), + ), const TextSpan(text: ' times!'), ], ), @@ -75,13 +75,15 @@ class UpgradeList extends StatelessWidget { @override Widget build(BuildContext context) { var upgrades = context.watch(); - return ListView(children: [ - _UpgradeWidget( - upgrade: upgrades.tim, - title: 'Tim Sneath', - onPressed: upgrades.addTim, - ), - ]); + return ListView( + children: [ + _UpgradeWidget( + upgrade: upgrades.tim, + title: 'Tim Sneath', + onPressed: upgrades.addTim, + ), + ], + ); } } @@ -99,24 +101,19 @@ class _UpgradeWidget extends StatelessWidget { @override Widget build(BuildContext context) { return InkWell( - onTap: onPressed, - child: ListTile( - leading: Center( - widthFactor: 1, - child: Text( - upgrade.count.toString(), - ), - ), - title: Text( - title, - style: !upgrade.purchasable - ? const TextStyle(color: Colors.redAccent) - : null, - ), - subtitle: Text('Produces ${upgrade.work} dashes per second'), - trailing: Text( - '${NumberFormat.compact().format(upgrade.cost)} dashes', - ), - )); + onTap: onPressed, + child: ListTile( + leading: Center(widthFactor: 1, child: Text(upgrade.count.toString())), + title: Text( + title, + style: + !upgrade.purchasable + ? const TextStyle(color: Colors.redAccent) + : null, + ), + subtitle: Text('Produces ${upgrade.work} dashes per second'), + trailing: Text('${NumberFormat.compact().format(upgrade.cost)} dashes'), + ), + ); } } diff --git a/in_app_purchases/step_10/app/lib/pages/login_page.dart b/in_app_purchases/step_10/app/lib/pages/login_page.dart index f0bc7dbc45..655da8b403 100644 --- a/in_app_purchases/step_10/app/lib/pages/login_page.dart +++ b/in_app_purchases/step_10/app/lib/pages/login_page.dart @@ -11,16 +11,15 @@ class LoginPage extends StatelessWidget { var firebaseNotifier = context.watch(); if (firebaseNotifier.isLoggingIn) { - return const Center( - child: Text('Logging in...'), - ); + return const Center(child: Text('Logging in...')); } return Center( - child: FilledButton( - onPressed: () { - firebaseNotifier.login(); - }, - child: const Text('Login'), - )); + child: FilledButton( + onPressed: () { + firebaseNotifier.login(); + }, + child: const Text('Login'), + ), + ); } } diff --git a/in_app_purchases/step_10/app/lib/pages/purchase_page.dart b/in_app_purchases/step_10/app/lib/pages/purchase_page.dart index 85470b24fb..97eee25f38 100644 --- a/in_app_purchases/step_10/app/lib/pages/purchase_page.dart +++ b/in_app_purchases/step_10/app/lib/pages/purchase_page.dart @@ -36,17 +36,20 @@ class PurchasePage extends StatelessWidget { case StoreState.notAvailable: storeWidget = _PurchasesNotAvailable(); } - return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - storeWidget, - const Padding( - padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), - child: Text( - 'Past purchases', - style: TextStyle(fontWeight: FontWeight.bold), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + storeWidget, + const Padding( + padding: EdgeInsets.fromLTRB(32.0, 32.0, 32.0, 0.0), + child: Text( + 'Past purchases', + style: TextStyle(fontWeight: FontWeight.bold), + ), ), - ), - const PastPurchasesWidget(), - ]); + const PastPurchasesWidget(), + ], + ); } } @@ -70,13 +73,17 @@ class _PurchaseList extends StatelessWidget { var purchases = context.watch(); var products = purchases.products; return Column( - children: products - .map((product) => _PurchaseWidget( - product: product, - onPressed: () { - purchases.buy(product); - })) - .toList(), + children: + products + .map( + (product) => _PurchaseWidget( + product: product, + onPressed: () { + purchases.buy(product); + }, + ), + ) + .toList(), ); } } @@ -85,10 +92,7 @@ class _PurchaseWidget extends StatelessWidget { final PurchasableProduct product; final VoidCallback onPressed; - const _PurchaseWidget({ - required this.product, - required this.onPressed, - }); + const _PurchaseWidget({required this.product, required this.onPressed}); @override Widget build(BuildContext context) { @@ -97,21 +101,20 @@ class _PurchaseWidget extends StatelessWidget { title += ' (purchased)'; } return InkWell( - onTap: onPressed, - child: ListTile( - title: Text( - title, - ), - subtitle: Text(product.description), - trailing: Text(_trailing()), - )); + onTap: onPressed, + child: ListTile( + title: Text(title), + subtitle: Text(product.description), + trailing: Text(_trailing()), + ), + ); } String _trailing() { return switch (product.status) { ProductStatus.purchasable => product.price, ProductStatus.purchased => 'purchased', - ProductStatus.pending => 'buying...' + ProductStatus.pending => 'buying...', }; } } @@ -125,10 +128,11 @@ class PastPurchasesWidget extends StatelessWidget { return ListView.separated( shrinkWrap: true, itemCount: purchases.length, - itemBuilder: (context, index) => ListTile( - title: Text(purchases[index].title), - subtitle: Text(purchases[index].status.toString()), - ), + itemBuilder: + (context, index) => ListTile( + title: Text(purchases[index].title), + subtitle: Text(purchases[index].status.toString()), + ), separatorBuilder: (context, index) => const Divider(), ); } diff --git a/in_app_purchases/step_10/app/lib/repo/iap_repo.dart b/in_app_purchases/step_10/app/lib/repo/iap_repo.dart index f238a98c39..67e3f137ba 100644 --- a/in_app_purchases/step_10/app/lib/repo/iap_repo.dart +++ b/in_app_purchases/step_10/app/lib/repo/iap_repo.dart @@ -47,19 +47,23 @@ class IAPRepo extends ChangeNotifier { hasUpgrade = false; return; } - var purchaseStream = _firestore - .collection('purchases') - .where('userId', isEqualTo: user.uid) - .snapshots(); + var purchaseStream = + _firestore + .collection('purchases') + .where('userId', isEqualTo: user.uid) + .snapshots(); _purchaseSubscription = purchaseStream.listen((snapshot) { - purchases = snapshot.docs.map((document) { - var data = document.data(); - return PastPurchase.fromJson(data); - }).toList(); + purchases = + snapshot.docs.map((document) { + var data = document.data(); + return PastPurchase.fromJson(data); + }).toList(); - hasActiveSubscription = purchases.any((element) => - element.productId == storeKeySubscription && - element.status != Status.expired); + hasActiveSubscription = purchases.any( + (element) => + element.productId == storeKeySubscription && + element.status != Status.expired, + ); hasUpgrade = purchases.any( (element) => element.productId == storeKeyUpgrade, diff --git a/in_app_purchases/step_10/app/pubspec.yaml b/in_app_purchases/step_10/app/pubspec.yaml index 518e415ab2..04baea6b35 100644 --- a/in_app_purchases/step_10/app/pubspec.yaml +++ b/in_app_purchases/step_10/app/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/in_app_purchases/step_10/app/test/widget_test.dart b/in_app_purchases/step_10/app/test/widget_test.dart index cd48c00478..ce165ef6de 100644 --- a/in_app_purchases/step_10/app/test/widget_test.dart +++ b/in_app_purchases/step_10/app/test/widget_test.dart @@ -13,8 +13,10 @@ void main() { class TestIAPConnection implements InAppPurchase { @override - Future buyConsumable( - {required PurchaseParam purchaseParam, bool autoConsume = true}) { + Future buyConsumable({ + required PurchaseParam purchaseParam, + bool autoConsume = true, + }) { return Future.value(false); } @@ -35,10 +37,9 @@ class TestIAPConnection implements InAppPurchase { @override Future queryProductDetails(Set identifiers) { - return Future.value(ProductDetailsResponse( - productDetails: [], - notFoundIDs: [], - )); + return Future.value( + ProductDetailsResponse(productDetails: [], notFoundIDs: []), + ); } @override diff --git a/in_app_purchases/step_10/dart-backend/bin/server.dart b/in_app_purchases/step_10/dart-backend/bin/server.dart index 8eb019f5f9..0007cf9ad2 100644 --- a/in_app_purchases/step_10/dart-backend/bin/server.dart +++ b/in_app_purchases/step_10/dart-backend/bin/server.dart @@ -26,13 +26,14 @@ Future> _createPurchaseHandlers() async { // Configure Android Publisher API access final serviceAccountGooglePlay = File('assets/service-account-google-play.json').readAsStringSync(); - final clientCredentialsGooglePlay = - auth.ServiceAccountCredentials.fromJson(serviceAccountGooglePlay); - final clientGooglePlay = - await auth.clientViaServiceAccount(clientCredentialsGooglePlay, [ - ap.AndroidPublisherApi.androidpublisherScope, - pubsub.PubsubApi.cloudPlatformScope, - ]); + final clientCredentialsGooglePlay = auth.ServiceAccountCredentials.fromJson( + serviceAccountGooglePlay, + ); + final clientGooglePlay = await auth + .clientViaServiceAccount(clientCredentialsGooglePlay, [ + ap.AndroidPublisherApi.androidpublisherScope, + pubsub.PubsubApi.cloudPlatformScope, + ]); final androidPublisher = ap.AndroidPublisherApi(clientGooglePlay); // Pub/Sub API to receive on purchase events from Google Play @@ -41,12 +42,13 @@ Future> _createPurchaseHandlers() async { // Configure Firestore API access final serviceAccountFirebase = File('assets/service-account-firebase.json').readAsStringSync(); - final clientCredentialsFirebase = - auth.ServiceAccountCredentials.fromJson(serviceAccountFirebase); - final clientFirebase = - await auth.clientViaServiceAccount(clientCredentialsFirebase, [ - fs.FirestoreApi.cloudPlatformScope, - ]); + final clientCredentialsFirebase = auth.ServiceAccountCredentials.fromJson( + serviceAccountFirebase, + ); + final clientFirebase = await auth.clientViaServiceAccount( + clientCredentialsFirebase, + [fs.FirestoreApi.cloudPlatformScope], + ); final firestoreApi = fs.FirestoreApi(clientFirebase); final dynamic json = jsonDecode(serviceAccountFirebase); final projectId = json['project_id'] as String; @@ -86,10 +88,7 @@ Future> _createPurchaseHandlers() async { iapRepository, pubsubApi, ), - 'app_store': AppStorePurchaseHandler( - iapRepository, - appStoreServerAPI, - ), + 'app_store': AppStorePurchaseHandler(iapRepository, appStoreServerAPI), }; } @@ -132,19 +131,14 @@ Future main() async { await serveHandler(router.call); } -({ - String userId, - String source, - ProductData productData, - String token, -}) getPurchaseData(dynamic payload) { - if (payload - case { - 'userId': String userId, - 'source': String source, - 'productId': String productId, - 'verificationData': String token, - }) { +({String userId, String source, ProductData productData, String token}) +getPurchaseData(dynamic payload) { + if (payload case { + 'userId': String userId, + 'source': String source, + 'productId': String productId, + 'verificationData': String token, + }) { return ( userId: userId, source: source, diff --git a/in_app_purchases/step_10/dart-backend/lib/app_store_purchase_handler.dart b/in_app_purchases/step_10/dart-backend/lib/app_store_purchase_handler.dart index 440bbb10ec..b4789d3462 100644 --- a/in_app_purchases/step_10/dart-backend/lib/app_store_purchase_handler.dart +++ b/in_app_purchases/step_10/dart-backend/lib/app_store_purchase_handler.dart @@ -14,10 +14,7 @@ class AppStorePurchaseHandler extends PurchaseHandler { final IapRepository iapRepository; final AppStoreServerAPI appStoreServerAPI; - AppStorePurchaseHandler( - this.iapRepository, - this.appStoreServerAPI, - ) { + AppStorePurchaseHandler(this.iapRepository, this.appStoreServerAPI) { // Poll Subscription status every 10 seconds. Timer.periodic(Duration(seconds: 10), (_) { _pullStatus(); @@ -25,10 +22,7 @@ class AppStorePurchaseHandler extends PurchaseHandler { } final _iTunesAPI = ITunesApi( - ITunesHttpClient( - ITunesEnvironment.sandbox(), - loggingEnabled: true, - ), + ITunesHttpClient(ITunesEnvironment.sandbox(), loggingEnabled: true), ); @override @@ -71,30 +65,37 @@ class AppStorePurchaseHandler extends PurchaseHandler { } switch (product.type) { case ProductType.nonSubscription: - await iapRepository.createOrUpdatePurchase(NonSubscriptionPurchase( - userId: userId, - productId: receipt.productId ?? '', - iapSource: IAPSource.appstore, - orderId: receipt.originalTransactionId ?? '', - purchaseDate: DateTime.fromMillisecondsSinceEpoch( - int.parse(receipt.originalPurchaseDateMs ?? '0')), - type: product.type, - status: NonSubscriptionStatus.completed, - )); + await iapRepository.createOrUpdatePurchase( + NonSubscriptionPurchase( + userId: userId, + productId: receipt.productId ?? '', + iapSource: IAPSource.appstore, + orderId: receipt.originalTransactionId ?? '', + purchaseDate: DateTime.fromMillisecondsSinceEpoch( + int.parse(receipt.originalPurchaseDateMs ?? '0'), + ), + type: product.type, + status: NonSubscriptionStatus.completed, + ), + ); break; case ProductType.subscription: - await iapRepository.createOrUpdatePurchase(SubscriptionPurchase( - userId: userId, - productId: receipt.productId ?? '', - iapSource: IAPSource.appstore, - orderId: receipt.originalTransactionId ?? '', - purchaseDate: DateTime.fromMillisecondsSinceEpoch( - int.parse(receipt.originalPurchaseDateMs ?? '0')), - type: product.type, - expiryDate: DateTime.fromMillisecondsSinceEpoch( - int.parse(receipt.expiresDateMs ?? '0')), - status: SubscriptionStatus.active, - )); + await iapRepository.createOrUpdatePurchase( + SubscriptionPurchase( + userId: userId, + productId: receipt.productId ?? '', + iapSource: IAPSource.appstore, + orderId: receipt.originalTransactionId ?? '', + purchaseDate: DateTime.fromMillisecondsSinceEpoch( + int.parse(receipt.originalPurchaseDateMs ?? '0'), + ), + type: product.type, + expiryDate: DateTime.fromMillisecondsSinceEpoch( + int.parse(receipt.expiresDateMs ?? '0'), + ), + status: SubscriptionStatus.active, + ), + ); break; } } @@ -112,35 +113,43 @@ class AppStorePurchaseHandler extends PurchaseHandler { print('Polling App Store'); final purchases = await iapRepository.getPurchases(); // filter for App Store subscriptions - final appStoreSubscriptions = purchases.where((element) => - element.type == ProductType.subscription && - element.iapSource == IAPSource.appstore); + final appStoreSubscriptions = purchases.where( + (element) => + element.type == ProductType.subscription && + element.iapSource == IAPSource.appstore, + ); for (final purchase in appStoreSubscriptions) { - final status = - await appStoreServerAPI.getAllSubscriptionStatuses(purchase.orderId); + final status = await appStoreServerAPI.getAllSubscriptionStatuses( + purchase.orderId, + ); // Obtain all subscriptions for the order id. for (final subscription in status.data) { // Last transaction contains the subscription status. for (final transaction in subscription.lastTransactions) { final expirationDate = DateTime.fromMillisecondsSinceEpoch( - transaction.transactionInfo.expiresDate ?? 0); + transaction.transactionInfo.expiresDate ?? 0, + ); // Check if subscription has expired. final isExpired = expirationDate.isBefore(DateTime.now()); print('Expiration Date: $expirationDate - isExpired: $isExpired'); // Update the subscription status with the new expiration date and status. - await iapRepository.updatePurchase(SubscriptionPurchase( - userId: null, - productId: transaction.transactionInfo.productId, - iapSource: IAPSource.appstore, - orderId: transaction.originalTransactionId, - purchaseDate: DateTime.fromMillisecondsSinceEpoch( - transaction.transactionInfo.originalPurchaseDate), - type: ProductType.subscription, - expiryDate: expirationDate, - status: isExpired - ? SubscriptionStatus.expired - : SubscriptionStatus.active, - )); + await iapRepository.updatePurchase( + SubscriptionPurchase( + userId: null, + productId: transaction.transactionInfo.productId, + iapSource: IAPSource.appstore, + orderId: transaction.originalTransactionId, + purchaseDate: DateTime.fromMillisecondsSinceEpoch( + transaction.transactionInfo.originalPurchaseDate, + ), + type: ProductType.subscription, + expiryDate: expirationDate, + status: + isExpired + ? SubscriptionStatus.expired + : SubscriptionStatus.active, + ), + ); } } } diff --git a/in_app_purchases/step_10/dart-backend/lib/google_play_purchase_handler.dart b/in_app_purchases/step_10/dart-backend/lib/google_play_purchase_handler.dart index b77ca0e461..ead67e4603 100644 --- a/in_app_purchases/step_10/dart-backend/lib/google_play_purchase_handler.dart +++ b/in_app_purchases/step_10/dart-backend/lib/google_play_purchase_handler.dart @@ -162,9 +162,7 @@ class GooglePlayPurchaseHandler extends PurchaseHandler { /// Called every 10 seconds Future _pullMessageFromPubSub() async { print('Polling Google Play messages'); - final request = pubsub.PullRequest( - maxMessages: 1000, - ); + final request = pubsub.PullRequest(maxMessages: 1000); final topicName = 'projects/$googlePlayProjectName/subscriptions/$googlePlayPubsubBillingTopic-sub'; final pullResponse = await pubsubApi.projects.subscriptions.pull( @@ -230,9 +228,7 @@ class GooglePlayPurchaseHandler extends PurchaseHandler { /// ACK Messages from Pub/Sub Future _ackMessage(String id) async { print('ACK Message'); - final request = pubsub.AcknowledgeRequest( - ackIds: [id], - ); + final request = pubsub.AcknowledgeRequest(ackIds: [id]); final subscriptionName = 'projects/$googlePlayProjectName/subscriptions/$googlePlayPubsubBillingTopic-sub'; await pubsubApi.projects.subscriptions.acknowledge( diff --git a/in_app_purchases/step_10/dart-backend/lib/iap_repository.dart b/in_app_purchases/step_10/dart-backend/lib/iap_repository.dart index 1856f31c95..98a0d6ace6 100644 --- a/in_app_purchases/step_10/dart-backend/lib/iap_repository.dart +++ b/in_app_purchases/step_10/dart-backend/lib/iap_repository.dart @@ -2,10 +2,7 @@ import 'package:googleapis/firestore/v1.dart'; import 'products.dart'; -enum IAPSource { - googleplay, - appstore, -} +enum IAPSource { googleplay, appstore } abstract class Purchase { final IAPSource iapSource; @@ -30,8 +27,9 @@ abstract class Purchase { 'orderId': Value(stringValue: orderId), 'productId': Value(stringValue: productId), 'userId': Value(stringValue: userId), - 'purchaseDate': - Value(timestampValue: purchaseDate.toUtc().toIso8601String()), + 'purchaseDate': Value( + timestampValue: purchaseDate.toUtc().toIso8601String(), + ), 'type': Value(stringValue: type.name), }; } @@ -40,46 +38,51 @@ abstract class Purchase { static Purchase fromDocument(Document e) { final type = ProductType.values.firstWhere( - (element) => element.name == e.fields!['type']!.stringValue); + (element) => element.name == e.fields!['type']!.stringValue, + ); switch (type) { case ProductType.subscription: return SubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: SubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), - expiryDate: DateTime.tryParse( - e.fields!['expiryDate']?.timestampValue ?? '') ?? + (element) => element.name == e.fields!['status']!.stringValue, + ), + expiryDate: + DateTime.tryParse( + e.fields!['expiryDate']?.timestampValue ?? '', + ) ?? DateTime.now(), ); case ProductType.nonSubscription: return NonSubscriptionPurchase( - iapSource: e.fields!['iapSource']!.stringValue == 'googleplay' - ? IAPSource.googleplay - : IAPSource.appstore, + iapSource: + e.fields!['iapSource']!.stringValue == 'googleplay' + ? IAPSource.googleplay + : IAPSource.appstore, orderId: e.fields!['orderId']!.stringValue!, productId: e.fields!['productId']!.stringValue!, userId: e.fields!['userId']!.stringValue, - purchaseDate: - DateTime.parse(e.fields!['purchaseDate']!.timestampValue!), + purchaseDate: DateTime.parse( + e.fields!['purchaseDate']!.timestampValue!, + ), status: NonSubscriptionStatus.values.firstWhere( - (element) => element.name == e.fields!['status']!.stringValue), + (element) => element.name == e.fields!['status']!.stringValue, + ), ); } } } -enum NonSubscriptionStatus { - pending, - completed, - cancelled, -} +enum NonSubscriptionStatus { pending, completed, cancelled } enum SubscriptionStatus { pending, active, expired } @@ -99,17 +102,13 @@ class NonSubscriptionPurchase extends Purchase { @override Map toDocument() { final doc = super.toDocument(); - doc.addAll({ - 'status': Value(stringValue: status.name), - }); + doc.addAll({'status': Value(stringValue: status.name)}); return doc; } @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -153,9 +152,7 @@ class SubscriptionPurchase extends Purchase { @override Map updateDocument() { - return { - 'status': Value(stringValue: status.name), - }; + return {'status': Value(stringValue: status.name)}; } @override @@ -187,9 +184,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.toDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.toDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), ), ], ), @@ -205,9 +203,10 @@ class IapRepository { writes: [ Write( update: Document( - fields: purchaseData.updateDocument(), - name: - 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId'), + fields: purchaseData.updateDocument(), + name: + 'projects/$projectId/databases/(default)/documents/purchases/$purchaseId', + ), updateMask: DocumentMask(fieldPaths: ['status']), ), ], diff --git a/in_app_purchases/step_10/dart-backend/lib/products.dart b/in_app_purchases/step_10/dart-backend/lib/products.dart index d6baaeb9ca..921ffd8da9 100644 --- a/in_app_purchases/step_10/dart-backend/lib/products.dart +++ b/in_app_purchases/step_10/dart-backend/lib/products.dart @@ -5,10 +5,7 @@ class ProductData { const ProductData(this.productId, this.type); } -enum ProductType { - subscription, - nonSubscription, -} +enum ProductType { subscription, nonSubscription } const productDataMap = { 'dash_consumable_2k': ProductData( diff --git a/in_app_purchases/step_10/dart-backend/pubspec.yaml b/in_app_purchases/step_10/dart-backend/pubspec.yaml index af254ee049..68a14f2c1e 100644 --- a/in_app_purchases/step_10/dart-backend/pubspec.yaml +++ b/in_app_purchases/step_10/dart-backend/pubspec.yaml @@ -4,7 +4,7 @@ version: 1.0.0 # repository: https://github.com/my_org/my_repo environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: app_store_server_sdk: ^1.2.9 diff --git a/namer/codelab_rebuild.yaml b/namer/codelab_rebuild.yaml index a9db74c3c9..a4e87fcb85 100644 --- a/namer/codelab_rebuild.yaml +++ b/namer/codelab_rebuild.yaml @@ -20,7 +20,7 @@ steps: version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -54,7 +54,6 @@ steps: prefer_final_fields: false unnecessary_breaks: true use_key_in_widget_constructors: false - - name: Replace lib/main.dart path: namer_app/lib/main.dart replace-contents: | @@ -95,10 +94,7 @@ steps: return Scaffold( body: Column( - children: [ - Text('A random idea:'), - Text(appState.current.asLowerCase), - ], + children: [Text('A random idea:'), Text(appState.current.asLowerCase)], ), ); } @@ -150,22 +146,24 @@ steps: patch-u: | --- b/namer/step_04_a_widget/lib/main.dart +++ a/namer/step_04_a_widget/lib/main.dart - @@ -36,8 +36,14 @@ class MyHomePage extends StatelessWidget { + @@ -35,7 +35,16 @@ class MyHomePage extends StatelessWidget { + return Scaffold( body: Column( - children: [ - - Text('A random idea:'), + - children: [Text('A random idea:'), Text(appState.current.asLowerCase)], + + children: [ + Text('A random AWESOME idea:'), - Text(appState.current.asLowerCase), + + Text(appState.current.asLowerCase), + ElevatedButton( + onPressed: () { + print('button pressed!'); + }, + child: Text('Next'), + ), - ], + + ], ), ); + } - name: Patch test/widget_test.dart path: namer_app/test/widget_test.dart patch-u: | @@ -216,38 +214,36 @@ steps: - name: Add additional test path: namer_app/test/widget_test.dart patch-u: | - --- a/namer_app/test/widget_test.dart - +++ b/namer_app/test/widget_test.dart + --- b/namer/step_04_b_behavior/test/widget_test.dart + +++ a/namer/step_04_b_behavior/test/widget_test.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:namer_app/main.dart'; - @@ -6,5 +7,45 @@ - testWidgets('App starts', (WidgetTester tester) async { + @@ -7,4 +8,44 @@ void main() { await tester.pumpWidget(const MyApp()); expect(find.text('A random AWESOME idea:'), findsOneWidget); - + }); + }); + + testWidgets('Tapping button changes word pair', (WidgetTester tester) async { + await tester.pumpWidget(const MyApp()); + + String findWordPair() { - + final wordPairTextWidget = tester - + // Get all Text widgets... - + .widgetList(find.byType(Text)) - + // ... skip one ('A random AWESOME idea:') ... - + .skip(1) - + // ... and take the first after it. - + .first; + + final wordPairTextWidget = + + tester + + // Get all Text widgets... + + .widgetList(find.byType(Text)) + + // ... skip one ('A random AWESOME idea:') ... + + .skip(1) + + // ... and take the first after it. + + .first; + return wordPairTextWidget.data!; + } + + // Tap several times and keep a list of word pair values. + const tryCount = 5; - + final pairs = [ - + findWordPair(), - + ]; + + final pairs = [findWordPair()]; + for (var i = 1; i < tryCount; i++) { + await tester.tap(find.text('Next')); + await tester.pumpAndSettle(); @@ -261,13 +257,14 @@ steps: + // We only fail this test when there is zero variance - all the + // word pairs are the same, even though we clicked 'Next' several times. + hasLength(greaterThan(1)), - + reason: 'After clicking $tryCount times, ' + + reason: + + 'After clicking $tryCount times, ' + 'the app should have generated at least two different word pairs. ' + 'Instead, the app showed these: $pairs. ' + 'That almost certainly means that the word pair is not being ' + 'randomly generated at all. The button does not work.', + ); - }); + + }); } - name: Copy step_04_b_behavior copydir: @@ -319,16 +316,13 @@ steps: ElevatedButton( onPressed: () { appState.getNext(); - @@ -55,3 +55,17 @@ class MyHomePage extends StatelessWidget { + @@ -55,3 +55,14 @@ class MyHomePage extends StatelessWidget { ); } } + +class BigCard extends StatelessWidget { - + const BigCard({ - + super.key, - + required this.pair, - + }); + + const BigCard({super.key, required this.pair}); + + final WordPair pair; + @@ -340,23 +334,23 @@ steps: - name: Update test to use BigCard path: namer_app/test/widget_test.dart patch-u: | - --- a/namer_app/test/widget_test.dart - +++ b/namer_app/test/widget_test.dart - @@ -13,13 +13,10 @@ void main() { + --- b/namer/step_05_b_extract/test/widget_test.dart + +++ a/namer/step_05_b_extract/test/widget_test.dart + @@ -13,14 +13,9 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - - final wordPairTextWidget = tester - - // Get all Text widgets... - - .widgetList(find.byType(Text)) - - // ... skip one ('A random AWESOME idea:') ... - - .skip(1) - - // ... and take the first after it. - - .first; - + final wordPairTextWidget = tester.widget(find.descendant( - + of: find.byType(BigCard), - + matching: find.byType(Text), - + )); + - final wordPairTextWidget = + - tester + - // Get all Text widgets... + - .widgetList(find.byType(Text)) + - // ... skip one ('A random AWESOME idea:') ... + - .skip(1) + - // ... and take the first after it. + - .first; + + final wordPairTextWidget = tester.widget( + + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + + ); return wordPairTextWidget.data!; } - name: Copy step_05_b_extract @@ -370,9 +364,9 @@ steps: - name: Add Card and Padding path: namer_app/lib/main.dart patch-u: | - --- a/namer_app/lib/main.dart - +++ b/namer_app/lib/main.dart - @@ -66,6 +66,11 @@ class BigCard extends StatelessWidget { + --- b/namer/step_05_c_card_padding/lib/main.dart + +++ a/namer/step_05_c_card_padding/lib/main.dart + @@ -63,6 +63,11 @@ class BigCard extends StatelessWidget { @override Widget build(BuildContext context) { @@ -396,9 +390,9 @@ steps: - name: Add Theme path: namer_app/lib/main.dart patch-u: | - --- a/namer_app/lib/main.dart - +++ b/namer_app/lib/main.dart - @@ -66,7 +66,10 @@ class BigCard extends StatelessWidget { + --- b/namer/step_05_d_theme/lib/main.dart + +++ a/namer/step_05_d_theme/lib/main.dart + @@ -63,7 +63,10 @@ class BigCard extends StatelessWidget { @override Widget build(BuildContext context) { @@ -420,9 +414,9 @@ steps: - name: Add textStyle path: namer_app/lib/main.dart patch-u: | - --- a/namer_app/lib/main.dart - +++ b/namer_app/lib/main.dart - @@ -67,12 +67,15 @@ class BigCard extends StatelessWidget { + --- b/namer/step_05_e_text_style/lib/main.dart + +++ a/namer/step_05_e_text_style/lib/main.dart + @@ -64,12 +64,15 @@ class BigCard extends StatelessWidget { @override Widget build(BuildContext context) { final theme = Theme.of(context); @@ -450,9 +444,9 @@ steps: - name: Add semanticsLabel path: namer_app/lib/main.dart patch-u: | - --- a/namer_app/lib/main.dart - +++ b/namer_app/lib/main.dart - @@ -75,7 +75,11 @@ class BigCard extends StatelessWidget { + --- b/namer/step_05_f_accessibility/lib/main.dart + +++ a/namer/step_05_f_accessibility/lib/main.dart + @@ -72,7 +72,11 @@ class BigCard extends StatelessWidget { color: theme.colorScheme.primary, child: Padding( padding: const EdgeInsets.all(20), @@ -680,9 +674,9 @@ steps: - name: Add test to check 'Like' button path: namer_app/test/widget_test.dart patch-u: | - --- a/namer_app/test/widget_test.dart - +++ b/namer_app/test/widget_test.dart - @@ -45,4 +45,26 @@ + --- b/namer/step_06_c_add_like_button/test/widget_test.dart + +++ a/namer/step_06_c_add_like_button/test/widget_test.dart + @@ -43,4 +43,26 @@ void main() { 'randomly generated at all. The button does not work.', ); }); @@ -940,12 +934,12 @@ steps: - name: Add LayoutBuilder path: namer_app/lib/main.dart patch-u: | - --- a/namer_app/lib/main.dart - +++ b/namer_app/lib/main.dart - @@ -64,39 +64,41 @@ + --- b/namer/step_07_e_add_layout_builder/lib/main.dart + +++ a/namer/step_07_e_add_layout_builder/lib/main.dart + @@ -64,38 +64,42 @@ class _MyHomePageState extends State { throw UnimplementedError('no widget for $selectedIndex'); } - + - return Scaffold( - body: Row( - children: [ @@ -956,11 +950,40 @@ steps: - NavigationRailDestination( - icon: Icon(Icons.home), - label: Text('Home'), - - ), + + return LayoutBuilder( + + builder: (context, constraints) { + + return Scaffold( + + body: Row( + + children: [ + + SafeArea( + + child: NavigationRail( + + extended: constraints.maxWidth >= 600, + + destinations: [ + + NavigationRailDestination( + + icon: Icon(Icons.home), + + label: Text('Home'), + + ), + + NavigationRailDestination( + + icon: Icon(Icons.favorite), + + label: Text('Favorites'), + + ), + + ], + + selectedIndex: selectedIndex, + + onDestinationSelected: (value) { + + setState(() { + + selectedIndex = value; + + }); + + }, + ), - NavigationRailDestination( - icon: Icon(Icons.favorite), - label: Text('Favorites'), - - ), + + ), + + Expanded( + + child: Container( + + color: Theme.of(context).colorScheme.primaryContainer, + + child: page, + ), - ], - selectedIndex: selectedIndex, - onDestinationSelected: (value) { @@ -968,50 +991,21 @@ steps: - selectedIndex = value; - }); - }, - + return LayoutBuilder(builder: (context, constraints) { - + return Scaffold( - + body: Row( - + children: [ - + SafeArea( - + child: NavigationRail( - + extended: constraints.maxWidth >= 600, - + destinations: [ - + NavigationRailDestination( - + icon: Icon(Icons.home), - + label: Text('Home'), - + ), - + NavigationRailDestination( - + icon: Icon(Icons.favorite), - + label: Text('Favorites'), - + ), - + ], - + selectedIndex: selectedIndex, - + onDestinationSelected: (value) { - + setState(() { - + selectedIndex = value; - + }); - + }, - + ), - ), + - ), - ), - Expanded( - child: Container( - color: Theme.of(context).colorScheme.primaryContainer, - child: page, - + Expanded( - + child: Container( - + color: Theme.of(context).colorScheme.primaryContainer, - + child: page, + - ), + ), - ), - - ), + + ], + ), - ], - ), - - ); - + ], - + ), - + ); - + }); + + ); + + }, + ); } } - name: Copy step_07_e_add_layout_builder @@ -1036,7 +1030,7 @@ steps: default: throw UnimplementedError('no widget for $selectedIndex'); } - @@ -174,3 +174,31 @@ class BigCard extends StatelessWidget { + @@ -173,3 +173,31 @@ class BigCard extends StatelessWidget { ); } } @@ -1047,17 +1041,17 @@ steps: + var appState = context.watch(); + + if (appState.favorites.isEmpty) { - + return Center( - + child: Text('No favorites yet.'), - + ); + + return Center(child: Text('No favorites yet.')); + } + + return ListView( + children: [ + Padding( + padding: const EdgeInsets.all(20), - + child: Text('You have ' - + '${appState.favorites.length} favorites:'), + + child: Text( + + 'You have ' + + '${appState.favorites.length} favorites:', + + ), + ), + for (var pair in appState.favorites) + ListTile( @@ -1071,48 +1065,54 @@ steps: - name: Add test to check FavoritesPage path: namer_app/test/widget_test.dart patch-u: | - --- a/namer_app/test/widget_test.dart - +++ b/namer_app/test/widget_test.dart - @@ -67,4 +67,45 @@ void main() { + --- b/namer/step_08/test/widget_test.dart + +++ a/namer/step_08/test/widget_test.dart + @@ -65,4 +65,51 @@ void main() { expect(findElevatedButtonByIcon(Icons.favorite_border), findsNothing); expect(findElevatedButtonByIcon(Icons.favorite), findsOneWidget); }); + - + testWidgets('Liked word pair shows up in Favorites', - + (WidgetTester tester) async { + + testWidgets('Liked word pair shows up in Favorites', ( + + WidgetTester tester, + + ) async { + await tester.pumpWidget(const MyApp()); + + // Find the currently shown word pair. - + final wordPairTextWidget = tester.widget(find.descendant( - + of: find.byType(BigCard), - + matching: find.byType(Text), - + )); + + final wordPairTextWidget = tester.widget( + + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + + ); + final current = wordPairTextWidget.data!; + + // Go to the Favorites page. - + await tester.tap(find.descendant( - + of: find.byType(NavigationRail), - + matching: find.byIcon(Icons.favorite), - + )); + + await tester.tap( + + find.descendant( + + of: find.byType(NavigationRail), + + matching: find.byIcon(Icons.favorite), + + ), + + ); + await tester.pumpAndSettle(); + + // Not there yet. + expect(find.text(current), findsNothing); + + // Go back to the Generator page. - + await tester.tap(find.descendant( - + of: find.byType(NavigationRail), - + matching: find.byIcon(Icons.home), - + )); + + await tester.tap( + + find.descendant( + + of: find.byType(NavigationRail), + + matching: find.byIcon(Icons.home), + + ), + + ); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Like')); + + // Go to Favorites page once again. - + await tester.tap(find.descendant( - + of: find.byType(NavigationRail), - + matching: find.byIcon(Icons.favorite), - + )); + + await tester.tap( + + find.descendant( + + of: find.byType(NavigationRail), + + matching: find.byIcon(Icons.favorite), + + ), + + ); + await tester.pumpAndSettle(); + + // Should be there. diff --git a/namer/step_03/android/.gitignore b/namer/step_03/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_03/android/.gitignore +++ b/namer/step_03/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_03/android/app/build.gradle b/namer/step_03/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_03/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_03/android/app/build.gradle.kts b/namer/step_03/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_03/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_03/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_03/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_03/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_03/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_03/android/build.gradle b/namer/step_03/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_03/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_03/android/build.gradle.kts b/namer/step_03/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_03/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_03/android/gradle.properties b/namer/step_03/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_03/android/gradle.properties +++ b/namer/step_03/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_03/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_03/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_03/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_03/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_03/android/settings.gradle b/namer/step_03/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_03/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_03/android/settings.gradle.kts b/namer/step_03/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_03/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_03/lib/main.dart b/namer/step_03/lib/main.dart index e3cd2fb505..bbd61f77e4 100644 --- a/namer/step_03/lib/main.dart +++ b/namer/step_03/lib/main.dart @@ -35,10 +35,7 @@ class MyHomePage extends StatelessWidget { return Scaffold( body: Column( - children: [ - Text('A random idea:'), - Text(appState.current.asLowerCase), - ], + children: [Text('A random idea:'), Text(appState.current.asLowerCase)], ), ); } diff --git a/namer/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_03/pubspec.yaml b/namer/step_03/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_03/pubspec.yaml +++ b/namer/step_03/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_04_a_widget/android/.gitignore b/namer/step_04_a_widget/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_04_a_widget/android/.gitignore +++ b/namer/step_04_a_widget/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_04_a_widget/android/app/build.gradle b/namer/step_04_a_widget/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_04_a_widget/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_04_a_widget/android/app/build.gradle.kts b/namer/step_04_a_widget/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_04_a_widget/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_04_a_widget/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_04_a_widget/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_04_a_widget/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_04_a_widget/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_04_a_widget/android/build.gradle b/namer/step_04_a_widget/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_04_a_widget/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_04_a_widget/android/build.gradle.kts b/namer/step_04_a_widget/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_04_a_widget/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_04_a_widget/android/gradle.properties b/namer/step_04_a_widget/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_04_a_widget/android/gradle.properties +++ b/namer/step_04_a_widget/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_04_a_widget/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_04_a_widget/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_04_a_widget/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_04_a_widget/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_04_a_widget/android/settings.gradle b/namer/step_04_a_widget/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_04_a_widget/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_04_a_widget/android/settings.gradle.kts b/namer/step_04_a_widget/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_04_a_widget/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_04_a_widget/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_04_a_widget/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_04_a_widget/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_04_a_widget/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_04_a_widget/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_04_a_widget/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_04_a_widget/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_04_a_widget/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_04_a_widget/pubspec.yaml b/namer/step_04_a_widget/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_04_a_widget/pubspec.yaml +++ b/namer/step_04_a_widget/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_04_b_behavior/android/.gitignore b/namer/step_04_b_behavior/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_04_b_behavior/android/.gitignore +++ b/namer/step_04_b_behavior/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_04_b_behavior/android/app/build.gradle b/namer/step_04_b_behavior/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_04_b_behavior/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_04_b_behavior/android/app/build.gradle.kts b/namer/step_04_b_behavior/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_04_b_behavior/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_04_b_behavior/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_04_b_behavior/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_04_b_behavior/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_04_b_behavior/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_04_b_behavior/android/build.gradle b/namer/step_04_b_behavior/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_04_b_behavior/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_04_b_behavior/android/build.gradle.kts b/namer/step_04_b_behavior/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_04_b_behavior/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_04_b_behavior/android/gradle.properties b/namer/step_04_b_behavior/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_04_b_behavior/android/gradle.properties +++ b/namer/step_04_b_behavior/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_04_b_behavior/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_04_b_behavior/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_04_b_behavior/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_04_b_behavior/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_04_b_behavior/android/settings.gradle b/namer/step_04_b_behavior/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_04_b_behavior/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_04_b_behavior/android/settings.gradle.kts b/namer/step_04_b_behavior/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_04_b_behavior/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_04_b_behavior/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_04_b_behavior/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_04_b_behavior/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_04_b_behavior/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_04_b_behavior/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_04_b_behavior/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_04_b_behavior/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_04_b_behavior/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_04_b_behavior/pubspec.yaml b/namer/step_04_b_behavior/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_04_b_behavior/pubspec.yaml +++ b/namer/step_04_b_behavior/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_04_b_behavior/test/widget_test.dart b/namer/step_04_b_behavior/test/widget_test.dart index d9e3d9b474..074e6c0f8d 100644 --- a/namer/step_04_b_behavior/test/widget_test.dart +++ b/namer/step_04_b_behavior/test/widget_test.dart @@ -13,21 +13,20 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester - // Get all Text widgets... - .widgetList(find.byType(Text)) - // ... skip one ('A random AWESOME idea:') ... - .skip(1) - // ... and take the first after it. - .first; + final wordPairTextWidget = + tester + // Get all Text widgets... + .widgetList(find.byType(Text)) + // ... skip one ('A random AWESOME idea:') ... + .skip(1) + // ... and take the first after it. + .first; return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -41,7 +40,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_05_a_pair/android/.gitignore b/namer/step_05_a_pair/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_05_a_pair/android/.gitignore +++ b/namer/step_05_a_pair/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_05_a_pair/android/app/build.gradle b/namer/step_05_a_pair/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_05_a_pair/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_05_a_pair/android/app/build.gradle.kts b/namer/step_05_a_pair/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_05_a_pair/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_05_a_pair/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_05_a_pair/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_05_a_pair/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_05_a_pair/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_05_a_pair/android/build.gradle b/namer/step_05_a_pair/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_05_a_pair/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_05_a_pair/android/build.gradle.kts b/namer/step_05_a_pair/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_05_a_pair/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_05_a_pair/android/gradle.properties b/namer/step_05_a_pair/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_05_a_pair/android/gradle.properties +++ b/namer/step_05_a_pair/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_05_a_pair/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_05_a_pair/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_05_a_pair/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_05_a_pair/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_05_a_pair/android/settings.gradle b/namer/step_05_a_pair/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_05_a_pair/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_05_a_pair/android/settings.gradle.kts b/namer/step_05_a_pair/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_05_a_pair/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_05_a_pair/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_a_pair/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_05_a_pair/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_a_pair/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_a_pair/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_a_pair/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_05_a_pair/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_a_pair/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_a_pair/pubspec.yaml b/namer/step_05_a_pair/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_05_a_pair/pubspec.yaml +++ b/namer/step_05_a_pair/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_05_a_pair/test/widget_test.dart b/namer/step_05_a_pair/test/widget_test.dart index d9e3d9b474..074e6c0f8d 100644 --- a/namer/step_05_a_pair/test/widget_test.dart +++ b/namer/step_05_a_pair/test/widget_test.dart @@ -13,21 +13,20 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester - // Get all Text widgets... - .widgetList(find.byType(Text)) - // ... skip one ('A random AWESOME idea:') ... - .skip(1) - // ... and take the first after it. - .first; + final wordPairTextWidget = + tester + // Get all Text widgets... + .widgetList(find.byType(Text)) + // ... skip one ('A random AWESOME idea:') ... + .skip(1) + // ... and take the first after it. + .first; return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -41,7 +40,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_05_b_extract/android/.gitignore b/namer/step_05_b_extract/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_05_b_extract/android/.gitignore +++ b/namer/step_05_b_extract/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_05_b_extract/android/app/build.gradle b/namer/step_05_b_extract/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_05_b_extract/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_05_b_extract/android/app/build.gradle.kts b/namer/step_05_b_extract/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_05_b_extract/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_05_b_extract/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_05_b_extract/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_05_b_extract/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_05_b_extract/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_05_b_extract/android/build.gradle b/namer/step_05_b_extract/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_05_b_extract/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_05_b_extract/android/build.gradle.kts b/namer/step_05_b_extract/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_05_b_extract/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_05_b_extract/android/gradle.properties b/namer/step_05_b_extract/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_05_b_extract/android/gradle.properties +++ b/namer/step_05_b_extract/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_05_b_extract/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_05_b_extract/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_05_b_extract/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_05_b_extract/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_05_b_extract/android/settings.gradle b/namer/step_05_b_extract/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_05_b_extract/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_05_b_extract/android/settings.gradle.kts b/namer/step_05_b_extract/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_05_b_extract/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_05_b_extract/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_b_extract/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_05_b_extract/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_b_extract/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_b_extract/lib/main.dart b/namer/step_05_b_extract/lib/main.dart index df8ad5883f..f3a55156bb 100644 --- a/namer/step_05_b_extract/lib/main.dart +++ b/namer/step_05_b_extract/lib/main.dart @@ -57,10 +57,7 @@ class MyHomePage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_05_b_extract/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_b_extract/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_05_b_extract/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_b_extract/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_b_extract/pubspec.yaml b/namer/step_05_b_extract/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_05_b_extract/pubspec.yaml +++ b/namer/step_05_b_extract/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_05_b_extract/test/widget_test.dart b/namer/step_05_b_extract/test/widget_test.dart index edfa65481d..50ae8b2f16 100644 --- a/namer/step_05_b_extract/test/widget_test.dart +++ b/namer/step_05_b_extract/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_05_c_card_padding/android/.gitignore b/namer/step_05_c_card_padding/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_05_c_card_padding/android/.gitignore +++ b/namer/step_05_c_card_padding/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_05_c_card_padding/android/app/build.gradle b/namer/step_05_c_card_padding/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_05_c_card_padding/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_05_c_card_padding/android/app/build.gradle.kts b/namer/step_05_c_card_padding/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_05_c_card_padding/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_05_c_card_padding/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_05_c_card_padding/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_05_c_card_padding/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_05_c_card_padding/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_05_c_card_padding/android/build.gradle b/namer/step_05_c_card_padding/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_05_c_card_padding/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_05_c_card_padding/android/build.gradle.kts b/namer/step_05_c_card_padding/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_05_c_card_padding/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_05_c_card_padding/android/gradle.properties b/namer/step_05_c_card_padding/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_05_c_card_padding/android/gradle.properties +++ b/namer/step_05_c_card_padding/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_05_c_card_padding/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_05_c_card_padding/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_05_c_card_padding/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_05_c_card_padding/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_05_c_card_padding/android/settings.gradle b/namer/step_05_c_card_padding/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_05_c_card_padding/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_05_c_card_padding/android/settings.gradle.kts b/namer/step_05_c_card_padding/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_05_c_card_padding/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_05_c_card_padding/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_c_card_padding/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_05_c_card_padding/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_c_card_padding/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_c_card_padding/lib/main.dart b/namer/step_05_c_card_padding/lib/main.dart index 65c3d31a88..2b4d656c0c 100644 --- a/namer/step_05_c_card_padding/lib/main.dart +++ b/namer/step_05_c_card_padding/lib/main.dart @@ -57,10 +57,7 @@ class MyHomePage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_05_c_card_padding/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_c_card_padding/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_05_c_card_padding/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_c_card_padding/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_c_card_padding/pubspec.yaml b/namer/step_05_c_card_padding/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_05_c_card_padding/pubspec.yaml +++ b/namer/step_05_c_card_padding/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_05_c_card_padding/test/widget_test.dart b/namer/step_05_c_card_padding/test/widget_test.dart index edfa65481d..50ae8b2f16 100644 --- a/namer/step_05_c_card_padding/test/widget_test.dart +++ b/namer/step_05_c_card_padding/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_05_d_theme/android/.gitignore b/namer/step_05_d_theme/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_05_d_theme/android/.gitignore +++ b/namer/step_05_d_theme/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_05_d_theme/android/app/build.gradle b/namer/step_05_d_theme/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_05_d_theme/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_05_d_theme/android/app/build.gradle.kts b/namer/step_05_d_theme/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_05_d_theme/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_05_d_theme/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_05_d_theme/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_05_d_theme/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_05_d_theme/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_05_d_theme/android/build.gradle b/namer/step_05_d_theme/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_05_d_theme/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_05_d_theme/android/build.gradle.kts b/namer/step_05_d_theme/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_05_d_theme/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_05_d_theme/android/gradle.properties b/namer/step_05_d_theme/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_05_d_theme/android/gradle.properties +++ b/namer/step_05_d_theme/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_05_d_theme/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_05_d_theme/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_05_d_theme/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_05_d_theme/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_05_d_theme/android/settings.gradle b/namer/step_05_d_theme/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_05_d_theme/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_05_d_theme/android/settings.gradle.kts b/namer/step_05_d_theme/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_05_d_theme/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_05_d_theme/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_d_theme/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_05_d_theme/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_d_theme/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_d_theme/lib/main.dart b/namer/step_05_d_theme/lib/main.dart index 40b161c32a..784e524bdb 100644 --- a/namer/step_05_d_theme/lib/main.dart +++ b/namer/step_05_d_theme/lib/main.dart @@ -57,10 +57,7 @@ class MyHomePage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_05_d_theme/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_d_theme/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_05_d_theme/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_d_theme/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_d_theme/pubspec.yaml b/namer/step_05_d_theme/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_05_d_theme/pubspec.yaml +++ b/namer/step_05_d_theme/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_05_d_theme/test/widget_test.dart b/namer/step_05_d_theme/test/widget_test.dart index edfa65481d..50ae8b2f16 100644 --- a/namer/step_05_d_theme/test/widget_test.dart +++ b/namer/step_05_d_theme/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_05_e_text_style/android/.gitignore b/namer/step_05_e_text_style/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_05_e_text_style/android/.gitignore +++ b/namer/step_05_e_text_style/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_05_e_text_style/android/app/build.gradle b/namer/step_05_e_text_style/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_05_e_text_style/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_05_e_text_style/android/app/build.gradle.kts b/namer/step_05_e_text_style/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_05_e_text_style/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_05_e_text_style/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_05_e_text_style/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_05_e_text_style/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_05_e_text_style/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_05_e_text_style/android/build.gradle b/namer/step_05_e_text_style/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_05_e_text_style/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_05_e_text_style/android/build.gradle.kts b/namer/step_05_e_text_style/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_05_e_text_style/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_05_e_text_style/android/gradle.properties b/namer/step_05_e_text_style/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_05_e_text_style/android/gradle.properties +++ b/namer/step_05_e_text_style/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_05_e_text_style/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_05_e_text_style/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_05_e_text_style/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_05_e_text_style/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_05_e_text_style/android/settings.gradle b/namer/step_05_e_text_style/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_05_e_text_style/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_05_e_text_style/android/settings.gradle.kts b/namer/step_05_e_text_style/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_05_e_text_style/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_05_e_text_style/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_e_text_style/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_05_e_text_style/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_e_text_style/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_e_text_style/lib/main.dart b/namer/step_05_e_text_style/lib/main.dart index 9efc9e4a31..e548990ea9 100644 --- a/namer/step_05_e_text_style/lib/main.dart +++ b/namer/step_05_e_text_style/lib/main.dart @@ -57,10 +57,7 @@ class MyHomePage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_05_e_text_style/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_e_text_style/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_05_e_text_style/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_e_text_style/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_e_text_style/pubspec.yaml b/namer/step_05_e_text_style/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_05_e_text_style/pubspec.yaml +++ b/namer/step_05_e_text_style/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_05_e_text_style/test/widget_test.dart b/namer/step_05_e_text_style/test/widget_test.dart index edfa65481d..50ae8b2f16 100644 --- a/namer/step_05_e_text_style/test/widget_test.dart +++ b/namer/step_05_e_text_style/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_05_f_accessibility/android/.gitignore b/namer/step_05_f_accessibility/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_05_f_accessibility/android/.gitignore +++ b/namer/step_05_f_accessibility/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_05_f_accessibility/android/app/build.gradle b/namer/step_05_f_accessibility/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_05_f_accessibility/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_05_f_accessibility/android/app/build.gradle.kts b/namer/step_05_f_accessibility/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_05_f_accessibility/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_05_f_accessibility/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_05_f_accessibility/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_05_f_accessibility/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_05_f_accessibility/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_05_f_accessibility/android/build.gradle b/namer/step_05_f_accessibility/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_05_f_accessibility/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_05_f_accessibility/android/build.gradle.kts b/namer/step_05_f_accessibility/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_05_f_accessibility/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_05_f_accessibility/android/gradle.properties b/namer/step_05_f_accessibility/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_05_f_accessibility/android/gradle.properties +++ b/namer/step_05_f_accessibility/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_05_f_accessibility/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_05_f_accessibility/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_05_f_accessibility/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_05_f_accessibility/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_05_f_accessibility/android/settings.gradle b/namer/step_05_f_accessibility/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_05_f_accessibility/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_05_f_accessibility/android/settings.gradle.kts b/namer/step_05_f_accessibility/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_05_f_accessibility/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_05_f_accessibility/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_f_accessibility/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_05_f_accessibility/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_f_accessibility/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_f_accessibility/lib/main.dart b/namer/step_05_f_accessibility/lib/main.dart index b8b557e969..f8ba0b82b2 100644 --- a/namer/step_05_f_accessibility/lib/main.dart +++ b/namer/step_05_f_accessibility/lib/main.dart @@ -57,10 +57,7 @@ class MyHomePage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_05_f_accessibility/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_f_accessibility/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_05_f_accessibility/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_f_accessibility/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_f_accessibility/pubspec.yaml b/namer/step_05_f_accessibility/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_05_f_accessibility/pubspec.yaml +++ b/namer/step_05_f_accessibility/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_05_f_accessibility/test/widget_test.dart b/namer/step_05_f_accessibility/test/widget_test.dart index edfa65481d..50ae8b2f16 100644 --- a/namer/step_05_f_accessibility/test/widget_test.dart +++ b/namer/step_05_f_accessibility/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_05_g_center_vertical/android/.gitignore b/namer/step_05_g_center_vertical/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_05_g_center_vertical/android/.gitignore +++ b/namer/step_05_g_center_vertical/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_05_g_center_vertical/android/app/build.gradle b/namer/step_05_g_center_vertical/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_05_g_center_vertical/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_05_g_center_vertical/android/app/build.gradle.kts b/namer/step_05_g_center_vertical/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_05_g_center_vertical/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_05_g_center_vertical/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_05_g_center_vertical/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_05_g_center_vertical/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_05_g_center_vertical/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_05_g_center_vertical/android/build.gradle b/namer/step_05_g_center_vertical/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_05_g_center_vertical/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_05_g_center_vertical/android/build.gradle.kts b/namer/step_05_g_center_vertical/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_05_g_center_vertical/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_05_g_center_vertical/android/gradle.properties b/namer/step_05_g_center_vertical/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_05_g_center_vertical/android/gradle.properties +++ b/namer/step_05_g_center_vertical/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_05_g_center_vertical/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_05_g_center_vertical/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_05_g_center_vertical/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_05_g_center_vertical/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_05_g_center_vertical/android/settings.gradle b/namer/step_05_g_center_vertical/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_05_g_center_vertical/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_05_g_center_vertical/android/settings.gradle.kts b/namer/step_05_g_center_vertical/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_05_g_center_vertical/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_05_g_center_vertical/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_g_center_vertical/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_05_g_center_vertical/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_g_center_vertical/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_g_center_vertical/lib/main.dart b/namer/step_05_g_center_vertical/lib/main.dart index 9b4d8554b2..d664ec1cd8 100644 --- a/namer/step_05_g_center_vertical/lib/main.dart +++ b/namer/step_05_g_center_vertical/lib/main.dart @@ -58,10 +58,7 @@ class MyHomePage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_05_g_center_vertical/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_g_center_vertical/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_05_g_center_vertical/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_g_center_vertical/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_g_center_vertical/pubspec.yaml b/namer/step_05_g_center_vertical/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_05_g_center_vertical/pubspec.yaml +++ b/namer/step_05_g_center_vertical/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_05_g_center_vertical/test/widget_test.dart b/namer/step_05_g_center_vertical/test/widget_test.dart index edfa65481d..50ae8b2f16 100644 --- a/namer/step_05_g_center_vertical/test/widget_test.dart +++ b/namer/step_05_g_center_vertical/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_05_h_center_horizontal/android/.gitignore b/namer/step_05_h_center_horizontal/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_05_h_center_horizontal/android/.gitignore +++ b/namer/step_05_h_center_horizontal/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_05_h_center_horizontal/android/app/build.gradle b/namer/step_05_h_center_horizontal/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_05_h_center_horizontal/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_05_h_center_horizontal/android/app/build.gradle.kts b/namer/step_05_h_center_horizontal/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_05_h_center_horizontal/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_05_h_center_horizontal/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_05_h_center_horizontal/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_05_h_center_horizontal/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_05_h_center_horizontal/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_05_h_center_horizontal/android/build.gradle b/namer/step_05_h_center_horizontal/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_05_h_center_horizontal/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_05_h_center_horizontal/android/build.gradle.kts b/namer/step_05_h_center_horizontal/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_05_h_center_horizontal/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_05_h_center_horizontal/android/gradle.properties b/namer/step_05_h_center_horizontal/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_05_h_center_horizontal/android/gradle.properties +++ b/namer/step_05_h_center_horizontal/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_05_h_center_horizontal/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_05_h_center_horizontal/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_05_h_center_horizontal/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_05_h_center_horizontal/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_05_h_center_horizontal/android/settings.gradle b/namer/step_05_h_center_horizontal/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_05_h_center_horizontal/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_05_h_center_horizontal/android/settings.gradle.kts b/namer/step_05_h_center_horizontal/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_05_h_center_horizontal/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_05_h_center_horizontal/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_h_center_horizontal/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_05_h_center_horizontal/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_h_center_horizontal/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_h_center_horizontal/lib/main.dart b/namer/step_05_h_center_horizontal/lib/main.dart index 971d1951e4..8a3ec510b3 100644 --- a/namer/step_05_h_center_horizontal/lib/main.dart +++ b/namer/step_05_h_center_horizontal/lib/main.dart @@ -60,10 +60,7 @@ class MyHomePage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_05_h_center_horizontal/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_h_center_horizontal/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_05_h_center_horizontal/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_h_center_horizontal/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_h_center_horizontal/pubspec.yaml b/namer/step_05_h_center_horizontal/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_05_h_center_horizontal/pubspec.yaml +++ b/namer/step_05_h_center_horizontal/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_05_h_center_horizontal/test/widget_test.dart b/namer/step_05_h_center_horizontal/test/widget_test.dart index edfa65481d..50ae8b2f16 100644 --- a/namer/step_05_h_center_horizontal/test/widget_test.dart +++ b/namer/step_05_h_center_horizontal/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_05_i_optional_changes/android/.gitignore b/namer/step_05_i_optional_changes/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_05_i_optional_changes/android/.gitignore +++ b/namer/step_05_i_optional_changes/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_05_i_optional_changes/android/app/build.gradle b/namer/step_05_i_optional_changes/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_05_i_optional_changes/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_05_i_optional_changes/android/app/build.gradle.kts b/namer/step_05_i_optional_changes/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_05_i_optional_changes/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_05_i_optional_changes/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_05_i_optional_changes/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_05_i_optional_changes/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_05_i_optional_changes/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_05_i_optional_changes/android/build.gradle b/namer/step_05_i_optional_changes/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_05_i_optional_changes/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_05_i_optional_changes/android/build.gradle.kts b/namer/step_05_i_optional_changes/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_05_i_optional_changes/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_05_i_optional_changes/android/gradle.properties b/namer/step_05_i_optional_changes/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_05_i_optional_changes/android/gradle.properties +++ b/namer/step_05_i_optional_changes/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_05_i_optional_changes/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_05_i_optional_changes/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_05_i_optional_changes/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_05_i_optional_changes/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_05_i_optional_changes/android/settings.gradle b/namer/step_05_i_optional_changes/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_05_i_optional_changes/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_05_i_optional_changes/android/settings.gradle.kts b/namer/step_05_i_optional_changes/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_05_i_optional_changes/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_05_i_optional_changes/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_i_optional_changes/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_05_i_optional_changes/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_i_optional_changes/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_i_optional_changes/lib/main.dart b/namer/step_05_i_optional_changes/lib/main.dart index 1a5b294587..25eb0baec4 100644 --- a/namer/step_05_i_optional_changes/lib/main.dart +++ b/namer/step_05_i_optional_changes/lib/main.dart @@ -60,10 +60,7 @@ class MyHomePage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_05_i_optional_changes/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_05_i_optional_changes/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_05_i_optional_changes/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_05_i_optional_changes/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_05_i_optional_changes/pubspec.yaml b/namer/step_05_i_optional_changes/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_05_i_optional_changes/pubspec.yaml +++ b/namer/step_05_i_optional_changes/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_05_i_optional_changes/test/widget_test.dart b/namer/step_05_i_optional_changes/test/widget_test.dart index f78c4b8b7e..0d96309d19 100644 --- a/namer/step_05_i_optional_changes/test/widget_test.dart +++ b/namer/step_05_i_optional_changes/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_06_a_business_logic/android/.gitignore b/namer/step_06_a_business_logic/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_06_a_business_logic/android/.gitignore +++ b/namer/step_06_a_business_logic/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_06_a_business_logic/android/app/build.gradle b/namer/step_06_a_business_logic/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_06_a_business_logic/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_06_a_business_logic/android/app/build.gradle.kts b/namer/step_06_a_business_logic/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_06_a_business_logic/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_06_a_business_logic/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_06_a_business_logic/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_06_a_business_logic/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_06_a_business_logic/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_06_a_business_logic/android/build.gradle b/namer/step_06_a_business_logic/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_06_a_business_logic/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_06_a_business_logic/android/build.gradle.kts b/namer/step_06_a_business_logic/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_06_a_business_logic/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_06_a_business_logic/android/gradle.properties b/namer/step_06_a_business_logic/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_06_a_business_logic/android/gradle.properties +++ b/namer/step_06_a_business_logic/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_06_a_business_logic/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_06_a_business_logic/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_06_a_business_logic/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_06_a_business_logic/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_06_a_business_logic/android/settings.gradle b/namer/step_06_a_business_logic/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_06_a_business_logic/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_06_a_business_logic/android/settings.gradle.kts b/namer/step_06_a_business_logic/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_06_a_business_logic/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_06_a_business_logic/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_06_a_business_logic/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_06_a_business_logic/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_06_a_business_logic/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_06_a_business_logic/lib/main.dart b/namer/step_06_a_business_logic/lib/main.dart index 98f84bcc23..b2a8316707 100644 --- a/namer/step_06_a_business_logic/lib/main.dart +++ b/namer/step_06_a_business_logic/lib/main.dart @@ -71,10 +71,7 @@ class MyHomePage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_06_a_business_logic/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_06_a_business_logic/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_06_a_business_logic/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_06_a_business_logic/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_06_a_business_logic/pubspec.yaml b/namer/step_06_a_business_logic/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_06_a_business_logic/pubspec.yaml +++ b/namer/step_06_a_business_logic/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_06_a_business_logic/test/widget_test.dart b/namer/step_06_a_business_logic/test/widget_test.dart index f78c4b8b7e..0d96309d19 100644 --- a/namer/step_06_a_business_logic/test/widget_test.dart +++ b/namer/step_06_a_business_logic/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_06_b_add_row/android/.gitignore b/namer/step_06_b_add_row/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_06_b_add_row/android/.gitignore +++ b/namer/step_06_b_add_row/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_06_b_add_row/android/app/build.gradle b/namer/step_06_b_add_row/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_06_b_add_row/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_06_b_add_row/android/app/build.gradle.kts b/namer/step_06_b_add_row/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_06_b_add_row/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_06_b_add_row/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_06_b_add_row/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_06_b_add_row/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_06_b_add_row/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_06_b_add_row/android/build.gradle b/namer/step_06_b_add_row/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_06_b_add_row/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_06_b_add_row/android/build.gradle.kts b/namer/step_06_b_add_row/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_06_b_add_row/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_06_b_add_row/android/gradle.properties b/namer/step_06_b_add_row/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_06_b_add_row/android/gradle.properties +++ b/namer/step_06_b_add_row/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_06_b_add_row/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_06_b_add_row/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_06_b_add_row/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_06_b_add_row/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_06_b_add_row/android/settings.gradle b/namer/step_06_b_add_row/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_06_b_add_row/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_06_b_add_row/android/settings.gradle.kts b/namer/step_06_b_add_row/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_06_b_add_row/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_06_b_add_row/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_06_b_add_row/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_06_b_add_row/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_06_b_add_row/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_06_b_add_row/lib/main.dart b/namer/step_06_b_add_row/lib/main.dart index 718ba38b10..c5c06222cf 100644 --- a/namer/step_06_b_add_row/lib/main.dart +++ b/namer/step_06_b_add_row/lib/main.dart @@ -76,10 +76,7 @@ class MyHomePage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_06_b_add_row/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_06_b_add_row/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_06_b_add_row/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_06_b_add_row/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_06_b_add_row/pubspec.yaml b/namer/step_06_b_add_row/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_06_b_add_row/pubspec.yaml +++ b/namer/step_06_b_add_row/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_06_b_add_row/test/widget_test.dart b/namer/step_06_b_add_row/test/widget_test.dart index f78c4b8b7e..0d96309d19 100644 --- a/namer/step_06_b_add_row/test/widget_test.dart +++ b/namer/step_06_b_add_row/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_06_c_add_like_button/android/.gitignore b/namer/step_06_c_add_like_button/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_06_c_add_like_button/android/.gitignore +++ b/namer/step_06_c_add_like_button/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_06_c_add_like_button/android/app/build.gradle b/namer/step_06_c_add_like_button/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_06_c_add_like_button/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_06_c_add_like_button/android/app/build.gradle.kts b/namer/step_06_c_add_like_button/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_06_c_add_like_button/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_06_c_add_like_button/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_06_c_add_like_button/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_06_c_add_like_button/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_06_c_add_like_button/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_06_c_add_like_button/android/build.gradle b/namer/step_06_c_add_like_button/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_06_c_add_like_button/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_06_c_add_like_button/android/build.gradle.kts b/namer/step_06_c_add_like_button/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_06_c_add_like_button/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_06_c_add_like_button/android/gradle.properties b/namer/step_06_c_add_like_button/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_06_c_add_like_button/android/gradle.properties +++ b/namer/step_06_c_add_like_button/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_06_c_add_like_button/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_06_c_add_like_button/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_06_c_add_like_button/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_06_c_add_like_button/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_06_c_add_like_button/android/settings.gradle b/namer/step_06_c_add_like_button/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_06_c_add_like_button/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_06_c_add_like_button/android/settings.gradle.kts b/namer/step_06_c_add_like_button/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_06_c_add_like_button/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_06_c_add_like_button/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_06_c_add_like_button/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_06_c_add_like_button/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_06_c_add_like_button/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_06_c_add_like_button/lib/main.dart b/namer/step_06_c_add_like_button/lib/main.dart index 8bd96c095c..1a04180976 100644 --- a/namer/step_06_c_add_like_button/lib/main.dart +++ b/namer/step_06_c_add_like_button/lib/main.dart @@ -91,10 +91,7 @@ class MyHomePage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_06_c_add_like_button/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_06_c_add_like_button/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_06_c_add_like_button/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_06_c_add_like_button/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_06_c_add_like_button/pubspec.yaml b/namer/step_06_c_add_like_button/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_06_c_add_like_button/pubspec.yaml +++ b/namer/step_06_c_add_like_button/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_06_c_add_like_button/test/widget_test.dart b/namer/step_06_c_add_like_button/test/widget_test.dart index 528bd2d6fd..e4176ea2b9 100644 --- a/namer/step_06_c_add_like_button/test/widget_test.dart +++ b/namer/step_06_c_add_like_button/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_07_a_split_my_home_page/android/.gitignore b/namer/step_07_a_split_my_home_page/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_07_a_split_my_home_page/android/.gitignore +++ b/namer/step_07_a_split_my_home_page/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_07_a_split_my_home_page/android/app/build.gradle b/namer/step_07_a_split_my_home_page/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_07_a_split_my_home_page/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_07_a_split_my_home_page/android/app/build.gradle.kts b/namer/step_07_a_split_my_home_page/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_07_a_split_my_home_page/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_07_a_split_my_home_page/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_07_a_split_my_home_page/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_07_a_split_my_home_page/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_07_a_split_my_home_page/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_07_a_split_my_home_page/android/build.gradle b/namer/step_07_a_split_my_home_page/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_07_a_split_my_home_page/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_07_a_split_my_home_page/android/build.gradle.kts b/namer/step_07_a_split_my_home_page/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_07_a_split_my_home_page/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_07_a_split_my_home_page/android/gradle.properties b/namer/step_07_a_split_my_home_page/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_07_a_split_my_home_page/android/gradle.properties +++ b/namer/step_07_a_split_my_home_page/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_07_a_split_my_home_page/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_07_a_split_my_home_page/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_07_a_split_my_home_page/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_07_a_split_my_home_page/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_07_a_split_my_home_page/android/settings.gradle b/namer/step_07_a_split_my_home_page/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_07_a_split_my_home_page/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_07_a_split_my_home_page/android/settings.gradle.kts b/namer/step_07_a_split_my_home_page/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_07_a_split_my_home_page/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_07_a_split_my_home_page/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_07_a_split_my_home_page/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_07_a_split_my_home_page/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_07_a_split_my_home_page/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_07_a_split_my_home_page/lib/main.dart b/namer/step_07_a_split_my_home_page/lib/main.dart index 9fb6206a79..0f4e62edf0 100644 --- a/namer/step_07_a_split_my_home_page/lib/main.dart +++ b/namer/step_07_a_split_my_home_page/lib/main.dart @@ -126,10 +126,7 @@ class GeneratorPage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_07_a_split_my_home_page/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_07_a_split_my_home_page/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_07_a_split_my_home_page/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_07_a_split_my_home_page/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_07_a_split_my_home_page/pubspec.yaml b/namer/step_07_a_split_my_home_page/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_07_a_split_my_home_page/pubspec.yaml +++ b/namer/step_07_a_split_my_home_page/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_07_a_split_my_home_page/test/widget_test.dart b/namer/step_07_a_split_my_home_page/test/widget_test.dart index 528bd2d6fd..e4176ea2b9 100644 --- a/namer/step_07_a_split_my_home_page/test/widget_test.dart +++ b/namer/step_07_a_split_my_home_page/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_07_b_convert_to_stateful/android/.gitignore b/namer/step_07_b_convert_to_stateful/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_07_b_convert_to_stateful/android/.gitignore +++ b/namer/step_07_b_convert_to_stateful/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_07_b_convert_to_stateful/android/app/build.gradle b/namer/step_07_b_convert_to_stateful/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_07_b_convert_to_stateful/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_07_b_convert_to_stateful/android/app/build.gradle.kts b/namer/step_07_b_convert_to_stateful/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_07_b_convert_to_stateful/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_07_b_convert_to_stateful/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_07_b_convert_to_stateful/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_07_b_convert_to_stateful/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_07_b_convert_to_stateful/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_07_b_convert_to_stateful/android/build.gradle b/namer/step_07_b_convert_to_stateful/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_07_b_convert_to_stateful/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_07_b_convert_to_stateful/android/build.gradle.kts b/namer/step_07_b_convert_to_stateful/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_07_b_convert_to_stateful/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_07_b_convert_to_stateful/android/gradle.properties b/namer/step_07_b_convert_to_stateful/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_07_b_convert_to_stateful/android/gradle.properties +++ b/namer/step_07_b_convert_to_stateful/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_07_b_convert_to_stateful/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_07_b_convert_to_stateful/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_07_b_convert_to_stateful/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_07_b_convert_to_stateful/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_07_b_convert_to_stateful/android/settings.gradle b/namer/step_07_b_convert_to_stateful/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_07_b_convert_to_stateful/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_07_b_convert_to_stateful/android/settings.gradle.kts b/namer/step_07_b_convert_to_stateful/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_07_b_convert_to_stateful/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_07_b_convert_to_stateful/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_07_b_convert_to_stateful/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_07_b_convert_to_stateful/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_07_b_convert_to_stateful/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_07_b_convert_to_stateful/lib/main.dart b/namer/step_07_b_convert_to_stateful/lib/main.dart index 4a4cc36dc2..aba92ad06e 100644 --- a/namer/step_07_b_convert_to_stateful/lib/main.dart +++ b/namer/step_07_b_convert_to_stateful/lib/main.dart @@ -131,10 +131,7 @@ class GeneratorPage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_07_b_convert_to_stateful/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_07_b_convert_to_stateful/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_07_b_convert_to_stateful/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_07_b_convert_to_stateful/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_07_b_convert_to_stateful/pubspec.yaml b/namer/step_07_b_convert_to_stateful/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_07_b_convert_to_stateful/pubspec.yaml +++ b/namer/step_07_b_convert_to_stateful/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_07_b_convert_to_stateful/test/widget_test.dart b/namer/step_07_b_convert_to_stateful/test/widget_test.dart index 528bd2d6fd..e4176ea2b9 100644 --- a/namer/step_07_b_convert_to_stateful/test/widget_test.dart +++ b/namer/step_07_b_convert_to_stateful/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_07_c_add_selectedindex/android/.gitignore b/namer/step_07_c_add_selectedindex/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_07_c_add_selectedindex/android/.gitignore +++ b/namer/step_07_c_add_selectedindex/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_07_c_add_selectedindex/android/app/build.gradle b/namer/step_07_c_add_selectedindex/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_07_c_add_selectedindex/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_07_c_add_selectedindex/android/app/build.gradle.kts b/namer/step_07_c_add_selectedindex/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_07_c_add_selectedindex/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_07_c_add_selectedindex/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_07_c_add_selectedindex/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_07_c_add_selectedindex/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_07_c_add_selectedindex/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_07_c_add_selectedindex/android/build.gradle b/namer/step_07_c_add_selectedindex/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_07_c_add_selectedindex/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_07_c_add_selectedindex/android/build.gradle.kts b/namer/step_07_c_add_selectedindex/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_07_c_add_selectedindex/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_07_c_add_selectedindex/android/gradle.properties b/namer/step_07_c_add_selectedindex/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_07_c_add_selectedindex/android/gradle.properties +++ b/namer/step_07_c_add_selectedindex/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_07_c_add_selectedindex/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_07_c_add_selectedindex/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_07_c_add_selectedindex/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_07_c_add_selectedindex/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_07_c_add_selectedindex/android/settings.gradle b/namer/step_07_c_add_selectedindex/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_07_c_add_selectedindex/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_07_c_add_selectedindex/android/settings.gradle.kts b/namer/step_07_c_add_selectedindex/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_07_c_add_selectedindex/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_07_c_add_selectedindex/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_07_c_add_selectedindex/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_07_c_add_selectedindex/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_07_c_add_selectedindex/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_07_c_add_selectedindex/lib/main.dart b/namer/step_07_c_add_selectedindex/lib/main.dart index cde769b27f..3c11d4b739 100644 --- a/namer/step_07_c_add_selectedindex/lib/main.dart +++ b/namer/step_07_c_add_selectedindex/lib/main.dart @@ -135,10 +135,7 @@ class GeneratorPage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_07_c_add_selectedindex/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_07_c_add_selectedindex/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_07_c_add_selectedindex/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_07_c_add_selectedindex/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_07_c_add_selectedindex/pubspec.yaml b/namer/step_07_c_add_selectedindex/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_07_c_add_selectedindex/pubspec.yaml +++ b/namer/step_07_c_add_selectedindex/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_07_c_add_selectedindex/test/widget_test.dart b/namer/step_07_c_add_selectedindex/test/widget_test.dart index 528bd2d6fd..e4176ea2b9 100644 --- a/namer/step_07_c_add_selectedindex/test/widget_test.dart +++ b/namer/step_07_c_add_selectedindex/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_07_d_use_selectedindex/android/.gitignore b/namer/step_07_d_use_selectedindex/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_07_d_use_selectedindex/android/.gitignore +++ b/namer/step_07_d_use_selectedindex/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_07_d_use_selectedindex/android/app/build.gradle b/namer/step_07_d_use_selectedindex/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_07_d_use_selectedindex/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_07_d_use_selectedindex/android/app/build.gradle.kts b/namer/step_07_d_use_selectedindex/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_07_d_use_selectedindex/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_07_d_use_selectedindex/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_07_d_use_selectedindex/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_07_d_use_selectedindex/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_07_d_use_selectedindex/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_07_d_use_selectedindex/android/build.gradle b/namer/step_07_d_use_selectedindex/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_07_d_use_selectedindex/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_07_d_use_selectedindex/android/build.gradle.kts b/namer/step_07_d_use_selectedindex/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_07_d_use_selectedindex/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_07_d_use_selectedindex/android/gradle.properties b/namer/step_07_d_use_selectedindex/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_07_d_use_selectedindex/android/gradle.properties +++ b/namer/step_07_d_use_selectedindex/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_07_d_use_selectedindex/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_07_d_use_selectedindex/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_07_d_use_selectedindex/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_07_d_use_selectedindex/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_07_d_use_selectedindex/android/settings.gradle b/namer/step_07_d_use_selectedindex/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_07_d_use_selectedindex/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_07_d_use_selectedindex/android/settings.gradle.kts b/namer/step_07_d_use_selectedindex/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_07_d_use_selectedindex/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_07_d_use_selectedindex/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_07_d_use_selectedindex/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_07_d_use_selectedindex/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_07_d_use_selectedindex/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_07_d_use_selectedindex/lib/main.dart b/namer/step_07_d_use_selectedindex/lib/main.dart index 12b9ad4a60..756d236c47 100644 --- a/namer/step_07_d_use_selectedindex/lib/main.dart +++ b/namer/step_07_d_use_selectedindex/lib/main.dart @@ -145,10 +145,7 @@ class GeneratorPage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_07_d_use_selectedindex/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_07_d_use_selectedindex/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_07_d_use_selectedindex/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_07_d_use_selectedindex/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_07_d_use_selectedindex/pubspec.yaml b/namer/step_07_d_use_selectedindex/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_07_d_use_selectedindex/pubspec.yaml +++ b/namer/step_07_d_use_selectedindex/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_07_d_use_selectedindex/test/widget_test.dart b/namer/step_07_d_use_selectedindex/test/widget_test.dart index 528bd2d6fd..e4176ea2b9 100644 --- a/namer/step_07_d_use_selectedindex/test/widget_test.dart +++ b/namer/step_07_d_use_selectedindex/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_07_e_add_layout_builder/android/.gitignore b/namer/step_07_e_add_layout_builder/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_07_e_add_layout_builder/android/.gitignore +++ b/namer/step_07_e_add_layout_builder/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_07_e_add_layout_builder/android/app/build.gradle b/namer/step_07_e_add_layout_builder/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_07_e_add_layout_builder/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_07_e_add_layout_builder/android/app/build.gradle.kts b/namer/step_07_e_add_layout_builder/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_07_e_add_layout_builder/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_07_e_add_layout_builder/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_07_e_add_layout_builder/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_07_e_add_layout_builder/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_07_e_add_layout_builder/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_07_e_add_layout_builder/android/build.gradle b/namer/step_07_e_add_layout_builder/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_07_e_add_layout_builder/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_07_e_add_layout_builder/android/build.gradle.kts b/namer/step_07_e_add_layout_builder/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_07_e_add_layout_builder/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_07_e_add_layout_builder/android/gradle.properties b/namer/step_07_e_add_layout_builder/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_07_e_add_layout_builder/android/gradle.properties +++ b/namer/step_07_e_add_layout_builder/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_07_e_add_layout_builder/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_07_e_add_layout_builder/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_07_e_add_layout_builder/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_07_e_add_layout_builder/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_07_e_add_layout_builder/android/settings.gradle b/namer/step_07_e_add_layout_builder/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_07_e_add_layout_builder/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_07_e_add_layout_builder/android/settings.gradle.kts b/namer/step_07_e_add_layout_builder/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_07_e_add_layout_builder/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_07_e_add_layout_builder/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_07_e_add_layout_builder/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_07_e_add_layout_builder/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_07_e_add_layout_builder/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_07_e_add_layout_builder/lib/main.dart b/namer/step_07_e_add_layout_builder/lib/main.dart index 23e54d9d02..c5dcd1fa3a 100644 --- a/namer/step_07_e_add_layout_builder/lib/main.dart +++ b/namer/step_07_e_add_layout_builder/lib/main.dart @@ -64,41 +64,43 @@ class _MyHomePageState extends State { throw UnimplementedError('no widget for $selectedIndex'); } - return LayoutBuilder(builder: (context, constraints) { - return Scaffold( - body: Row( - children: [ - SafeArea( - child: NavigationRail( - extended: constraints.maxWidth >= 600, - destinations: [ - NavigationRailDestination( - icon: Icon(Icons.home), - label: Text('Home'), - ), - NavigationRailDestination( - icon: Icon(Icons.favorite), - label: Text('Favorites'), - ), - ], - selectedIndex: selectedIndex, - onDestinationSelected: (value) { - setState(() { - selectedIndex = value; - }); - }, + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + body: Row( + children: [ + SafeArea( + child: NavigationRail( + extended: constraints.maxWidth >= 600, + destinations: [ + NavigationRailDestination( + icon: Icon(Icons.home), + label: Text('Home'), + ), + NavigationRailDestination( + icon: Icon(Icons.favorite), + label: Text('Favorites'), + ), + ], + selectedIndex: selectedIndex, + onDestinationSelected: (value) { + setState(() { + selectedIndex = value; + }); + }, + ), ), - ), - Expanded( - child: Container( - color: Theme.of(context).colorScheme.primaryContainer, - child: page, + Expanded( + child: Container( + color: Theme.of(context).colorScheme.primaryContainer, + child: page, + ), ), - ), - ], - ), - ); - }); + ], + ), + ); + }, + ); } } @@ -147,10 +149,7 @@ class GeneratorPage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; diff --git a/namer/step_07_e_add_layout_builder/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_07_e_add_layout_builder/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_07_e_add_layout_builder/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_07_e_add_layout_builder/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_07_e_add_layout_builder/pubspec.yaml b/namer/step_07_e_add_layout_builder/pubspec.yaml index 2b51d8763d..224748d04a 100644 --- a/namer/step_07_e_add_layout_builder/pubspec.yaml +++ b/namer/step_07_e_add_layout_builder/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_07_e_add_layout_builder/test/widget_test.dart b/namer/step_07_e_add_layout_builder/test/widget_test.dart index 528bd2d6fd..e4176ea2b9 100644 --- a/namer/step_07_e_add_layout_builder/test/widget_test.dart +++ b/namer/step_07_e_add_layout_builder/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' diff --git a/namer/step_08/android/.gitignore b/namer/step_08/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/namer/step_08/android/.gitignore +++ b/namer/step_08/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/namer/step_08/android/app/build.gradle b/namer/step_08/android/app/build.gradle deleted file mode 100644 index 5537b83860..0000000000 --- a/namer/step_08/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.namer_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.namer_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/namer/step_08/android/app/build.gradle.kts b/namer/step_08/android/app/build.gradle.kts new file mode 100644 index 0000000000..41c1de824b --- /dev/null +++ b/namer/step_08/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.namer_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.namer_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/namer/step_08/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt b/namer/step_08/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt index 461d0f8fc8..712f297754 100644 --- a/namer/step_08/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt +++ b/namer/step_08/android/app/src/main/kotlin/com/example/namer_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.namer_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/namer/step_08/android/build.gradle b/namer/step_08/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/namer/step_08/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/namer/step_08/android/build.gradle.kts b/namer/step_08/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/namer/step_08/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/namer/step_08/android/gradle.properties b/namer/step_08/android/gradle.properties index 2597170821..f018a61817 100644 --- a/namer/step_08/android/gradle.properties +++ b/namer/step_08/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/namer/step_08/android/gradle/wrapper/gradle-wrapper.properties b/namer/step_08/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/namer/step_08/android/gradle/wrapper/gradle-wrapper.properties +++ b/namer/step_08/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/namer/step_08/android/settings.gradle b/namer/step_08/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/namer/step_08/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/namer/step_08/android/settings.gradle.kts b/namer/step_08/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/namer/step_08/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/namer/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/namer/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_08/lib/main.dart b/namer/step_08/lib/main.dart index 9c2e702033..0f4ea29715 100644 --- a/namer/step_08/lib/main.dart +++ b/namer/step_08/lib/main.dart @@ -64,41 +64,43 @@ class _MyHomePageState extends State { throw UnimplementedError('no widget for $selectedIndex'); } - return LayoutBuilder(builder: (context, constraints) { - return Scaffold( - body: Row( - children: [ - SafeArea( - child: NavigationRail( - extended: constraints.maxWidth >= 600, - destinations: [ - NavigationRailDestination( - icon: Icon(Icons.home), - label: Text('Home'), - ), - NavigationRailDestination( - icon: Icon(Icons.favorite), - label: Text('Favorites'), - ), - ], - selectedIndex: selectedIndex, - onDestinationSelected: (value) { - setState(() { - selectedIndex = value; - }); - }, + return LayoutBuilder( + builder: (context, constraints) { + return Scaffold( + body: Row( + children: [ + SafeArea( + child: NavigationRail( + extended: constraints.maxWidth >= 600, + destinations: [ + NavigationRailDestination( + icon: Icon(Icons.home), + label: Text('Home'), + ), + NavigationRailDestination( + icon: Icon(Icons.favorite), + label: Text('Favorites'), + ), + ], + selectedIndex: selectedIndex, + onDestinationSelected: (value) { + setState(() { + selectedIndex = value; + }); + }, + ), ), - ), - Expanded( - child: Container( - color: Theme.of(context).colorScheme.primaryContainer, - child: page, + Expanded( + child: Container( + color: Theme.of(context).colorScheme.primaryContainer, + child: page, + ), ), - ), - ], - ), - ); - }); + ], + ), + ); + }, + ); } } @@ -147,10 +149,7 @@ class GeneratorPage extends StatelessWidget { } class BigCard extends StatelessWidget { - const BigCard({ - super.key, - required this.pair, - }); + const BigCard({super.key, required this.pair}); final WordPair pair; @@ -181,17 +180,17 @@ class FavoritesPage extends StatelessWidget { var appState = context.watch(); if (appState.favorites.isEmpty) { - return Center( - child: Text('No favorites yet.'), - ); + return Center(child: Text('No favorites yet.')); } return ListView( children: [ Padding( padding: const EdgeInsets.all(20), - child: Text('You have ' - '${appState.favorites.length} favorites:'), + child: Text( + 'You have ' + '${appState.favorites.length} favorites:', + ), ), for (var pair in appState.favorites) ListTile( diff --git a/namer/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/namer/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index d67aea3f66..5302c2b7e8 100644 --- a/namer/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/namer/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/namer/step_08/pubspec.yaml b/namer/step_08/pubspec.yaml index a7ba7571e6..3380c91553 100644 --- a/namer/step_08/pubspec.yaml +++ b/namer/step_08/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 0.0.1+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: diff --git a/namer/step_08/test/widget_test.dart b/namer/step_08/test/widget_test.dart index 3a0f557bcc..b7f97317be 100644 --- a/namer/step_08/test/widget_test.dart +++ b/namer/step_08/test/widget_test.dart @@ -13,18 +13,15 @@ void main() { await tester.pumpWidget(const MyApp()); String findWordPair() { - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); return wordPairTextWidget.data!; } // Tap several times and keep a list of word pair values. const tryCount = 5; - final pairs = [ - findWordPair(), - ]; + final pairs = [findWordPair()]; for (var i = 1; i < tryCount; i++) { await tester.tap(find.text('Next')); await tester.pumpAndSettle(); @@ -38,7 +35,8 @@ void main() { // We only fail this test when there is zero variance - all the // word pairs are the same, even though we clicked 'Next' several times. hasLength(greaterThan(1)), - reason: 'After clicking $tryCount times, ' + reason: + 'After clicking $tryCount times, ' 'the app should have generated at least two different word pairs. ' 'Instead, the app showed these: $pairs. ' 'That almost certainly means that the word pair is not being ' @@ -68,41 +66,47 @@ void main() { expect(findElevatedButtonByIcon(Icons.favorite), findsOneWidget); }); - testWidgets('Liked word pair shows up in Favorites', - (WidgetTester tester) async { + testWidgets('Liked word pair shows up in Favorites', ( + WidgetTester tester, + ) async { await tester.pumpWidget(const MyApp()); // Find the currently shown word pair. - final wordPairTextWidget = tester.widget(find.descendant( - of: find.byType(BigCard), - matching: find.byType(Text), - )); + final wordPairTextWidget = tester.widget( + find.descendant(of: find.byType(BigCard), matching: find.byType(Text)), + ); final current = wordPairTextWidget.data!; // Go to the Favorites page. - await tester.tap(find.descendant( - of: find.byType(NavigationRail), - matching: find.byIcon(Icons.favorite), - )); + await tester.tap( + find.descendant( + of: find.byType(NavigationRail), + matching: find.byIcon(Icons.favorite), + ), + ); await tester.pumpAndSettle(); // Not there yet. expect(find.text(current), findsNothing); // Go back to the Generator page. - await tester.tap(find.descendant( - of: find.byType(NavigationRail), - matching: find.byIcon(Icons.home), - )); + await tester.tap( + find.descendant( + of: find.byType(NavigationRail), + matching: find.byIcon(Icons.home), + ), + ); await tester.pumpAndSettle(); await tester.tap(find.text('Like')); // Go to Favorites page once again. - await tester.tap(find.descendant( - of: find.byType(NavigationRail), - matching: find.byIcon(Icons.favorite), - )); + await tester.tap( + find.descendant( + of: find.byType(NavigationRail), + matching: find.byIcon(Icons.favorite), + ), + ); await tester.pumpAndSettle(); // Should be there. diff --git a/next-gen-ui/codelab_rebuild.yaml b/next-gen-ui/codelab_rebuild.yaml index d085a11a71..e0b0a5293d 100644 --- a/next-gen-ui/codelab_rebuild.yaml +++ b/next-gen-ui/codelab_rebuild.yaml @@ -697,13 +697,13 @@ steps: // Copyright 2023 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:ui'; - + class AssetPaths { /// Images static const String _images = 'assets/images'; - + static const String titleBgBase = '$_images/bg-base.jpg'; static const String titleBgReceive = '$_images/bg-light-receive.png'; static const String titleFgEmit = '$_images/fg-light-emit.png'; @@ -718,20 +718,20 @@ steps: static const String titleSelectedLeft = '$_images/select-left.png'; static const String titleSelectedRight = '$_images/select-right.png'; static const String pulseParticle = '$_images/particle3.png'; - + /// Shaders static const String _shaders = 'assets/shaders'; static const String orbShader = '$_shaders/orb_shader.frag'; static const String uiShader = '$_shaders/ui_glitch.frag'; } - + typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); - + Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); - + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), + ); + Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); } @@ -741,32 +741,35 @@ steps: // Copyright 2023 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); - + static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } - + abstract class AppColors { static const orbColors = [ Color(0xFF71FDBF), Color(0xFFCE33FF), Color(0xFFFF5033), ]; - + static const emitColors = [ Color(0xFF96FF33), Color(0xFF00FFFF), @@ -782,24 +785,21 @@ steps: // Copyright 2023 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; - + import 'ticking_builder.dart'; - - typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); - + + typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); + class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); } - + class _ReactiveWidgetState extends State { @override Widget build(BuildContext context) { @@ -820,13 +820,13 @@ steps: // Copyright 2023 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:ui' as ui; - + import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_animate/flutter_animate.dart'; - + /** * This is an unfinished, pre-release effect for Flutter Animate: * https://pub.dev/packages/flutter_animate @@ -838,9 +838,9 @@ steps: * SDK, this effect will be updated, tested, refined, and added to the * effects.dart file. */ - + // TODO: document. - + /// An effect that lets you apply an animated fragment shader to a target. @immutable class ShaderEffect extends Effect { @@ -851,16 +851,13 @@ steps: this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); - + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); + final ui.FragmentShader? shader; final ShaderUpdateCallback? update; final ShaderLayer layer; - + @override Widget build( BuildContext context, @@ -881,14 +878,14 @@ steps: } Rect rect = Rect.fromLTWH(0, 0, size.width, size.height); rect = insets?.inflateRect(rect) ?? rect; - + void drawImage() { canvas.save(); canvas.scale(ratio, ratio); canvas.drawImage(image, Offset.zero, Paint()); canvas.restore(); } - + if (layer == ShaderLayer.foreground) drawImage(); if (shader != null) canvas.drawRect(rect, Paint()..shader = shader); if (layer == ShaderLayer.background) drawImage(); @@ -900,7 +897,7 @@ steps: ); } } - + extension ShaderEffectExtensions on AnimateManager { /// Adds a [shader] extension to [AnimateManager] ([Animate] and [AnimateList]). T shader({ @@ -910,38 +907,41 @@ steps: ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } - + enum ShaderLayer { foreground, background, replace } - + /// Function signature for [ShaderEffect] update handlers. - typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); - + typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); + /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: // https://github.com/jonahwilliams/flutter_shaders - + // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + /// A callback for the [AnimatedSamplerBuilder] widget. - typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, - ); - + typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); + /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. /// @@ -986,38 +986,34 @@ steps: super.key, this.enabled = true, }); - + /// A callback used by this widget to provide the children captured in /// a texture. final AnimatedSamplerBuilder builder; - + /// Whether the children should be captured in a texture or displayed as /// normal. final bool enabled; - + /// The child widget. final Widget child; - + @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } - + class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { const _ShaderSamplerBuilder( this.builder, { super.child, required this.enabled, }); - + final AnimatedSamplerBuilder builder; final bool enabled; - + @override RenderObject createRenderObject(BuildContext context) { return _RenderShaderSamplerBuilderWidget( @@ -1026,17 +1022,19 @@ steps: enabled: enabled, ); } - + @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder ..enabled = enabled; } } - + // A render object that conditionally converts its child into a [ui.Image] // and then paints it in place of the child. class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { @@ -1045,13 +1043,14 @@ steps: required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; - + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; + @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -1060,7 +1059,7 @@ steps: ..devicePixelRatio = devicePixelRatio; return layer; } - + /// The device pixel ratio used to create the child image. double get devicePixelRatio => _devicePixelRatio; double _devicePixelRatio; @@ -1071,7 +1070,7 @@ steps: _devicePixelRatio = value; markNeedsCompositedLayerUpdate(); } - + /// The painter used to paint the child snapshot or child widgets. AnimatedSamplerBuilder get builder => _builder; AnimatedSamplerBuilder _builder; @@ -1082,7 +1081,7 @@ steps: _builder = value; markNeedsCompositedLayerUpdate(); } - + bool get enabled => _enabled; bool _enabled; set enabled(bool value) { @@ -1093,13 +1092,13 @@ steps: markNeedsPaint(); markNeedsCompositingBitsUpdate(); } - + @override bool get isRepaintBoundary => alwaysNeedsCompositing; - + @override bool get alwaysNeedsCompositing => enabled; - + @override void paint(PaintingContext context, Offset offset) { if (size.isEmpty || !_enabled) { @@ -1109,12 +1108,12 @@ steps: return super.paint(context, offset); } } - + /// A [Layer] that uses an [AnimatedSamplerBuilder] to create a [ui.Picture] /// every time it is added to a scene. class _ShaderSamplerBuilderLayer extends OffsetLayer { _ShaderSamplerBuilderLayer(this._callback); - + Size get size => _size; Size _size = Size.zero; set size(Size value) { @@ -1124,7 +1123,7 @@ steps: _size = value; markNeedsAddToScene(); } - + double get devicePixelRatio => _devicePixelRatio; double _devicePixelRatio = 1.0; set devicePixelRatio(double value) { @@ -1134,7 +1133,7 @@ steps: _devicePixelRatio = value; markNeedsAddToScene(); } - + AnimatedSamplerBuilder get callback => _callback; AnimatedSamplerBuilder _callback; set callback(AnimatedSamplerBuilder value) { @@ -1144,27 +1143,27 @@ steps: _callback = value; markNeedsAddToScene(); } - + ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } - + @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { @@ -1254,11 +1253,11 @@ steps: // Copyright 2023 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:math'; - + import 'package:flutter/material.dart'; - + class UiScaler extends StatelessWidget { const UiScaler({ super.key, @@ -1266,20 +1265,16 @@ steps: required this.alignment, this.referenceHeight = 1080, }); - + final int referenceHeight; final Widget child; final Alignment alignment; - + @override Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } - name: mkdir lib/orb_shader @@ -1312,14 +1307,14 @@ steps: this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; @@ -1454,11 +1449,13 @@ steps: v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); @@ -1507,20 +1504,20 @@ steps: // Copyright 2023 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:async'; import 'dart:math'; import 'dart:ui'; - + import 'package:flutter/material.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:provider/provider.dart'; - + import '../assets.dart'; import '../common/reactive_widget.dart'; import 'orb_shader_config.dart'; import 'orb_shader_painter.dart'; - + class OrbShaderWidget extends StatefulWidget { const OrbShaderWidget({ super.key, @@ -1529,84 +1526,94 @@ steps: required this.mousePos, required this.minEnergy, }); - + final double minEnergy; final OrbShaderConfig config; final Offset mousePos; final void Function(double energy)? onUpdate; - + @override State createState() => OrbShaderWidgetState(); } - + class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); - - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); - + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); + + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); + @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -1614,6 +1621,8 @@ steps: ); }, ); + }, + ); } - name: Replace lib/main.dart path: next_gen_ui/lib/main.dart @@ -1944,9 +1953,7 @@ steps: import '../styles.dart'; class TitleScreenUi extends StatelessWidget { - const TitleScreenUi({ - super.key, - }); + const TitleScreenUi({super.key}); @override Widget build(BuildContext context) { return const Padding( @@ -1955,10 +1962,7 @@ steps: children: [ /// Title Text TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), ], ), @@ -2006,15 +2010,13 @@ steps: class TitleScreen extends StatelessWidget { const TitleScreen({super.key}); - @@ -70,6 +71,11 @@ class TitleScreen extends StatelessWidget { + @@ -70,6 +71,9 @@ class TitleScreen extends StatelessWidget { color: emitColor, lightAmt: _finalEmitLightAmt, ), + + /// UI - + const Positioned.fill( - + child: TitleScreenUi(), - + ), + + const Positioned.fill(child: TitleScreenUi()), ], ), ), @@ -2048,14 +2050,17 @@ steps: import 'package:gap/gap.dart'; import '../assets.dart'; - @@ -13,20 +14,40 @@ import '../styles.dart'; + @@ -11,17 +12,39 @@ import '../common/ui_scaler.dart'; + import '../styles.dart'; + class TitleScreenUi extends StatelessWidget { - const TitleScreenUi({ - super.key, + - const TitleScreenUi({super.key}); + + const TitleScreenUi({ + + super.key, + required this.difficulty, + required this.onDifficultyPressed, + required this.onDifficultyFocused, - }); + + }); + + final int difficulty; + final void Function(int difficulty) onDifficultyPressed; @@ -2072,10 +2077,7 @@ steps: /// Title Text - TopLeft( + const TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), + + /// Difficulty Btns @@ -2092,7 +2094,7 @@ steps: ], ), ); - @@ -60,3 +81,107 @@ class _TitleText extends StatelessWidget { + @@ -55,3 +78,103 @@ class _TitleText extends StatelessWidget { ); } } @@ -2180,18 +2182,14 @@ steps: + + /// cross-hairs (selected state) + if (selected) ...[ - + CenterLeft( - + child: Image.asset(AssetPaths.titleSelectedLeft), - + ), + + CenterLeft(child: Image.asset(AssetPaths.titleSelectedLeft)), + CenterRight( + child: Image.asset(AssetPaths.titleSelectedRight), + ), + ], + + /// Label - + Center( - + child: Text(label.toUpperCase(), style: TextStyles.btn), - + ), + + Center(child: Text(label.toUpperCase(), style: TextStyles.btn)), + ], + ), + ), @@ -2282,7 +2280,7 @@ steps: lightAmt: _finalEmitLightAmt, ), - @@ -61,20 +82,24 @@ class TitleScreen extends StatelessWidget { + @@ -61,19 +82,25 @@ class TitleScreen extends StatelessWidget { /// Fg-Receive _LitImage( imgSrc: AssetPaths.titleFgReceive, @@ -2300,17 +2298,17 @@ steps: ), /// UI - - const Positioned.fill( - - child: TitleScreenUi(), + - const Positioned.fill(child: TitleScreenUi()), + Positioned.fill( + child: TitleScreenUi( + difficulty: _difficulty, + onDifficultyFocused: _handleDifficultyFocused, + onDifficultyPressed: _handleDifficultyPressed, + ), - ), + + ), ], ), + ), - name: Build Web app path: next_gen_ui flutter: build web @@ -2333,7 +2331,7 @@ steps: patch-u: | --- b/next-gen-ui/step_03_c/lib/title_screen/title_screen_ui.dart +++ a/next-gen-ui/step_03_c/lib/title_screen/title_screen_ui.dart - @@ -48,6 +48,17 @@ class TitleScreenUi extends StatelessWidget { + @@ -45,6 +45,17 @@ class TitleScreenUi extends StatelessWidget { ), ), ), @@ -2351,7 +2349,7 @@ steps: ], ), ); - @@ -185,3 +196,55 @@ class _DifficultyBtn extends StatelessWidget { + @@ -178,3 +189,60 @@ class _DifficultyBtn extends StatelessWidget { ); } } @@ -2388,15 +2386,20 @@ steps: + Positioned.fill(child: Image.asset(AssetPaths.titleStartBtn)), + if (state.isHovered || state.isFocused) ...[ + Positioned.fill( - + child: Image.asset(AssetPaths.titleStartBtnHover)), + + child: Image.asset(AssetPaths.titleStartBtnHover), + + ), + ], + Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ - + Text('START MISSION', - + style: TextStyles.btn - + .copyWith(fontSize: 24, letterSpacing: 18)), + + Text( + + 'START MISSION', + + style: TextStyles.btn.copyWith( + + fontSize: 24, + + letterSpacing: 18, + + ), + + ), + ], + ), + ), @@ -2457,16 +2460,17 @@ steps: import 'package:focusable_control_builder/focusable_control_builder.dart'; import 'package:gap/gap.dart'; - @@ -86,8 +87,10 @@ class _TitleText extends StatelessWidget { + @@ -83,8 +84,11 @@ class _TitleText extends StatelessWidget { Text('57', style: TextStyles.h2), Image.asset(AssetPaths.titleSelectedRight, height: 65), ], - ), - Text('INTO THE UNKNOWN', style: TextStyles.h3), + ).animate().fadeIn(delay: .8.seconds, duration: .7.seconds), - + Text('INTO THE UNKNOWN', style: TextStyles.h3) - + .animate() - + .fadeIn(delay: 1.seconds, duration: .7.seconds), + + Text( + + 'INTO THE UNKNOWN', + + style: TextStyles.h3, + + ).animate().fadeIn(delay: 1.seconds, duration: .7.seconds), ], ); } @@ -2492,32 +2496,48 @@ steps: patch-u: | --- b/next-gen-ui/step_04_b/lib/title_screen/title_screen_ui.dart +++ a/next-gen-ui/step_04_b/lib/title_screen/title_screen_ui.dart - @@ -117,19 +117,28 @@ class _DifficultyBtns extends StatelessWidget { - selected: difficulty == 0, - onPressed: () => onDifficultyPressed(0), - onHover: (over) => onDifficultyFocused(over ? 0 : null), + @@ -111,23 +111,32 @@ class _DifficultyBtns extends StatelessWidget { + mainAxisSize: MainAxisSize.min, + children: [ + _DifficultyBtn( + - label: 'Casual', + - selected: difficulty == 0, + - onPressed: () => onDifficultyPressed(0), + - onHover: (over) => onDifficultyFocused(over ? 0 : null), - ), - + ) + + label: 'Casual', + + selected: difficulty == 0, + + onPressed: () => onDifficultyPressed(0), + + onHover: (over) => onDifficultyFocused(over ? 0 : null), + + ) + .animate() + .fadeIn(delay: 1.3.seconds, duration: .35.seconds) + .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Normal', - selected: difficulty == 1, - onPressed: () => onDifficultyPressed(1), - onHover: (over) => onDifficultyFocused(over ? 1 : null), + - label: 'Normal', + - selected: difficulty == 1, + - onPressed: () => onDifficultyPressed(1), + - onHover: (over) => onDifficultyFocused(over ? 1 : null), - ), - + ) + + label: 'Normal', + + selected: difficulty == 1, + + onPressed: () => onDifficultyPressed(1), + + onHover: (over) => onDifficultyFocused(over ? 1 : null), + + ) + .animate() + .fadeIn(delay: 1.5.seconds, duration: .35.seconds) + .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Hardcore', - selected: difficulty == 2, - onPressed: () => onDifficultyPressed(2), - onHover: (over) => onDifficultyFocused(over ? 2 : null), + - label: 'Hardcore', + - selected: difficulty == 2, + - onPressed: () => onDifficultyPressed(2), + - onHover: (over) => onDifficultyFocused(over ? 2 : null), - ), - + ) + + label: 'Hardcore', + + selected: difficulty == 2, + + onPressed: () => onDifficultyPressed(2), + + onHover: (over) => onDifficultyFocused(over ? 2 : null), + + ) + .animate() + .fadeIn(delay: 1.7.seconds, duration: .35.seconds) + .slide(begin: const Offset(0, .2)), @@ -2546,16 +2566,67 @@ steps: patch-u: | --- b/next-gen-ui/step_04_c/lib/title_screen/title_screen_ui.dart +++ a/next-gen-ui/step_04_c/lib/title_screen/title_screen_ui.dart - @@ -254,8 +254,13 @@ class _StartBtnState extends State<_StartBtn> { - ), - ), - ], + @@ -228,33 +228,40 @@ class _StartBtnState extends State<_StartBtn> { + } + _wasHovered = (state.isHovered || state.isFocused); + return SizedBox( + - width: 520, + - height: 100, + - child: Stack( + - children: [ + - Positioned.fill(child: Image.asset(AssetPaths.titleStartBtn)), + - if (state.isHovered || state.isFocused) ...[ + - Positioned.fill( + - child: Image.asset(AssetPaths.titleStartBtnHover), + - ), + - ], + - Center( + - child: Row( + - mainAxisAlignment: MainAxisAlignment.end, + - children: [ + - Text( + - 'START MISSION', + - style: TextStyles.btn.copyWith( + - fontSize: 24, + - letterSpacing: 18, + + width: 520, + + height: 100, + + child: Stack( + + children: [ + + Positioned.fill( + + child: Image.asset(AssetPaths.titleStartBtn), + ), + - ), + - ], + - ), + - ), + - ], - ), - ); - + ) - + .animate(autoPlay: false, onInit: (c) => _btnAnim = c) - + .shimmer(duration: .7.seconds, color: Colors.black), - + ) + + if (state.isHovered || state.isFocused) ...[ + + Positioned.fill( + + child: Image.asset(AssetPaths.titleStartBtnHover), + + ), + + ], + + Center( + + child: Row( + + mainAxisAlignment: MainAxisAlignment.end, + + children: [ + + Text( + + 'START MISSION', + + style: TextStyles.btn.copyWith( + + fontSize: 24, + + letterSpacing: 18, + + ), + + ), + + ], + + ), + + ), + + ], + + ) + + .animate(autoPlay: false, onInit: (c) => _btnAnim = c) + + .shimmer(duration: .7.seconds, color: Colors.black), + + ) + .animate() + .fadeIn(delay: 2.3.seconds) + .slide(begin: const Offset(0, .2)); @@ -2584,7 +2655,7 @@ steps: patch-u: | --- b/next-gen-ui/step_04_d/lib/title_screen/title_screen_ui.dart +++ a/next-gen-ui/step_04_d/lib/title_screen/title_screen_ui.dart - @@ -171,10 +171,16 @@ class _DifficultyBtn extends StatelessWidget { + @@ -169,10 +169,17 @@ class _DifficultyBtn extends StatelessWidget { child: Stack( children: [ /// Bg with fill and outline @@ -2593,9 +2664,10 @@ steps: - color: const Color(0xFF00D1FF).withAlpha(25), - border: Border.all(color: Colors.white, width: 5), + AnimatedOpacity( - + opacity: (!selected && (state.isHovered || state.isFocused)) - + ? 1 - + : 0, + + opacity: + + (!selected && (state.isHovered || state.isFocused)) + + ? 1 + + : 0, + duration: .3.seconds, + child: Container( + decoration: BoxDecoration( @@ -2781,7 +2853,7 @@ steps: + final Color orbColor; + + final Widget Function(BuildContext context, Color orbColor, Color emitColor) - + builder; + + builder; + + @override + Widget build(BuildContext context) { @@ -2866,7 +2938,7 @@ steps: import '../common/ui_scaler.dart'; import '../styles.dart'; - @@ -71,7 +74,7 @@ class _TitleText extends StatelessWidget { + @@ -68,7 +71,7 @@ class _TitleText extends StatelessWidget { @override Widget build(BuildContext context) { @@ -2875,8 +2947,8 @@ steps: mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - @@ -93,6 +96,30 @@ class _TitleText extends StatelessWidget { - .fadeIn(delay: 1.seconds, duration: .7.seconds), + @@ -91,6 +94,31 @@ class _TitleText extends StatelessWidget { + ).animate().fadeIn(delay: 1.seconds, duration: .7.seconds), ], ); + return Consumer( @@ -2884,21 +2956,22 @@ steps: + if (fragmentPrograms == null) return content; + return TickingBuilder( + builder: (context, time) { - + return AnimatedSampler( - + (image, size, canvas) { - + const double overdrawPx = 30; - + final shader = fragmentPrograms.ui.fragmentShader(); - + shader - + ..setFloat(0, size.width) - + ..setFloat(1, size.height) - + ..setFloat(2, time) - + ..setImageSampler(0, image); - + Rect rect = Rect.fromLTWH(-overdrawPx, -overdrawPx, - + size.width + overdrawPx, size.height + overdrawPx); - + canvas.drawRect(rect, Paint()..shader = shader); - + }, - + child: content, - + ); + + return AnimatedSampler((image, size, canvas) { + + const double overdrawPx = 30; + + final shader = fragmentPrograms.ui.fragmentShader(); + + shader + + ..setFloat(0, size.width) + + ..setFloat(1, size.height) + + ..setFloat(2, time) + + ..setImageSampler(0, image); + + Rect rect = Rect.fromLTWH( + + -overdrawPx, + + -overdrawPx, + + size.width + overdrawPx, + + size.height + overdrawPx, + + ); + + canvas.drawRect(rect, Paint()..shader = shader); + + }, child: content); + }, + ); + }, @@ -2941,7 +3014,7 @@ steps: @override Widget build(BuildContext context) { - @@ -59,7 +61,7 @@ class TitleScreenUi extends StatelessWidget { + @@ -56,7 +58,7 @@ class TitleScreenUi extends StatelessWidget { alignment: Alignment.bottomRight, child: Padding( padding: const EdgeInsets.only(bottom: 20, right: 40), @@ -2996,7 +3069,7 @@ steps: Color get _emitColor => AppColors.emitColors[_difficultyOverride ?? _difficulty]; Color get _orbColor => - @@ -27,88 +48,189 @@ class _TitleScreenState extends State { + @@ -27,88 +48,190 @@ class _TitleScreenState extends State { /// Currently focused difficulty (if any) int? _difficultyOverride; @@ -3023,10 +3096,10 @@ steps: + Duration _getRndPulseDuration() => 100.ms + 200.ms * Random().nextDouble(); + + double _getMinEnergyForDifficulty(int difficulty) => switch (difficulty) { - + 1 => 0.3, - + 2 => 0.6, - + _ => 0, - + }; + + 1 => 0.3, + + 2 => 0.6, + + _ => 0, + + }; + + @override + void initState() { @@ -3186,9 +3259,10 @@ steps: + materialColor: orbColor, + lightColor: orbColor, + ), - + onUpdate: (energy) => setState(() { - + _orbEnergy = energy; - + }), + + onUpdate: + + (energy) => setState(() { + + _orbEnergy = energy; + + }), + ), + ], + ), @@ -3253,7 +3327,7 @@ steps: ), ), ); - @@ -119,19 +241,26 @@ class _LitImage extends StatelessWidget { + @@ -119,19 +242,26 @@ class _LitImage extends StatelessWidget { const _LitImage({ required this.color, required this.imgSrc, @@ -3307,19 +3381,19 @@ steps: // Copyright 2023 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'dart:math'; - + import 'package:flutter/material.dart'; import 'package:particle_field/particle_field.dart'; import 'package:rnd/rnd.dart'; - + class ParticleOverlay extends StatelessWidget { const ParticleOverlay({super.key, required this.color, required this.energy}); - + final Color color; final double energy; - + @override Widget build(BuildContext context) { return ParticleField( @@ -3328,29 +3402,31 @@ steps: ), // blend the image's alpha with the specified color: blendMode: BlendMode.dstIn, - + // this runs every tick: onTick: (controller, _, size) { List particles = controller.particles; - + // add a new particle with random angle, distance & velocity: double a = rnd(pi * 2); double dist = rnd(1, 4) * 35 + 150 * energy; double vel = rnd(1, 2) * (1 + energy * 1.8); - particles.add(Particle( - // how many ticks this particle will live: - lifespan: rnd(1, 2) * 20 + energy * 15, - // starting distance from center: - x: cos(a) * dist, - y: sin(a) * dist, - // starting velocity: - vx: cos(a) * vel, - vy: sin(a) * vel, - // other starting values: - rotation: a, - scale: rnd(1, 2) * 0.6 + energy * 0.5, - )); - + particles.add( + Particle( + // how many ticks this particle will live: + lifespan: rnd(1, 2) * 20 + energy * 15, + // starting distance from center: + x: cos(a) * dist, + y: sin(a) * dist, + // starting velocity: + vx: cos(a) * vel, + vy: sin(a) * vel, + // other starting values: + rotation: a, + scale: rnd(1, 2) * 0.6 + energy * 0.5, + ), + ); + // update all of the particles: for (int i = particles.length - 1; i >= 0; i--) { Particle p = particles[i]; @@ -3384,7 +3460,7 @@ steps: import 'title_screen_ui.dart'; class TitleScreen extends StatefulWidget { - @@ -199,6 +200,16 @@ class _TitleScreenState extends State + @@ -200,6 +201,16 @@ class _TitleScreenState extends State lightAmt: _finalEmitLightAmt, ), diff --git a/next-gen-ui/step_01/android/.gitignore b/next-gen-ui/step_01/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_01/android/.gitignore +++ b/next-gen-ui/step_01/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_01/android/app/build.gradle b/next-gen-ui/step_01/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_01/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_01/android/app/build.gradle.kts b/next-gen-ui/step_01/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_01/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_01/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_01/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_01/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_01/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_01/android/build.gradle b/next-gen-ui/step_01/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_01/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_01/android/build.gradle.kts b/next-gen-ui/step_01/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_01/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_01/android/gradle.properties b/next-gen-ui/step_01/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_01/android/gradle.properties +++ b/next-gen-ui/step_01/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_01/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_01/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_01/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_01/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_01/android/settings.gradle b/next-gen-ui/step_01/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_01/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_01/android/settings.gradle.kts b/next-gen-ui/step_01/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_01/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_01/ios/Podfile b/next-gen-ui/step_01/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_01/ios/Podfile +++ b/next-gen-ui/step_01/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_01/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_01/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_01/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_01/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_01/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_01/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_01/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_01/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_01/lib/assets.dart b/next-gen-ui/step_01/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_01/lib/assets.dart +++ b/next-gen-ui/step_01/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_01/lib/common/reactive_widget.dart b/next-gen-ui/step_01/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_01/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_01/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_01/lib/common/shader_effect.dart b/next-gen-ui/step_01/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_01/lib/common/shader_effect.dart +++ b/next-gen-ui/step_01/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_01/lib/common/ui_scaler.dart b/next-gen-ui/step_01/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_01/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_01/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_01/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_01/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_01/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_01/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_01/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_01/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_01/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_01/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_01/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_01/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_01/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_01/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_01/lib/styles.dart b/next-gen-ui/step_01/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_01/lib/styles.dart +++ b/next-gen-ui/step_01/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/deeplink_cookbook/linux/main.cc b/next-gen-ui/step_01/linux/runner/main.cc similarity index 100% rename from deeplink_cookbook/linux/main.cc rename to next-gen-ui/step_01/linux/runner/main.cc diff --git a/deeplink_cookbook/linux/my_application.h b/next-gen-ui/step_01/linux/runner/my_application.h similarity index 100% rename from deeplink_cookbook/linux/my_application.h rename to next-gen-ui/step_01/linux/runner/my_application.h diff --git a/next-gen-ui/step_01/macos/Podfile b/next-gen-ui/step_01/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_01/macos/Podfile +++ b/next-gen-ui/step_01/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_01/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_01/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_01/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_01/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_01/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_01/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_01/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_01/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_01/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_01/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_01/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_01/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_01/pubspec.yaml b/next-gen-ui/step_01/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_01/pubspec.yaml +++ b/next-gen-ui/step_01/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_01/windows/runner/Runner.rc b/next-gen-ui/step_01/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_01/windows/runner/Runner.rc +++ b/next-gen-ui/step_01/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_02_a/android/.gitignore b/next-gen-ui/step_02_a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_02_a/android/.gitignore +++ b/next-gen-ui/step_02_a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_02_a/android/app/build.gradle b/next-gen-ui/step_02_a/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_02_a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_02_a/android/app/build.gradle.kts b/next-gen-ui/step_02_a/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_02_a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_02_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_02_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_02_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_02_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_02_a/android/build.gradle b/next-gen-ui/step_02_a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_02_a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_02_a/android/build.gradle.kts b/next-gen-ui/step_02_a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_02_a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_02_a/android/gradle.properties b/next-gen-ui/step_02_a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_02_a/android/gradle.properties +++ b/next-gen-ui/step_02_a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_02_a/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_02_a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_02_a/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_02_a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_02_a/android/settings.gradle b/next-gen-ui/step_02_a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_02_a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_02_a/android/settings.gradle.kts b/next-gen-ui/step_02_a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_02_a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_02_a/ios/Podfile b/next-gen-ui/step_02_a/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_02_a/ios/Podfile +++ b/next-gen-ui/step_02_a/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_02_a/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_02_a/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_02_a/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_02_a/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_02_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_02_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_02_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_02_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_02_a/lib/assets.dart b/next-gen-ui/step_02_a/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_02_a/lib/assets.dart +++ b/next-gen-ui/step_02_a/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_02_a/lib/common/reactive_widget.dart b/next-gen-ui/step_02_a/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_02_a/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_02_a/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_02_a/lib/common/shader_effect.dart b/next-gen-ui/step_02_a/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_02_a/lib/common/shader_effect.dart +++ b/next-gen-ui/step_02_a/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_02_a/lib/common/ui_scaler.dart b/next-gen-ui/step_02_a/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_02_a/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_02_a/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_02_a/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_02_a/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_02_a/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_02_a/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_02_a/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_02_a/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_02_a/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_02_a/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_02_a/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_02_a/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_02_a/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_02_a/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_02_a/lib/styles.dart b/next-gen-ui/step_02_a/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_02_a/lib/styles.dart +++ b/next-gen-ui/step_02_a/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_02_a/linux/runner/main.cc b/next-gen-ui/step_02_a/linux/runner/main.cc new file mode 100644 index 0000000000..e7c5c54370 --- /dev/null +++ b/next-gen-ui/step_02_a/linux/runner/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/next-gen-ui/step_02_a/linux/runner/my_application.h b/next-gen-ui/step_02_a/linux/runner/my_application.h new file mode 100644 index 0000000000..72271d5e41 --- /dev/null +++ b/next-gen-ui/step_02_a/linux/runner/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/next-gen-ui/step_02_a/macos/Podfile b/next-gen-ui/step_02_a/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_02_a/macos/Podfile +++ b/next-gen-ui/step_02_a/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_02_a/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_02_a/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_02_a/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_02_a/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_02_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_02_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_02_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_02_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_02_a/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_02_a/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_02_a/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_02_a/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_02_a/pubspec.yaml b/next-gen-ui/step_02_a/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_02_a/pubspec.yaml +++ b/next-gen-ui/step_02_a/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_02_a/windows/runner/Runner.rc b/next-gen-ui/step_02_a/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_02_a/windows/runner/Runner.rc +++ b/next-gen-ui/step_02_a/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_02_b/android/.gitignore b/next-gen-ui/step_02_b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_02_b/android/.gitignore +++ b/next-gen-ui/step_02_b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_02_b/android/app/build.gradle b/next-gen-ui/step_02_b/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_02_b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_02_b/android/app/build.gradle.kts b/next-gen-ui/step_02_b/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_02_b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_02_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_02_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_02_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_02_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_02_b/android/build.gradle b/next-gen-ui/step_02_b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_02_b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_02_b/android/build.gradle.kts b/next-gen-ui/step_02_b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_02_b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_02_b/android/gradle.properties b/next-gen-ui/step_02_b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_02_b/android/gradle.properties +++ b/next-gen-ui/step_02_b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_02_b/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_02_b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_02_b/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_02_b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_02_b/android/settings.gradle b/next-gen-ui/step_02_b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_02_b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_02_b/android/settings.gradle.kts b/next-gen-ui/step_02_b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_02_b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_02_b/ios/Podfile b/next-gen-ui/step_02_b/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_02_b/ios/Podfile +++ b/next-gen-ui/step_02_b/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_02_b/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_02_b/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_02_b/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_02_b/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_02_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_02_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_02_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_02_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_02_b/lib/assets.dart b/next-gen-ui/step_02_b/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_02_b/lib/assets.dart +++ b/next-gen-ui/step_02_b/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_02_b/lib/common/reactive_widget.dart b/next-gen-ui/step_02_b/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_02_b/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_02_b/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_02_b/lib/common/shader_effect.dart b/next-gen-ui/step_02_b/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_02_b/lib/common/shader_effect.dart +++ b/next-gen-ui/step_02_b/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_02_b/lib/common/ui_scaler.dart b/next-gen-ui/step_02_b/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_02_b/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_02_b/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_02_b/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_02_b/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_02_b/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_02_b/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_02_b/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_02_b/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_02_b/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_02_b/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_02_b/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_02_b/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_02_b/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_02_b/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_02_b/lib/styles.dart b/next-gen-ui/step_02_b/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_02_b/lib/styles.dart +++ b/next-gen-ui/step_02_b/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_02_b/linux/runner/main.cc b/next-gen-ui/step_02_b/linux/runner/main.cc new file mode 100644 index 0000000000..e7c5c54370 --- /dev/null +++ b/next-gen-ui/step_02_b/linux/runner/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/next-gen-ui/step_02_b/linux/runner/my_application.h b/next-gen-ui/step_02_b/linux/runner/my_application.h new file mode 100644 index 0000000000..72271d5e41 --- /dev/null +++ b/next-gen-ui/step_02_b/linux/runner/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/next-gen-ui/step_02_b/macos/Podfile b/next-gen-ui/step_02_b/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_02_b/macos/Podfile +++ b/next-gen-ui/step_02_b/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_02_b/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_02_b/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_02_b/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_02_b/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_02_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_02_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_02_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_02_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_02_b/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_02_b/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_02_b/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_02_b/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_02_b/pubspec.yaml b/next-gen-ui/step_02_b/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_02_b/pubspec.yaml +++ b/next-gen-ui/step_02_b/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_02_b/windows/runner/Runner.rc b/next-gen-ui/step_02_b/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_02_b/windows/runner/Runner.rc +++ b/next-gen-ui/step_02_b/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_02_c/android/.gitignore b/next-gen-ui/step_02_c/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_02_c/android/.gitignore +++ b/next-gen-ui/step_02_c/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_02_c/android/app/build.gradle b/next-gen-ui/step_02_c/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_02_c/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_02_c/android/app/build.gradle.kts b/next-gen-ui/step_02_c/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_02_c/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_02_c/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_02_c/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_02_c/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_02_c/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_02_c/android/build.gradle b/next-gen-ui/step_02_c/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_02_c/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_02_c/android/build.gradle.kts b/next-gen-ui/step_02_c/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_02_c/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_02_c/android/gradle.properties b/next-gen-ui/step_02_c/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_02_c/android/gradle.properties +++ b/next-gen-ui/step_02_c/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_02_c/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_02_c/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_02_c/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_02_c/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_02_c/android/settings.gradle b/next-gen-ui/step_02_c/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_02_c/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_02_c/android/settings.gradle.kts b/next-gen-ui/step_02_c/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_02_c/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_02_c/ios/Podfile b/next-gen-ui/step_02_c/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_02_c/ios/Podfile +++ b/next-gen-ui/step_02_c/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_02_c/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_02_c/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_02_c/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_02_c/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_02_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_02_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_02_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_02_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_02_c/lib/assets.dart b/next-gen-ui/step_02_c/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_02_c/lib/assets.dart +++ b/next-gen-ui/step_02_c/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_02_c/lib/common/reactive_widget.dart b/next-gen-ui/step_02_c/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_02_c/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_02_c/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_02_c/lib/common/shader_effect.dart b/next-gen-ui/step_02_c/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_02_c/lib/common/shader_effect.dart +++ b/next-gen-ui/step_02_c/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_02_c/lib/common/ui_scaler.dart b/next-gen-ui/step_02_c/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_02_c/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_02_c/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_02_c/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_02_c/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_02_c/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_02_c/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_02_c/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_02_c/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_02_c/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_02_c/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_02_c/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_02_c/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_02_c/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_02_c/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_02_c/lib/styles.dart b/next-gen-ui/step_02_c/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_02_c/lib/styles.dart +++ b/next-gen-ui/step_02_c/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_02_c/macos/Podfile b/next-gen-ui/step_02_c/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_02_c/macos/Podfile +++ b/next-gen-ui/step_02_c/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_02_c/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_02_c/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_02_c/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_02_c/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_02_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_02_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_02_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_02_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_02_c/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_02_c/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_02_c/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_02_c/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_02_c/pubspec.yaml b/next-gen-ui/step_02_c/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_02_c/pubspec.yaml +++ b/next-gen-ui/step_02_c/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_02_c/windows/runner/Runner.rc b/next-gen-ui/step_02_c/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_02_c/windows/runner/Runner.rc +++ b/next-gen-ui/step_02_c/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_03_a/android/.gitignore b/next-gen-ui/step_03_a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_03_a/android/.gitignore +++ b/next-gen-ui/step_03_a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_03_a/android/app/build.gradle b/next-gen-ui/step_03_a/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_03_a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_03_a/android/app/build.gradle.kts b/next-gen-ui/step_03_a/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_03_a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_03_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_03_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_03_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_03_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_03_a/android/build.gradle b/next-gen-ui/step_03_a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_03_a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_03_a/android/build.gradle.kts b/next-gen-ui/step_03_a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_03_a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_03_a/android/gradle.properties b/next-gen-ui/step_03_a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_03_a/android/gradle.properties +++ b/next-gen-ui/step_03_a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_03_a/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_03_a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_03_a/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_03_a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_03_a/android/settings.gradle b/next-gen-ui/step_03_a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_03_a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_03_a/android/settings.gradle.kts b/next-gen-ui/step_03_a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_03_a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_03_a/ios/Podfile b/next-gen-ui/step_03_a/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_03_a/ios/Podfile +++ b/next-gen-ui/step_03_a/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_03_a/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_03_a/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_03_a/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_03_a/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_03_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_03_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_03_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_03_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_03_a/lib/assets.dart b/next-gen-ui/step_03_a/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_03_a/lib/assets.dart +++ b/next-gen-ui/step_03_a/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_03_a/lib/common/reactive_widget.dart b/next-gen-ui/step_03_a/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_03_a/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_03_a/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_03_a/lib/common/shader_effect.dart b/next-gen-ui/step_03_a/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_03_a/lib/common/shader_effect.dart +++ b/next-gen-ui/step_03_a/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_03_a/lib/common/ui_scaler.dart b/next-gen-ui/step_03_a/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_03_a/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_03_a/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_03_a/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_03_a/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_03_a/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_03_a/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_03_a/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_03_a/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_03_a/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_03_a/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_03_a/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_03_a/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_03_a/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_03_a/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_03_a/lib/styles.dart b/next-gen-ui/step_03_a/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_03_a/lib/styles.dart +++ b/next-gen-ui/step_03_a/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_03_a/lib/title_screen/title_screen.dart b/next-gen-ui/step_03_a/lib/title_screen/title_screen.dart index 7d7f32a6fe..f03d72cfaa 100644 --- a/next-gen-ui/step_03_a/lib/title_screen/title_screen.dart +++ b/next-gen-ui/step_03_a/lib/title_screen/title_screen.dart @@ -73,9 +73,7 @@ class TitleScreen extends StatelessWidget { ), /// UI - const Positioned.fill( - child: TitleScreenUi(), - ), + const Positioned.fill(child: TitleScreenUi()), ], ), ), diff --git a/next-gen-ui/step_03_a/lib/title_screen/title_screen_ui.dart b/next-gen-ui/step_03_a/lib/title_screen/title_screen_ui.dart index 63f726ef94..ddefb308b6 100644 --- a/next-gen-ui/step_03_a/lib/title_screen/title_screen_ui.dart +++ b/next-gen-ui/step_03_a/lib/title_screen/title_screen_ui.dart @@ -11,9 +11,7 @@ import '../common/ui_scaler.dart'; import '../styles.dart'; class TitleScreenUi extends StatelessWidget { - const TitleScreenUi({ - super.key, - }); + const TitleScreenUi({super.key}); @override Widget build(BuildContext context) { return const Padding( @@ -22,10 +20,7 @@ class TitleScreenUi extends StatelessWidget { children: [ /// Title Text TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), ], ), diff --git a/next-gen-ui/step_03_a/macos/Podfile b/next-gen-ui/step_03_a/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_03_a/macos/Podfile +++ b/next-gen-ui/step_03_a/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_03_a/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_03_a/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_03_a/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_03_a/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_03_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_03_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_03_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_03_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_03_a/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_03_a/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_03_a/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_03_a/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_03_a/pubspec.yaml b/next-gen-ui/step_03_a/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_03_a/pubspec.yaml +++ b/next-gen-ui/step_03_a/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_03_a/windows/runner/Runner.rc b/next-gen-ui/step_03_a/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_03_a/windows/runner/Runner.rc +++ b/next-gen-ui/step_03_a/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_03_b/android/.gitignore b/next-gen-ui/step_03_b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_03_b/android/.gitignore +++ b/next-gen-ui/step_03_b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_03_b/android/app/build.gradle b/next-gen-ui/step_03_b/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_03_b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_03_b/android/app/build.gradle.kts b/next-gen-ui/step_03_b/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_03_b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_03_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_03_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_03_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_03_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_03_b/android/build.gradle b/next-gen-ui/step_03_b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_03_b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_03_b/android/build.gradle.kts b/next-gen-ui/step_03_b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_03_b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_03_b/android/gradle.properties b/next-gen-ui/step_03_b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_03_b/android/gradle.properties +++ b/next-gen-ui/step_03_b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_03_b/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_03_b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_03_b/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_03_b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_03_b/android/settings.gradle b/next-gen-ui/step_03_b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_03_b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_03_b/android/settings.gradle.kts b/next-gen-ui/step_03_b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_03_b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_03_b/ios/Podfile b/next-gen-ui/step_03_b/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_03_b/ios/Podfile +++ b/next-gen-ui/step_03_b/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_03_b/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_03_b/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_03_b/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_03_b/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_03_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_03_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_03_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_03_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_03_b/lib/assets.dart b/next-gen-ui/step_03_b/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_03_b/lib/assets.dart +++ b/next-gen-ui/step_03_b/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_03_b/lib/common/reactive_widget.dart b/next-gen-ui/step_03_b/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_03_b/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_03_b/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_03_b/lib/common/shader_effect.dart b/next-gen-ui/step_03_b/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_03_b/lib/common/shader_effect.dart +++ b/next-gen-ui/step_03_b/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_03_b/lib/common/ui_scaler.dart b/next-gen-ui/step_03_b/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_03_b/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_03_b/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_03_b/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_03_b/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_03_b/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_03_b/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_03_b/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_03_b/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_03_b/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_03_b/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_03_b/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_03_b/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_03_b/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_03_b/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_03_b/lib/styles.dart b/next-gen-ui/step_03_b/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_03_b/lib/styles.dart +++ b/next-gen-ui/step_03_b/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_03_b/lib/title_screen/title_screen_ui.dart b/next-gen-ui/step_03_b/lib/title_screen/title_screen_ui.dart index 5ab4f262e2..7d790b0fec 100644 --- a/next-gen-ui/step_03_b/lib/title_screen/title_screen_ui.dart +++ b/next-gen-ui/step_03_b/lib/title_screen/title_screen_ui.dart @@ -31,10 +31,7 @@ class TitleScreenUi extends StatelessWidget { children: [ /// Title Text const TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), /// Difficulty Btns @@ -165,18 +162,14 @@ class _DifficultyBtn extends StatelessWidget { /// cross-hairs (selected state) if (selected) ...[ - CenterLeft( - child: Image.asset(AssetPaths.titleSelectedLeft), - ), + CenterLeft(child: Image.asset(AssetPaths.titleSelectedLeft)), CenterRight( child: Image.asset(AssetPaths.titleSelectedRight), ), ], /// Label - Center( - child: Text(label.toUpperCase(), style: TextStyles.btn), - ), + Center(child: Text(label.toUpperCase(), style: TextStyles.btn)), ], ), ), diff --git a/next-gen-ui/step_03_b/macos/Podfile b/next-gen-ui/step_03_b/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_03_b/macos/Podfile +++ b/next-gen-ui/step_03_b/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_03_b/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_03_b/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_03_b/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_03_b/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_03_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_03_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_03_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_03_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_03_b/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_03_b/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_03_b/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_03_b/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_03_b/pubspec.yaml b/next-gen-ui/step_03_b/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_03_b/pubspec.yaml +++ b/next-gen-ui/step_03_b/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_03_b/windows/runner/Runner.rc b/next-gen-ui/step_03_b/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_03_b/windows/runner/Runner.rc +++ b/next-gen-ui/step_03_b/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_03_c/android/.gitignore b/next-gen-ui/step_03_c/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_03_c/android/.gitignore +++ b/next-gen-ui/step_03_c/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_03_c/android/app/build.gradle b/next-gen-ui/step_03_c/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_03_c/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_03_c/android/app/build.gradle.kts b/next-gen-ui/step_03_c/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_03_c/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_03_c/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_03_c/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_03_c/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_03_c/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_03_c/android/build.gradle b/next-gen-ui/step_03_c/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_03_c/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_03_c/android/build.gradle.kts b/next-gen-ui/step_03_c/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_03_c/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_03_c/android/gradle.properties b/next-gen-ui/step_03_c/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_03_c/android/gradle.properties +++ b/next-gen-ui/step_03_c/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_03_c/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_03_c/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_03_c/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_03_c/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_03_c/android/settings.gradle b/next-gen-ui/step_03_c/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_03_c/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_03_c/android/settings.gradle.kts b/next-gen-ui/step_03_c/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_03_c/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_03_c/ios/Podfile b/next-gen-ui/step_03_c/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_03_c/ios/Podfile +++ b/next-gen-ui/step_03_c/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_03_c/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_03_c/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_03_c/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_03_c/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_03_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_03_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_03_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_03_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_03_c/lib/assets.dart b/next-gen-ui/step_03_c/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_03_c/lib/assets.dart +++ b/next-gen-ui/step_03_c/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_03_c/lib/common/reactive_widget.dart b/next-gen-ui/step_03_c/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_03_c/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_03_c/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_03_c/lib/common/shader_effect.dart b/next-gen-ui/step_03_c/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_03_c/lib/common/shader_effect.dart +++ b/next-gen-ui/step_03_c/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_03_c/lib/common/ui_scaler.dart b/next-gen-ui/step_03_c/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_03_c/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_03_c/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_03_c/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_03_c/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_03_c/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_03_c/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_03_c/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_03_c/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_03_c/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_03_c/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_03_c/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_03_c/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_03_c/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_03_c/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_03_c/lib/styles.dart b/next-gen-ui/step_03_c/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_03_c/lib/styles.dart +++ b/next-gen-ui/step_03_c/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_03_c/lib/title_screen/title_screen_ui.dart b/next-gen-ui/step_03_c/lib/title_screen/title_screen_ui.dart index c2e83197c3..fbc0cd55cb 100644 --- a/next-gen-ui/step_03_c/lib/title_screen/title_screen_ui.dart +++ b/next-gen-ui/step_03_c/lib/title_screen/title_screen_ui.dart @@ -31,10 +31,7 @@ class TitleScreenUi extends StatelessWidget { children: [ /// Title Text const TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), /// Difficulty Btns @@ -176,18 +173,14 @@ class _DifficultyBtn extends StatelessWidget { /// cross-hairs (selected state) if (selected) ...[ - CenterLeft( - child: Image.asset(AssetPaths.titleSelectedLeft), - ), + CenterLeft(child: Image.asset(AssetPaths.titleSelectedLeft)), CenterRight( child: Image.asset(AssetPaths.titleSelectedRight), ), ], /// Label - Center( - child: Text(label.toUpperCase(), style: TextStyles.btn), - ), + Center(child: Text(label.toUpperCase(), style: TextStyles.btn)), ], ), ), @@ -229,15 +222,20 @@ class _StartBtnState extends State<_StartBtn> { Positioned.fill(child: Image.asset(AssetPaths.titleStartBtn)), if (state.isHovered || state.isFocused) ...[ Positioned.fill( - child: Image.asset(AssetPaths.titleStartBtnHover)), + child: Image.asset(AssetPaths.titleStartBtnHover), + ), ], Center( child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - Text('START MISSION', - style: TextStyles.btn - .copyWith(fontSize: 24, letterSpacing: 18)), + Text( + 'START MISSION', + style: TextStyles.btn.copyWith( + fontSize: 24, + letterSpacing: 18, + ), + ), ], ), ), diff --git a/next-gen-ui/step_03_c/macos/Podfile b/next-gen-ui/step_03_c/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_03_c/macos/Podfile +++ b/next-gen-ui/step_03_c/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_03_c/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_03_c/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_03_c/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_03_c/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_03_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_03_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_03_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_03_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_03_c/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_03_c/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_03_c/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_03_c/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_03_c/pubspec.yaml b/next-gen-ui/step_03_c/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_03_c/pubspec.yaml +++ b/next-gen-ui/step_03_c/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_03_c/windows/runner/Runner.rc b/next-gen-ui/step_03_c/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_03_c/windows/runner/Runner.rc +++ b/next-gen-ui/step_03_c/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_04_a/android/.gitignore b/next-gen-ui/step_04_a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_04_a/android/.gitignore +++ b/next-gen-ui/step_04_a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_04_a/android/app/build.gradle b/next-gen-ui/step_04_a/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_04_a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_04_a/android/app/build.gradle.kts b/next-gen-ui/step_04_a/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_04_a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_04_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_04_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_04_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_04_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_04_a/android/build.gradle b/next-gen-ui/step_04_a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_04_a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_04_a/android/build.gradle.kts b/next-gen-ui/step_04_a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_04_a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_04_a/android/gradle.properties b/next-gen-ui/step_04_a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_04_a/android/gradle.properties +++ b/next-gen-ui/step_04_a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_04_a/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_04_a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_04_a/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_04_a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_04_a/android/settings.gradle b/next-gen-ui/step_04_a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_04_a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_04_a/android/settings.gradle.kts b/next-gen-ui/step_04_a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_04_a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_04_a/ios/Podfile b/next-gen-ui/step_04_a/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_04_a/ios/Podfile +++ b/next-gen-ui/step_04_a/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_04_a/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_04_a/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_04_a/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_04_a/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_04_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_04_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_04_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_04_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_04_a/lib/assets.dart b/next-gen-ui/step_04_a/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_04_a/lib/assets.dart +++ b/next-gen-ui/step_04_a/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_04_a/lib/common/reactive_widget.dart b/next-gen-ui/step_04_a/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_04_a/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_04_a/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_04_a/lib/common/shader_effect.dart b/next-gen-ui/step_04_a/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_04_a/lib/common/shader_effect.dart +++ b/next-gen-ui/step_04_a/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_04_a/lib/common/ui_scaler.dart b/next-gen-ui/step_04_a/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_04_a/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_04_a/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_04_a/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_04_a/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_04_a/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_04_a/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_04_a/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_04_a/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_04_a/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_04_a/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_04_a/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_04_a/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_04_a/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_04_a/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_04_a/lib/styles.dart b/next-gen-ui/step_04_a/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_04_a/lib/styles.dart +++ b/next-gen-ui/step_04_a/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_04_a/lib/title_screen/title_screen_ui.dart b/next-gen-ui/step_04_a/lib/title_screen/title_screen_ui.dart index 8643ec908b..aaef7ba096 100644 --- a/next-gen-ui/step_04_a/lib/title_screen/title_screen_ui.dart +++ b/next-gen-ui/step_04_a/lib/title_screen/title_screen_ui.dart @@ -32,10 +32,7 @@ class TitleScreenUi extends StatelessWidget { children: [ /// Title Text const TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), /// Difficulty Btns @@ -88,9 +85,10 @@ class _TitleText extends StatelessWidget { Image.asset(AssetPaths.titleSelectedRight, height: 65), ], ).animate().fadeIn(delay: .8.seconds, duration: .7.seconds), - Text('INTO THE UNKNOWN', style: TextStyles.h3) - .animate() - .fadeIn(delay: 1.seconds, duration: .7.seconds), + Text( + 'INTO THE UNKNOWN', + style: TextStyles.h3, + ).animate().fadeIn(delay: 1.seconds, duration: .7.seconds), ], ); } @@ -179,18 +177,14 @@ class _DifficultyBtn extends StatelessWidget { /// cross-hairs (selected state) if (selected) ...[ - CenterLeft( - child: Image.asset(AssetPaths.titleSelectedLeft), - ), + CenterLeft(child: Image.asset(AssetPaths.titleSelectedLeft)), CenterRight( child: Image.asset(AssetPaths.titleSelectedRight), ), ], /// Label - Center( - child: Text(label.toUpperCase(), style: TextStyles.btn), - ), + Center(child: Text(label.toUpperCase(), style: TextStyles.btn)), ], ), ), @@ -232,15 +226,20 @@ class _StartBtnState extends State<_StartBtn> { Positioned.fill(child: Image.asset(AssetPaths.titleStartBtn)), if (state.isHovered || state.isFocused) ...[ Positioned.fill( - child: Image.asset(AssetPaths.titleStartBtnHover)), + child: Image.asset(AssetPaths.titleStartBtnHover), + ), ], Center( child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - Text('START MISSION', - style: TextStyles.btn - .copyWith(fontSize: 24, letterSpacing: 18)), + Text( + 'START MISSION', + style: TextStyles.btn.copyWith( + fontSize: 24, + letterSpacing: 18, + ), + ), ], ), ), diff --git a/next-gen-ui/step_04_a/macos/Podfile b/next-gen-ui/step_04_a/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_04_a/macos/Podfile +++ b/next-gen-ui/step_04_a/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_04_a/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_04_a/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_04_a/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_04_a/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_04_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_04_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_04_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_04_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_04_a/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_04_a/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_04_a/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_04_a/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_04_a/pubspec.yaml b/next-gen-ui/step_04_a/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_04_a/pubspec.yaml +++ b/next-gen-ui/step_04_a/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_04_a/windows/runner/Runner.rc b/next-gen-ui/step_04_a/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_04_a/windows/runner/Runner.rc +++ b/next-gen-ui/step_04_a/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_04_b/android/.gitignore b/next-gen-ui/step_04_b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_04_b/android/.gitignore +++ b/next-gen-ui/step_04_b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_04_b/android/app/build.gradle b/next-gen-ui/step_04_b/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_04_b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_04_b/android/app/build.gradle.kts b/next-gen-ui/step_04_b/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_04_b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_04_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_04_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_04_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_04_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_04_b/android/build.gradle b/next-gen-ui/step_04_b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_04_b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_04_b/android/build.gradle.kts b/next-gen-ui/step_04_b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_04_b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_04_b/android/gradle.properties b/next-gen-ui/step_04_b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_04_b/android/gradle.properties +++ b/next-gen-ui/step_04_b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_04_b/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_04_b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_04_b/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_04_b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_04_b/android/settings.gradle b/next-gen-ui/step_04_b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_04_b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_04_b/android/settings.gradle.kts b/next-gen-ui/step_04_b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_04_b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_04_b/ios/Podfile b/next-gen-ui/step_04_b/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_04_b/ios/Podfile +++ b/next-gen-ui/step_04_b/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_04_b/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_04_b/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_04_b/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_04_b/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_04_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_04_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_04_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_04_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_04_b/lib/assets.dart b/next-gen-ui/step_04_b/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_04_b/lib/assets.dart +++ b/next-gen-ui/step_04_b/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_04_b/lib/common/reactive_widget.dart b/next-gen-ui/step_04_b/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_04_b/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_04_b/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_04_b/lib/common/shader_effect.dart b/next-gen-ui/step_04_b/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_04_b/lib/common/shader_effect.dart +++ b/next-gen-ui/step_04_b/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_04_b/lib/common/ui_scaler.dart b/next-gen-ui/step_04_b/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_04_b/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_04_b/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_04_b/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_04_b/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_04_b/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_04_b/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_04_b/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_04_b/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_04_b/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_04_b/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_04_b/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_04_b/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_04_b/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_04_b/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_04_b/lib/styles.dart b/next-gen-ui/step_04_b/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_04_b/lib/styles.dart +++ b/next-gen-ui/step_04_b/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_04_b/lib/title_screen/title_screen_ui.dart b/next-gen-ui/step_04_b/lib/title_screen/title_screen_ui.dart index ca3cfdba90..ba77e2a952 100644 --- a/next-gen-ui/step_04_b/lib/title_screen/title_screen_ui.dart +++ b/next-gen-ui/step_04_b/lib/title_screen/title_screen_ui.dart @@ -32,10 +32,7 @@ class TitleScreenUi extends StatelessWidget { children: [ /// Title Text const TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), /// Difficulty Btns @@ -88,9 +85,10 @@ class _TitleText extends StatelessWidget { Image.asset(AssetPaths.titleSelectedRight, height: 65), ], ).animate().fadeIn(delay: .8.seconds, duration: .7.seconds), - Text('INTO THE UNKNOWN', style: TextStyles.h3) - .animate() - .fadeIn(delay: 1.seconds, duration: .7.seconds), + Text( + 'INTO THE UNKNOWN', + style: TextStyles.h3, + ).animate().fadeIn(delay: 1.seconds, duration: .7.seconds), ], ); } @@ -113,29 +111,29 @@ class _DifficultyBtns extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ _DifficultyBtn( - label: 'Casual', - selected: difficulty == 0, - onPressed: () => onDifficultyPressed(0), - onHover: (over) => onDifficultyFocused(over ? 0 : null), - ) + label: 'Casual', + selected: difficulty == 0, + onPressed: () => onDifficultyPressed(0), + onHover: (over) => onDifficultyFocused(over ? 0 : null), + ) .animate() .fadeIn(delay: 1.3.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Normal', - selected: difficulty == 1, - onPressed: () => onDifficultyPressed(1), - onHover: (over) => onDifficultyFocused(over ? 1 : null), - ) + label: 'Normal', + selected: difficulty == 1, + onPressed: () => onDifficultyPressed(1), + onHover: (over) => onDifficultyFocused(over ? 1 : null), + ) .animate() .fadeIn(delay: 1.5.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Hardcore', - selected: difficulty == 2, - onPressed: () => onDifficultyPressed(2), - onHover: (over) => onDifficultyFocused(over ? 2 : null), - ) + label: 'Hardcore', + selected: difficulty == 2, + onPressed: () => onDifficultyPressed(2), + onHover: (over) => onDifficultyFocused(over ? 2 : null), + ) .animate() .fadeIn(delay: 1.7.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), @@ -188,18 +186,14 @@ class _DifficultyBtn extends StatelessWidget { /// cross-hairs (selected state) if (selected) ...[ - CenterLeft( - child: Image.asset(AssetPaths.titleSelectedLeft), - ), + CenterLeft(child: Image.asset(AssetPaths.titleSelectedLeft)), CenterRight( child: Image.asset(AssetPaths.titleSelectedRight), ), ], /// Label - Center( - child: Text(label.toUpperCase(), style: TextStyles.btn), - ), + Center(child: Text(label.toUpperCase(), style: TextStyles.btn)), ], ), ), @@ -241,15 +235,20 @@ class _StartBtnState extends State<_StartBtn> { Positioned.fill(child: Image.asset(AssetPaths.titleStartBtn)), if (state.isHovered || state.isFocused) ...[ Positioned.fill( - child: Image.asset(AssetPaths.titleStartBtnHover)), + child: Image.asset(AssetPaths.titleStartBtnHover), + ), ], Center( child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - Text('START MISSION', - style: TextStyles.btn - .copyWith(fontSize: 24, letterSpacing: 18)), + Text( + 'START MISSION', + style: TextStyles.btn.copyWith( + fontSize: 24, + letterSpacing: 18, + ), + ), ], ), ), diff --git a/next-gen-ui/step_04_b/macos/Podfile b/next-gen-ui/step_04_b/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_04_b/macos/Podfile +++ b/next-gen-ui/step_04_b/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_04_b/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_04_b/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_04_b/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_04_b/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_04_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_04_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_04_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_04_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_04_b/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_04_b/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_04_b/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_04_b/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_04_b/pubspec.yaml b/next-gen-ui/step_04_b/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_04_b/pubspec.yaml +++ b/next-gen-ui/step_04_b/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_04_b/windows/runner/Runner.rc b/next-gen-ui/step_04_b/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_04_b/windows/runner/Runner.rc +++ b/next-gen-ui/step_04_b/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_04_c/android/.gitignore b/next-gen-ui/step_04_c/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_04_c/android/.gitignore +++ b/next-gen-ui/step_04_c/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_04_c/android/app/build.gradle b/next-gen-ui/step_04_c/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_04_c/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_04_c/android/app/build.gradle.kts b/next-gen-ui/step_04_c/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_04_c/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_04_c/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_04_c/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_04_c/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_04_c/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_04_c/android/build.gradle b/next-gen-ui/step_04_c/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_04_c/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_04_c/android/build.gradle.kts b/next-gen-ui/step_04_c/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_04_c/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_04_c/android/gradle.properties b/next-gen-ui/step_04_c/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_04_c/android/gradle.properties +++ b/next-gen-ui/step_04_c/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_04_c/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_04_c/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_04_c/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_04_c/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_04_c/android/settings.gradle b/next-gen-ui/step_04_c/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_04_c/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_04_c/android/settings.gradle.kts b/next-gen-ui/step_04_c/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_04_c/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_04_c/ios/Podfile b/next-gen-ui/step_04_c/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_04_c/ios/Podfile +++ b/next-gen-ui/step_04_c/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_04_c/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_04_c/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_04_c/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_04_c/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_04_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_04_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_04_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_04_c/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_04_c/lib/assets.dart b/next-gen-ui/step_04_c/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_04_c/lib/assets.dart +++ b/next-gen-ui/step_04_c/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_04_c/lib/common/reactive_widget.dart b/next-gen-ui/step_04_c/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_04_c/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_04_c/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_04_c/lib/common/shader_effect.dart b/next-gen-ui/step_04_c/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_04_c/lib/common/shader_effect.dart +++ b/next-gen-ui/step_04_c/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_04_c/lib/common/ui_scaler.dart b/next-gen-ui/step_04_c/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_04_c/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_04_c/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_04_c/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_04_c/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_04_c/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_04_c/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_04_c/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_04_c/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_04_c/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_04_c/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_04_c/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_04_c/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_04_c/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_04_c/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_04_c/lib/styles.dart b/next-gen-ui/step_04_c/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_04_c/lib/styles.dart +++ b/next-gen-ui/step_04_c/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_04_c/lib/title_screen/title_screen_ui.dart b/next-gen-ui/step_04_c/lib/title_screen/title_screen_ui.dart index 4b08343cb0..9b093de263 100644 --- a/next-gen-ui/step_04_c/lib/title_screen/title_screen_ui.dart +++ b/next-gen-ui/step_04_c/lib/title_screen/title_screen_ui.dart @@ -32,10 +32,7 @@ class TitleScreenUi extends StatelessWidget { children: [ /// Title Text const TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), /// Difficulty Btns @@ -88,9 +85,10 @@ class _TitleText extends StatelessWidget { Image.asset(AssetPaths.titleSelectedRight, height: 65), ], ).animate().fadeIn(delay: .8.seconds, duration: .7.seconds), - Text('INTO THE UNKNOWN', style: TextStyles.h3) - .animate() - .fadeIn(delay: 1.seconds, duration: .7.seconds), + Text( + 'INTO THE UNKNOWN', + style: TextStyles.h3, + ).animate().fadeIn(delay: 1.seconds, duration: .7.seconds), ], ); } @@ -113,29 +111,29 @@ class _DifficultyBtns extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ _DifficultyBtn( - label: 'Casual', - selected: difficulty == 0, - onPressed: () => onDifficultyPressed(0), - onHover: (over) => onDifficultyFocused(over ? 0 : null), - ) + label: 'Casual', + selected: difficulty == 0, + onPressed: () => onDifficultyPressed(0), + onHover: (over) => onDifficultyFocused(over ? 0 : null), + ) .animate() .fadeIn(delay: 1.3.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Normal', - selected: difficulty == 1, - onPressed: () => onDifficultyPressed(1), - onHover: (over) => onDifficultyFocused(over ? 1 : null), - ) + label: 'Normal', + selected: difficulty == 1, + onPressed: () => onDifficultyPressed(1), + onHover: (over) => onDifficultyFocused(over ? 1 : null), + ) .animate() .fadeIn(delay: 1.5.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Hardcore', - selected: difficulty == 2, - onPressed: () => onDifficultyPressed(2), - onHover: (over) => onDifficultyFocused(over ? 2 : null), - ) + label: 'Hardcore', + selected: difficulty == 2, + onPressed: () => onDifficultyPressed(2), + onHover: (over) => onDifficultyFocused(over ? 2 : null), + ) .animate() .fadeIn(delay: 1.7.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), @@ -188,18 +186,14 @@ class _DifficultyBtn extends StatelessWidget { /// cross-hairs (selected state) if (selected) ...[ - CenterLeft( - child: Image.asset(AssetPaths.titleSelectedLeft), - ), + CenterLeft(child: Image.asset(AssetPaths.titleSelectedLeft)), CenterRight( child: Image.asset(AssetPaths.titleSelectedRight), ), ], /// Label - Center( - child: Text(label.toUpperCase(), style: TextStyles.btn), - ), + Center(child: Text(label.toUpperCase(), style: TextStyles.btn)), ], ), ), @@ -234,30 +228,37 @@ class _StartBtnState extends State<_StartBtn> { } _wasHovered = (state.isHovered || state.isFocused); return SizedBox( - width: 520, - height: 100, - child: Stack( - children: [ - Positioned.fill(child: Image.asset(AssetPaths.titleStartBtn)), - if (state.isHovered || state.isFocused) ...[ - Positioned.fill( - child: Image.asset(AssetPaths.titleStartBtnHover)), - ], - Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text('START MISSION', - style: TextStyles.btn - .copyWith(fontSize: 24, letterSpacing: 18)), - ], - ), - ), - ], - ) - .animate(autoPlay: false, onInit: (c) => _btnAnim = c) - .shimmer(duration: .7.seconds, color: Colors.black), - ) + width: 520, + height: 100, + child: Stack( + children: [ + Positioned.fill( + child: Image.asset(AssetPaths.titleStartBtn), + ), + if (state.isHovered || state.isFocused) ...[ + Positioned.fill( + child: Image.asset(AssetPaths.titleStartBtnHover), + ), + ], + Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + 'START MISSION', + style: TextStyles.btn.copyWith( + fontSize: 24, + letterSpacing: 18, + ), + ), + ], + ), + ), + ], + ) + .animate(autoPlay: false, onInit: (c) => _btnAnim = c) + .shimmer(duration: .7.seconds, color: Colors.black), + ) .animate() .fadeIn(delay: 2.3.seconds) .slide(begin: const Offset(0, .2)); diff --git a/next-gen-ui/step_04_c/macos/Podfile b/next-gen-ui/step_04_c/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_04_c/macos/Podfile +++ b/next-gen-ui/step_04_c/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_04_c/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_04_c/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_04_c/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_04_c/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_04_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_04_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_04_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_04_c/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_04_c/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_04_c/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_04_c/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_04_c/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_04_c/pubspec.yaml b/next-gen-ui/step_04_c/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_04_c/pubspec.yaml +++ b/next-gen-ui/step_04_c/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_04_c/windows/runner/Runner.rc b/next-gen-ui/step_04_c/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_04_c/windows/runner/Runner.rc +++ b/next-gen-ui/step_04_c/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_04_d/android/.gitignore b/next-gen-ui/step_04_d/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_04_d/android/.gitignore +++ b/next-gen-ui/step_04_d/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_04_d/android/app/build.gradle b/next-gen-ui/step_04_d/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_04_d/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_04_d/android/app/build.gradle.kts b/next-gen-ui/step_04_d/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_04_d/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_04_d/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_04_d/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_04_d/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_04_d/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_04_d/android/build.gradle b/next-gen-ui/step_04_d/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_04_d/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_04_d/android/build.gradle.kts b/next-gen-ui/step_04_d/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_04_d/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_04_d/android/gradle.properties b/next-gen-ui/step_04_d/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_04_d/android/gradle.properties +++ b/next-gen-ui/step_04_d/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_04_d/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_04_d/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_04_d/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_04_d/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_04_d/android/settings.gradle b/next-gen-ui/step_04_d/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_04_d/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_04_d/android/settings.gradle.kts b/next-gen-ui/step_04_d/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_04_d/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_04_d/ios/Podfile b/next-gen-ui/step_04_d/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_04_d/ios/Podfile +++ b/next-gen-ui/step_04_d/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_04_d/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_04_d/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_04_d/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_04_d/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_04_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_04_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_04_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_04_d/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_04_d/lib/assets.dart b/next-gen-ui/step_04_d/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_04_d/lib/assets.dart +++ b/next-gen-ui/step_04_d/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_04_d/lib/common/reactive_widget.dart b/next-gen-ui/step_04_d/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_04_d/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_04_d/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_04_d/lib/common/shader_effect.dart b/next-gen-ui/step_04_d/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_04_d/lib/common/shader_effect.dart +++ b/next-gen-ui/step_04_d/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_04_d/lib/common/ui_scaler.dart b/next-gen-ui/step_04_d/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_04_d/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_04_d/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_04_d/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_04_d/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_04_d/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_04_d/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_04_d/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_04_d/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_04_d/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_04_d/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_04_d/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_04_d/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_04_d/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_04_d/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_04_d/lib/styles.dart b/next-gen-ui/step_04_d/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_04_d/lib/styles.dart +++ b/next-gen-ui/step_04_d/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_04_d/lib/title_screen/title_screen_ui.dart b/next-gen-ui/step_04_d/lib/title_screen/title_screen_ui.dart index c83f15dde4..10d3f0c702 100644 --- a/next-gen-ui/step_04_d/lib/title_screen/title_screen_ui.dart +++ b/next-gen-ui/step_04_d/lib/title_screen/title_screen_ui.dart @@ -32,10 +32,7 @@ class TitleScreenUi extends StatelessWidget { children: [ /// Title Text const TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), /// Difficulty Btns @@ -88,9 +85,10 @@ class _TitleText extends StatelessWidget { Image.asset(AssetPaths.titleSelectedRight, height: 65), ], ).animate().fadeIn(delay: .8.seconds, duration: .7.seconds), - Text('INTO THE UNKNOWN', style: TextStyles.h3) - .animate() - .fadeIn(delay: 1.seconds, duration: .7.seconds), + Text( + 'INTO THE UNKNOWN', + style: TextStyles.h3, + ).animate().fadeIn(delay: 1.seconds, duration: .7.seconds), ], ); } @@ -113,29 +111,29 @@ class _DifficultyBtns extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ _DifficultyBtn( - label: 'Casual', - selected: difficulty == 0, - onPressed: () => onDifficultyPressed(0), - onHover: (over) => onDifficultyFocused(over ? 0 : null), - ) + label: 'Casual', + selected: difficulty == 0, + onPressed: () => onDifficultyPressed(0), + onHover: (over) => onDifficultyFocused(over ? 0 : null), + ) .animate() .fadeIn(delay: 1.3.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Normal', - selected: difficulty == 1, - onPressed: () => onDifficultyPressed(1), - onHover: (over) => onDifficultyFocused(over ? 1 : null), - ) + label: 'Normal', + selected: difficulty == 1, + onPressed: () => onDifficultyPressed(1), + onHover: (over) => onDifficultyFocused(over ? 1 : null), + ) .animate() .fadeIn(delay: 1.5.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Hardcore', - selected: difficulty == 2, - onPressed: () => onDifficultyPressed(2), - onHover: (over) => onDifficultyFocused(over ? 2 : null), - ) + label: 'Hardcore', + selected: difficulty == 2, + onPressed: () => onDifficultyPressed(2), + onHover: (over) => onDifficultyFocused(over ? 2 : null), + ) .animate() .fadeIn(delay: 1.7.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), @@ -172,9 +170,10 @@ class _DifficultyBtn extends StatelessWidget { children: [ /// Bg with fill and outline AnimatedOpacity( - opacity: (!selected && (state.isHovered || state.isFocused)) - ? 1 - : 0, + opacity: + (!selected && (state.isHovered || state.isFocused)) + ? 1 + : 0, duration: .3.seconds, child: Container( decoration: BoxDecoration( @@ -194,18 +193,14 @@ class _DifficultyBtn extends StatelessWidget { /// cross-hairs (selected state) if (selected) ...[ - CenterLeft( - child: Image.asset(AssetPaths.titleSelectedLeft), - ), + CenterLeft(child: Image.asset(AssetPaths.titleSelectedLeft)), CenterRight( child: Image.asset(AssetPaths.titleSelectedRight), ), ], /// Label - Center( - child: Text(label.toUpperCase(), style: TextStyles.btn), - ), + Center(child: Text(label.toUpperCase(), style: TextStyles.btn)), ], ), ), @@ -240,30 +235,37 @@ class _StartBtnState extends State<_StartBtn> { } _wasHovered = (state.isHovered || state.isFocused); return SizedBox( - width: 520, - height: 100, - child: Stack( - children: [ - Positioned.fill(child: Image.asset(AssetPaths.titleStartBtn)), - if (state.isHovered || state.isFocused) ...[ - Positioned.fill( - child: Image.asset(AssetPaths.titleStartBtnHover)), - ], - Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text('START MISSION', - style: TextStyles.btn - .copyWith(fontSize: 24, letterSpacing: 18)), - ], - ), - ), - ], - ) - .animate(autoPlay: false, onInit: (c) => _btnAnim = c) - .shimmer(duration: .7.seconds, color: Colors.black), - ) + width: 520, + height: 100, + child: Stack( + children: [ + Positioned.fill( + child: Image.asset(AssetPaths.titleStartBtn), + ), + if (state.isHovered || state.isFocused) ...[ + Positioned.fill( + child: Image.asset(AssetPaths.titleStartBtnHover), + ), + ], + Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + 'START MISSION', + style: TextStyles.btn.copyWith( + fontSize: 24, + letterSpacing: 18, + ), + ), + ], + ), + ), + ], + ) + .animate(autoPlay: false, onInit: (c) => _btnAnim = c) + .shimmer(duration: .7.seconds, color: Colors.black), + ) .animate() .fadeIn(delay: 2.3.seconds) .slide(begin: const Offset(0, .2)); diff --git a/next-gen-ui/step_04_d/macos/Podfile b/next-gen-ui/step_04_d/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_04_d/macos/Podfile +++ b/next-gen-ui/step_04_d/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_04_d/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_04_d/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_04_d/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_04_d/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_04_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_04_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_04_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_04_d/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_04_d/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_04_d/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_04_d/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_04_d/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_04_d/pubspec.yaml b/next-gen-ui/step_04_d/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_04_d/pubspec.yaml +++ b/next-gen-ui/step_04_d/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_04_d/windows/runner/Runner.rc b/next-gen-ui/step_04_d/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_04_d/windows/runner/Runner.rc +++ b/next-gen-ui/step_04_d/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_04_e/android/.gitignore b/next-gen-ui/step_04_e/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_04_e/android/.gitignore +++ b/next-gen-ui/step_04_e/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_04_e/android/app/build.gradle b/next-gen-ui/step_04_e/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_04_e/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_04_e/android/app/build.gradle.kts b/next-gen-ui/step_04_e/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_04_e/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_04_e/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_04_e/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_04_e/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_04_e/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_04_e/android/build.gradle b/next-gen-ui/step_04_e/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_04_e/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_04_e/android/build.gradle.kts b/next-gen-ui/step_04_e/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_04_e/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_04_e/android/gradle.properties b/next-gen-ui/step_04_e/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_04_e/android/gradle.properties +++ b/next-gen-ui/step_04_e/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_04_e/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_04_e/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_04_e/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_04_e/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_04_e/android/settings.gradle b/next-gen-ui/step_04_e/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_04_e/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_04_e/android/settings.gradle.kts b/next-gen-ui/step_04_e/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_04_e/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_04_e/ios/Podfile b/next-gen-ui/step_04_e/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_04_e/ios/Podfile +++ b/next-gen-ui/step_04_e/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_04_e/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_04_e/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_04_e/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_04_e/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_04_e/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_04_e/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_04_e/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_04_e/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_04_e/lib/assets.dart b/next-gen-ui/step_04_e/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_04_e/lib/assets.dart +++ b/next-gen-ui/step_04_e/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_04_e/lib/common/reactive_widget.dart b/next-gen-ui/step_04_e/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_04_e/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_04_e/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_04_e/lib/common/shader_effect.dart b/next-gen-ui/step_04_e/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_04_e/lib/common/shader_effect.dart +++ b/next-gen-ui/step_04_e/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_04_e/lib/common/ui_scaler.dart b/next-gen-ui/step_04_e/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_04_e/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_04_e/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_04_e/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_04_e/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_04_e/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_04_e/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_04_e/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_04_e/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_04_e/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_04_e/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_04_e/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_04_e/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_04_e/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_04_e/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_04_e/lib/styles.dart b/next-gen-ui/step_04_e/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_04_e/lib/styles.dart +++ b/next-gen-ui/step_04_e/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_04_e/lib/title_screen/title_screen.dart b/next-gen-ui/step_04_e/lib/title_screen/title_screen.dart index 4c6723725b..aad83b04cb 100644 --- a/next-gen-ui/step_04_e/lib/title_screen/title_screen.dart +++ b/next-gen-ui/step_04_e/lib/title_screen/title_screen.dart @@ -147,7 +147,7 @@ class _AnimatedColors extends StatelessWidget { final Color orbColor; final Widget Function(BuildContext context, Color orbColor, Color emitColor) - builder; + builder; @override Widget build(BuildContext context) { diff --git a/next-gen-ui/step_04_e/lib/title_screen/title_screen_ui.dart b/next-gen-ui/step_04_e/lib/title_screen/title_screen_ui.dart index c83f15dde4..10d3f0c702 100644 --- a/next-gen-ui/step_04_e/lib/title_screen/title_screen_ui.dart +++ b/next-gen-ui/step_04_e/lib/title_screen/title_screen_ui.dart @@ -32,10 +32,7 @@ class TitleScreenUi extends StatelessWidget { children: [ /// Title Text const TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), /// Difficulty Btns @@ -88,9 +85,10 @@ class _TitleText extends StatelessWidget { Image.asset(AssetPaths.titleSelectedRight, height: 65), ], ).animate().fadeIn(delay: .8.seconds, duration: .7.seconds), - Text('INTO THE UNKNOWN', style: TextStyles.h3) - .animate() - .fadeIn(delay: 1.seconds, duration: .7.seconds), + Text( + 'INTO THE UNKNOWN', + style: TextStyles.h3, + ).animate().fadeIn(delay: 1.seconds, duration: .7.seconds), ], ); } @@ -113,29 +111,29 @@ class _DifficultyBtns extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ _DifficultyBtn( - label: 'Casual', - selected: difficulty == 0, - onPressed: () => onDifficultyPressed(0), - onHover: (over) => onDifficultyFocused(over ? 0 : null), - ) + label: 'Casual', + selected: difficulty == 0, + onPressed: () => onDifficultyPressed(0), + onHover: (over) => onDifficultyFocused(over ? 0 : null), + ) .animate() .fadeIn(delay: 1.3.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Normal', - selected: difficulty == 1, - onPressed: () => onDifficultyPressed(1), - onHover: (over) => onDifficultyFocused(over ? 1 : null), - ) + label: 'Normal', + selected: difficulty == 1, + onPressed: () => onDifficultyPressed(1), + onHover: (over) => onDifficultyFocused(over ? 1 : null), + ) .animate() .fadeIn(delay: 1.5.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Hardcore', - selected: difficulty == 2, - onPressed: () => onDifficultyPressed(2), - onHover: (over) => onDifficultyFocused(over ? 2 : null), - ) + label: 'Hardcore', + selected: difficulty == 2, + onPressed: () => onDifficultyPressed(2), + onHover: (over) => onDifficultyFocused(over ? 2 : null), + ) .animate() .fadeIn(delay: 1.7.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), @@ -172,9 +170,10 @@ class _DifficultyBtn extends StatelessWidget { children: [ /// Bg with fill and outline AnimatedOpacity( - opacity: (!selected && (state.isHovered || state.isFocused)) - ? 1 - : 0, + opacity: + (!selected && (state.isHovered || state.isFocused)) + ? 1 + : 0, duration: .3.seconds, child: Container( decoration: BoxDecoration( @@ -194,18 +193,14 @@ class _DifficultyBtn extends StatelessWidget { /// cross-hairs (selected state) if (selected) ...[ - CenterLeft( - child: Image.asset(AssetPaths.titleSelectedLeft), - ), + CenterLeft(child: Image.asset(AssetPaths.titleSelectedLeft)), CenterRight( child: Image.asset(AssetPaths.titleSelectedRight), ), ], /// Label - Center( - child: Text(label.toUpperCase(), style: TextStyles.btn), - ), + Center(child: Text(label.toUpperCase(), style: TextStyles.btn)), ], ), ), @@ -240,30 +235,37 @@ class _StartBtnState extends State<_StartBtn> { } _wasHovered = (state.isHovered || state.isFocused); return SizedBox( - width: 520, - height: 100, - child: Stack( - children: [ - Positioned.fill(child: Image.asset(AssetPaths.titleStartBtn)), - if (state.isHovered || state.isFocused) ...[ - Positioned.fill( - child: Image.asset(AssetPaths.titleStartBtnHover)), - ], - Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text('START MISSION', - style: TextStyles.btn - .copyWith(fontSize: 24, letterSpacing: 18)), - ], - ), - ), - ], - ) - .animate(autoPlay: false, onInit: (c) => _btnAnim = c) - .shimmer(duration: .7.seconds, color: Colors.black), - ) + width: 520, + height: 100, + child: Stack( + children: [ + Positioned.fill( + child: Image.asset(AssetPaths.titleStartBtn), + ), + if (state.isHovered || state.isFocused) ...[ + Positioned.fill( + child: Image.asset(AssetPaths.titleStartBtnHover), + ), + ], + Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + 'START MISSION', + style: TextStyles.btn.copyWith( + fontSize: 24, + letterSpacing: 18, + ), + ), + ], + ), + ), + ], + ) + .animate(autoPlay: false, onInit: (c) => _btnAnim = c) + .shimmer(duration: .7.seconds, color: Colors.black), + ) .animate() .fadeIn(delay: 2.3.seconds) .slide(begin: const Offset(0, .2)); diff --git a/next-gen-ui/step_04_e/macos/Podfile b/next-gen-ui/step_04_e/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_04_e/macos/Podfile +++ b/next-gen-ui/step_04_e/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_04_e/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_04_e/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_04_e/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_04_e/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_04_e/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_04_e/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_04_e/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_04_e/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_04_e/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_04_e/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_04_e/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_04_e/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_04_e/pubspec.yaml b/next-gen-ui/step_04_e/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_04_e/pubspec.yaml +++ b/next-gen-ui/step_04_e/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_04_e/windows/runner/Runner.rc b/next-gen-ui/step_04_e/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_04_e/windows/runner/Runner.rc +++ b/next-gen-ui/step_04_e/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_05_a/android/.gitignore b/next-gen-ui/step_05_a/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_05_a/android/.gitignore +++ b/next-gen-ui/step_05_a/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_05_a/android/app/build.gradle b/next-gen-ui/step_05_a/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_05_a/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_05_a/android/app/build.gradle.kts b/next-gen-ui/step_05_a/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_05_a/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_05_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_05_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_05_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_05_a/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_05_a/android/build.gradle b/next-gen-ui/step_05_a/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_05_a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_05_a/android/build.gradle.kts b/next-gen-ui/step_05_a/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_05_a/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_05_a/android/gradle.properties b/next-gen-ui/step_05_a/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_05_a/android/gradle.properties +++ b/next-gen-ui/step_05_a/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_05_a/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_05_a/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_05_a/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_05_a/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_05_a/android/settings.gradle b/next-gen-ui/step_05_a/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_05_a/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_05_a/android/settings.gradle.kts b/next-gen-ui/step_05_a/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_05_a/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_05_a/ios/Podfile b/next-gen-ui/step_05_a/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_05_a/ios/Podfile +++ b/next-gen-ui/step_05_a/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_05_a/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_05_a/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_05_a/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_05_a/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_05_a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_05_a/lib/assets.dart b/next-gen-ui/step_05_a/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_05_a/lib/assets.dart +++ b/next-gen-ui/step_05_a/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_05_a/lib/common/reactive_widget.dart b/next-gen-ui/step_05_a/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_05_a/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_05_a/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_05_a/lib/common/shader_effect.dart b/next-gen-ui/step_05_a/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_05_a/lib/common/shader_effect.dart +++ b/next-gen-ui/step_05_a/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_05_a/lib/common/ui_scaler.dart b/next-gen-ui/step_05_a/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_05_a/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_05_a/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_05_a/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_05_a/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_05_a/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_05_a/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_05_a/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_05_a/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_05_a/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_05_a/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_05_a/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_05_a/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_05_a/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_05_a/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_05_a/lib/styles.dart b/next-gen-ui/step_05_a/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_05_a/lib/styles.dart +++ b/next-gen-ui/step_05_a/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_05_a/lib/title_screen/title_screen.dart b/next-gen-ui/step_05_a/lib/title_screen/title_screen.dart index 4c6723725b..aad83b04cb 100644 --- a/next-gen-ui/step_05_a/lib/title_screen/title_screen.dart +++ b/next-gen-ui/step_05_a/lib/title_screen/title_screen.dart @@ -147,7 +147,7 @@ class _AnimatedColors extends StatelessWidget { final Color orbColor; final Widget Function(BuildContext context, Color orbColor, Color emitColor) - builder; + builder; @override Widget build(BuildContext context) { diff --git a/next-gen-ui/step_05_a/lib/title_screen/title_screen_ui.dart b/next-gen-ui/step_05_a/lib/title_screen/title_screen_ui.dart index 3bf7e64717..16ac96eb77 100644 --- a/next-gen-ui/step_05_a/lib/title_screen/title_screen_ui.dart +++ b/next-gen-ui/step_05_a/lib/title_screen/title_screen_ui.dart @@ -35,10 +35,7 @@ class TitleScreenUi extends StatelessWidget { children: [ /// Title Text const TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), /// Difficulty Btns @@ -91,9 +88,10 @@ class _TitleText extends StatelessWidget { Image.asset(AssetPaths.titleSelectedRight, height: 65), ], ).animate().fadeIn(delay: .8.seconds, duration: .7.seconds), - Text('INTO THE UNKNOWN', style: TextStyles.h3) - .animate() - .fadeIn(delay: 1.seconds, duration: .7.seconds), + Text( + 'INTO THE UNKNOWN', + style: TextStyles.h3, + ).animate().fadeIn(delay: 1.seconds, duration: .7.seconds), ], ); return Consumer( @@ -101,21 +99,22 @@ class _TitleText extends StatelessWidget { if (fragmentPrograms == null) return content; return TickingBuilder( builder: (context, time) { - return AnimatedSampler( - (image, size, canvas) { - const double overdrawPx = 30; - final shader = fragmentPrograms.ui.fragmentShader(); - shader - ..setFloat(0, size.width) - ..setFloat(1, size.height) - ..setFloat(2, time) - ..setImageSampler(0, image); - Rect rect = Rect.fromLTWH(-overdrawPx, -overdrawPx, - size.width + overdrawPx, size.height + overdrawPx); - canvas.drawRect(rect, Paint()..shader = shader); - }, - child: content, - ); + return AnimatedSampler((image, size, canvas) { + const double overdrawPx = 30; + final shader = fragmentPrograms.ui.fragmentShader(); + shader + ..setFloat(0, size.width) + ..setFloat(1, size.height) + ..setFloat(2, time) + ..setImageSampler(0, image); + Rect rect = Rect.fromLTWH( + -overdrawPx, + -overdrawPx, + size.width + overdrawPx, + size.height + overdrawPx, + ); + canvas.drawRect(rect, Paint()..shader = shader); + }, child: content); }, ); }, @@ -140,29 +139,29 @@ class _DifficultyBtns extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ _DifficultyBtn( - label: 'Casual', - selected: difficulty == 0, - onPressed: () => onDifficultyPressed(0), - onHover: (over) => onDifficultyFocused(over ? 0 : null), - ) + label: 'Casual', + selected: difficulty == 0, + onPressed: () => onDifficultyPressed(0), + onHover: (over) => onDifficultyFocused(over ? 0 : null), + ) .animate() .fadeIn(delay: 1.3.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Normal', - selected: difficulty == 1, - onPressed: () => onDifficultyPressed(1), - onHover: (over) => onDifficultyFocused(over ? 1 : null), - ) + label: 'Normal', + selected: difficulty == 1, + onPressed: () => onDifficultyPressed(1), + onHover: (over) => onDifficultyFocused(over ? 1 : null), + ) .animate() .fadeIn(delay: 1.5.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Hardcore', - selected: difficulty == 2, - onPressed: () => onDifficultyPressed(2), - onHover: (over) => onDifficultyFocused(over ? 2 : null), - ) + label: 'Hardcore', + selected: difficulty == 2, + onPressed: () => onDifficultyPressed(2), + onHover: (over) => onDifficultyFocused(over ? 2 : null), + ) .animate() .fadeIn(delay: 1.7.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), @@ -199,9 +198,10 @@ class _DifficultyBtn extends StatelessWidget { children: [ /// Bg with fill and outline AnimatedOpacity( - opacity: (!selected && (state.isHovered || state.isFocused)) - ? 1 - : 0, + opacity: + (!selected && (state.isHovered || state.isFocused)) + ? 1 + : 0, duration: .3.seconds, child: Container( decoration: BoxDecoration( @@ -221,18 +221,14 @@ class _DifficultyBtn extends StatelessWidget { /// cross-hairs (selected state) if (selected) ...[ - CenterLeft( - child: Image.asset(AssetPaths.titleSelectedLeft), - ), + CenterLeft(child: Image.asset(AssetPaths.titleSelectedLeft)), CenterRight( child: Image.asset(AssetPaths.titleSelectedRight), ), ], /// Label - Center( - child: Text(label.toUpperCase(), style: TextStyles.btn), - ), + Center(child: Text(label.toUpperCase(), style: TextStyles.btn)), ], ), ), @@ -267,30 +263,37 @@ class _StartBtnState extends State<_StartBtn> { } _wasHovered = (state.isHovered || state.isFocused); return SizedBox( - width: 520, - height: 100, - child: Stack( - children: [ - Positioned.fill(child: Image.asset(AssetPaths.titleStartBtn)), - if (state.isHovered || state.isFocused) ...[ - Positioned.fill( - child: Image.asset(AssetPaths.titleStartBtnHover)), - ], - Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text('START MISSION', - style: TextStyles.btn - .copyWith(fontSize: 24, letterSpacing: 18)), - ], - ), - ), - ], - ) - .animate(autoPlay: false, onInit: (c) => _btnAnim = c) - .shimmer(duration: .7.seconds, color: Colors.black), - ) + width: 520, + height: 100, + child: Stack( + children: [ + Positioned.fill( + child: Image.asset(AssetPaths.titleStartBtn), + ), + if (state.isHovered || state.isFocused) ...[ + Positioned.fill( + child: Image.asset(AssetPaths.titleStartBtnHover), + ), + ], + Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + 'START MISSION', + style: TextStyles.btn.copyWith( + fontSize: 24, + letterSpacing: 18, + ), + ), + ], + ), + ), + ], + ) + .animate(autoPlay: false, onInit: (c) => _btnAnim = c) + .shimmer(duration: .7.seconds, color: Colors.black), + ) .animate() .fadeIn(delay: 2.3.seconds) .slide(begin: const Offset(0, .2)); diff --git a/next-gen-ui/step_05_a/macos/Podfile b/next-gen-ui/step_05_a/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_05_a/macos/Podfile +++ b/next-gen-ui/step_05_a/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_05_a/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_05_a/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_05_a/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_05_a/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_05_a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_05_a/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_05_a/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_05_a/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_05_a/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_05_a/pubspec.yaml b/next-gen-ui/step_05_a/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_05_a/pubspec.yaml +++ b/next-gen-ui/step_05_a/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_05_a/windows/runner/Runner.rc b/next-gen-ui/step_05_a/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_05_a/windows/runner/Runner.rc +++ b/next-gen-ui/step_05_a/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_05_b/android/.gitignore b/next-gen-ui/step_05_b/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_05_b/android/.gitignore +++ b/next-gen-ui/step_05_b/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_05_b/android/app/build.gradle b/next-gen-ui/step_05_b/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_05_b/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_05_b/android/app/build.gradle.kts b/next-gen-ui/step_05_b/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_05_b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_05_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_05_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_05_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_05_b/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_05_b/android/build.gradle b/next-gen-ui/step_05_b/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_05_b/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_05_b/android/build.gradle.kts b/next-gen-ui/step_05_b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_05_b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_05_b/android/gradle.properties b/next-gen-ui/step_05_b/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_05_b/android/gradle.properties +++ b/next-gen-ui/step_05_b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_05_b/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_05_b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_05_b/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_05_b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_05_b/android/settings.gradle b/next-gen-ui/step_05_b/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_05_b/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_05_b/android/settings.gradle.kts b/next-gen-ui/step_05_b/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_05_b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_05_b/ios/Podfile b/next-gen-ui/step_05_b/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_05_b/ios/Podfile +++ b/next-gen-ui/step_05_b/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_05_b/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_05_b/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_05_b/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_05_b/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_05_b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_05_b/lib/assets.dart b/next-gen-ui/step_05_b/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_05_b/lib/assets.dart +++ b/next-gen-ui/step_05_b/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_05_b/lib/common/reactive_widget.dart b/next-gen-ui/step_05_b/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_05_b/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_05_b/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_05_b/lib/common/shader_effect.dart b/next-gen-ui/step_05_b/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_05_b/lib/common/shader_effect.dart +++ b/next-gen-ui/step_05_b/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_05_b/lib/common/ui_scaler.dart b/next-gen-ui/step_05_b/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_05_b/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_05_b/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_05_b/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_05_b/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_05_b/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_05_b/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_05_b/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_05_b/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_05_b/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_05_b/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_05_b/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_05_b/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_05_b/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_05_b/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_05_b/lib/styles.dart b/next-gen-ui/step_05_b/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_05_b/lib/styles.dart +++ b/next-gen-ui/step_05_b/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_05_b/lib/title_screen/title_screen.dart b/next-gen-ui/step_05_b/lib/title_screen/title_screen.dart index a69c4dce06..6a228c85ba 100644 --- a/next-gen-ui/step_05_b/lib/title_screen/title_screen.dart +++ b/next-gen-ui/step_05_b/lib/title_screen/title_screen.dart @@ -71,10 +71,10 @@ class _TitleScreenState extends State Duration _getRndPulseDuration() => 100.ms + 200.ms * Random().nextDouble(); double _getMinEnergyForDifficulty(int difficulty) => switch (difficulty) { - 1 => 0.3, - 2 => 0.6, - _ => 0, - }; + 1 => 0.3, + 2 => 0.6, + _ => 0, + }; @override void initState() { @@ -167,9 +167,10 @@ class _TitleScreenState extends State materialColor: orbColor, lightColor: orbColor, ), - onUpdate: (energy) => setState(() { - _orbEnergy = energy; - }), + onUpdate: + (energy) => setState(() { + _orbEnergy = energy; + }), ), ], ), @@ -276,7 +277,7 @@ class _AnimatedColors extends StatelessWidget { final Color orbColor; final Widget Function(BuildContext context, Color orbColor, Color emitColor) - builder; + builder; @override Widget build(BuildContext context) { diff --git a/next-gen-ui/step_05_b/lib/title_screen/title_screen_ui.dart b/next-gen-ui/step_05_b/lib/title_screen/title_screen_ui.dart index 4a7dd6ea7f..2831ad9136 100644 --- a/next-gen-ui/step_05_b/lib/title_screen/title_screen_ui.dart +++ b/next-gen-ui/step_05_b/lib/title_screen/title_screen_ui.dart @@ -37,10 +37,7 @@ class TitleScreenUi extends StatelessWidget { children: [ /// Title Text const TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), /// Difficulty Btns @@ -93,9 +90,10 @@ class _TitleText extends StatelessWidget { Image.asset(AssetPaths.titleSelectedRight, height: 65), ], ).animate().fadeIn(delay: .8.seconds, duration: .7.seconds), - Text('INTO THE UNKNOWN', style: TextStyles.h3) - .animate() - .fadeIn(delay: 1.seconds, duration: .7.seconds), + Text( + 'INTO THE UNKNOWN', + style: TextStyles.h3, + ).animate().fadeIn(delay: 1.seconds, duration: .7.seconds), ], ); return Consumer( @@ -103,21 +101,22 @@ class _TitleText extends StatelessWidget { if (fragmentPrograms == null) return content; return TickingBuilder( builder: (context, time) { - return AnimatedSampler( - (image, size, canvas) { - const double overdrawPx = 30; - final shader = fragmentPrograms.ui.fragmentShader(); - shader - ..setFloat(0, size.width) - ..setFloat(1, size.height) - ..setFloat(2, time) - ..setImageSampler(0, image); - Rect rect = Rect.fromLTWH(-overdrawPx, -overdrawPx, - size.width + overdrawPx, size.height + overdrawPx); - canvas.drawRect(rect, Paint()..shader = shader); - }, - child: content, - ); + return AnimatedSampler((image, size, canvas) { + const double overdrawPx = 30; + final shader = fragmentPrograms.ui.fragmentShader(); + shader + ..setFloat(0, size.width) + ..setFloat(1, size.height) + ..setFloat(2, time) + ..setImageSampler(0, image); + Rect rect = Rect.fromLTWH( + -overdrawPx, + -overdrawPx, + size.width + overdrawPx, + size.height + overdrawPx, + ); + canvas.drawRect(rect, Paint()..shader = shader); + }, child: content); }, ); }, @@ -142,29 +141,29 @@ class _DifficultyBtns extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ _DifficultyBtn( - label: 'Casual', - selected: difficulty == 0, - onPressed: () => onDifficultyPressed(0), - onHover: (over) => onDifficultyFocused(over ? 0 : null), - ) + label: 'Casual', + selected: difficulty == 0, + onPressed: () => onDifficultyPressed(0), + onHover: (over) => onDifficultyFocused(over ? 0 : null), + ) .animate() .fadeIn(delay: 1.3.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Normal', - selected: difficulty == 1, - onPressed: () => onDifficultyPressed(1), - onHover: (over) => onDifficultyFocused(over ? 1 : null), - ) + label: 'Normal', + selected: difficulty == 1, + onPressed: () => onDifficultyPressed(1), + onHover: (over) => onDifficultyFocused(over ? 1 : null), + ) .animate() .fadeIn(delay: 1.5.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Hardcore', - selected: difficulty == 2, - onPressed: () => onDifficultyPressed(2), - onHover: (over) => onDifficultyFocused(over ? 2 : null), - ) + label: 'Hardcore', + selected: difficulty == 2, + onPressed: () => onDifficultyPressed(2), + onHover: (over) => onDifficultyFocused(over ? 2 : null), + ) .animate() .fadeIn(delay: 1.7.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), @@ -201,9 +200,10 @@ class _DifficultyBtn extends StatelessWidget { children: [ /// Bg with fill and outline AnimatedOpacity( - opacity: (!selected && (state.isHovered || state.isFocused)) - ? 1 - : 0, + opacity: + (!selected && (state.isHovered || state.isFocused)) + ? 1 + : 0, duration: .3.seconds, child: Container( decoration: BoxDecoration( @@ -223,18 +223,14 @@ class _DifficultyBtn extends StatelessWidget { /// cross-hairs (selected state) if (selected) ...[ - CenterLeft( - child: Image.asset(AssetPaths.titleSelectedLeft), - ), + CenterLeft(child: Image.asset(AssetPaths.titleSelectedLeft)), CenterRight( child: Image.asset(AssetPaths.titleSelectedRight), ), ], /// Label - Center( - child: Text(label.toUpperCase(), style: TextStyles.btn), - ), + Center(child: Text(label.toUpperCase(), style: TextStyles.btn)), ], ), ), @@ -269,30 +265,37 @@ class _StartBtnState extends State<_StartBtn> { } _wasHovered = (state.isHovered || state.isFocused); return SizedBox( - width: 520, - height: 100, - child: Stack( - children: [ - Positioned.fill(child: Image.asset(AssetPaths.titleStartBtn)), - if (state.isHovered || state.isFocused) ...[ - Positioned.fill( - child: Image.asset(AssetPaths.titleStartBtnHover)), - ], - Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text('START MISSION', - style: TextStyles.btn - .copyWith(fontSize: 24, letterSpacing: 18)), - ], - ), - ), - ], - ) - .animate(autoPlay: false, onInit: (c) => _btnAnim = c) - .shimmer(duration: .7.seconds, color: Colors.black), - ) + width: 520, + height: 100, + child: Stack( + children: [ + Positioned.fill( + child: Image.asset(AssetPaths.titleStartBtn), + ), + if (state.isHovered || state.isFocused) ...[ + Positioned.fill( + child: Image.asset(AssetPaths.titleStartBtnHover), + ), + ], + Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + 'START MISSION', + style: TextStyles.btn.copyWith( + fontSize: 24, + letterSpacing: 18, + ), + ), + ], + ), + ), + ], + ) + .animate(autoPlay: false, onInit: (c) => _btnAnim = c) + .shimmer(duration: .7.seconds, color: Colors.black), + ) .animate() .fadeIn(delay: 2.3.seconds) .slide(begin: const Offset(0, .2)); diff --git a/next-gen-ui/step_05_b/macos/Podfile b/next-gen-ui/step_05_b/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_05_b/macos/Podfile +++ b/next-gen-ui/step_05_b/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_05_b/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_05_b/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_05_b/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_05_b/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_05_b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_05_b/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_05_b/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_05_b/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_05_b/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_05_b/pubspec.yaml b/next-gen-ui/step_05_b/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_05_b/pubspec.yaml +++ b/next-gen-ui/step_05_b/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_05_b/windows/runner/Runner.rc b/next-gen-ui/step_05_b/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_05_b/windows/runner/Runner.rc +++ b/next-gen-ui/step_05_b/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/next-gen-ui/step_06/android/.gitignore b/next-gen-ui/step_06/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/next-gen-ui/step_06/android/.gitignore +++ b/next-gen-ui/step_06/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/next-gen-ui/step_06/android/app/build.gradle b/next-gen-ui/step_06/android/app/build.gradle deleted file mode 100644 index b6fad008f9..0000000000 --- a/next-gen-ui/step_06/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.next_gen_ui" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.next_gen_ui" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/next-gen-ui/step_06/android/app/build.gradle.kts b/next-gen-ui/step_06/android/app/build.gradle.kts new file mode 100644 index 0000000000..4934dd5e41 --- /dev/null +++ b/next-gen-ui/step_06/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.next_gen_ui" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.next_gen_ui" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/next-gen-ui/step_06/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt b/next-gen-ui/step_06/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt index 3e9bc4cccf..4c3a19b83d 100644 --- a/next-gen-ui/step_06/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt +++ b/next-gen-ui/step_06/android/app/src/main/kotlin/com/example/next_gen_ui/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.next_gen_ui import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/next-gen-ui/step_06/android/build.gradle b/next-gen-ui/step_06/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/next-gen-ui/step_06/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/next-gen-ui/step_06/android/build.gradle.kts b/next-gen-ui/step_06/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/next-gen-ui/step_06/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/next-gen-ui/step_06/android/gradle.properties b/next-gen-ui/step_06/android/gradle.properties index 2597170821..f018a61817 100644 --- a/next-gen-ui/step_06/android/gradle.properties +++ b/next-gen-ui/step_06/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/next-gen-ui/step_06/android/gradle/wrapper/gradle-wrapper.properties b/next-gen-ui/step_06/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/next-gen-ui/step_06/android/gradle/wrapper/gradle-wrapper.properties +++ b/next-gen-ui/step_06/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/next-gen-ui/step_06/android/settings.gradle b/next-gen-ui/step_06/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/next-gen-ui/step_06/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/next-gen-ui/step_06/android/settings.gradle.kts b/next-gen-ui/step_06/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/next-gen-ui/step_06/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/next-gen-ui/step_06/ios/Podfile b/next-gen-ui/step_06/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/next-gen-ui/step_06/ios/Podfile +++ b/next-gen-ui/step_06/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_06/ios/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_06/ios/Runner.xcodeproj/project.pbxproj index 8f047bdf00..1ccfa4799b 100644 --- a/next-gen-ui/step_06/ios/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_06/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46BAE536884C6917A13F46E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B1CF946366B840164A5B6A19 /* Pods_Runner.framework */; }; - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,60 +42,51 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B46BAE536884C6917A13F46E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { + 054EDBA468DEB70722A3EEE2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B62141185A2A64CE6AE671F2 /* Pods_Runner.framework in Frameworks */, + 40B88DBD9963959C213DB48B /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - C266D94F39398FF0845062EB /* Frameworks */ = { + 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B81AE38132A98A311F8F51B8 /* Pods_RunnerTests.framework in Frameworks */, + 21230D9189F5B8B5B997213C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 29779CA63CE39E764210D572 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B1CF946366B840164A5B6A19 /* Pods_Runner.framework */, - 249FB81AECD9AE84FFA40AD0 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -104,15 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 67CB01004931F5EAE1484002 /* Pods */ = { + 62ADDF0447F8A492A142E839 /* Pods */ = { isa = PBXGroup; children = ( - 64F96334240D4715F67078C9 /* Pods-Runner.debug.xcconfig */, - 1065108C466C107C635700F4 /* Pods-Runner.release.xcconfig */, - 9790F6561207E583E84D4FF9 /* Pods-Runner.profile.xcconfig */, - 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */, - 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */, - 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */, + E11DD3002EFBF54163C5512E /* Pods-Runner.debug.xcconfig */, + EA33509B53DD48E41D5D0D25 /* Pods-Runner.release.xcconfig */, + 6829F4C84748D44E04ADAAE8 /* Pods-Runner.profile.xcconfig */, + 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */, + 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */, + D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -136,8 +127,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 67CB01004931F5EAE1484002 /* Pods */, - 29779CA63CE39E764210D572 /* Frameworks */, + 62ADDF0447F8A492A142E839 /* Pods */, + C886FB56140D5DB8A5E770B0 /* Frameworks */, ); sourceTree = ""; }; @@ -165,6 +156,15 @@ path = Runner; sourceTree = ""; }; + C886FB56140D5DB8A5E770B0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B46BAE536884C6917A13F46E /* Pods_Runner.framework */, + 795AB3A0C154AD0B2815555C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */, + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - C266D94F39398FF0845062EB /* Frameworks */, + 054EDBA468DEB70722A3EEE2 /* Frameworks */, ); buildRules = ( ); @@ -191,7 +191,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */, + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -269,80 +269,80 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 15FA0791F2F6E4DEC3602581 /* [CP] Check Pods Manifest.lock */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); + name = "Thin Binary"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 1A41435D909B4A5BA59DA804 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + A4E2E90927596D0CF56202F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Thin Binary"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D256D0E94D08C644CD3E44F7 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "Run Script"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -469,7 +469,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0FBB97D3B77C3F8ABBBA69D1 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4D8C4A7C664CC2A6C803F356 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -487,7 +487,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5220EC7DF66B6FF52474A86B /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 0E66D6F83C22057F31BBB18E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -503,7 +503,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6641BE7C3FD295E85E2B1262 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D5F6C024CA13348A7A2E6D6E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/next-gen-ui/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/next-gen-ui/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_06/lib/assets.dart b/next-gen-ui/step_06/lib/assets.dart index d0286c9a12..440dab3f61 100644 --- a/next-gen-ui/step_06/lib/assets.dart +++ b/next-gen-ui/step_06/lib/assets.dart @@ -32,9 +32,9 @@ class AssetPaths { typedef FragmentPrograms = ({FragmentProgram orb, FragmentProgram ui}); Future loadFragmentPrograms() async => ( - orb: (await _loadFragmentProgram(AssetPaths.orbShader)), - ui: (await _loadFragmentProgram(AssetPaths.uiShader)), - ); + orb: (await _loadFragmentProgram(AssetPaths.orbShader)), + ui: (await _loadFragmentProgram(AssetPaths.uiShader)), +); Future _loadFragmentProgram(String path) async { return (await FragmentProgram.fromAsset(path)); diff --git a/next-gen-ui/step_06/lib/common/reactive_widget.dart b/next-gen-ui/step_06/lib/common/reactive_widget.dart index c75aa491e9..f480d8b3eb 100644 --- a/next-gen-ui/step_06/lib/common/reactive_widget.dart +++ b/next-gen-ui/step_06/lib/common/reactive_widget.dart @@ -6,14 +6,11 @@ import 'package:flutter/material.dart'; import 'ticking_builder.dart'; -typedef ReactiveWidgetBuilder = Widget Function( - BuildContext context, double time, Size bounds); +typedef ReactiveWidgetBuilder = + Widget Function(BuildContext context, double time, Size bounds); class ReactiveWidget extends StatefulWidget { - const ReactiveWidget({ - super.key, - required this.builder, - }); + const ReactiveWidget({super.key, required this.builder}); final ReactiveWidgetBuilder builder; @override State createState() => _ReactiveWidgetState(); diff --git a/next-gen-ui/step_06/lib/common/shader_effect.dart b/next-gen-ui/step_06/lib/common/shader_effect.dart index 69bd75f7d9..7e6ebe8bdf 100644 --- a/next-gen-ui/step_06/lib/common/shader_effect.dart +++ b/next-gen-ui/step_06/lib/common/shader_effect.dart @@ -32,11 +32,8 @@ class ShaderEffect extends Effect { this.shader, this.update, ShaderLayer? layer, - }) : layer = layer ?? ShaderLayer.replace, - super( - begin: 0, - end: 1, - ); + }) : layer = layer ?? ShaderLayer.replace, + super(begin: 0, end: 1); final ui.FragmentShader? shader; final ShaderUpdateCallback? update; @@ -91,22 +88,28 @@ extension ShaderEffectExtensions on AnimateManager { ui.FragmentShader? shader, ShaderUpdateCallback? update, ShaderLayer? layer, - }) => - addEffect(ShaderEffect( - delay: delay, - duration: duration, - curve: curve, - shader: shader, - update: update, - layer: layer, - )); + }) => addEffect( + ShaderEffect( + delay: delay, + duration: duration, + curve: curve, + shader: shader, + update: update, + layer: layer, + ), + ); } enum ShaderLayer { foreground, background, replace } /// Function signature for [ShaderEffect] update handlers. -typedef ShaderUpdateCallback = EdgeInsets? Function( - ui.FragmentShader shader, double value, Size size, ui.Image image); +typedef ShaderUpdateCallback = + EdgeInsets? Function( + ui.FragmentShader shader, + double value, + Size size, + ui.Image image, + ); /******************************************************************************/ // TODO: add this as a dependency instead of copying it in once it is stable: @@ -117,11 +120,8 @@ typedef ShaderUpdateCallback = EdgeInsets? Function( // found in the LICENSE file. /// A callback for the [AnimatedSamplerBuilder] widget. -typedef AnimatedSamplerBuilder = void Function( - ui.Image image, - Size size, - ui.Canvas canvas, -); +typedef AnimatedSamplerBuilder = + void Function(ui.Image image, Size size, ui.Canvas canvas); /// A widget that allows access to a snapshot of the child widgets for painting /// with a sampler applied to a [FragmentProgram]. @@ -181,11 +181,7 @@ class AnimatedSampler extends StatelessWidget { @override Widget build(BuildContext context) { - return _ShaderSamplerBuilder( - builder, - enabled: enabled, - child: child, - ); + return _ShaderSamplerBuilder(builder, enabled: enabled, child: child); } } @@ -210,7 +206,9 @@ class _ShaderSamplerBuilder extends SingleChildRenderObjectWidget { @override void updateRenderObject( - BuildContext context, covariant RenderObject renderObject) { + BuildContext context, + covariant RenderObject renderObject, + ) { (renderObject as _RenderShaderSamplerBuilderWidget) ..devicePixelRatio = MediaQuery.of(context).devicePixelRatio ..builder = builder @@ -226,13 +224,14 @@ class _RenderShaderSamplerBuilderWidget extends RenderProxyBox { required double devicePixelRatio, required AnimatedSamplerBuilder builder, required bool enabled, - }) : _devicePixelRatio = devicePixelRatio, - _builder = builder, - _enabled = enabled; + }) : _devicePixelRatio = devicePixelRatio, + _builder = builder, + _enabled = enabled; @override - OffsetLayer updateCompositedLayer( - {required covariant _ShaderSamplerBuilderLayer? oldLayer}) { + OffsetLayer updateCompositedLayer({ + required covariant _ShaderSamplerBuilderLayer? oldLayer, + }) { final _ShaderSamplerBuilderLayer layer = oldLayer ?? _ShaderSamplerBuilderLayer(builder); layer @@ -328,24 +327,24 @@ class _ShaderSamplerBuilderLayer extends OffsetLayer { ui.Image _buildChildScene(Rect bounds, double pixelRatio) { final ui.SceneBuilder builder = ui.SceneBuilder(); - final Matrix4 transform = - Matrix4.diagonal3Values(pixelRatio, pixelRatio, 1); + final Matrix4 transform = Matrix4.diagonal3Values( + pixelRatio, + pixelRatio, + 1, + ); builder.pushTransform(transform.storage); addChildrenToScene(builder); builder.pop(); return builder.build().toImageSync( - (pixelRatio * bounds.width).ceil(), - (pixelRatio * bounds.height).ceil(), - ); + (pixelRatio * bounds.width).ceil(), + (pixelRatio * bounds.height).ceil(), + ); } @override void addToScene(ui.SceneBuilder builder) { if (size.isEmpty) return; - final ui.Image image = _buildChildScene( - offset & size, - devicePixelRatio, - ); + final ui.Image image = _buildChildScene(offset & size, devicePixelRatio); final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); try { diff --git a/next-gen-ui/step_06/lib/common/ui_scaler.dart b/next-gen-ui/step_06/lib/common/ui_scaler.dart index 07c3287650..e7dbb9be42 100644 --- a/next-gen-ui/step_06/lib/common/ui_scaler.dart +++ b/next-gen-ui/step_06/lib/common/ui_scaler.dart @@ -22,10 +22,6 @@ class UiScaler extends StatelessWidget { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final double scale = min(screenSize.height / referenceHeight, 1.0); - return Transform.scale( - scale: scale, - alignment: alignment, - child: child, - ); + return Transform.scale(scale: scale, alignment: alignment, child: child); } } diff --git a/next-gen-ui/step_06/lib/orb_shader/orb_shader_config.dart b/next-gen-ui/step_06/lib/orb_shader/orb_shader_config.dart index ef975cccf8..a038e0be63 100644 --- a/next-gen-ui/step_06/lib/orb_shader/orb_shader_config.dart +++ b/next-gen-ui/step_06/lib/orb_shader/orb_shader_config.dart @@ -22,14 +22,14 @@ class OrbShaderConfig { this.lightOffsetX = 0, this.lightOffsetY = 0.1, this.lightOffsetZ = -0.66, - }) : assert(zoom >= 0 && zoom <= 1), - assert(exposure >= 0), - assert(metalness >= 0 && metalness <= 1), - assert(lightRadius >= 0), - assert(lightBrightness >= 1), - assert(ior >= 0 && ior <= 2), - assert(lightAttenuation >= 0 && lightAttenuation <= 1), - assert(ambientLightBrightness >= 0); + }) : assert(zoom >= 0 && zoom <= 1), + assert(exposure >= 0), + assert(metalness >= 0 && metalness <= 1), + assert(lightRadius >= 0), + assert(lightBrightness >= 1), + assert(ior >= 0 && ior <= 2), + assert(lightAttenuation >= 0 && lightAttenuation <= 1), + assert(ambientLightBrightness >= 0); final double zoom; diff --git a/next-gen-ui/step_06/lib/orb_shader/orb_shader_painter.dart b/next-gen-ui/step_06/lib/orb_shader/orb_shader_painter.dart index 399c20ab7e..1e04cc0df8 100644 --- a/next-gen-ui/step_06/lib/orb_shader/orb_shader_painter.dart +++ b/next-gen-ui/step_06/lib/orb_shader/orb_shader_painter.dart @@ -30,11 +30,13 @@ class OrbShaderPainter extends CustomPainter { v64.Vector3 colorToVector3(Color c) => v64.Vector3(c.r, c.g, c.b); - v64.Vector3 lightLumP = colorToVector3(config.lightColor).normalized() * + v64.Vector3 lightLumP = + colorToVector3(config.lightColor).normalized() * max(0.0, config.lightBrightness); v64.Vector3 albedo = colorToVector3(config.materialColor); - v64.Vector3 ambientLight = colorToVector3(config.ambientLightColor) * + v64.Vector3 ambientLight = + colorToVector3(config.ambientLightColor) * max(0.0, config.ambientLightBrightness); shader.setFloat(0, size.width); diff --git a/next-gen-ui/step_06/lib/orb_shader/orb_shader_widget.dart b/next-gen-ui/step_06/lib/orb_shader/orb_shader_widget.dart index 573b68afea..4187e7ced2 100644 --- a/next-gen-ui/step_06/lib/orb_shader/orb_shader_widget.dart +++ b/next-gen-ui/step_06/lib/orb_shader/orb_shader_widget.dart @@ -35,72 +35,82 @@ class OrbShaderWidget extends StatefulWidget { class OrbShaderWidgetState extends State with SingleTickerProviderStateMixin { - final _heartbeatSequence = TweenSequence( - [ - TweenSequenceItem(tween: ConstantTween(0), weight: 40), - TweenSequenceItem( - tween: Tween(begin: 0.0, end: 1.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 8), - TweenSequenceItem( - tween: Tween(begin: 1.0, end: 0.2) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 12), - TweenSequenceItem( - tween: Tween(begin: 0.2, end: 0.8) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 6), - TweenSequenceItem( - tween: Tween(begin: 0.8, end: 0.0) - .chain(CurveTween(curve: Curves.easeInOutCubic)), - weight: 10), - ], - ); + final _heartbeatSequence = TweenSequence([ + TweenSequenceItem(tween: ConstantTween(0), weight: 40), + TweenSequenceItem( + tween: Tween( + begin: 0.0, + end: 1.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 8, + ), + TweenSequenceItem( + tween: Tween( + begin: 1.0, + end: 0.2, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 12, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.2, + end: 0.8, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 6, + ), + TweenSequenceItem( + tween: Tween( + begin: 0.8, + end: 0.0, + ).chain(CurveTween(curve: Curves.easeInOutCubic)), + weight: 10, + ), + ]); - late final _heartbeatAnim = - AnimationController(vsync: this, duration: 3000.ms)..repeat(); + late final _heartbeatAnim = AnimationController( + vsync: this, + duration: 3000.ms, + )..repeat(); @override Widget build(BuildContext context) => Consumer( - builder: (context, fragmentPrograms, _) { - if (fragmentPrograms == null) return const SizedBox.expand(); - return ListenableBuilder( - listenable: _heartbeatAnim, - builder: (_, __) { - final heartbeatEnergy = - _heartbeatAnim.drive(_heartbeatSequence).value; - return TweenAnimationBuilder( - tween: Tween( - begin: widget.minEnergy, end: widget.minEnergy), - duration: 300.ms, - curve: Curves.easeOutCubic, - builder: (context, minEnergy, child) { - return ReactiveWidget( - builder: (context, time, size) { - double energyLevel = 0; - if (size.shortestSide != 0) { - final d = (Offset(size.width, size.height) / 2 - - widget.mousePos) + builder: (context, fragmentPrograms, _) { + if (fragmentPrograms == null) return const SizedBox.expand(); + return ListenableBuilder( + listenable: _heartbeatAnim, + builder: (_, __) { + final heartbeatEnergy = + _heartbeatAnim.drive(_heartbeatSequence).value; + return TweenAnimationBuilder( + tween: Tween( + begin: widget.minEnergy, + end: widget.minEnergy, + ), + duration: 300.ms, + curve: Curves.easeOutCubic, + builder: (context, minEnergy, child) { + return ReactiveWidget( + builder: (context, time, size) { + double energyLevel = 0; + if (size.shortestSide != 0) { + final d = + (Offset(size.width, size.height) / 2 - widget.mousePos) .distance; - final hitSize = size.shortestSide * .5; - energyLevel = 1 - min(1, (d / hitSize)); - scheduleMicrotask( - () => widget.onUpdate?.call(energyLevel)); - } - energyLevel += - (1.3 - energyLevel) * heartbeatEnergy * 0.1; - energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; - return CustomPaint( - size: size, - painter: OrbShaderPainter( - fragmentPrograms.orb.fragmentShader(), - config: widget.config, - time: time, - mousePos: widget.mousePos, - energy: energyLevel, - ), - ); - }, + final hitSize = size.shortestSide * .5; + energyLevel = 1 - min(1, (d / hitSize)); + scheduleMicrotask(() => widget.onUpdate?.call(energyLevel)); + } + energyLevel += (1.3 - energyLevel) * heartbeatEnergy * 0.1; + energyLevel = lerpDouble(minEnergy, 1, energyLevel)!; + return CustomPaint( + size: size, + painter: OrbShaderPainter( + fragmentPrograms.orb.fragmentShader(), + config: widget.config, + time: time, + mousePos: widget.mousePos, + energy: energyLevel, + ), ); }, ); @@ -108,4 +118,6 @@ class OrbShaderWidgetState extends State ); }, ); + }, + ); } diff --git a/next-gen-ui/step_06/lib/styles.dart b/next-gen-ui/step_06/lib/styles.dart index 1e449fff3a..fb5083c6a8 100644 --- a/next-gen-ui/step_06/lib/styles.dart +++ b/next-gen-ui/step_06/lib/styles.dart @@ -8,16 +8,19 @@ class TextStyles { static const _font1 = TextStyle(fontFamily: 'Exo', color: Colors.white); static TextStyle get h1 => _font1.copyWith( - fontSize: 75, letterSpacing: 35, fontWeight: FontWeight.w700); + fontSize: 75, + letterSpacing: 35, + fontWeight: FontWeight.w700, + ); static TextStyle get h2 => h1.copyWith(fontSize: 40, letterSpacing: 0); static TextStyle get h3 => h1.copyWith(fontSize: 24, letterSpacing: 20, fontWeight: FontWeight.w400); static TextStyle get body => _font1.copyWith(fontSize: 16); static TextStyle get btn => _font1.copyWith( - fontSize: 16, - fontWeight: FontWeight.bold, - letterSpacing: 10, - ); + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 10, + ); } abstract class AppColors { diff --git a/next-gen-ui/step_06/lib/title_screen/particle_overlay.dart b/next-gen-ui/step_06/lib/title_screen/particle_overlay.dart index 52d6a1c8a8..183d22f338 100644 --- a/next-gen-ui/step_06/lib/title_screen/particle_overlay.dart +++ b/next-gen-ui/step_06/lib/title_screen/particle_overlay.dart @@ -31,19 +31,21 @@ class ParticleOverlay extends StatelessWidget { double a = rnd(pi * 2); double dist = rnd(1, 4) * 35 + 150 * energy; double vel = rnd(1, 2) * (1 + energy * 1.8); - particles.add(Particle( - // how many ticks this particle will live: - lifespan: rnd(1, 2) * 20 + energy * 15, - // starting distance from center: - x: cos(a) * dist, - y: sin(a) * dist, - // starting velocity: - vx: cos(a) * vel, - vy: sin(a) * vel, - // other starting values: - rotation: a, - scale: rnd(1, 2) * 0.6 + energy * 0.5, - )); + particles.add( + Particle( + // how many ticks this particle will live: + lifespan: rnd(1, 2) * 20 + energy * 15, + // starting distance from center: + x: cos(a) * dist, + y: sin(a) * dist, + // starting velocity: + vx: cos(a) * vel, + vy: sin(a) * vel, + // other starting values: + rotation: a, + scale: rnd(1, 2) * 0.6 + energy * 0.5, + ), + ); // update all of the particles: for (int i = particles.length - 1; i >= 0; i--) { diff --git a/next-gen-ui/step_06/lib/title_screen/title_screen.dart b/next-gen-ui/step_06/lib/title_screen/title_screen.dart index 913ac6b873..ce5a4dba46 100644 --- a/next-gen-ui/step_06/lib/title_screen/title_screen.dart +++ b/next-gen-ui/step_06/lib/title_screen/title_screen.dart @@ -72,10 +72,10 @@ class _TitleScreenState extends State Duration _getRndPulseDuration() => 100.ms + 200.ms * Random().nextDouble(); double _getMinEnergyForDifficulty(int difficulty) => switch (difficulty) { - 1 => 0.3, - 2 => 0.6, - _ => 0, - }; + 1 => 0.3, + 2 => 0.6, + _ => 0, + }; @override void initState() { @@ -168,9 +168,10 @@ class _TitleScreenState extends State materialColor: orbColor, lightColor: orbColor, ), - onUpdate: (energy) => setState(() { - _orbEnergy = energy; - }), + onUpdate: + (energy) => setState(() { + _orbEnergy = energy; + }), ), ], ), @@ -287,7 +288,7 @@ class _AnimatedColors extends StatelessWidget { final Color orbColor; final Widget Function(BuildContext context, Color orbColor, Color emitColor) - builder; + builder; @override Widget build(BuildContext context) { diff --git a/next-gen-ui/step_06/lib/title_screen/title_screen_ui.dart b/next-gen-ui/step_06/lib/title_screen/title_screen_ui.dart index 4a7dd6ea7f..2831ad9136 100644 --- a/next-gen-ui/step_06/lib/title_screen/title_screen_ui.dart +++ b/next-gen-ui/step_06/lib/title_screen/title_screen_ui.dart @@ -37,10 +37,7 @@ class TitleScreenUi extends StatelessWidget { children: [ /// Title Text const TopLeft( - child: UiScaler( - alignment: Alignment.topLeft, - child: _TitleText(), - ), + child: UiScaler(alignment: Alignment.topLeft, child: _TitleText()), ), /// Difficulty Btns @@ -93,9 +90,10 @@ class _TitleText extends StatelessWidget { Image.asset(AssetPaths.titleSelectedRight, height: 65), ], ).animate().fadeIn(delay: .8.seconds, duration: .7.seconds), - Text('INTO THE UNKNOWN', style: TextStyles.h3) - .animate() - .fadeIn(delay: 1.seconds, duration: .7.seconds), + Text( + 'INTO THE UNKNOWN', + style: TextStyles.h3, + ).animate().fadeIn(delay: 1.seconds, duration: .7.seconds), ], ); return Consumer( @@ -103,21 +101,22 @@ class _TitleText extends StatelessWidget { if (fragmentPrograms == null) return content; return TickingBuilder( builder: (context, time) { - return AnimatedSampler( - (image, size, canvas) { - const double overdrawPx = 30; - final shader = fragmentPrograms.ui.fragmentShader(); - shader - ..setFloat(0, size.width) - ..setFloat(1, size.height) - ..setFloat(2, time) - ..setImageSampler(0, image); - Rect rect = Rect.fromLTWH(-overdrawPx, -overdrawPx, - size.width + overdrawPx, size.height + overdrawPx); - canvas.drawRect(rect, Paint()..shader = shader); - }, - child: content, - ); + return AnimatedSampler((image, size, canvas) { + const double overdrawPx = 30; + final shader = fragmentPrograms.ui.fragmentShader(); + shader + ..setFloat(0, size.width) + ..setFloat(1, size.height) + ..setFloat(2, time) + ..setImageSampler(0, image); + Rect rect = Rect.fromLTWH( + -overdrawPx, + -overdrawPx, + size.width + overdrawPx, + size.height + overdrawPx, + ); + canvas.drawRect(rect, Paint()..shader = shader); + }, child: content); }, ); }, @@ -142,29 +141,29 @@ class _DifficultyBtns extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ _DifficultyBtn( - label: 'Casual', - selected: difficulty == 0, - onPressed: () => onDifficultyPressed(0), - onHover: (over) => onDifficultyFocused(over ? 0 : null), - ) + label: 'Casual', + selected: difficulty == 0, + onPressed: () => onDifficultyPressed(0), + onHover: (over) => onDifficultyFocused(over ? 0 : null), + ) .animate() .fadeIn(delay: 1.3.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Normal', - selected: difficulty == 1, - onPressed: () => onDifficultyPressed(1), - onHover: (over) => onDifficultyFocused(over ? 1 : null), - ) + label: 'Normal', + selected: difficulty == 1, + onPressed: () => onDifficultyPressed(1), + onHover: (over) => onDifficultyFocused(over ? 1 : null), + ) .animate() .fadeIn(delay: 1.5.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), _DifficultyBtn( - label: 'Hardcore', - selected: difficulty == 2, - onPressed: () => onDifficultyPressed(2), - onHover: (over) => onDifficultyFocused(over ? 2 : null), - ) + label: 'Hardcore', + selected: difficulty == 2, + onPressed: () => onDifficultyPressed(2), + onHover: (over) => onDifficultyFocused(over ? 2 : null), + ) .animate() .fadeIn(delay: 1.7.seconds, duration: .35.seconds) .slide(begin: const Offset(0, .2)), @@ -201,9 +200,10 @@ class _DifficultyBtn extends StatelessWidget { children: [ /// Bg with fill and outline AnimatedOpacity( - opacity: (!selected && (state.isHovered || state.isFocused)) - ? 1 - : 0, + opacity: + (!selected && (state.isHovered || state.isFocused)) + ? 1 + : 0, duration: .3.seconds, child: Container( decoration: BoxDecoration( @@ -223,18 +223,14 @@ class _DifficultyBtn extends StatelessWidget { /// cross-hairs (selected state) if (selected) ...[ - CenterLeft( - child: Image.asset(AssetPaths.titleSelectedLeft), - ), + CenterLeft(child: Image.asset(AssetPaths.titleSelectedLeft)), CenterRight( child: Image.asset(AssetPaths.titleSelectedRight), ), ], /// Label - Center( - child: Text(label.toUpperCase(), style: TextStyles.btn), - ), + Center(child: Text(label.toUpperCase(), style: TextStyles.btn)), ], ), ), @@ -269,30 +265,37 @@ class _StartBtnState extends State<_StartBtn> { } _wasHovered = (state.isHovered || state.isFocused); return SizedBox( - width: 520, - height: 100, - child: Stack( - children: [ - Positioned.fill(child: Image.asset(AssetPaths.titleStartBtn)), - if (state.isHovered || state.isFocused) ...[ - Positioned.fill( - child: Image.asset(AssetPaths.titleStartBtnHover)), - ], - Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text('START MISSION', - style: TextStyles.btn - .copyWith(fontSize: 24, letterSpacing: 18)), - ], - ), - ), - ], - ) - .animate(autoPlay: false, onInit: (c) => _btnAnim = c) - .shimmer(duration: .7.seconds, color: Colors.black), - ) + width: 520, + height: 100, + child: Stack( + children: [ + Positioned.fill( + child: Image.asset(AssetPaths.titleStartBtn), + ), + if (state.isHovered || state.isFocused) ...[ + Positioned.fill( + child: Image.asset(AssetPaths.titleStartBtnHover), + ), + ], + Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + 'START MISSION', + style: TextStyles.btn.copyWith( + fontSize: 24, + letterSpacing: 18, + ), + ), + ], + ), + ), + ], + ) + .animate(autoPlay: false, onInit: (c) => _btnAnim = c) + .shimmer(duration: .7.seconds, color: Colors.black), + ) .animate() .fadeIn(delay: 2.3.seconds) .slide(begin: const Offset(0, .2)); diff --git a/next-gen-ui/step_06/macos/Podfile b/next-gen-ui/step_06/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/next-gen-ui/step_06/macos/Podfile +++ b/next-gen-ui/step_06/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/next-gen-ui/step_06/macos/Runner.xcodeproj/project.pbxproj b/next-gen-ui/step_06/macos/Runner.xcodeproj/project.pbxproj index 5ca8a3231e..00cf6654d1 100644 --- a/next-gen-ui/step_06/macos/Runner.xcodeproj/project.pbxproj +++ b/next-gen-ui/step_06/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */; }; + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70907F10D88B462804477CEC /* Pods_Runner.framework */; }; + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +62,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +80,14 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 70907F10D88B462804477CEC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2E6B87224BF317E31F74B0D6 /* Pods_RunnerTests.framework in Frameworks */, + E42902DB736480E9C2276B8C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,27 +103,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 56635C0EC97E7F426A37B2E0 /* Pods_Runner.framework in Frameworks */, + 164D1626F845F42DA57B3850 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0EB950B6EBBA8562ED05E9C6 /* Pods */ = { - isa = PBXGroup; - children = ( - 1084579C46BDDCE9E7DF16AC /* Pods-Runner.debug.xcconfig */, - 2D475486DFFA8C60E5710DB0 /* Pods-Runner.release.xcconfig */, - E57940CC1AE193EDBC7E60BC /* Pods-Runner.profile.xcconfig */, - 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */, - 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */, - 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -151,7 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 0EB950B6EBBA8562ED05E9C6 /* Pods */, + E34793676509747D6285AB16 /* Pods */, ); sourceTree = ""; }; @@ -202,12 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 70907F10D88B462804477CEC /* Pods_Runner.framework */, - FF5748F504BD5E56042DEADB /* Pods_RunnerTests.framework */, + EAEC91886AC5DFF46A36488E /* Pods_Runner.framework */, + DDCC7B17484FDA6FA5B9F10D /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + E34793676509747D6285AB16 /* Pods */ = { + isa = PBXGroup; + children = ( + 9A3EC0E8FCF3A17E31C97BC7 /* Pods-Runner.debug.xcconfig */, + 6CC71A9B11C85AD1D82B90F8 /* Pods-Runner.release.xcconfig */, + 15CC24631BC9147A769EC288 /* Pods-Runner.profile.xcconfig */, + 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */, + 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */, + 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */, + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */, + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */, + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -323,7 +323,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 038DC0986A46E5F2839BD12E /* [CP] Embed Pods Frameworks */ = { + 006B3839D302995D083AC119 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -340,67 +340,67 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 24CA264AC7C1AA37F685BC19 /* [CP] Check Pods Manifest.lock */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( + Flutter/ephemeral/tripwire, ); outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 68E3BEA5B304CD0C84AA7115 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 9936C57FFCBF37419AE7561E /* [CP] Check Pods Manifest.lock */ = { + B1F1E09A7F1A94A67A227A05 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +415,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -473,7 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86295B0784C4F550CBE8BD69 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 64F0B1EEF7EE24FBA37B3F51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -488,7 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 949451BBF3DF607E13DBB265 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 1B0C61A7C21063B38A11BD6E /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -503,7 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 812DEB8E378C986DF221D831 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 4CAE8F3CF9962B87DD658FF9 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/next-gen-ui/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/next-gen-ui/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 81245032fe..43f629639c 100644 --- a/next-gen-ui/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/next-gen-ui/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/next-gen-ui/step_06/macos/Runner/Configs/AppInfo.xcconfig b/next-gen-ui/step_06/macos/Runner/Configs/AppInfo.xcconfig index 75cb962401..49197d439f 100644 --- a/next-gen-ui/step_06/macos/Runner/Configs/AppInfo.xcconfig +++ b/next-gen-ui/step_06/macos/Runner/Configs/AppInfo.xcconfig @@ -11,4 +11,4 @@ PRODUCT_NAME = next_gen_ui PRODUCT_BUNDLE_IDENTIFIER = com.example.nextGenUi // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/next-gen-ui/step_06/pubspec.yaml b/next-gen-ui/step_06/pubspec.yaml index 601a335c3d..336748d3fe 100644 --- a/next-gen-ui/step_06/pubspec.yaml +++ b/next-gen-ui/step_06/pubspec.yaml @@ -4,14 +4,14 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: sdk: flutter extra_alignments: ^1.0.0+1 flextras: ^1.0.0 - flutter_animate: ^4.5.0 + flutter_animate: ^4.5.2 focusable_control_builder: ^1.0.2+1 gap: ^3.0.1 particle_field: ^1.0.0 diff --git a/next-gen-ui/step_06/windows/runner/Runner.rc b/next-gen-ui/step_06/windows/runner/Runner.rc index 9818761ddd..64f7731101 100644 --- a/next-gen-ui/step_06/windows/runner/Runner.rc +++ b/next-gen-ui/step_06/windows/runner/Runner.rc @@ -93,7 +93,7 @@ BEGIN VALUE "FileDescription", "next_gen_ui" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "next_gen_ui" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" VALUE "OriginalFilename", "next_gen_ui.exe" "\0" VALUE "ProductName", "next_gen_ui" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" diff --git a/testing_codelab/codelab_rebuild.yaml b/testing_codelab/codelab_rebuild.yaml index d1470e2169..94434ddf3b 100644 --- a/testing_codelab/codelab_rebuild.yaml +++ b/testing_codelab/codelab_rebuild.yaml @@ -66,6 +66,9 @@ steps: import 'package:flutter/material.dart'; void main() { + - name: Format lib/main.dart + path: testing_app + dart: format lib/main.dart - name: Copy step_03 copydir: from: testing_app @@ -121,9 +124,7 @@ steps: child: MaterialApp.router( title: 'Testing Sample', theme: ThemeData( - colorScheme: ColorScheme.fromSeed( - seedColor: Colors.deepPurple, - ), + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), routerConfig: _router, ), @@ -167,39 +168,39 @@ steps: // Copyright 2020 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; - + import '../models/favorites.dart'; - + class FavoritesPage extends StatelessWidget { const FavoritesPage({super.key}); - + static String routeName = 'favorites_page'; - + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Favorites'), - ), + appBar: AppBar(title: const Text('Favorites')), body: Consumer( - builder: (context, value, child) => ListView.builder( - itemCount: value.items.length, - padding: const EdgeInsets.symmetric(vertical: 16), - itemBuilder: (context, index) => FavoriteItemTile(value.items[index]), - ), + builder: + (context, value, child) => ListView.builder( + itemCount: value.items.length, + padding: const EdgeInsets.symmetric(vertical: 16), + itemBuilder: + (context, index) => FavoriteItemTile(value.items[index]), + ), ), ); } } - + class FavoriteItemTile extends StatelessWidget { const FavoriteItemTile(this.itemNo, {super.key}); - + final int itemNo; - + @override Widget build(BuildContext context) { return Padding( @@ -208,10 +209,7 @@ steps: leading: CircleAvatar( backgroundColor: Colors.primaries[itemNo % Colors.primaries.length], ), - title: Text( - 'Item $itemNo', - key: Key('favorites_text_$itemNo'), - ), + title: Text('Item $itemNo', key: Key('favorites_text_$itemNo')), trailing: IconButton( key: Key('remove_icon_$itemNo'), icon: const Icon(Icons.close), @@ -235,18 +233,18 @@ steps: // Copyright 2020 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import '../models/favorites.dart'; import 'favorites.dart'; - + class HomePage extends StatelessWidget { static String routeName = '/'; - + const HomePage({super.key}); - + @override Widget build(BuildContext context) { return Scaffold( @@ -271,40 +269,40 @@ steps: ); } } - + class ItemTile extends StatelessWidget { final int itemNo; - + const ItemTile(this.itemNo, {super.key}); - + @override Widget build(BuildContext context) { var favoritesList = Provider.of(context); - + return Padding( padding: const EdgeInsets.all(8.0), child: ListTile( leading: CircleAvatar( backgroundColor: Colors.primaries[itemNo % Colors.primaries.length], ), - title: Text( - 'Item $itemNo', - key: Key('text_$itemNo'), - ), + title: Text('Item $itemNo', key: Key('text_$itemNo')), trailing: IconButton( key: Key('icon_$itemNo'), - icon: favoritesList.items.contains(itemNo) - ? const Icon(Icons.favorite) - : const Icon(Icons.favorite_border), + icon: + favoritesList.items.contains(itemNo) + ? const Icon(Icons.favorite) + : const Icon(Icons.favorite_border), onPressed: () { !favoritesList.items.contains(itemNo) ? favoritesList.add(itemNo) : favoritesList.remove(itemNo); ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text(favoritesList.items.contains(itemNo) - ? 'Added to favorites.' - : 'Removed from favorites.'), + content: Text( + favoritesList.items.contains(itemNo) + ? 'Added to favorites.' + : 'Removed from favorites.', + ), duration: const Duration(seconds: 1), ), ); @@ -412,14 +410,12 @@ steps: late Favorites favoritesList; Widget createFavoritesScreen() => ChangeNotifierProvider( - create: (context) { - favoritesList = Favorites(); - return favoritesList; - }, - child: const MaterialApp( - home: FavoritesPage(), - ), - ); + create: (context) { + favoritesList = Favorites(); + return favoritesList; + }, + child: const MaterialApp(home: FavoritesPage()), + ); void addItems() { for (var i = 0; i < 10; i += 2) { @@ -443,8 +439,10 @@ steps: var totalItems = tester.widgetList(find.byIcon(Icons.close)).length; await tester.tap(find.byIcon(Icons.close).first); await tester.pumpAndSettle(); - expect(tester.widgetList(find.byIcon(Icons.close)).length, - lessThan(totalItems)); + expect( + tester.widgetList(find.byIcon(Icons.close)).length, + lessThan(totalItems), + ); expect(find.text('Removed from favorites.'), findsOneWidget); }); }); @@ -455,39 +453,33 @@ steps: // Copyright 2020 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:provider/provider.dart'; import 'package:testing_app/models/favorites.dart'; import 'package:testing_app/screens/home.dart'; - + Widget createHomeScreen() => ChangeNotifierProvider( - create: (context) => Favorites(), - child: const MaterialApp( - home: HomePage(), - ), - ); - + create: (context) => Favorites(), + child: const MaterialApp(home: HomePage()), + ); + void main() { group('Home Page Widget Tests', () { testWidgets('Testing if ListView shows up', (tester) async { await tester.pumpWidget(createHomeScreen()); expect(find.byType(ListView), findsOneWidget); }); - + testWidgets('Testing Scrolling', (tester) async { await tester.pumpWidget(createHomeScreen()); expect(find.text('Item 0'), findsOneWidget); - await tester.fling( - find.byType(ListView), - const Offset(0, -200), - 3000, - ); + await tester.fling(find.byType(ListView), const Offset(0, -200), 3000); await tester.pumpAndSettle(); expect(find.text('Item 0'), findsNothing); }); - + testWidgets('Testing IconButtons', (tester) async { await tester.pumpWidget(createHomeScreen()); expect(find.byIcon(Icons.favorite), findsNothing); @@ -525,42 +517,38 @@ steps: // Copyright 2021 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:testing_app/main.dart'; - + void main() { group('Testing App', () { testWidgets('Favorites operations test', (tester) async { await tester.pumpWidget(const TestingApp()); - - final iconKeys = [ - 'icon_0', - 'icon_1', - 'icon_2', - ]; - + + final iconKeys = ['icon_0', 'icon_1', 'icon_2']; + for (var icon in iconKeys) { await tester.tap(find.byKey(ValueKey(icon))); await tester.pumpAndSettle(const Duration(seconds: 1)); - + expect(find.text('Added to favorites.'), findsOneWidget); } - + await tester.tap(find.text('Favorites')); await tester.pumpAndSettle(); - + final removeIconKeys = [ 'remove_icon_0', 'remove_icon_1', 'remove_icon_2', ]; - + for (final iconKey in removeIconKeys) { await tester.tap(find.byKey(ValueKey(iconKey))); await tester.pumpAndSettle(const Duration(seconds: 1)); - + expect(find.text('Removed from favorites.'), findsOneWidget); } }); @@ -633,19 +621,20 @@ steps: // Copyright 2020 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter_driver/flutter_driver.dart' as driver; import 'package:integration_test/integration_test_driver.dart'; - + Future main() { return integrationDriver( responseDataCallback: (data) async { if (data != null) { final timeline = driver.Timeline.fromJson( - data['scrolling_summary'] as Map); - + data['scrolling_summary'] as Map, + ); + final summary = driver.TimelineSummary.summarize(timeline); - + await summary.writeTimelineToFile( 'scrolling_summary', pretty: true, diff --git a/testing_codelab/step_03/android/.gitignore b/testing_codelab/step_03/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/testing_codelab/step_03/android/.gitignore +++ b/testing_codelab/step_03/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/testing_codelab/step_03/android/app/build.gradle b/testing_codelab/step_03/android/app/build.gradle deleted file mode 100644 index 10e017b858..0000000000 --- a/testing_codelab/step_03/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.testing_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.testing_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/testing_codelab/step_03/android/app/build.gradle.kts b/testing_codelab/step_03/android/app/build.gradle.kts new file mode 100644 index 0000000000..ee969b8712 --- /dev/null +++ b/testing_codelab/step_03/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.testing_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.testing_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/testing_codelab/step_03/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt b/testing_codelab/step_03/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt index 337e691391..c077d2270d 100644 --- a/testing_codelab/step_03/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt +++ b/testing_codelab/step_03/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.testing_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/testing_codelab/step_03/android/build.gradle b/testing_codelab/step_03/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/testing_codelab/step_03/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/testing_codelab/step_03/android/build.gradle.kts b/testing_codelab/step_03/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/testing_codelab/step_03/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/testing_codelab/step_03/android/gradle.properties b/testing_codelab/step_03/android/gradle.properties index 2597170821..f018a61817 100644 --- a/testing_codelab/step_03/android/gradle.properties +++ b/testing_codelab/step_03/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/testing_codelab/step_03/android/gradle/wrapper/gradle-wrapper.properties b/testing_codelab/step_03/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/testing_codelab/step_03/android/gradle/wrapper/gradle-wrapper.properties +++ b/testing_codelab/step_03/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/testing_codelab/step_03/android/settings.gradle b/testing_codelab/step_03/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/testing_codelab/step_03/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/testing_codelab/step_03/android/settings.gradle.kts b/testing_codelab/step_03/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/testing_codelab/step_03/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/testing_codelab/step_03/ios/Podfile b/testing_codelab/step_03/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/testing_codelab/step_03/ios/Podfile +++ b/testing_codelab/step_03/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/testing_codelab/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/testing_codelab/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/testing_codelab/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/testing_codelab/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/testing_codelab/step_03/lib/main.dart b/testing_codelab/step_03/lib/main.dart index a54c73710f..11536f7c6f 100644 --- a/testing_codelab/step_03/lib/main.dart +++ b/testing_codelab/step_03/lib/main.dart @@ -14,11 +14,7 @@ class MainApp extends StatelessWidget { @override Widget build(BuildContext context) { return const MaterialApp( - home: Scaffold( - body: Center( - child: Text('Hello World!'), - ), - ), + home: Scaffold(body: Center(child: Text('Hello World!'))), ); } } diff --git a/testing_codelab/step_03/macos/Podfile b/testing_codelab/step_03/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/testing_codelab/step_03/macos/Podfile +++ b/testing_codelab/step_03/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/testing_codelab/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/testing_codelab/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 643630b7fb..a506647a7d 100644 --- a/testing_codelab/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/testing_codelab/step_03/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/testing_codelab/step_03/pubspec.yaml b/testing_codelab/step_03/pubspec.yaml index 0896897318..de5dc2ac5f 100644 --- a/testing_codelab/step_03/pubspec.yaml +++ b/testing_codelab/step_03/pubspec.yaml @@ -8,7 +8,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -20,7 +20,7 @@ dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^5.0.0 - test: ^1.25.8 + test: ^1.25.15 flutter_driver: sdk: flutter integration_test: diff --git a/testing_codelab/step_04/android/.gitignore b/testing_codelab/step_04/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/testing_codelab/step_04/android/.gitignore +++ b/testing_codelab/step_04/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/testing_codelab/step_04/android/app/build.gradle b/testing_codelab/step_04/android/app/build.gradle deleted file mode 100644 index 10e017b858..0000000000 --- a/testing_codelab/step_04/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.testing_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.testing_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/testing_codelab/step_04/android/app/build.gradle.kts b/testing_codelab/step_04/android/app/build.gradle.kts new file mode 100644 index 0000000000..ee969b8712 --- /dev/null +++ b/testing_codelab/step_04/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.testing_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.testing_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/testing_codelab/step_04/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt b/testing_codelab/step_04/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt index 337e691391..c077d2270d 100644 --- a/testing_codelab/step_04/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt +++ b/testing_codelab/step_04/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.testing_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/testing_codelab/step_04/android/build.gradle b/testing_codelab/step_04/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/testing_codelab/step_04/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/testing_codelab/step_04/android/build.gradle.kts b/testing_codelab/step_04/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/testing_codelab/step_04/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/testing_codelab/step_04/android/gradle.properties b/testing_codelab/step_04/android/gradle.properties index 2597170821..f018a61817 100644 --- a/testing_codelab/step_04/android/gradle.properties +++ b/testing_codelab/step_04/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/testing_codelab/step_04/android/gradle/wrapper/gradle-wrapper.properties b/testing_codelab/step_04/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/testing_codelab/step_04/android/gradle/wrapper/gradle-wrapper.properties +++ b/testing_codelab/step_04/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/testing_codelab/step_04/android/settings.gradle b/testing_codelab/step_04/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/testing_codelab/step_04/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/testing_codelab/step_04/android/settings.gradle.kts b/testing_codelab/step_04/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/testing_codelab/step_04/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/testing_codelab/step_04/ios/Podfile b/testing_codelab/step_04/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/testing_codelab/step_04/ios/Podfile +++ b/testing_codelab/step_04/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/testing_codelab/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/testing_codelab/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/testing_codelab/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/testing_codelab/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/testing_codelab/step_04/lib/main.dart b/testing_codelab/step_04/lib/main.dart index 186b7e6adb..ff16b4cde5 100644 --- a/testing_codelab/step_04/lib/main.dart +++ b/testing_codelab/step_04/lib/main.dart @@ -42,9 +42,7 @@ class TestingApp extends StatelessWidget { child: MaterialApp.router( title: 'Testing Sample', theme: ThemeData( - colorScheme: ColorScheme.fromSeed( - seedColor: Colors.deepPurple, - ), + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), routerConfig: _router, ), diff --git a/testing_codelab/step_04/lib/screens/favorites.dart b/testing_codelab/step_04/lib/screens/favorites.dart index fb66994a02..a8424f04b8 100644 --- a/testing_codelab/step_04/lib/screens/favorites.dart +++ b/testing_codelab/step_04/lib/screens/favorites.dart @@ -15,15 +15,15 @@ class FavoritesPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Favorites'), - ), + appBar: AppBar(title: const Text('Favorites')), body: Consumer( - builder: (context, value, child) => ListView.builder( - itemCount: value.items.length, - padding: const EdgeInsets.symmetric(vertical: 16), - itemBuilder: (context, index) => FavoriteItemTile(value.items[index]), - ), + builder: + (context, value, child) => ListView.builder( + itemCount: value.items.length, + padding: const EdgeInsets.symmetric(vertical: 16), + itemBuilder: + (context, index) => FavoriteItemTile(value.items[index]), + ), ), ); } @@ -42,10 +42,7 @@ class FavoriteItemTile extends StatelessWidget { leading: CircleAvatar( backgroundColor: Colors.primaries[itemNo % Colors.primaries.length], ), - title: Text( - 'Item $itemNo', - key: Key('favorites_text_$itemNo'), - ), + title: Text('Item $itemNo', key: Key('favorites_text_$itemNo')), trailing: IconButton( key: Key('remove_icon_$itemNo'), icon: const Icon(Icons.close), diff --git a/testing_codelab/step_04/lib/screens/home.dart b/testing_codelab/step_04/lib/screens/home.dart index 1af3be5985..15c4f8048e 100644 --- a/testing_codelab/step_04/lib/screens/home.dart +++ b/testing_codelab/step_04/lib/screens/home.dart @@ -53,24 +53,24 @@ class ItemTile extends StatelessWidget { leading: CircleAvatar( backgroundColor: Colors.primaries[itemNo % Colors.primaries.length], ), - title: Text( - 'Item $itemNo', - key: Key('text_$itemNo'), - ), + title: Text('Item $itemNo', key: Key('text_$itemNo')), trailing: IconButton( key: Key('icon_$itemNo'), - icon: favoritesList.items.contains(itemNo) - ? const Icon(Icons.favorite) - : const Icon(Icons.favorite_border), + icon: + favoritesList.items.contains(itemNo) + ? const Icon(Icons.favorite) + : const Icon(Icons.favorite_border), onPressed: () { !favoritesList.items.contains(itemNo) ? favoritesList.add(itemNo) : favoritesList.remove(itemNo); ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text(favoritesList.items.contains(itemNo) - ? 'Added to favorites.' - : 'Removed from favorites.'), + content: Text( + favoritesList.items.contains(itemNo) + ? 'Added to favorites.' + : 'Removed from favorites.', + ), duration: const Duration(seconds: 1), ), ); diff --git a/testing_codelab/step_04/macos/Podfile b/testing_codelab/step_04/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/testing_codelab/step_04/macos/Podfile +++ b/testing_codelab/step_04/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/testing_codelab/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/testing_codelab/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 643630b7fb..a506647a7d 100644 --- a/testing_codelab/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/testing_codelab/step_04/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/testing_codelab/step_04/pubspec.yaml b/testing_codelab/step_04/pubspec.yaml index 0896897318..de5dc2ac5f 100644 --- a/testing_codelab/step_04/pubspec.yaml +++ b/testing_codelab/step_04/pubspec.yaml @@ -8,7 +8,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -20,7 +20,7 @@ dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^5.0.0 - test: ^1.25.8 + test: ^1.25.15 flutter_driver: sdk: flutter integration_test: diff --git a/testing_codelab/step_05/android/.gitignore b/testing_codelab/step_05/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/testing_codelab/step_05/android/.gitignore +++ b/testing_codelab/step_05/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/testing_codelab/step_05/android/app/build.gradle b/testing_codelab/step_05/android/app/build.gradle deleted file mode 100644 index 10e017b858..0000000000 --- a/testing_codelab/step_05/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.testing_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.testing_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/testing_codelab/step_05/android/app/build.gradle.kts b/testing_codelab/step_05/android/app/build.gradle.kts new file mode 100644 index 0000000000..ee969b8712 --- /dev/null +++ b/testing_codelab/step_05/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.testing_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.testing_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/testing_codelab/step_05/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt b/testing_codelab/step_05/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt index 337e691391..c077d2270d 100644 --- a/testing_codelab/step_05/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt +++ b/testing_codelab/step_05/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.testing_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/testing_codelab/step_05/android/build.gradle b/testing_codelab/step_05/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/testing_codelab/step_05/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/testing_codelab/step_05/android/build.gradle.kts b/testing_codelab/step_05/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/testing_codelab/step_05/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/testing_codelab/step_05/android/gradle.properties b/testing_codelab/step_05/android/gradle.properties index 2597170821..f018a61817 100644 --- a/testing_codelab/step_05/android/gradle.properties +++ b/testing_codelab/step_05/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/testing_codelab/step_05/android/gradle/wrapper/gradle-wrapper.properties b/testing_codelab/step_05/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/testing_codelab/step_05/android/gradle/wrapper/gradle-wrapper.properties +++ b/testing_codelab/step_05/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/testing_codelab/step_05/android/settings.gradle b/testing_codelab/step_05/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/testing_codelab/step_05/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/testing_codelab/step_05/android/settings.gradle.kts b/testing_codelab/step_05/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/testing_codelab/step_05/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/testing_codelab/step_05/ios/Podfile b/testing_codelab/step_05/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/testing_codelab/step_05/ios/Podfile +++ b/testing_codelab/step_05/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/testing_codelab/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/testing_codelab/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/testing_codelab/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/testing_codelab/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/testing_codelab/step_05/lib/main.dart b/testing_codelab/step_05/lib/main.dart index 186b7e6adb..ff16b4cde5 100644 --- a/testing_codelab/step_05/lib/main.dart +++ b/testing_codelab/step_05/lib/main.dart @@ -42,9 +42,7 @@ class TestingApp extends StatelessWidget { child: MaterialApp.router( title: 'Testing Sample', theme: ThemeData( - colorScheme: ColorScheme.fromSeed( - seedColor: Colors.deepPurple, - ), + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), routerConfig: _router, ), diff --git a/testing_codelab/step_05/lib/screens/favorites.dart b/testing_codelab/step_05/lib/screens/favorites.dart index fb66994a02..a8424f04b8 100644 --- a/testing_codelab/step_05/lib/screens/favorites.dart +++ b/testing_codelab/step_05/lib/screens/favorites.dart @@ -15,15 +15,15 @@ class FavoritesPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Favorites'), - ), + appBar: AppBar(title: const Text('Favorites')), body: Consumer( - builder: (context, value, child) => ListView.builder( - itemCount: value.items.length, - padding: const EdgeInsets.symmetric(vertical: 16), - itemBuilder: (context, index) => FavoriteItemTile(value.items[index]), - ), + builder: + (context, value, child) => ListView.builder( + itemCount: value.items.length, + padding: const EdgeInsets.symmetric(vertical: 16), + itemBuilder: + (context, index) => FavoriteItemTile(value.items[index]), + ), ), ); } @@ -42,10 +42,7 @@ class FavoriteItemTile extends StatelessWidget { leading: CircleAvatar( backgroundColor: Colors.primaries[itemNo % Colors.primaries.length], ), - title: Text( - 'Item $itemNo', - key: Key('favorites_text_$itemNo'), - ), + title: Text('Item $itemNo', key: Key('favorites_text_$itemNo')), trailing: IconButton( key: Key('remove_icon_$itemNo'), icon: const Icon(Icons.close), diff --git a/testing_codelab/step_05/lib/screens/home.dart b/testing_codelab/step_05/lib/screens/home.dart index 1af3be5985..15c4f8048e 100644 --- a/testing_codelab/step_05/lib/screens/home.dart +++ b/testing_codelab/step_05/lib/screens/home.dart @@ -53,24 +53,24 @@ class ItemTile extends StatelessWidget { leading: CircleAvatar( backgroundColor: Colors.primaries[itemNo % Colors.primaries.length], ), - title: Text( - 'Item $itemNo', - key: Key('text_$itemNo'), - ), + title: Text('Item $itemNo', key: Key('text_$itemNo')), trailing: IconButton( key: Key('icon_$itemNo'), - icon: favoritesList.items.contains(itemNo) - ? const Icon(Icons.favorite) - : const Icon(Icons.favorite_border), + icon: + favoritesList.items.contains(itemNo) + ? const Icon(Icons.favorite) + : const Icon(Icons.favorite_border), onPressed: () { !favoritesList.items.contains(itemNo) ? favoritesList.add(itemNo) : favoritesList.remove(itemNo); ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text(favoritesList.items.contains(itemNo) - ? 'Added to favorites.' - : 'Removed from favorites.'), + content: Text( + favoritesList.items.contains(itemNo) + ? 'Added to favorites.' + : 'Removed from favorites.', + ), duration: const Duration(seconds: 1), ), ); diff --git a/testing_codelab/step_05/macos/Podfile b/testing_codelab/step_05/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/testing_codelab/step_05/macos/Podfile +++ b/testing_codelab/step_05/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/testing_codelab/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/testing_codelab/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 643630b7fb..a506647a7d 100644 --- a/testing_codelab/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/testing_codelab/step_05/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/testing_codelab/step_05/pubspec.yaml b/testing_codelab/step_05/pubspec.yaml index 0896897318..de5dc2ac5f 100644 --- a/testing_codelab/step_05/pubspec.yaml +++ b/testing_codelab/step_05/pubspec.yaml @@ -8,7 +8,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -20,7 +20,7 @@ dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^5.0.0 - test: ^1.25.8 + test: ^1.25.15 flutter_driver: sdk: flutter integration_test: diff --git a/testing_codelab/step_06/android/.gitignore b/testing_codelab/step_06/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/testing_codelab/step_06/android/.gitignore +++ b/testing_codelab/step_06/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/testing_codelab/step_06/android/app/build.gradle b/testing_codelab/step_06/android/app/build.gradle deleted file mode 100644 index 10e017b858..0000000000 --- a/testing_codelab/step_06/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.testing_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.testing_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/testing_codelab/step_06/android/app/build.gradle.kts b/testing_codelab/step_06/android/app/build.gradle.kts new file mode 100644 index 0000000000..ee969b8712 --- /dev/null +++ b/testing_codelab/step_06/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.testing_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.testing_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/testing_codelab/step_06/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt b/testing_codelab/step_06/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt index 337e691391..c077d2270d 100644 --- a/testing_codelab/step_06/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt +++ b/testing_codelab/step_06/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.testing_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/testing_codelab/step_06/android/build.gradle b/testing_codelab/step_06/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/testing_codelab/step_06/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/testing_codelab/step_06/android/build.gradle.kts b/testing_codelab/step_06/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/testing_codelab/step_06/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/testing_codelab/step_06/android/gradle.properties b/testing_codelab/step_06/android/gradle.properties index 2597170821..f018a61817 100644 --- a/testing_codelab/step_06/android/gradle.properties +++ b/testing_codelab/step_06/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/testing_codelab/step_06/android/gradle/wrapper/gradle-wrapper.properties b/testing_codelab/step_06/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/testing_codelab/step_06/android/gradle/wrapper/gradle-wrapper.properties +++ b/testing_codelab/step_06/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/testing_codelab/step_06/android/settings.gradle b/testing_codelab/step_06/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/testing_codelab/step_06/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/testing_codelab/step_06/android/settings.gradle.kts b/testing_codelab/step_06/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/testing_codelab/step_06/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/testing_codelab/step_06/ios/Podfile b/testing_codelab/step_06/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/testing_codelab/step_06/ios/Podfile +++ b/testing_codelab/step_06/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/testing_codelab/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/testing_codelab/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/testing_codelab/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/testing_codelab/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/testing_codelab/step_06/lib/main.dart b/testing_codelab/step_06/lib/main.dart index 186b7e6adb..ff16b4cde5 100644 --- a/testing_codelab/step_06/lib/main.dart +++ b/testing_codelab/step_06/lib/main.dart @@ -42,9 +42,7 @@ class TestingApp extends StatelessWidget { child: MaterialApp.router( title: 'Testing Sample', theme: ThemeData( - colorScheme: ColorScheme.fromSeed( - seedColor: Colors.deepPurple, - ), + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), routerConfig: _router, ), diff --git a/testing_codelab/step_06/lib/screens/favorites.dart b/testing_codelab/step_06/lib/screens/favorites.dart index fb66994a02..a8424f04b8 100644 --- a/testing_codelab/step_06/lib/screens/favorites.dart +++ b/testing_codelab/step_06/lib/screens/favorites.dart @@ -15,15 +15,15 @@ class FavoritesPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Favorites'), - ), + appBar: AppBar(title: const Text('Favorites')), body: Consumer( - builder: (context, value, child) => ListView.builder( - itemCount: value.items.length, - padding: const EdgeInsets.symmetric(vertical: 16), - itemBuilder: (context, index) => FavoriteItemTile(value.items[index]), - ), + builder: + (context, value, child) => ListView.builder( + itemCount: value.items.length, + padding: const EdgeInsets.symmetric(vertical: 16), + itemBuilder: + (context, index) => FavoriteItemTile(value.items[index]), + ), ), ); } @@ -42,10 +42,7 @@ class FavoriteItemTile extends StatelessWidget { leading: CircleAvatar( backgroundColor: Colors.primaries[itemNo % Colors.primaries.length], ), - title: Text( - 'Item $itemNo', - key: Key('favorites_text_$itemNo'), - ), + title: Text('Item $itemNo', key: Key('favorites_text_$itemNo')), trailing: IconButton( key: Key('remove_icon_$itemNo'), icon: const Icon(Icons.close), diff --git a/testing_codelab/step_06/lib/screens/home.dart b/testing_codelab/step_06/lib/screens/home.dart index 1af3be5985..15c4f8048e 100644 --- a/testing_codelab/step_06/lib/screens/home.dart +++ b/testing_codelab/step_06/lib/screens/home.dart @@ -53,24 +53,24 @@ class ItemTile extends StatelessWidget { leading: CircleAvatar( backgroundColor: Colors.primaries[itemNo % Colors.primaries.length], ), - title: Text( - 'Item $itemNo', - key: Key('text_$itemNo'), - ), + title: Text('Item $itemNo', key: Key('text_$itemNo')), trailing: IconButton( key: Key('icon_$itemNo'), - icon: favoritesList.items.contains(itemNo) - ? const Icon(Icons.favorite) - : const Icon(Icons.favorite_border), + icon: + favoritesList.items.contains(itemNo) + ? const Icon(Icons.favorite) + : const Icon(Icons.favorite_border), onPressed: () { !favoritesList.items.contains(itemNo) ? favoritesList.add(itemNo) : favoritesList.remove(itemNo); ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text(favoritesList.items.contains(itemNo) - ? 'Added to favorites.' - : 'Removed from favorites.'), + content: Text( + favoritesList.items.contains(itemNo) + ? 'Added to favorites.' + : 'Removed from favorites.', + ), duration: const Duration(seconds: 1), ), ); diff --git a/testing_codelab/step_06/macos/Podfile b/testing_codelab/step_06/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/testing_codelab/step_06/macos/Podfile +++ b/testing_codelab/step_06/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/testing_codelab/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/testing_codelab/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 643630b7fb..a506647a7d 100644 --- a/testing_codelab/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/testing_codelab/step_06/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/testing_codelab/step_06/pubspec.yaml b/testing_codelab/step_06/pubspec.yaml index 0896897318..de5dc2ac5f 100644 --- a/testing_codelab/step_06/pubspec.yaml +++ b/testing_codelab/step_06/pubspec.yaml @@ -8,7 +8,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -20,7 +20,7 @@ dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^5.0.0 - test: ^1.25.8 + test: ^1.25.15 flutter_driver: sdk: flutter integration_test: diff --git a/testing_codelab/step_06/test/favorites_test.dart b/testing_codelab/step_06/test/favorites_test.dart index 25b3f4ce78..a2b50dfb97 100644 --- a/testing_codelab/step_06/test/favorites_test.dart +++ b/testing_codelab/step_06/test/favorites_test.dart @@ -11,14 +11,12 @@ import 'package:testing_app/screens/favorites.dart'; late Favorites favoritesList; Widget createFavoritesScreen() => ChangeNotifierProvider( - create: (context) { - favoritesList = Favorites(); - return favoritesList; - }, - child: const MaterialApp( - home: FavoritesPage(), - ), - ); + create: (context) { + favoritesList = Favorites(); + return favoritesList; + }, + child: const MaterialApp(home: FavoritesPage()), +); void addItems() { for (var i = 0; i < 10; i += 2) { @@ -42,8 +40,10 @@ void main() { var totalItems = tester.widgetList(find.byIcon(Icons.close)).length; await tester.tap(find.byIcon(Icons.close).first); await tester.pumpAndSettle(); - expect(tester.widgetList(find.byIcon(Icons.close)).length, - lessThan(totalItems)); + expect( + tester.widgetList(find.byIcon(Icons.close)).length, + lessThan(totalItems), + ); expect(find.text('Removed from favorites.'), findsOneWidget); }); }); diff --git a/testing_codelab/step_06/test/home_test.dart b/testing_codelab/step_06/test/home_test.dart index 6979041f50..1d561156a6 100644 --- a/testing_codelab/step_06/test/home_test.dart +++ b/testing_codelab/step_06/test/home_test.dart @@ -9,11 +9,9 @@ import 'package:testing_app/models/favorites.dart'; import 'package:testing_app/screens/home.dart'; Widget createHomeScreen() => ChangeNotifierProvider( - create: (context) => Favorites(), - child: const MaterialApp( - home: HomePage(), - ), - ); + create: (context) => Favorites(), + child: const MaterialApp(home: HomePage()), +); void main() { group('Home Page Widget Tests', () { @@ -25,11 +23,7 @@ void main() { testWidgets('Testing Scrolling', (tester) async { await tester.pumpWidget(createHomeScreen()); expect(find.text('Item 0'), findsOneWidget); - await tester.fling( - find.byType(ListView), - const Offset(0, -200), - 3000, - ); + await tester.fling(find.byType(ListView), const Offset(0, -200), 3000); await tester.pumpAndSettle(); expect(find.text('Item 0'), findsNothing); }); diff --git a/testing_codelab/step_07/android/.gitignore b/testing_codelab/step_07/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/testing_codelab/step_07/android/.gitignore +++ b/testing_codelab/step_07/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/testing_codelab/step_07/android/app/build.gradle b/testing_codelab/step_07/android/app/build.gradle deleted file mode 100644 index 10e017b858..0000000000 --- a/testing_codelab/step_07/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.testing_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.testing_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/testing_codelab/step_07/android/app/build.gradle.kts b/testing_codelab/step_07/android/app/build.gradle.kts new file mode 100644 index 0000000000..ee969b8712 --- /dev/null +++ b/testing_codelab/step_07/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.testing_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.testing_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/testing_codelab/step_07/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt b/testing_codelab/step_07/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt index 337e691391..c077d2270d 100644 --- a/testing_codelab/step_07/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt +++ b/testing_codelab/step_07/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.testing_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/testing_codelab/step_07/android/build.gradle b/testing_codelab/step_07/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/testing_codelab/step_07/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/testing_codelab/step_07/android/build.gradle.kts b/testing_codelab/step_07/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/testing_codelab/step_07/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/testing_codelab/step_07/android/gradle.properties b/testing_codelab/step_07/android/gradle.properties index 2597170821..f018a61817 100644 --- a/testing_codelab/step_07/android/gradle.properties +++ b/testing_codelab/step_07/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/testing_codelab/step_07/android/gradle/wrapper/gradle-wrapper.properties b/testing_codelab/step_07/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/testing_codelab/step_07/android/gradle/wrapper/gradle-wrapper.properties +++ b/testing_codelab/step_07/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/testing_codelab/step_07/android/settings.gradle b/testing_codelab/step_07/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/testing_codelab/step_07/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/testing_codelab/step_07/android/settings.gradle.kts b/testing_codelab/step_07/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/testing_codelab/step_07/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/testing_codelab/step_07/integration_test/app_test.dart b/testing_codelab/step_07/integration_test/app_test.dart index 8497bc0aa7..2ed3c02001 100644 --- a/testing_codelab/step_07/integration_test/app_test.dart +++ b/testing_codelab/step_07/integration_test/app_test.dart @@ -11,11 +11,7 @@ void main() { testWidgets('Favorites operations test', (tester) async { await tester.pumpWidget(const TestingApp()); - final iconKeys = [ - 'icon_0', - 'icon_1', - 'icon_2', - ]; + final iconKeys = ['icon_0', 'icon_1', 'icon_2']; for (var icon in iconKeys) { await tester.tap(find.byKey(ValueKey(icon))); diff --git a/testing_codelab/step_07/ios/Podfile b/testing_codelab/step_07/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/testing_codelab/step_07/ios/Podfile +++ b/testing_codelab/step_07/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/testing_codelab/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/testing_codelab/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/testing_codelab/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/testing_codelab/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/testing_codelab/step_07/lib/main.dart b/testing_codelab/step_07/lib/main.dart index 186b7e6adb..ff16b4cde5 100644 --- a/testing_codelab/step_07/lib/main.dart +++ b/testing_codelab/step_07/lib/main.dart @@ -42,9 +42,7 @@ class TestingApp extends StatelessWidget { child: MaterialApp.router( title: 'Testing Sample', theme: ThemeData( - colorScheme: ColorScheme.fromSeed( - seedColor: Colors.deepPurple, - ), + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), routerConfig: _router, ), diff --git a/testing_codelab/step_07/lib/screens/favorites.dart b/testing_codelab/step_07/lib/screens/favorites.dart index fb66994a02..a8424f04b8 100644 --- a/testing_codelab/step_07/lib/screens/favorites.dart +++ b/testing_codelab/step_07/lib/screens/favorites.dart @@ -15,15 +15,15 @@ class FavoritesPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Favorites'), - ), + appBar: AppBar(title: const Text('Favorites')), body: Consumer( - builder: (context, value, child) => ListView.builder( - itemCount: value.items.length, - padding: const EdgeInsets.symmetric(vertical: 16), - itemBuilder: (context, index) => FavoriteItemTile(value.items[index]), - ), + builder: + (context, value, child) => ListView.builder( + itemCount: value.items.length, + padding: const EdgeInsets.symmetric(vertical: 16), + itemBuilder: + (context, index) => FavoriteItemTile(value.items[index]), + ), ), ); } @@ -42,10 +42,7 @@ class FavoriteItemTile extends StatelessWidget { leading: CircleAvatar( backgroundColor: Colors.primaries[itemNo % Colors.primaries.length], ), - title: Text( - 'Item $itemNo', - key: Key('favorites_text_$itemNo'), - ), + title: Text('Item $itemNo', key: Key('favorites_text_$itemNo')), trailing: IconButton( key: Key('remove_icon_$itemNo'), icon: const Icon(Icons.close), diff --git a/testing_codelab/step_07/lib/screens/home.dart b/testing_codelab/step_07/lib/screens/home.dart index 1af3be5985..15c4f8048e 100644 --- a/testing_codelab/step_07/lib/screens/home.dart +++ b/testing_codelab/step_07/lib/screens/home.dart @@ -53,24 +53,24 @@ class ItemTile extends StatelessWidget { leading: CircleAvatar( backgroundColor: Colors.primaries[itemNo % Colors.primaries.length], ), - title: Text( - 'Item $itemNo', - key: Key('text_$itemNo'), - ), + title: Text('Item $itemNo', key: Key('text_$itemNo')), trailing: IconButton( key: Key('icon_$itemNo'), - icon: favoritesList.items.contains(itemNo) - ? const Icon(Icons.favorite) - : const Icon(Icons.favorite_border), + icon: + favoritesList.items.contains(itemNo) + ? const Icon(Icons.favorite) + : const Icon(Icons.favorite_border), onPressed: () { !favoritesList.items.contains(itemNo) ? favoritesList.add(itemNo) : favoritesList.remove(itemNo); ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text(favoritesList.items.contains(itemNo) - ? 'Added to favorites.' - : 'Removed from favorites.'), + content: Text( + favoritesList.items.contains(itemNo) + ? 'Added to favorites.' + : 'Removed from favorites.', + ), duration: const Duration(seconds: 1), ), ); diff --git a/testing_codelab/step_07/macos/Podfile b/testing_codelab/step_07/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/testing_codelab/step_07/macos/Podfile +++ b/testing_codelab/step_07/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/testing_codelab/step_07/macos/Runner.xcodeproj/project.pbxproj b/testing_codelab/step_07/macos/Runner.xcodeproj/project.pbxproj index 218ca75cfa..6114f089fd 100644 --- a/testing_codelab/step_07/macos/Runner.xcodeproj/project.pbxproj +++ b/testing_codelab/step_07/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0CE67CAA019A1C0683B8D6F4 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 573135718834D320D3F43732 /* Pods_Runner.framework */; }; + 16F776E8C3525BD6993EE69E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB8D7C6573F684D5503652F4 /* Pods_Runner.framework */; }; + 186C3DFBD505126DCCC8FE6A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD92A5B84B4F1BAA06E9D27 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 87726F8926202E0751EAD00D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9057233C41B301040AFD81DA /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 30FDDDC835943982FAD88A97 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -78,16 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 446DC8485B18B486072DC87E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 573135718834D320D3F43732 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4BDC042E582B900BD2E5869A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 705D816F49773673AAD542A1 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8D2C90E5642839783D9D03F9 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 9057233C41B301040AFD81DA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 88300D94C8807A0DEFB02EB4 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9E9A54053A2FE9EF0A8A2DC3 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - B0482B64ED235A5A0D24CBEF /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F028191E33D5323DDA42A571 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - FFCCA3B09AC9BC44ADACF1CF /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + B1E37E61EE4207F015F3939C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + BBD92A5B84B4F1BAA06E9D27 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BC71578BEC97B8B47CDFAB76 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + CB8D7C6573F684D5503652F4 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 87726F8926202E0751EAD00D /* Pods_RunnerTests.framework in Frameworks */, + 186C3DFBD505126DCCC8FE6A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0CE67CAA019A1C0683B8D6F4 /* Pods_Runner.framework in Frameworks */, + 16F776E8C3525BD6993EE69E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0855DC161E378EFD1B8DB919 /* Pods */ = { + isa = PBXGroup; + children = ( + 88300D94C8807A0DEFB02EB4 /* Pods-Runner.debug.xcconfig */, + 705D816F49773673AAD542A1 /* Pods-Runner.release.xcconfig */, + 30FDDDC835943982FAD88A97 /* Pods-Runner.profile.xcconfig */, + 4BDC042E582B900BD2E5869A /* Pods-RunnerTests.debug.xcconfig */, + BC71578BEC97B8B47CDFAB76 /* Pods-RunnerTests.release.xcconfig */, + B1E37E61EE4207F015F3939C /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A241777CB88728E9E1C1FB9B /* Pods */, + 0855DC161E378EFD1B8DB919 /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - A241777CB88728E9E1C1FB9B /* Pods */ = { - isa = PBXGroup; - children = ( - FFCCA3B09AC9BC44ADACF1CF /* Pods-Runner.debug.xcconfig */, - 446DC8485B18B486072DC87E /* Pods-Runner.release.xcconfig */, - B0482B64ED235A5A0D24CBEF /* Pods-Runner.profile.xcconfig */, - F028191E33D5323DDA42A571 /* Pods-RunnerTests.debug.xcconfig */, - 8D2C90E5642839783D9D03F9 /* Pods-RunnerTests.release.xcconfig */, - 9E9A54053A2FE9EF0A8A2DC3 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 573135718834D320D3F43732 /* Pods_Runner.framework */, - 9057233C41B301040AFD81DA /* Pods_RunnerTests.framework */, + CB8D7C6573F684D5503652F4 /* Pods_Runner.framework */, + BBD92A5B84B4F1BAA06E9D27 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - EE97282E5FEF7A6F6BFC0107 /* [CP] Check Pods Manifest.lock */, + C247617CEA1CCA384579E8CC /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,7 +234,7 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 5B8422477CCC570C4C1B7AAD /* [CP] Check Pods Manifest.lock */, + 474805DB78DD20A3C07936C0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, @@ -360,7 +360,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 5B8422477CCC570C4C1B7AAD /* [CP] Check Pods Manifest.lock */ = { + 474805DB78DD20A3C07936C0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -382,7 +382,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - EE97282E5FEF7A6F6BFC0107 /* [CP] Check Pods Manifest.lock */ = { + C247617CEA1CCA384579E8CC /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -455,7 +455,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F028191E33D5323DDA42A571 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4BDC042E582B900BD2E5869A /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -470,7 +470,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8D2C90E5642839783D9D03F9 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = BC71578BEC97B8B47CDFAB76 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -485,7 +485,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9E9A54053A2FE9EF0A8A2DC3 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = B1E37E61EE4207F015F3939C /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/testing_codelab/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/testing_codelab/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 643630b7fb..a506647a7d 100644 --- a/testing_codelab/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/testing_codelab/step_07/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/testing_codelab/step_07/pubspec.yaml b/testing_codelab/step_07/pubspec.yaml index 0896897318..de5dc2ac5f 100644 --- a/testing_codelab/step_07/pubspec.yaml +++ b/testing_codelab/step_07/pubspec.yaml @@ -8,7 +8,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -20,7 +20,7 @@ dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^5.0.0 - test: ^1.25.8 + test: ^1.25.15 flutter_driver: sdk: flutter integration_test: diff --git a/testing_codelab/step_07/test/favorites_test.dart b/testing_codelab/step_07/test/favorites_test.dart index 25b3f4ce78..a2b50dfb97 100644 --- a/testing_codelab/step_07/test/favorites_test.dart +++ b/testing_codelab/step_07/test/favorites_test.dart @@ -11,14 +11,12 @@ import 'package:testing_app/screens/favorites.dart'; late Favorites favoritesList; Widget createFavoritesScreen() => ChangeNotifierProvider( - create: (context) { - favoritesList = Favorites(); - return favoritesList; - }, - child: const MaterialApp( - home: FavoritesPage(), - ), - ); + create: (context) { + favoritesList = Favorites(); + return favoritesList; + }, + child: const MaterialApp(home: FavoritesPage()), +); void addItems() { for (var i = 0; i < 10; i += 2) { @@ -42,8 +40,10 @@ void main() { var totalItems = tester.widgetList(find.byIcon(Icons.close)).length; await tester.tap(find.byIcon(Icons.close).first); await tester.pumpAndSettle(); - expect(tester.widgetList(find.byIcon(Icons.close)).length, - lessThan(totalItems)); + expect( + tester.widgetList(find.byIcon(Icons.close)).length, + lessThan(totalItems), + ); expect(find.text('Removed from favorites.'), findsOneWidget); }); }); diff --git a/testing_codelab/step_07/test/home_test.dart b/testing_codelab/step_07/test/home_test.dart index 6979041f50..1d561156a6 100644 --- a/testing_codelab/step_07/test/home_test.dart +++ b/testing_codelab/step_07/test/home_test.dart @@ -9,11 +9,9 @@ import 'package:testing_app/models/favorites.dart'; import 'package:testing_app/screens/home.dart'; Widget createHomeScreen() => ChangeNotifierProvider( - create: (context) => Favorites(), - child: const MaterialApp( - home: HomePage(), - ), - ); + create: (context) => Favorites(), + child: const MaterialApp(home: HomePage()), +); void main() { group('Home Page Widget Tests', () { @@ -25,11 +23,7 @@ void main() { testWidgets('Testing Scrolling', (tester) async { await tester.pumpWidget(createHomeScreen()); expect(find.text('Item 0'), findsOneWidget); - await tester.fling( - find.byType(ListView), - const Offset(0, -200), - 3000, - ); + await tester.fling(find.byType(ListView), const Offset(0, -200), 3000); await tester.pumpAndSettle(); expect(find.text('Item 0'), findsNothing); }); diff --git a/testing_codelab/step_08/android/.gitignore b/testing_codelab/step_08/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/testing_codelab/step_08/android/.gitignore +++ b/testing_codelab/step_08/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/testing_codelab/step_08/android/app/build.gradle b/testing_codelab/step_08/android/app/build.gradle deleted file mode 100644 index 10e017b858..0000000000 --- a/testing_codelab/step_08/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.testing_app" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.testing_app" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/testing_codelab/step_08/android/app/build.gradle.kts b/testing_codelab/step_08/android/app/build.gradle.kts new file mode 100644 index 0000000000..ee969b8712 --- /dev/null +++ b/testing_codelab/step_08/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.testing_app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.testing_app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/testing_codelab/step_08/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt b/testing_codelab/step_08/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt index 337e691391..c077d2270d 100644 --- a/testing_codelab/step_08/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt +++ b/testing_codelab/step_08/android/app/src/main/kotlin/com/example/testing_app/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.testing_app import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/testing_codelab/step_08/android/build.gradle b/testing_codelab/step_08/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/testing_codelab/step_08/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/testing_codelab/step_08/android/build.gradle.kts b/testing_codelab/step_08/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/testing_codelab/step_08/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/testing_codelab/step_08/android/gradle.properties b/testing_codelab/step_08/android/gradle.properties index 2597170821..f018a61817 100644 --- a/testing_codelab/step_08/android/gradle.properties +++ b/testing_codelab/step_08/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/testing_codelab/step_08/android/gradle/wrapper/gradle-wrapper.properties b/testing_codelab/step_08/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba6..afa1e8eb0a 100644 --- a/testing_codelab/step_08/android/gradle/wrapper/gradle-wrapper.properties +++ b/testing_codelab/step_08/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/testing_codelab/step_08/android/settings.gradle b/testing_codelab/step_08/android/settings.gradle deleted file mode 100644 index b9e43bd376..0000000000 --- a/testing_codelab/step_08/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/testing_codelab/step_08/android/settings.gradle.kts b/testing_codelab/step_08/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/testing_codelab/step_08/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/testing_codelab/step_08/integration_test/app_test.dart b/testing_codelab/step_08/integration_test/app_test.dart index 8497bc0aa7..2ed3c02001 100644 --- a/testing_codelab/step_08/integration_test/app_test.dart +++ b/testing_codelab/step_08/integration_test/app_test.dart @@ -11,11 +11,7 @@ void main() { testWidgets('Favorites operations test', (tester) async { await tester.pumpWidget(const TestingApp()); - final iconKeys = [ - 'icon_0', - 'icon_1', - 'icon_2', - ]; + final iconKeys = ['icon_0', 'icon_1', 'icon_2']; for (var icon in iconKeys) { await tester.tap(find.byKey(ValueKey(icon))); diff --git a/testing_codelab/step_08/ios/Podfile b/testing_codelab/step_08/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/testing_codelab/step_08/ios/Podfile +++ b/testing_codelab/step_08/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/testing_codelab/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/testing_codelab/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/testing_codelab/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/testing_codelab/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/testing_codelab/step_08/lib/main.dart b/testing_codelab/step_08/lib/main.dart index 186b7e6adb..ff16b4cde5 100644 --- a/testing_codelab/step_08/lib/main.dart +++ b/testing_codelab/step_08/lib/main.dart @@ -42,9 +42,7 @@ class TestingApp extends StatelessWidget { child: MaterialApp.router( title: 'Testing Sample', theme: ThemeData( - colorScheme: ColorScheme.fromSeed( - seedColor: Colors.deepPurple, - ), + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), routerConfig: _router, ), diff --git a/testing_codelab/step_08/lib/screens/favorites.dart b/testing_codelab/step_08/lib/screens/favorites.dart index fb66994a02..a8424f04b8 100644 --- a/testing_codelab/step_08/lib/screens/favorites.dart +++ b/testing_codelab/step_08/lib/screens/favorites.dart @@ -15,15 +15,15 @@ class FavoritesPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Favorites'), - ), + appBar: AppBar(title: const Text('Favorites')), body: Consumer( - builder: (context, value, child) => ListView.builder( - itemCount: value.items.length, - padding: const EdgeInsets.symmetric(vertical: 16), - itemBuilder: (context, index) => FavoriteItemTile(value.items[index]), - ), + builder: + (context, value, child) => ListView.builder( + itemCount: value.items.length, + padding: const EdgeInsets.symmetric(vertical: 16), + itemBuilder: + (context, index) => FavoriteItemTile(value.items[index]), + ), ), ); } @@ -42,10 +42,7 @@ class FavoriteItemTile extends StatelessWidget { leading: CircleAvatar( backgroundColor: Colors.primaries[itemNo % Colors.primaries.length], ), - title: Text( - 'Item $itemNo', - key: Key('favorites_text_$itemNo'), - ), + title: Text('Item $itemNo', key: Key('favorites_text_$itemNo')), trailing: IconButton( key: Key('remove_icon_$itemNo'), icon: const Icon(Icons.close), diff --git a/testing_codelab/step_08/lib/screens/home.dart b/testing_codelab/step_08/lib/screens/home.dart index 1af3be5985..15c4f8048e 100644 --- a/testing_codelab/step_08/lib/screens/home.dart +++ b/testing_codelab/step_08/lib/screens/home.dart @@ -53,24 +53,24 @@ class ItemTile extends StatelessWidget { leading: CircleAvatar( backgroundColor: Colors.primaries[itemNo % Colors.primaries.length], ), - title: Text( - 'Item $itemNo', - key: Key('text_$itemNo'), - ), + title: Text('Item $itemNo', key: Key('text_$itemNo')), trailing: IconButton( key: Key('icon_$itemNo'), - icon: favoritesList.items.contains(itemNo) - ? const Icon(Icons.favorite) - : const Icon(Icons.favorite_border), + icon: + favoritesList.items.contains(itemNo) + ? const Icon(Icons.favorite) + : const Icon(Icons.favorite_border), onPressed: () { !favoritesList.items.contains(itemNo) ? favoritesList.add(itemNo) : favoritesList.remove(itemNo); ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text(favoritesList.items.contains(itemNo) - ? 'Added to favorites.' - : 'Removed from favorites.'), + content: Text( + favoritesList.items.contains(itemNo) + ? 'Added to favorites.' + : 'Removed from favorites.', + ), duration: const Duration(seconds: 1), ), ); diff --git a/testing_codelab/step_08/macos/Podfile b/testing_codelab/step_08/macos/Podfile index c795730db8..29c8eb3294 100644 --- a/testing_codelab/step_08/macos/Podfile +++ b/testing_codelab/step_08/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/testing_codelab/step_08/macos/Runner.xcodeproj/project.pbxproj b/testing_codelab/step_08/macos/Runner.xcodeproj/project.pbxproj index 218ca75cfa..6114f089fd 100644 --- a/testing_codelab/step_08/macos/Runner.xcodeproj/project.pbxproj +++ b/testing_codelab/step_08/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0CE67CAA019A1C0683B8D6F4 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 573135718834D320D3F43732 /* Pods_Runner.framework */; }; + 16F776E8C3525BD6993EE69E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB8D7C6573F684D5503652F4 /* Pods_Runner.framework */; }; + 186C3DFBD505126DCCC8FE6A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD92A5B84B4F1BAA06E9D27 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 87726F8926202E0751EAD00D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9057233C41B301040AFD81DA /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +62,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 30FDDDC835943982FAD88A97 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -78,16 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 446DC8485B18B486072DC87E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 573135718834D320D3F43732 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4BDC042E582B900BD2E5869A /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 705D816F49773673AAD542A1 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 8D2C90E5642839783D9D03F9 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 9057233C41B301040AFD81DA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 88300D94C8807A0DEFB02EB4 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 9E9A54053A2FE9EF0A8A2DC3 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - B0482B64ED235A5A0D24CBEF /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F028191E33D5323DDA42A571 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - FFCCA3B09AC9BC44ADACF1CF /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + B1E37E61EE4207F015F3939C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + BBD92A5B84B4F1BAA06E9D27 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BC71578BEC97B8B47CDFAB76 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + CB8D7C6573F684D5503652F4 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 87726F8926202E0751EAD00D /* Pods_RunnerTests.framework in Frameworks */, + 186C3DFBD505126DCCC8FE6A /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,13 +103,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0CE67CAA019A1C0683B8D6F4 /* Pods_Runner.framework in Frameworks */, + 16F776E8C3525BD6993EE69E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0855DC161E378EFD1B8DB919 /* Pods */ = { + isa = PBXGroup; + children = ( + 88300D94C8807A0DEFB02EB4 /* Pods-Runner.debug.xcconfig */, + 705D816F49773673AAD542A1 /* Pods-Runner.release.xcconfig */, + 30FDDDC835943982FAD88A97 /* Pods-Runner.profile.xcconfig */, + 4BDC042E582B900BD2E5869A /* Pods-RunnerTests.debug.xcconfig */, + BC71578BEC97B8B47CDFAB76 /* Pods-RunnerTests.release.xcconfig */, + B1E37E61EE4207F015F3939C /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -137,7 +151,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - A241777CB88728E9E1C1FB9B /* Pods */, + 0855DC161E378EFD1B8DB919 /* Pods */, ); sourceTree = ""; }; @@ -185,25 +199,11 @@ path = Runner; sourceTree = ""; }; - A241777CB88728E9E1C1FB9B /* Pods */ = { - isa = PBXGroup; - children = ( - FFCCA3B09AC9BC44ADACF1CF /* Pods-Runner.debug.xcconfig */, - 446DC8485B18B486072DC87E /* Pods-Runner.release.xcconfig */, - B0482B64ED235A5A0D24CBEF /* Pods-Runner.profile.xcconfig */, - F028191E33D5323DDA42A571 /* Pods-RunnerTests.debug.xcconfig */, - 8D2C90E5642839783D9D03F9 /* Pods-RunnerTests.release.xcconfig */, - 9E9A54053A2FE9EF0A8A2DC3 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 573135718834D320D3F43732 /* Pods_Runner.framework */, - 9057233C41B301040AFD81DA /* Pods_RunnerTests.framework */, + CB8D7C6573F684D5503652F4 /* Pods_Runner.framework */, + BBD92A5B84B4F1BAA06E9D27 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -215,7 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - EE97282E5FEF7A6F6BFC0107 /* [CP] Check Pods Manifest.lock */, + C247617CEA1CCA384579E8CC /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,7 +234,7 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 5B8422477CCC570C4C1B7AAD /* [CP] Check Pods Manifest.lock */, + 474805DB78DD20A3C07936C0 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, @@ -360,7 +360,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 5B8422477CCC570C4C1B7AAD /* [CP] Check Pods Manifest.lock */ = { + 474805DB78DD20A3C07936C0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -382,7 +382,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - EE97282E5FEF7A6F6BFC0107 /* [CP] Check Pods Manifest.lock */ = { + C247617CEA1CCA384579E8CC /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -455,7 +455,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F028191E33D5323DDA42A571 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 4BDC042E582B900BD2E5869A /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -470,7 +470,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8D2C90E5642839783D9D03F9 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = BC71578BEC97B8B47CDFAB76 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -485,7 +485,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9E9A54053A2FE9EF0A8A2DC3 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = B1E37E61EE4207F015F3939C /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/testing_codelab/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/testing_codelab/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 643630b7fb..a506647a7d 100644 --- a/testing_codelab/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/testing_codelab/step_08/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/testing_codelab/step_08/pubspec.yaml b/testing_codelab/step_08/pubspec.yaml index 0896897318..de5dc2ac5f 100644 --- a/testing_codelab/step_08/pubspec.yaml +++ b/testing_codelab/step_08/pubspec.yaml @@ -8,7 +8,7 @@ publish_to: 'none' version: 0.1.0 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: flutter: @@ -20,7 +20,7 @@ dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^5.0.0 - test: ^1.25.8 + test: ^1.25.15 flutter_driver: sdk: flutter integration_test: diff --git a/testing_codelab/step_08/test/favorites_test.dart b/testing_codelab/step_08/test/favorites_test.dart index 25b3f4ce78..a2b50dfb97 100644 --- a/testing_codelab/step_08/test/favorites_test.dart +++ b/testing_codelab/step_08/test/favorites_test.dart @@ -11,14 +11,12 @@ import 'package:testing_app/screens/favorites.dart'; late Favorites favoritesList; Widget createFavoritesScreen() => ChangeNotifierProvider( - create: (context) { - favoritesList = Favorites(); - return favoritesList; - }, - child: const MaterialApp( - home: FavoritesPage(), - ), - ); + create: (context) { + favoritesList = Favorites(); + return favoritesList; + }, + child: const MaterialApp(home: FavoritesPage()), +); void addItems() { for (var i = 0; i < 10; i += 2) { @@ -42,8 +40,10 @@ void main() { var totalItems = tester.widgetList(find.byIcon(Icons.close)).length; await tester.tap(find.byIcon(Icons.close).first); await tester.pumpAndSettle(); - expect(tester.widgetList(find.byIcon(Icons.close)).length, - lessThan(totalItems)); + expect( + tester.widgetList(find.byIcon(Icons.close)).length, + lessThan(totalItems), + ); expect(find.text('Removed from favorites.'), findsOneWidget); }); }); diff --git a/testing_codelab/step_08/test/home_test.dart b/testing_codelab/step_08/test/home_test.dart index 6979041f50..1d561156a6 100644 --- a/testing_codelab/step_08/test/home_test.dart +++ b/testing_codelab/step_08/test/home_test.dart @@ -9,11 +9,9 @@ import 'package:testing_app/models/favorites.dart'; import 'package:testing_app/screens/home.dart'; Widget createHomeScreen() => ChangeNotifierProvider( - create: (context) => Favorites(), - child: const MaterialApp( - home: HomePage(), - ), - ); + create: (context) => Favorites(), + child: const MaterialApp(home: HomePage()), +); void main() { group('Home Page Widget Tests', () { @@ -25,11 +23,7 @@ void main() { testWidgets('Testing Scrolling', (tester) async { await tester.pumpWidget(createHomeScreen()); expect(find.text('Item 0'), findsOneWidget); - await tester.fling( - find.byType(ListView), - const Offset(0, -200), - 3000, - ); + await tester.fling(find.byType(ListView), const Offset(0, -200), 3000); await tester.pumpAndSettle(); expect(find.text('Item 0'), findsNothing); }); diff --git a/testing_codelab/step_08/test_driver/perf_driver.dart b/testing_codelab/step_08/test_driver/perf_driver.dart index e00ea019f0..efc52cd9e4 100644 --- a/testing_codelab/step_08/test_driver/perf_driver.dart +++ b/testing_codelab/step_08/test_driver/perf_driver.dart @@ -10,7 +10,8 @@ Future main() { responseDataCallback: (data) async { if (data != null) { final timeline = driver.Timeline.fromJson( - data['scrolling_summary'] as Map); + data['scrolling_summary'] as Map, + ); final summary = driver.TimelineSummary.summarize(timeline); diff --git a/tooling/claat_export_images/.gitignore b/tooling/claat_export_images/.gitignore deleted file mode 100644 index 3a85790408..0000000000 --- a/tooling/claat_export_images/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# https://dart.dev/guides/libraries/private-files -# Created by `dart pub` -.dart_tool/ diff --git a/tooling/claat_export_images/.vscode/launch.json b/tooling/claat_export_images/.vscode/launch.json deleted file mode 100644 index 74f40e94af..0000000000 --- a/tooling/claat_export_images/.vscode/launch.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "claat_export", - "request": "launch", - "type": "dart", - "program": "bin/claat_export.dart" - }, - { - "name": "render_codelab", - "request": "launch", - "type": "dart", - "program": "bin/render_codelab.dart", - "args": [ - "test/data/exports/17L9jk2dhTFrdEqyLb6Wxhq0NeRrtzpQLLJv09qROsA8.json" - ] - } - ] -} \ No newline at end of file diff --git a/tooling/claat_export_images/CHANGELOG.md b/tooling/claat_export_images/CHANGELOG.md deleted file mode 100644 index effe43c82c..0000000000 --- a/tooling/claat_export_images/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -## 1.0.0 - -- Initial version. diff --git a/tooling/claat_export_images/README.md b/tooling/claat_export_images/README.md deleted file mode 100644 index 68ac14a50b..0000000000 --- a/tooling/claat_export_images/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# CLAAT Image exporter, Dart version - -A tool to export the images for a CLAAT codelab. This tool uses the Google Docs API to -retrieve the images embedded in a Google Doc. This tool is being used to slim down the -images attached to Google Codelabs as a Thing (CLAAT) gDocs that are collectively too -large for the Google Docs HTML export API. - -## Install dependencies - -```shell -dart pub get -``` - -## Enabling API Access - -Follow the instructions in the Python Quickstart section on [setting up your environment][]. -You will wind up with a client secret JSON file that this script requires to work. - - [setting up your environment]: https://developers.google.com/docs/api/quickstart/python#set_up_your_environment - - -## Run - -After following the quickstart setup instructions, run the code: - -```shell -dart bin/claat_export_images.dart -s client_secret.json -d $CLAAT_GOOGLE_DOC_ID -``` \ No newline at end of file diff --git a/tooling/claat_export_images/analysis_options.yaml b/tooling/claat_export_images/analysis_options.yaml deleted file mode 100644 index e324a02e99..0000000000 --- a/tooling/claat_export_images/analysis_options.yaml +++ /dev/null @@ -1,32 +0,0 @@ -# This file configures the static analysis results for your project (errors, -# warnings, and lints). -# -# This enables the 'recommended' set of lints from `package:lints`. -# This set helps identify many issues that may lead to problems when running -# or consuming Dart code, and enforces writing Dart using a single, idiomatic -# style and format. -# -# If you want a smaller set of lints you can change this to specify -# 'package:lints/core.yaml'. These are just the most critical lints -# (the recommended set includes the core lints). -# The core lints are also what is used by pub.dev for scoring packages. - -include: package:lints/recommended.yaml - -# Uncomment the following section to specify additional rules. - -linter: - rules: - - camel_case_types - - directives_ordering - - prefer_single_quotes - -# analyzer: -# exclude: -# - path/to/excluded/files/** - -# For more information about the core and recommended set of lints, see -# https://dart.dev/go/core-lints - -# For additional information about configuring this file, see -# https://dart.dev/guides/language/analysis-options diff --git a/tooling/claat_export_images/bin/claat_export_images.dart b/tooling/claat_export_images/bin/claat_export_images.dart deleted file mode 100644 index e4e4354bb7..0000000000 --- a/tooling/claat_export_images/bin/claat_export_images.dart +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2023 The Flutter team. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:convert'; -import 'dart:io'; - -import 'package:args/args.dart'; -import 'package:claat_export_images/claat_export_images.dart'; -import 'package:claat_export_images/client_secret.dart'; -import 'package:googleapis/docs/v1.dart' as google_docs; -import 'package:googleapis_auth/auth_io.dart'; -import 'package:http/http.dart' as http; -import 'package:image/image.dart'; -import 'package:path/path.dart' as path; - -void main(List arguments) async { - final argParser = ArgParser(); - argParser.addFlag( - 'help', - abbr: 'h', - negatable: false, - help: 'Display usage', - ); - argParser.addOption( - 'client-secrets', - abbr: 's', - mandatory: true, - help: 'The path to the client_secrets.json file', - ); - argParser.addOption( - 'doc-id', - abbr: 'd', - mandatory: true, - help: 'The document ID to export the images of', - ); - argParser.parse(arguments); - final args = argParser.parse(arguments); - if (args['help']) { - print(argParser.usage); - exit(-1); - } - - final clientSecret = ClientSecret.fromJson( - jsonDecode( - await File(args['client-secrets']).readAsString(), - ), - ); - - final gDocID = args['doc-id']; - - final client = await obtainCredentials( - clientID: clientSecret.installed.clientId, - clientSecret: clientSecret.installed.clientSecret, - ); - final apiClient = google_docs.DocsApi(client); - final document = await apiClient.documents - .get(gDocID, suggestionsViewMode: 'PREVIEW_WITHOUT_SUGGESTIONS'); - final uris = claatImageUris(document); - Directory('img').createSync(); - int imageCount = 0; - for (final uri in uris) { - final response = await http.get(uri); - if (PngDecoder().isValidFile(response.bodyBytes)) { - File(path.join('img', '${uri.pathSegments.last}.png')) - .writeAsBytesSync(response.bodyBytes); - imageCount += 1; - } else if (JpegDecoder().isValidFile(response.bodyBytes)) { - File(path.join('img', '${uri.pathSegments.last}.jpg')) - .writeAsBytesSync(response.bodyBytes); - imageCount += 1; - } else if (GifDecoder().isValidFile(response.bodyBytes)) { - File(path.join('img', '${uri.pathSegments.last}.gif')) - .writeAsBytesSync(response.bodyBytes); - imageCount += 1; - } else if (WebPDecoder().isValidFile(response.bodyBytes)) { - File(path.join('img', '${uri.pathSegments.last}.webp')) - .writeAsBytesSync(response.bodyBytes); - imageCount += 1; - } else { - print('Unknown image format: $uri'); - } - } - print('Wrote $imageCount images to img/'); -} - -Future obtainCredentials( - {required String clientID, required String clientSecret}) async => - await clientViaUserConsent( - ClientId(clientID, clientSecret), - [google_docs.DocsApi.driveReadonlyScope], - _prompt, - ); - -void _prompt(String url) { - print('Please go to the following URL and grant access:'); - print(' => $url'); - print(''); -} diff --git a/tooling/claat_export_images/client_secret.json b/tooling/claat_export_images/client_secret.json deleted file mode 100644 index c9305798cb..0000000000 --- a/tooling/claat_export_images/client_secret.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "installed": { - "client_id": "CLIENT-ID", - "project_id": "PROJECT-ID", - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://oauth2.googleapis.com/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_secret": "CLIENT-SECRET", - "redirect_uris": [ - "http://localhost" - ] - } -} \ No newline at end of file diff --git a/tooling/claat_export_images/img/.gitignore b/tooling/claat_export_images/img/.gitignore deleted file mode 100644 index 9303184243..0000000000 --- a/tooling/claat_export_images/img/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.png -*.gif -*.jpg -*.webp diff --git a/tooling/claat_export_images/lib/claat_export_images.dart b/tooling/claat_export_images/lib/claat_export_images.dart deleted file mode 100644 index 5fbbd4d2f2..0000000000 --- a/tooling/claat_export_images/lib/claat_export_images.dart +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2023 The Flutter team. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:googleapis/docs/v1.dart' as gdoc; - -List claatImageUris(gdoc.Document document) { - List uris = []; - for (final MapEntry(:value) in document.inlineObjects!.entries) { - final contentUri = value - .inlineObjectProperties?.embeddedObject?.imageProperties?.contentUri; - if (contentUri != null) { - final uri = Uri.tryParse(contentUri); - if (uri != null) { - uris.add(uri); - } - } - } - return uris; -} diff --git a/tooling/claat_export_images/lib/client_secret.dart b/tooling/claat_export_images/lib/client_secret.dart deleted file mode 100644 index 5a98298453..0000000000 --- a/tooling/claat_export_images/lib/client_secret.dart +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2023 The Flutter team. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:json_annotation/json_annotation.dart'; - -part 'client_secret.g.dart'; - -@JsonSerializable() -class ClientSecret { - final ClientSecretInstalled installed; - - ClientSecret(this.installed); - - factory ClientSecret.fromJson(Map json) => - _$ClientSecretFromJson(json); - - Map toJson() => _$ClientSecretToJson(this); -} - -@JsonSerializable() -class ClientSecretInstalled { - @JsonKey(name: 'client_id') - final String clientId; - - @JsonKey(name: 'project_id') - final String projectId; - - @JsonKey(name: 'auth_uri') - final String authUri; - - @JsonKey(name: 'token_uri') - final String tokenUri; - - @JsonKey(name: 'auth_provider_x509_cert_url') - final String authProviderX509CertUrl; - - @JsonKey(name: 'client_secret') - final String clientSecret; - - @JsonKey(name: 'redirect_uris') - final List redirectUris; - - ClientSecretInstalled( - this.clientId, - this.projectId, - this.authUri, - this.tokenUri, - this.authProviderX509CertUrl, - this.clientSecret, - this.redirectUris); - - factory ClientSecretInstalled.fromJson(Map json) => - _$ClientSecretInstalledFromJson(json); - - Map toJson() => _$ClientSecretInstalledToJson(this); -} diff --git a/tooling/claat_export_images/lib/client_secret.g.dart b/tooling/claat_export_images/lib/client_secret.g.dart deleted file mode 100644 index 105cc1741b..0000000000 --- a/tooling/claat_export_images/lib/client_secret.g.dart +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2023 The Flutter team. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'client_secret.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -ClientSecret _$ClientSecretFromJson(Map json) => ClientSecret( - ClientSecretInstalled.fromJson(json['installed'] as Map), - ); - -Map _$ClientSecretToJson(ClientSecret instance) => - { - 'installed': instance.installed, - }; - -ClientSecretInstalled _$ClientSecretInstalledFromJson( - Map json) => - ClientSecretInstalled( - json['client_id'] as String, - json['project_id'] as String, - json['auth_uri'] as String, - json['token_uri'] as String, - json['auth_provider_x509_cert_url'] as String, - json['client_secret'] as String, - (json['redirect_uris'] as List).map((e) => e as String).toList(), - ); - -Map _$ClientSecretInstalledToJson( - ClientSecretInstalled instance) => - { - 'client_id': instance.clientId, - 'project_id': instance.projectId, - 'auth_uri': instance.authUri, - 'token_uri': instance.tokenUri, - 'auth_provider_x509_cert_url': instance.authProviderX509CertUrl, - 'client_secret': instance.clientSecret, - 'redirect_uris': instance.redirectUris, - }; diff --git a/tooling/claat_export_images/pubspec.yaml b/tooling/claat_export_images/pubspec.yaml deleted file mode 100644 index 28db290064..0000000000 --- a/tooling/claat_export_images/pubspec.yaml +++ /dev/null @@ -1,22 +0,0 @@ -name: claat_export_images -description: A tool to export images from a CLAAT codelab -version: 1.0.0 -repository: https://github.com/flutter/codelabs - -environment: - sdk: ^3.6.2 - -dependencies: - args: ^2.4.2 - googleapis: ^11.2.0 - googleapis_auth: ^1.4.1 - http: ^1.1.0 - image: ^4.0.17 - json_annotation: ^4.8.1 - path: ^1.8.3 - -dev_dependencies: - build_runner: ^2.4.5 - json_serializable: ^6.7.0 - lints: ">=2.0.0 <4.0.0" - test: ^1.21.0 diff --git a/tooling/claat_export_images/test/claat_export_images_test.dart b/tooling/claat_export_images/test/claat_export_images_test.dart deleted file mode 100644 index 57280d6013..0000000000 --- a/tooling/claat_export_images/test/claat_export_images_test.dart +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2023 The Flutter team. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:convert'; -import 'dart:io'; - -import 'package:claat_export_images/claat_export_images.dart'; -import 'package:googleapis/docs/v1.dart' as gdoc; -import 'package:test/test.dart'; - -void main() async { - final items = (jsonDecode(await File('test/data/data.json').readAsString()) - as List) - .map((e) => e.toString()); - - test('load data.json', () async { - expect(items.length, 8); - for (final item in items) { - var jsonContent = await File(item).readAsString(); - expect(jsonContent, isNotNull); - expect(jsonDecode(jsonContent), isNotNull); - final document = gdoc.Document.fromJson(jsonDecode(jsonContent)); - final uris = claatImageUris(document); - expect(uris, isNotNull); - expect(uris.length, greaterThan(0)); - } - }); -} diff --git a/tooling/claat_export_images/test/data/README.md b/tooling/claat_export_images/test/data/README.md deleted file mode 100644 index bf4969c4e5..0000000000 --- a/tooling/claat_export_images/test/data/README.md +++ /dev/null @@ -1,8 +0,0 @@ -## Test data - -The files under `exports` were created as follows: - -```console -$ cd exports -$ dart run ../../../bin/claat_export.dart -s ../../../client_secret.apps.googleusercontent.com.json -d $CLAAT_GOOGLE_DOC_ID -``` diff --git a/tooling/claat_export_images/test/data/data.json b/tooling/claat_export_images/test/data/data.json deleted file mode 100644 index 4e5071f819..0000000000 --- a/tooling/claat_export_images/test/data/data.json +++ /dev/null @@ -1,10 +0,0 @@ -[ - "test/data/exports/17L9jk2dhTFrdEqyLb6Wxhq0NeRrtzpQLLJv09qROsA8.json", - "test/data/exports/1CdlksSvxBE2XRBVZtOKpfMUO68OLJDLdQc7mxN_zABg.json", - "test/data/exports/1EQtDsZv6vkvgreuOrF0KMo6kiKJ-534DShEFGankv20.json", - "test/data/exports/1MfCrv1w6aK7SLq9gmjJwXCJFQ-AX9NWJit2gq-v2Xx8.json", - "test/data/exports/1NJq1PfV9mB2avhoM2l12DSQ8p2x6s_epXcLwCcZwpcg.json", - "test/data/exports/1Y099kkeEUvi3FRbE6a0pjZkkBzMHmraX3Q33zCC5uJM.json", - "test/data/exports/1ihOxu-DK3SBrUYyppRtzKvfwceSIzk4ZWzP9F6nRtnw.json", - "test/data/exports/1kwYB2RE1EXYMOt7F5fm-0nrY6BA1AyWsBXz2vlfTfxA.json" -] \ No newline at end of file diff --git a/tooling/claat_export_images/test/data/exports/17L9jk2dhTFrdEqyLb6Wxhq0NeRrtzpQLLJv09qROsA8.json b/tooling/claat_export_images/test/data/exports/17L9jk2dhTFrdEqyLb6Wxhq0NeRrtzpQLLJv09qROsA8.json deleted file mode 100644 index 8187ce8b03..0000000000 --- a/tooling/claat_export_images/test/data/exports/17L9jk2dhTFrdEqyLb6Wxhq0NeRrtzpQLLJv09qROsA8.json +++ /dev/null @@ -1,72337 +0,0 @@ -{ - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 39, - "paragraph": { - "elements": [ - { - "endIndex": 38, - "startIndex": 1, - "textRun": { - "content": "Dive into Dart’s patterns and records", - "textStyle": {} - } - }, - { - "endIndex": 39, - "startIndex": 38, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 14.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.8s8krlrp7f4l", - "namedStyleType": "TITLE", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1 - }, - { - "endIndex": 40, - "paragraph": { - "elements": [ - { - "endIndex": 40, - "startIndex": 39, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39 - }, - { - "endIndex": 551, - "startIndex": 40, - "table": { - "columns": 2, - "rows": 11, - "tableRows": [ - { - "endIndex": 156, - "startIndex": 41, - "tableCells": [ - { - "content": [ - { - "endIndex": 51, - "paragraph": { - "elements": [ - { - "endIndex": 51, - "startIndex": 43, - "textRun": { - "content": "Summary\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43 - } - ], - "endIndex": 51, - "startIndex": 42, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 156, - "paragraph": { - "elements": [ - { - "endIndex": 156, - "startIndex": 52, - "textRun": { - "content": "Use patterns, records, and other new features of Dart 3 to rearchitect your UI design style in Flutter.\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52 - } - ], - "endIndex": 156, - "startIndex": 51, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 194, - "startIndex": 156, - "tableCells": [ - { - "content": [ - { - "endIndex": 162, - "paragraph": { - "elements": [ - { - "endIndex": 162, - "startIndex": 158, - "textRun": { - "content": "URL\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 158 - } - ], - "endIndex": 162, - "startIndex": 157, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 194, - "paragraph": { - "elements": [ - { - "endIndex": 194, - "startIndex": 163, - "textRun": { - "content": "codelabs/dart-patterns-records\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 163 - } - ], - "endIndex": 194, - "startIndex": 162, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 214, - "startIndex": 194, - "tableCells": [ - { - "content": [ - { - "endIndex": 205, - "paragraph": { - "elements": [ - { - "endIndex": 205, - "startIndex": 196, - "textRun": { - "content": "Category\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 196 - } - ], - "endIndex": 205, - "startIndex": 195, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 214, - "paragraph": { - "elements": [ - { - "endIndex": 214, - "startIndex": 206, - "textRun": { - "content": "Flutter\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 206 - } - ], - "endIndex": 214, - "startIndex": 205, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 253, - "startIndex": 214, - "tableCells": [ - { - "content": [ - { - "endIndex": 228, - "paragraph": { - "elements": [ - { - "endIndex": 228, - "startIndex": 216, - "textRun": { - "content": "Environment\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 216 - } - ], - "endIndex": 228, - "startIndex": 215, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 253, - "paragraph": { - "elements": [ - { - "endIndex": 253, - "startIndex": 229, - "textRun": { - "content": "web, kiosk, tag-flutter\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 229 - } - ], - "endIndex": 253, - "startIndex": 228, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 312, - "startIndex": 253, - "tableCells": [ - { - "content": [ - { - "endIndex": 269, - "paragraph": { - "elements": [ - { - "endIndex": 269, - "startIndex": 255, - "textRun": { - "content": "Feedback Link\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 255 - } - ], - "endIndex": 269, - "startIndex": 254, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 312, - "paragraph": { - "elements": [ - { - "endIndex": 312, - "startIndex": 270, - "textRun": { - "content": "https://github.com/flutter/flutter/issues\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 270 - } - ], - "endIndex": 312, - "startIndex": 269, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 348, - "startIndex": 312, - "tableCells": [ - { - "content": [ - { - "endIndex": 321, - "paragraph": { - "elements": [ - { - "endIndex": 321, - "startIndex": 314, - "textRun": { - "content": "Author\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 314 - } - ], - "endIndex": 321, - "startIndex": 313, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 348, - "paragraph": { - "elements": [ - { - "endIndex": 348, - "startIndex": 322, - "textRun": { - "content": "John Ryan, Marya Belanger\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 322 - } - ], - "endIndex": 348, - "startIndex": 321, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 381, - "startIndex": 348, - "tableCells": [ - { - "content": [ - { - "endIndex": 362, - "paragraph": { - "elements": [ - { - "endIndex": 362, - "startIndex": 350, - "textRun": { - "content": "Author LDAP\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 350 - } - ], - "endIndex": 362, - "startIndex": 349, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 381, - "paragraph": { - "elements": [ - { - "endIndex": 381, - "startIndex": 363, - "textRun": { - "content": "ryjohn, mbelanger\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 363 - } - ], - "endIndex": 381, - "startIndex": 362, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 469, - "startIndex": 381, - "tableCells": [ - { - "content": [ - { - "endIndex": 398, - "paragraph": { - "elements": [ - { - "endIndex": 398, - "startIndex": 383, - "textRun": { - "content": "Directory path\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 383 - } - ], - "endIndex": 398, - "startIndex": 382, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 469, - "paragraph": { - "elements": [ - { - "endIndex": 469, - "startIndex": 399, - "textRun": { - "content": "google3/third_party/devsite/codelabs/en/codelabs/diving-in-to-dart-3/\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 399 - } - ], - "endIndex": 469, - "startIndex": 398, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 504, - "startIndex": 469, - "tableCells": [ - { - "content": [ - { - "endIndex": 489, - "paragraph": { - "elements": [ - { - "endIndex": 489, - "startIndex": 471, - "textRun": { - "content": "Analytics Account\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 471 - } - ], - "endIndex": 489, - "startIndex": 470, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 504, - "paragraph": { - "elements": [ - { - "endIndex": 504, - "startIndex": 490, - "textRun": { - "content": "UA-52746336-1\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 490 - } - ], - "endIndex": 504, - "startIndex": 489, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 530, - "startIndex": 504, - "tableCells": [ - { - "content": [ - { - "endIndex": 514, - "paragraph": { - "elements": [ - { - "endIndex": 514, - "startIndex": 506, - "textRun": { - "content": "Project\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 506 - } - ], - "endIndex": 514, - "startIndex": 505, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 530, - "paragraph": { - "elements": [ - { - "endIndex": 530, - "startIndex": 515, - "textRun": { - "content": "/_project.yaml\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 515 - } - ], - "endIndex": 530, - "startIndex": 514, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 550, - "startIndex": 530, - "tableCells": [ - { - "content": [ - { - "endIndex": 537, - "paragraph": { - "elements": [ - { - "endIndex": 537, - "startIndex": 532, - "textRun": { - "content": "Book\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 532 - } - ], - "endIndex": 537, - "startIndex": 531, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 550, - "paragraph": { - "elements": [ - { - "endIndex": 550, - "startIndex": 538, - "textRun": { - "content": "/_book.yaml\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 538 - } - ], - "endIndex": 550, - "startIndex": 537, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "width": { - "magnitude": 101.25, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - }, - { - "width": { - "magnitude": 366.75, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - } - ] - } - } - }, - { - "endIndex": 552, - "paragraph": { - "elements": [ - { - "endIndex": 552, - "startIndex": 551, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 551 - }, - { - "endIndex": 553, - "paragraph": { - "elements": [ - { - "endIndex": 553, - "startIndex": 552, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 552 - }, - { - "endIndex": 1907, - "startIndex": 553, - "tableOfContents": { - "content": [ - { - "endIndex": 567, - "paragraph": { - "elements": [ - { - "endIndex": 566, - "startIndex": 554, - "textRun": { - "content": "Introduction", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.hzcz072cgix0" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 567, - "startIndex": 566, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 554 - }, - { - "endIndex": 585, - "paragraph": { - "elements": [ - { - "endIndex": 584, - "startIndex": 567, - "textRun": { - "content": "What you'll build", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ohez9ifqj67k" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 585, - "startIndex": 584, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 567 - }, - { - "endIndex": 603, - "paragraph": { - "elements": [ - { - "endIndex": 602, - "startIndex": 585, - "textRun": { - "content": "What you'll learn", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.2ww7b2q8ih95" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 603, - "startIndex": 602, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 585 - }, - { - "endIndex": 627, - "paragraph": { - "elements": [ - { - "endIndex": 626, - "startIndex": 603, - "textRun": { - "content": "Set up your environment", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.2zyyznhvjezk" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 627, - "startIndex": 626, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 603 - }, - { - "endIndex": 646, - "paragraph": { - "elements": [ - { - "endIndex": 645, - "startIndex": 627, - "textRun": { - "content": "Create the project", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.bwo0af2iwk90" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 646, - "startIndex": 645, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 627 - }, - { - "endIndex": 655, - "paragraph": { - "elements": [ - { - "endIndex": 654, - "startIndex": 646, - "textRun": { - "content": "Get Dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.hz1dqd64dfk8" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 655, - "startIndex": 654, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 646 - }, - { - "endIndex": 680, - "paragraph": { - "elements": [ - { - "endIndex": 679, - "startIndex": 655, - "textRun": { - "content": "Create a Flutter project", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.puul27u3qcal" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 680, - "startIndex": 679, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 655 - }, - { - "endIndex": 708, - "paragraph": { - "elements": [ - { - "endIndex": 707, - "startIndex": 680, - "textRun": { - "content": "Set the minimum SDK version", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.fn7r4ym5936q" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 708, - "startIndex": 707, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 680 - }, - { - "endIndex": 721, - "paragraph": { - "elements": [ - { - "endIndex": 720, - "startIndex": 708, - "textRun": { - "content": "pubspec.yaml", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.wxfg1yyhggp8" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 721, - "startIndex": 720, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 708 - }, - { - "endIndex": 740, - "paragraph": { - "elements": [ - { - "endIndex": 739, - "startIndex": 721, - "textRun": { - "content": "Set up the project", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.tofj7jijs3a4" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 740, - "startIndex": 739, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 721 - }, - { - "endIndex": 768, - "paragraph": { - "elements": [ - { - "endIndex": 767, - "startIndex": 740, - "textRun": { - "content": "Define the data for the app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.al2qhdvxmiug" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 768, - "startIndex": 767, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 740 - }, - { - "endIndex": 782, - "paragraph": { - "elements": [ - { - "endIndex": 781, - "startIndex": 768, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.re3z7mxbljy8" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 782, - "startIndex": 781, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 768 - }, - { - "endIndex": 794, - "paragraph": { - "elements": [ - { - "endIndex": 793, - "startIndex": 782, - "textRun": { - "content": "Run the app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.k5wrikjay60s" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 794, - "startIndex": 793, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 782 - }, - { - "endIndex": 808, - "paragraph": { - "elements": [ - { - "endIndex": 807, - "startIndex": 794, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.pfkw4b2rwt18" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 808, - "startIndex": 807, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 794 - }, - { - "endIndex": 834, - "paragraph": { - "elements": [ - { - "endIndex": 833, - "startIndex": 808, - "textRun": { - "content": "Create and return records", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.3kiny5cugr9k" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 834, - "startIndex": 833, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 808 - }, - { - "endIndex": 861, - "paragraph": { - "elements": [ - { - "endIndex": 860, - "startIndex": 834, - "textRun": { - "content": "Create and return a record", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.8sr849kjw46b" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 861, - "startIndex": 860, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 834 - }, - { - "endIndex": 875, - "paragraph": { - "elements": [ - { - "endIndex": 874, - "startIndex": 861, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.cvgunwoh6oqy" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 875, - "startIndex": 874, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 861 - }, - { - "endIndex": 896, - "paragraph": { - "elements": [ - { - "endIndex": 895, - "startIndex": 875, - "textRun": { - "content": "Access record fields", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.m7t4gd6sit79" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 896, - "startIndex": 895, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 875 - }, - { - "endIndex": 910, - "paragraph": { - "elements": [ - { - "endIndex": 909, - "startIndex": 896, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.6k8szvspvapq" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 910, - "startIndex": 909, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 896 - }, - { - "endIndex": 946, - "paragraph": { - "elements": [ - { - "endIndex": 945, - "startIndex": 910, - "textRun": { - "content": "Match and destructure with patterns", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.568j9pkqmod0" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 946, - "startIndex": 945, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 910 - }, - { - "endIndex": 988, - "paragraph": { - "elements": [ - { - "endIndex": 987, - "startIndex": 946, - "textRun": { - "content": "Destructure a record into local variables", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.gpl49c2b0ub" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 988, - "startIndex": 987, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 946 - }, - { - "endIndex": 1002, - "paragraph": { - "elements": [ - { - "endIndex": 1001, - "startIndex": 988, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.z05ke9eh3pmu" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1002, - "startIndex": 1001, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 988 - }, - { - "endIndex": 1016, - "paragraph": { - "elements": [ - { - "endIndex": 1015, - "startIndex": 1002, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.utlztqy2hktb" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1016, - "startIndex": 1015, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1002 - }, - { - "endIndex": 1045, - "paragraph": { - "elements": [ - { - "endIndex": 1044, - "startIndex": 1016, - "textRun": { - "content": "Use patterns to extract data", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.pycw5b4t4lns" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1045, - "startIndex": 1044, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1016 - }, - { - "endIndex": 1079, - "paragraph": { - "elements": [ - { - "endIndex": 1078, - "startIndex": 1045, - "textRun": { - "content": "Read JSON values without patterns", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.yf61kg5owa9m" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1079, - "startIndex": 1078, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1045 - }, - { - "endIndex": 1093, - "paragraph": { - "elements": [ - { - "endIndex": 1092, - "startIndex": 1079, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.xtpw6x4ct4ba" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1093, - "startIndex": 1092, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1079 - }, - { - "endIndex": 1130, - "paragraph": { - "elements": [ - { - "endIndex": 1129, - "startIndex": 1093, - "textRun": { - "content": "Read JSON values using a map pattern", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.6jvsgpwu5vaj" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1130, - "startIndex": 1129, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1093 - }, - { - "endIndex": 1144, - "paragraph": { - "elements": [ - { - "endIndex": 1143, - "startIndex": 1130, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.up9oxn6751gl" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1144, - "startIndex": 1143, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1130 - }, - { - "endIndex": 1178, - "paragraph": { - "elements": [ - { - "endIndex": 1177, - "startIndex": 1144, - "textRun": { - "content": "Prepare the app for more patterns", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.hkoplv4js2dj" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1178, - "startIndex": 1177, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1144 - }, - { - "endIndex": 1210, - "paragraph": { - "elements": [ - { - "endIndex": 1209, - "startIndex": 1178, - "textRun": { - "content": "Create a class that stores data", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.e2lkdi57402r" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1210, - "startIndex": 1209, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1178 - }, - { - "endIndex": 1224, - "paragraph": { - "elements": [ - { - "endIndex": 1223, - "startIndex": 1210, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ge9la6aiy6ve" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1224, - "startIndex": 1223, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1210 - }, - { - "endIndex": 1255, - "paragraph": { - "elements": [ - { - "endIndex": 1254, - "startIndex": 1224, - "textRun": { - "content": "Return a list of Block objects", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.n19bd2b94m9o" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1255, - "startIndex": 1254, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1224 - }, - { - "endIndex": 1269, - "paragraph": { - "elements": [ - { - "endIndex": 1268, - "startIndex": 1255, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.jmifchr63cwh" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1269, - "startIndex": 1268, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1255 - }, - { - "endIndex": 1306, - "paragraph": { - "elements": [ - { - "endIndex": 1305, - "startIndex": 1269, - "textRun": { - "content": "Use patterns to display the document", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.i44naeu2u775" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1306, - "startIndex": 1305, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1269 - }, - { - "endIndex": 1368, - "paragraph": { - "elements": [ - { - "endIndex": 1367, - "startIndex": 1306, - "textRun": { - "content": "Control what’s rendered using patterns with switch statements", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.mrd1p7wmy500" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1368, - "startIndex": 1367, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1306 - }, - { - "endIndex": 1382, - "paragraph": { - "elements": [ - { - "endIndex": 1381, - "startIndex": 1368, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.lfig9orpitjc" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1382, - "startIndex": 1381, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1368 - }, - { - "endIndex": 1411, - "paragraph": { - "elements": [ - { - "endIndex": 1410, - "startIndex": 1382, - "textRun": { - "content": "Display the document content", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.m3ty4akt3v4k" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1411, - "startIndex": 1410, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1382 - }, - { - "endIndex": 1425, - "paragraph": { - "elements": [ - { - "endIndex": 1424, - "startIndex": 1411, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.2jxf0i2gbgxq" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1425, - "startIndex": 1424, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1411 - }, - { - "endIndex": 1448, - "paragraph": { - "elements": [ - { - "endIndex": 1447, - "startIndex": 1425, - "textRun": { - "content": "Use switch expressions", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.is937g7djrt5" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1448, - "startIndex": 1447, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1425 - }, - { - "endIndex": 1502, - "paragraph": { - "elements": [ - { - "endIndex": 1501, - "startIndex": 1448, - "textRun": { - "content": "Convert the switch statement into a switch expression", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ny6l3hlbb3ze" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1502, - "startIndex": 1501, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1448 - }, - { - "endIndex": 1516, - "paragraph": { - "elements": [ - { - "endIndex": 1515, - "startIndex": 1502, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ux4uol8rfg8y" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1516, - "startIndex": 1515, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1502 - }, - { - "endIndex": 1536, - "paragraph": { - "elements": [ - { - "endIndex": 1535, - "startIndex": 1516, - "textRun": { - "content": "Use object patterns", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.o28rbfr3i2hm" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1536, - "startIndex": 1535, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1516 - }, - { - "endIndex": 1576, - "paragraph": { - "elements": [ - { - "endIndex": 1575, - "startIndex": 1536, - "textRun": { - "content": "Extract properties from object patterns", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.hiek3z8bfnbt" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1576, - "startIndex": 1575, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1536 - }, - { - "endIndex": 1590, - "paragraph": { - "elements": [ - { - "endIndex": 1589, - "startIndex": 1576, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.vivylxd16zs" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1590, - "startIndex": 1589, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1576 - }, - { - "endIndex": 1621, - "paragraph": { - "elements": [ - { - "endIndex": 1620, - "startIndex": 1590, - "textRun": { - "content": "Add formatting logic for weeks", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.954rbgsdumm6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1621, - "startIndex": 1620, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1590 - }, - { - "endIndex": 1635, - "paragraph": { - "elements": [ - { - "endIndex": 1634, - "startIndex": 1621, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.io2pno42mpr0" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1635, - "startIndex": 1634, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1621 - }, - { - "endIndex": 1674, - "paragraph": { - "elements": [ - { - "endIndex": 1673, - "startIndex": 1635, - "textRun": { - "content": "Add the newly formatted date to the UI", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.mnuqwgraocl9" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1674, - "startIndex": 1673, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1635 - }, - { - "endIndex": 1688, - "paragraph": { - "elements": [ - { - "endIndex": 1687, - "startIndex": 1674, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.33yq3djwxg2k" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1688, - "startIndex": 1687, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1674 - }, - { - "endIndex": 1726, - "paragraph": { - "elements": [ - { - "endIndex": 1725, - "startIndex": 1688, - "textRun": { - "content": "Seal a class for exhaustive switching", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.qhrafs2obyf8" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1726, - "startIndex": 1725, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1688 - }, - { - "endIndex": 1748, - "paragraph": { - "elements": [ - { - "endIndex": 1747, - "startIndex": 1726, - "textRun": { - "content": "Create the subclasses", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.r3jqucu93ahb" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1748, - "startIndex": 1747, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1726 - }, - { - "endIndex": 1762, - "paragraph": { - "elements": [ - { - "endIndex": 1761, - "startIndex": 1748, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.6y1ysytcknvf" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1762, - "startIndex": 1761, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1748 - }, - { - "endIndex": 1782, - "paragraph": { - "elements": [ - { - "endIndex": 1781, - "startIndex": 1762, - "textRun": { - "content": "Seal the superclass", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.g3xt9adlan98" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1782, - "startIndex": 1781, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1762 - }, - { - "endIndex": 1796, - "paragraph": { - "elements": [ - { - "endIndex": 1795, - "startIndex": 1782, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.8e7nmbgjwwar" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1796, - "startIndex": 1795, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1782 - }, - { - "endIndex": 1848, - "paragraph": { - "elements": [ - { - "endIndex": 1847, - "startIndex": 1796, - "textRun": { - "content": "Use a switch expression in order to display widgets", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.foj9vhgbov84" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1848, - "startIndex": 1847, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1796 - }, - { - "endIndex": 1862, - "paragraph": { - "elements": [ - { - "endIndex": 1861, - "startIndex": 1848, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.m6cm9c15guwi" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1862, - "startIndex": 1861, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1848 - }, - { - "endIndex": 1878, - "paragraph": { - "elements": [ - { - "endIndex": 1877, - "startIndex": 1862, - "textRun": { - "content": "Congratulations", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.s22qmcj4zu61" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1878, - "startIndex": 1877, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1862 - }, - { - "endIndex": 1891, - "paragraph": { - "elements": [ - { - "endIndex": 1890, - "startIndex": 1878, - "textRun": { - "content": "What’s next?", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.9mqifffit2ew" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1891, - "startIndex": 1890, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1878 - }, - { - "endIndex": 1906, - "paragraph": { - "elements": [ - { - "endIndex": 1905, - "startIndex": 1891, - "textRun": { - "content": "Reference docs", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.an95hoqxrlhg" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1906, - "startIndex": 1905, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1891 - } - ] - } - }, - { - "endIndex": 1908, - "paragraph": { - "elements": [ - { - "endIndex": 1908, - "startIndex": 1907, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1907 - }, - { - "endIndex": 1909, - "paragraph": { - "elements": [ - { - "endIndex": 1909, - "startIndex": 1908, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Verdana", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1908 - }, - { - "endIndex": 1922, - "paragraph": { - "elements": [ - { - "endIndex": 1922, - "startIndex": 1909, - "textRun": { - "content": "Introduction\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hzcz072cgix0", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 1909 - }, - { - "endIndex": 1937, - "paragraph": { - "elements": [ - { - "endIndex": 1936, - "startIndex": 1922, - "textRun": { - "content": "Duration: 2:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1937, - "startIndex": 1936, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1922 - }, - { - "endIndex": 1938, - "paragraph": { - "elements": [ - { - "endIndex": 1938, - "startIndex": 1937, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1937 - }, - { - "endIndex": 2112, - "paragraph": { - "elements": [ - { - "endIndex": 1956, - "startIndex": 1938, - "textRun": { - "content": "Dart 3 introduces ", - "textStyle": {} - } - }, - { - "endIndex": 1964, - "startIndex": 1956, - "textRun": { - "content": "patterns", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 1965, - "startIndex": 1964, - "textRun": { - "content": " ", - "textStyle": { - "bold": true, - "italic": true - } - } - }, - { - "endIndex": 1980, - "startIndex": 1965, - "textRun": { - "content": "to the language", - "textStyle": {} - } - }, - { - "endIndex": 2112, - "startIndex": 1980, - "textRun": { - "content": ", a major new category of grammar. Beyond this new way to write Dart code, there are several other language enhancements, including\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 1938 - }, - { - "endIndex": 2158, - "paragraph": { - "bullet": { - "listId": "kix.29md3ly3lepf", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 2119, - "startIndex": 2112, - "textRun": { - "content": "records", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 2156, - "startIndex": 2119, - "textRun": { - "content": " for bundling data of different types", - "textStyle": {} - } - }, - { - "endIndex": 2158, - "startIndex": 2156, - "textRun": { - "content": ",\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2112 - }, - { - "endIndex": 2202, - "paragraph": { - "bullet": { - "listId": "kix.29md3ly3lepf", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 2173, - "startIndex": 2158, - "textRun": { - "content": "class modifiers", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 2202, - "startIndex": 2173, - "textRun": { - "content": " for controlling access, and\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2158 - }, - { - "endIndex": 2249, - "paragraph": { - "bullet": { - "listId": "kix.29md3ly3lepf", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 2206, - "startIndex": 2202, - "textRun": { - "content": "new ", - "textStyle": {} - } - }, - { - "endIndex": 2224, - "startIndex": 2206, - "textRun": { - "content": "switch expressions", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 2229, - "startIndex": 2224, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 2247, - "startIndex": 2229, - "textRun": { - "content": "if-case statements", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 2249, - "startIndex": 2247, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2202 - }, - { - "endIndex": 2250, - "paragraph": { - "elements": [ - { - "endIndex": 2250, - "startIndex": 2249, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2249 - }, - { - "endIndex": 2419, - "paragraph": { - "elements": [ - { - "endIndex": 2419, - "startIndex": 2250, - "textRun": { - "content": "These features expand the choices you have when writing Dart code. In this codelab, you learn how to use them to make your code more compact, streamlined, and flexible.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2250 - }, - { - "endIndex": 2420, - "paragraph": { - "elements": [ - { - "endIndex": 2420, - "startIndex": 2419, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2419 - }, - { - "endIndex": 2583, - "paragraph": { - "elements": [ - { - "endIndex": 2583, - "startIndex": 2420, - "textRun": { - "content": "This codelab assumes you have some familiarity with Flutter and Dart. If you feel a little rusty, consider brushing up on the basics with the following resources:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2420 - }, - { - "endIndex": 2604, - "paragraph": { - "bullet": { - "listId": "kix.ys8rp5gxh2y2", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2603, - "startIndex": 2583, - "textRun": { - "content": "Introduction to Dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://dart.dev/language" - }, - "underline": true - } - } - }, - { - "endIndex": 2604, - "startIndex": 2603, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2583 - }, - { - "endIndex": 2627, - "paragraph": { - "bullet": { - "listId": "kix.ys8rp5gxh2y2", - "textStyle": { - "italic": true - } - }, - "elements": [ - { - "endIndex": 2626, - "startIndex": 2604, - "textRun": { - "content": "Your first Flutter app", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://codelabs.developers.google.com/codelabs/flutter-codelab-first" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2627, - "startIndex": 2626, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2604 - }, - { - "endIndex": 2628, - "paragraph": { - "elements": [ - { - "endIndex": 2628, - "startIndex": 2627, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2627 - }, - { - "endIndex": 2646, - "paragraph": { - "elements": [ - { - "endIndex": 2645, - "startIndex": 2628, - "textRun": { - "content": "What you'll build", - "textStyle": {} - } - }, - { - "endIndex": 2646, - "startIndex": 2645, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ohez9ifqj67k", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 2628 - }, - { - "endIndex": 3012, - "paragraph": { - "elements": [ - { - "endIndex": 3012, - "startIndex": 2646, - "textRun": { - "content": "This codelab creates an application that displays a JSON document in Flutter. The application simulates JSON coming from an external source. The JSON contains document data such as the modification date, title, headers, and paragraphs. You write code to neatly pack data into records so that it can be transferred and unpacked wherever your Flutter widgets need it.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2646 - }, - { - "endIndex": 3013, - "paragraph": { - "elements": [ - { - "endIndex": 3013, - "startIndex": 3012, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3012 - }, - { - "endIndex": 3179, - "paragraph": { - "elements": [ - { - "endIndex": 3179, - "startIndex": 3013, - "textRun": { - "content": "You then use patterns to build the appropriate widget when the value matches that pattern. You also see how to use patterns to destructure data into local variables.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3013 - }, - { - "endIndex": 3180, - "paragraph": { - "elements": [ - { - "endIndex": 3180, - "startIndex": 3179, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3179 - }, - { - "endIndex": 3182, - "paragraph": { - "elements": [ - { - "endIndex": 3181, - "inlineObjectElement": { - "inlineObjectId": "kix.ctv7dbuxjvub", - "textStyle": {} - }, - "startIndex": 3180 - }, - { - "endIndex": 3182, - "startIndex": 3181, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3180 - }, - { - "endIndex": 3200, - "paragraph": { - "elements": [ - { - "endIndex": 3200, - "startIndex": 3182, - "textRun": { - "content": "What you'll learn\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.2ww7b2q8ih95", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 3182 - }, - { - "endIndex": 3273, - "paragraph": { - "bullet": { - "listId": "kix.7cnpkqyuk55g", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3273, - "startIndex": 3200, - "textRun": { - "content": "How to create a record that stores multiple values with different types.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3200 - }, - { - "endIndex": 3336, - "paragraph": { - "bullet": { - "listId": "kix.7cnpkqyuk55g", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3336, - "startIndex": 3273, - "textRun": { - "content": "How to return multiple values from a function using a record. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3273 - }, - { - "endIndex": 3429, - "paragraph": { - "bullet": { - "listId": "kix.7cnpkqyuk55g", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3429, - "startIndex": 3336, - "textRun": { - "content": "How to use patterns to match, validate, and destructure data from records and other objects.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3336 - }, - { - "endIndex": 3494, - "paragraph": { - "bullet": { - "listId": "kix.7cnpkqyuk55g", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3494, - "startIndex": 3429, - "textRun": { - "content": "How to bind pattern-matched values to new or existing variables.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3429 - }, - { - "endIndex": 3584, - "paragraph": { - "bullet": { - "listId": "kix.7cnpkqyuk55g", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3509, - "startIndex": 3494, - "textRun": { - "content": "How to use new ", - "textStyle": {} - } - }, - { - "endIndex": 3559, - "startIndex": 3509, - "textRun": { - "content": "switch statement capabilities, switch expressions,", - "textStyle": {} - } - }, - { - "endIndex": 3563, - "startIndex": 3559, - "textRun": { - "content": " and", - "textStyle": {} - } - }, - { - "endIndex": 3567, - "startIndex": 3563, - "textRun": { - "content": " if-", - "textStyle": {} - } - }, - { - "endIndex": 3583, - "startIndex": 3567, - "textRun": { - "content": "case statements.", - "textStyle": {} - } - }, - { - "endIndex": 3584, - "startIndex": 3583, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3494 - }, - { - "endIndex": 3714, - "paragraph": { - "bullet": { - "listId": "kix.7cnpkqyuk55g", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3609, - "startIndex": 3584, - "textRun": { - "content": "How to take advantage of ", - "textStyle": {} - } - }, - { - "endIndex": 3632, - "startIndex": 3609, - "textRun": { - "content": "exhaustiveness checking", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 3713, - "startIndex": 3632, - "textRun": { - "content": " to ensure that every case is handled in a switch statement or switch expression.", - "textStyle": {} - } - }, - { - "endIndex": 3714, - "startIndex": 3713, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3584 - }, - { - "endIndex": 3715, - "paragraph": { - "elements": [ - { - "endIndex": 3715, - "startIndex": 3714, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3714 - }, - { - "endIndex": 3739, - "paragraph": { - "elements": [ - { - "endIndex": 3739, - "startIndex": 3715, - "textRun": { - "content": "Set up your environment\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.2zyyznhvjezk", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 3715 - }, - { - "endIndex": 3754, - "paragraph": { - "elements": [ - { - "endIndex": 3754, - "startIndex": 3739, - "textRun": { - "content": "Duration: 3:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3739 - }, - { - "endIndex": 3755, - "paragraph": { - "elements": [ - { - "endIndex": 3755, - "startIndex": 3754, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3754 - }, - { - "endIndex": 3780, - "paragraph": { - "bullet": { - "listId": "kix.a9n5e5f1az1v", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 3767, - "startIndex": 3755, - "textRun": { - "content": "Install the ", - "textStyle": {} - } - }, - { - "endIndex": 3778, - "startIndex": 3767, - "textRun": { - "content": "Flutter SDK", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/install" - }, - "underline": true - } - } - }, - { - "endIndex": 3780, - "startIndex": 3778, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3755 - }, - { - "endIndex": 3835, - "paragraph": { - "bullet": { - "listId": "kix.a9n5e5f1az1v", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 3796, - "startIndex": 3780, - "textRun": { - "content": "Set up an editor", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/editor" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3833, - "startIndex": 3796, - "textRun": { - "content": " such as Visual Studio Code (VS Code)", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3834, - "startIndex": 3833, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 3835, - "startIndex": 3834, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3780 - }, - { - "endIndex": 3947, - "paragraph": { - "bullet": { - "listId": "kix.a9n5e5f1az1v", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3850, - "startIndex": 3835, - "textRun": { - "content": "Go through the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3864, - "startIndex": 3850, - "textRun": { - "content": "Platform setup", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/install/macos#platform-setup" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3946, - "startIndex": 3864, - "textRun": { - "content": " steps for at least one target platform (iOS, Android, Desktop, or a web browser).", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3947, - "startIndex": 3946, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Verdana", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3835 - }, - { - "endIndex": 3966, - "paragraph": { - "elements": [ - { - "endIndex": 3965, - "startIndex": 3947, - "textRun": { - "content": "Create the project", - "textStyle": {} - } - }, - { - "endIndex": 3966, - "startIndex": 3965, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.bwo0af2iwk90", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 3947 - }, - { - "endIndex": 3981, - "paragraph": { - "elements": [ - { - "endIndex": 3980, - "startIndex": 3966, - "textRun": { - "content": "Duration: 3:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3981, - "startIndex": 3980, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3966 - }, - { - "endIndex": 3982, - "paragraph": { - "elements": [ - { - "endIndex": 3982, - "startIndex": 3981, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3981 - }, - { - "endIndex": 4151, - "paragraph": { - "elements": [ - { - "endIndex": 4150, - "startIndex": 3982, - "textRun": { - "content": "Before diving into patterns, records, and other new features, take a moment to set up your environment and the simple Flutter project for which you write all your code.", - "textStyle": {} - } - }, - { - "endIndex": 4151, - "startIndex": 4150, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3982 - }, - { - "endIndex": 4161, - "paragraph": { - "elements": [ - { - "endIndex": 4160, - "startIndex": 4151, - "textRun": { - "content": "Get Dart ", - "textStyle": {} - } - }, - { - "endIndex": 4161, - "startIndex": 4160, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hz1dqd64dfk8", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 4151 - }, - { - "endIndex": 4220, - "paragraph": { - "bullet": { - "listId": "kix.ss5r6gmvu828", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 4219, - "startIndex": 4161, - "textRun": { - "content": "To ensure you’re using Dart 3, run the following commands:", - "textStyle": {} - } - }, - { - "endIndex": 4220, - "startIndex": 4219, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4161 - }, - { - "endIndex": 4334, - "startIndex": 4220, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4333, - "startIndex": 4221, - "tableCells": [ - { - "content": [ - { - "endIndex": 4246, - "paragraph": { - "elements": [ - { - "endIndex": 4246, - "startIndex": 4223, - "textRun": { - "content": "flutter channel stable\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4223 - }, - { - "endIndex": 4262, - "paragraph": { - "elements": [ - { - "endIndex": 4262, - "startIndex": 4246, - "textRun": { - "content": "flutter upgrade\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4246 - }, - { - "endIndex": 4333, - "paragraph": { - "elements": [ - { - "endIndex": 4333, - "startIndex": 4262, - "textRun": { - "content": "dart --version # This should print \"Dart SDK version: 3.0.0\" or higher\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4262 - } - ], - "endIndex": 4333, - "startIndex": 4222, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4335, - "paragraph": { - "elements": [ - { - "endIndex": 4335, - "startIndex": 4334, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4334 - }, - { - "endIndex": 4425, - "startIndex": 4335, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4424, - "startIndex": 4336, - "tableCells": [ - { - "content": [ - { - "endIndex": 4424, - "paragraph": { - "elements": [ - { - "endIndex": 4344, - "startIndex": 4338, - "textRun": { - "content": "Note: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 4407, - "startIndex": 4344, - "textRun": { - "content": "The Flutter SDK includes Dart, but Dart is also available as a ", - "textStyle": {} - } - }, - { - "endIndex": 4421, - "startIndex": 4407, - "textRun": { - "content": "standalone SDK", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://dart.dev/get-dart" - }, - "underline": true - } - } - }, - { - "endIndex": 4424, - "startIndex": 4421, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4338 - } - ], - "endIndex": 4424, - "startIndex": 4337, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4426, - "paragraph": { - "elements": [ - { - "endIndex": 4426, - "startIndex": 4425, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4425 - }, - { - "endIndex": 4648, - "startIndex": 4426, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4647, - "startIndex": 4427, - "tableCells": [ - { - "content": [ - { - "endIndex": 4647, - "paragraph": { - "elements": [ - { - "endIndex": 4438, - "startIndex": 4429, - "textRun": { - "content": "Warning: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 4597, - "startIndex": 4438, - "textRun": { - "content": "Dart 3 only supports null safe code. If you have existing Dart projects that have not opted-in to null safety, this upgrade causes that code to break. Consult ", - "textStyle": {} - } - }, - { - "endIndex": 4614, - "startIndex": 4597, - "textRun": { - "content": "Sound null safety", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://dart.dev/null-safety#dart-3-and-null-safety" - }, - "underline": true - } - } - }, - { - "endIndex": 4646, - "startIndex": 4614, - "textRun": { - "content": " for safeguards and precautions.", - "textStyle": {} - } - }, - { - "endIndex": 4647, - "startIndex": 4646, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4429 - } - ], - "endIndex": 4647, - "startIndex": 4428, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8039216, - "green": 0.8980392, - "red": 0.9882353 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4673, - "paragraph": { - "elements": [ - { - "endIndex": 4673, - "startIndex": 4648, - "textRun": { - "content": "Create a Flutter project\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.puul27u3qcal", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 4648 - }, - { - "endIndex": 4881, - "paragraph": { - "bullet": { - "listId": "kix.e7rm6cchwfxs", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 4681, - "startIndex": 4673, - "textRun": { - "content": "Use the ", - "textStyle": {} - } - }, - { - "endIndex": 4695, - "startIndex": 4681, - "textRun": { - "content": "flutter create", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 4734, - "startIndex": 4695, - "textRun": { - "content": " command to create a new project named ", - "textStyle": {} - } - }, - { - "endIndex": 4750, - "startIndex": 4734, - "textRun": { - "content": "patterns_codelab", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4756, - "startIndex": 4750, - "textRun": { - "content": ". The ", - "textStyle": {} - } - }, - { - "endIndex": 4763, - "startIndex": 4756, - "textRun": { - "content": "--empty", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 4826, - "startIndex": 4763, - "textRun": { - "content": " flag prevents the creation of the standard counter app in the ", - "textStyle": {} - } - }, - { - "endIndex": 4839, - "startIndex": 4826, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4881, - "startIndex": 4839, - "textRun": { - "content": " file, which you’d have to remove anyway.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4673 - }, - { - "endIndex": 4882, - "paragraph": { - "elements": [ - { - "endIndex": 4882, - "startIndex": 4881, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4881 - }, - { - "endIndex": 4926, - "startIndex": 4882, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4925, - "startIndex": 4883, - "tableCells": [ - { - "content": [ - { - "endIndex": 4925, - "paragraph": { - "elements": [ - { - "endIndex": 4925, - "startIndex": 4885, - "textRun": { - "content": "flutter create --empty patterns_codelab\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4885 - } - ], - "endIndex": 4925, - "startIndex": 4884, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4927, - "paragraph": { - "elements": [ - { - "endIndex": 4927, - "startIndex": 4926, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4926 - }, - { - "endIndex": 4984, - "paragraph": { - "bullet": { - "listId": "kix.e7rm6cchwfxs", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 4942, - "startIndex": 4927, - "textRun": { - "content": "Then, open the ", - "textStyle": {} - } - }, - { - "endIndex": 4958, - "startIndex": 4942, - "textRun": { - "content": "patterns_codelab", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4983, - "startIndex": 4958, - "textRun": { - "content": " directory using VS Code.", - "textStyle": {} - } - }, - { - "endIndex": 4984, - "startIndex": 4983, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4927 - }, - { - "endIndex": 5010, - "startIndex": 4984, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 5009, - "startIndex": 4985, - "tableCells": [ - { - "content": [ - { - "endIndex": 5009, - "paragraph": { - "elements": [ - { - "endIndex": 5009, - "startIndex": 4987, - "textRun": { - "content": "code patterns_codelab\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4987 - } - ], - "endIndex": 5009, - "startIndex": 4986, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 5012, - "paragraph": { - "elements": [ - { - "endIndex": 5011, - "inlineObjectElement": { - "inlineObjectId": "kix.qfmyzzrv0fkx", - "textStyle": { - "italic": true - } - }, - "startIndex": 5010 - }, - { - "endIndex": 5012, - "startIndex": 5011, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 5.0, - "unit": "PT" - } - } - }, - "startIndex": 5010 - }, - { - "endIndex": 5040, - "paragraph": { - "elements": [ - { - "endIndex": 5040, - "startIndex": 5012, - "textRun": { - "content": "Set the minimum SDK version\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.fn7r4ym5936q", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 5012 - }, - { - "endIndex": 5118, - "paragraph": { - "bullet": { - "listId": "kix.odzjfc6rqek1", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 5118, - "startIndex": 5040, - "textRun": { - "content": "Set the SDK version constraint for your project to depend on Dart 3 or above.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5040 - }, - { - "endIndex": 5131, - "paragraph": { - "elements": [ - { - "endIndex": 5130, - "startIndex": 5118, - "textRun": { - "content": "pubspec.yaml", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_03/pubspec.yaml" - }, - "underline": true - } - } - }, - { - "endIndex": 5131, - "startIndex": 5130, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.wxfg1yyhggp8", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 5118 - }, - { - "endIndex": 5162, - "startIndex": 5131, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 5161, - "startIndex": 5132, - "tableCells": [ - { - "content": [ - { - "endIndex": 5147, - "paragraph": { - "elements": [ - { - "endIndex": 5147, - "startIndex": 5134, - "textRun": { - "content": "environment:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5134 - }, - { - "endIndex": 5161, - "paragraph": { - "elements": [ - { - "endIndex": 5161, - "startIndex": 5147, - "textRun": { - "content": " sdk: ^3.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5147 - } - ], - "endIndex": 5161, - "startIndex": 5133, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 5163, - "paragraph": { - "elements": [ - { - "endIndex": 5163, - "startIndex": 5162, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5162 - }, - { - "endIndex": 5391, - "startIndex": 5163, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 5390, - "startIndex": 5164, - "tableCells": [ - { - "content": [ - { - "endIndex": 5390, - "paragraph": { - "elements": [ - { - "endIndex": 5180, - "startIndex": 5166, - "textRun": { - "content": "Did you know? ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 5192, - "startIndex": 5180, - "textRun": { - "content": "This is your", - "textStyle": {} - } - }, - { - "endIndex": 5233, - "startIndex": 5192, - "textRun": { - "content": " first introduction to Dart 3! The caret ", - "textStyle": {} - } - }, - { - "endIndex": 5234, - "startIndex": 5233, - "textRun": { - "content": "^", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 5374, - "startIndex": 5234, - "textRun": { - "content": " syntax can now be used for SDK constraints (although it has been supported for packages since Dart 1.8). Previously, this would be written ", - "textStyle": {} - } - }, - { - "endIndex": 5388, - "startIndex": 5374, - "textRun": { - "content": ">=3.0.0 <4.0.0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 5389, - "startIndex": 5388, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 5390, - "startIndex": 5389, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5166 - } - ], - "endIndex": 5390, - "startIndex": 5165, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 5410, - "paragraph": { - "elements": [ - { - "endIndex": 5409, - "startIndex": 5391, - "textRun": { - "content": "Set up the project", - "textStyle": {} - } - }, - { - "endIndex": 5410, - "startIndex": 5409, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.tofj7jijs3a4", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 5391 - }, - { - "endIndex": 5425, - "paragraph": { - "elements": [ - { - "endIndex": 5424, - "startIndex": 5410, - "textRun": { - "content": "Duration: 3:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 5425, - "startIndex": 5424, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5410 - }, - { - "endIndex": 5426, - "paragraph": { - "elements": [ - { - "endIndex": 5426, - "startIndex": 5425, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5425 - }, - { - "endIndex": 5477, - "paragraph": { - "elements": [ - { - "endIndex": 5477, - "startIndex": 5426, - "textRun": { - "content": "In this step, you create or update two Dart files:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5426 - }, - { - "endIndex": 5535, - "paragraph": { - "bullet": { - "listId": "kix.tjxkb9tlcarv", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 5481, - "startIndex": 5477, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 5490, - "startIndex": 5481, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 5535, - "startIndex": 5490, - "textRun": { - "content": " file that contains widgets for the app, and\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5477 - }, - { - "endIndex": 5584, - "paragraph": { - "bullet": { - "listId": "kix.tjxkb9tlcarv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 5539, - "startIndex": 5535, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 5548, - "startIndex": 5539, - "textRun": { - "content": "data.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 5584, - "startIndex": 5548, - "textRun": { - "content": " file that provides the app's data.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5535 - }, - { - "endIndex": 5585, - "paragraph": { - "elements": [ - { - "endIndex": 5585, - "startIndex": 5584, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5584 - }, - { - "endIndex": 5658, - "paragraph": { - "elements": [ - { - "endIndex": 5658, - "startIndex": 5585, - "textRun": { - "content": "You will continue modifying both of these files in the subsequent steps.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5585 - }, - { - "endIndex": 5686, - "paragraph": { - "elements": [ - { - "endIndex": 5685, - "startIndex": 5658, - "textRun": { - "content": "Define the data for the app", - "textStyle": {} - } - }, - { - "endIndex": 5686, - "startIndex": 5685, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.al2qhdvxmiug", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 5658 - }, - { - "endIndex": 5754, - "paragraph": { - "bullet": { - "listId": "kix.sjzj7ysn5gcf", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 5705, - "startIndex": 5686, - "textRun": { - "content": "Create a new file, ", - "textStyle": {} - } - }, - { - "endIndex": 5718, - "startIndex": 5705, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 5719, - "startIndex": 5718, - "textRun": { - "content": ",", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - } - } - } - }, - { - "endIndex": 5753, - "startIndex": 5719, - "textRun": { - "content": " and add the following code to it:", - "textStyle": {} - } - }, - { - "endIndex": 5754, - "startIndex": 5753, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5686 - }, - { - "endIndex": 5768, - "paragraph": { - "elements": [ - { - "endIndex": 5767, - "startIndex": 5754, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_04/lib/data.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 5768, - "startIndex": 5767, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.re3z7mxbljy8", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 5754 - }, - { - "endIndex": 6286, - "startIndex": 5768, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 6285, - "startIndex": 5769, - "tableCells": [ - { - "content": [ - { - "endIndex": 5794, - "paragraph": { - "elements": [ - { - "endIndex": 5794, - "startIndex": 5771, - "textRun": { - "content": "import 'dart:convert';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5771 - }, - { - "endIndex": 5795, - "paragraph": { - "elements": [ - { - "endIndex": 5795, - "startIndex": 5794, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5794 - }, - { - "endIndex": 5812, - "paragraph": { - "elements": [ - { - "endIndex": 5812, - "startIndex": 5795, - "textRun": { - "content": "class Document {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5795 - }, - { - "endIndex": 5848, - "paragraph": { - "elements": [ - { - "endIndex": 5848, - "startIndex": 5812, - "textRun": { - "content": " final Map _json;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5812 - }, - { - "endIndex": 5897, - "paragraph": { - "elements": [ - { - "endIndex": 5897, - "startIndex": 5848, - "textRun": { - "content": " Document() : _json = jsonDecode(documentJson);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5848 - }, - { - "endIndex": 5899, - "paragraph": { - "elements": [ - { - "endIndex": 5899, - "startIndex": 5897, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5897 - }, - { - "endIndex": 5900, - "paragraph": { - "elements": [ - { - "endIndex": 5900, - "startIndex": 5899, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5899 - }, - { - "endIndex": 5925, - "paragraph": { - "elements": [ - { - "endIndex": 5925, - "startIndex": 5900, - "textRun": { - "content": "const documentJson = '''\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5900 - }, - { - "endIndex": 5927, - "paragraph": { - "elements": [ - { - "endIndex": 5927, - "startIndex": 5925, - "textRun": { - "content": "{\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5925 - }, - { - "endIndex": 5943, - "paragraph": { - "elements": [ - { - "endIndex": 5943, - "startIndex": 5927, - "textRun": { - "content": " \"metadata\": {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5927 - }, - { - "endIndex": 5971, - "paragraph": { - "elements": [ - { - "endIndex": 5971, - "startIndex": 5943, - "textRun": { - "content": " \"title\": \"My Document\",\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5943 - }, - { - "endIndex": 6000, - "paragraph": { - "elements": [ - { - "endIndex": 6000, - "startIndex": 5971, - "textRun": { - "content": " \"modified\": \"2023-05-10\"\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5971 - }, - { - "endIndex": 6005, - "paragraph": { - "elements": [ - { - "endIndex": 6005, - "startIndex": 6000, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6000 - }, - { - "endIndex": 6019, - "paragraph": { - "elements": [ - { - "endIndex": 6019, - "startIndex": 6005, - "textRun": { - "content": " \"blocks\": [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6005 - }, - { - "endIndex": 6025, - "paragraph": { - "elements": [ - { - "endIndex": 6025, - "startIndex": 6019, - "textRun": { - "content": " {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6019 - }, - { - "endIndex": 6045, - "paragraph": { - "elements": [ - { - "endIndex": 6045, - "startIndex": 6025, - "textRun": { - "content": " \"type\": \"h1\",\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6025 - }, - { - "endIndex": 6071, - "paragraph": { - "elements": [ - { - "endIndex": 6071, - "startIndex": 6045, - "textRun": { - "content": " \"text\": \"Chapter 1\"\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6045 - }, - { - "endIndex": 6078, - "paragraph": { - "elements": [ - { - "endIndex": 6078, - "startIndex": 6071, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6071 - }, - { - "endIndex": 6084, - "paragraph": { - "elements": [ - { - "endIndex": 6084, - "startIndex": 6078, - "textRun": { - "content": " {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6078 - }, - { - "endIndex": 6103, - "paragraph": { - "elements": [ - { - "endIndex": 6103, - "startIndex": 6084, - "textRun": { - "content": " \"type\": \"p\",\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6084 - }, - { - "endIndex": 6176, - "paragraph": { - "elements": [ - { - "endIndex": 6176, - "startIndex": 6103, - "textRun": { - "content": " \"text\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit.\"\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6103 - }, - { - "endIndex": 6183, - "paragraph": { - "elements": [ - { - "endIndex": 6183, - "startIndex": 6176, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6176 - }, - { - "endIndex": 6189, - "paragraph": { - "elements": [ - { - "endIndex": 6189, - "startIndex": 6183, - "textRun": { - "content": " {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6183 - }, - { - "endIndex": 6215, - "paragraph": { - "elements": [ - { - "endIndex": 6215, - "startIndex": 6189, - "textRun": { - "content": " \"type\": \"checkbox\",\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6189 - }, - { - "endIndex": 6239, - "paragraph": { - "elements": [ - { - "endIndex": 6239, - "startIndex": 6215, - "textRun": { - "content": " \"checked\": false,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6215 - }, - { - "endIndex": 6268, - "paragraph": { - "elements": [ - { - "endIndex": 6268, - "startIndex": 6239, - "textRun": { - "content": " \"text\": \"Learn Dart 3\"\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6239 - }, - { - "endIndex": 6274, - "paragraph": { - "elements": [ - { - "endIndex": 6274, - "startIndex": 6268, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6268 - }, - { - "endIndex": 6278, - "paragraph": { - "elements": [ - { - "endIndex": 6278, - "startIndex": 6274, - "textRun": { - "content": " ]\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6274 - }, - { - "endIndex": 6280, - "paragraph": { - "elements": [ - { - "endIndex": 6280, - "startIndex": 6278, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6278 - }, - { - "endIndex": 6285, - "paragraph": { - "elements": [ - { - "endIndex": 6285, - "startIndex": 6280, - "textRun": { - "content": "''';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6280 - } - ], - "endIndex": 6285, - "startIndex": 5770, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6287, - "paragraph": { - "elements": [ - { - "endIndex": 6287, - "startIndex": 6286, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6286 - }, - { - "endIndex": 6525, - "paragraph": { - "elements": [ - { - "endIndex": 6502, - "startIndex": 6287, - "textRun": { - "content": "Imagine a program receiving data from an external source, like an I/O stream or HTTP request. In this codelab, you simplify that more-realistic use case by mocking incoming JSON data with a multi-line string in the ", - "textStyle": {} - } - }, - { - "endIndex": 6514, - "startIndex": 6502, - "textRun": { - "content": "documentJson", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6525, - "startIndex": 6514, - "textRun": { - "content": " variable.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6287 - }, - { - "endIndex": 6526, - "paragraph": { - "elements": [ - { - "endIndex": 6526, - "startIndex": 6525, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6525 - }, - { - "endIndex": 6729, - "paragraph": { - "elements": [ - { - "endIndex": 6558, - "startIndex": 6526, - "textRun": { - "content": "The JSON data is defined in the ", - "textStyle": {} - } - }, - { - "endIndex": 6566, - "startIndex": 6558, - "textRun": { - "content": "Document", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6681, - "startIndex": 6566, - "textRun": { - "content": " class, and later in this codelab, you add functions that return data from the parsed JSON. This class defines and ", - "textStyle": {} - } - }, - { - "endIndex": 6692, - "startIndex": 6681, - "textRun": { - "content": "initializes", - "textStyle": {} - } - }, - { - "endIndex": 6697, - "startIndex": 6692, - "textRun": { - "content": " the ", - "textStyle": {} - } - }, - { - "endIndex": 6702, - "startIndex": 6697, - "textRun": { - "content": "_json", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6709, - "startIndex": 6702, - "textRun": { - "content": " field ", - "textStyle": {} - } - }, - { - "endIndex": 6728, - "startIndex": 6709, - "textRun": { - "content": "in its constructor.", - "textStyle": {} - } - }, - { - "endIndex": 6729, - "startIndex": 6728, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6526 - }, - { - "endIndex": 6730, - "paragraph": { - "elements": [ - { - "endIndex": 6730, - "startIndex": 6729, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6729 - }, - { - "endIndex": 6973, - "startIndex": 6730, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 6972, - "startIndex": 6731, - "tableCells": [ - { - "content": [ - { - "endIndex": 6870, - "paragraph": { - "elements": [ - { - "endIndex": 6747, - "startIndex": 6733, - "textRun": { - "content": "Did you know? ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 6761, - "startIndex": 6747, - "textRun": { - "content": "You can press ", - "textStyle": {} - } - }, - { - "endIndex": 6768, - "startIndex": 6761, - "textRun": { - "content": "Command", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6772, - "startIndex": 6768, - "textRun": { - "content": " or ", - "textStyle": {} - } - }, - { - "endIndex": 6779, - "startIndex": 6772, - "textRun": { - "content": "Control", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6870, - "startIndex": 6779, - "textRun": { - "content": " and click on functions, classes, and libraries in VS Code to see where they are defined.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6733 - }, - { - "endIndex": 6871, - "paragraph": { - "elements": [ - { - "endIndex": 6871, - "startIndex": 6870, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6870 - }, - { - "endIndex": 6972, - "paragraph": { - "elements": [ - { - "endIndex": 6889, - "startIndex": 6871, - "textRun": { - "content": "Try doing this on ", - "textStyle": {} - } - }, - { - "endIndex": 6899, - "startIndex": 6889, - "textRun": { - "content": "jsonDecode", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6950, - "startIndex": 6899, - "textRun": { - "content": " and see the editor open to the declaration in the ", - "textStyle": {} - } - }, - { - "endIndex": 6962, - "startIndex": 6950, - "textRun": { - "content": "dart:convert", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6972, - "startIndex": 6962, - "textRun": { - "content": " library.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6871 - } - ], - "endIndex": 6972, - "startIndex": 6732, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6974, - "paragraph": { - "elements": [ - { - "endIndex": 6974, - "startIndex": 6973, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6973 - }, - { - "endIndex": 6986, - "paragraph": { - "elements": [ - { - "endIndex": 6985, - "startIndex": 6974, - "textRun": { - "content": "Run the app", - "textStyle": {} - } - }, - { - "endIndex": 6986, - "startIndex": 6985, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.k5wrikjay60s", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 6974 - }, - { - "endIndex": 6987, - "paragraph": { - "elements": [ - { - "endIndex": 6987, - "startIndex": 6986, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6986 - }, - { - "endIndex": 7092, - "paragraph": { - "elements": [ - { - "endIndex": 6991, - "startIndex": 6987, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 7005, - "startIndex": 6991, - "textRun": { - "content": "flutter create", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 7026, - "startIndex": 7005, - "textRun": { - "content": " command creates the ", - "textStyle": {} - } - }, - { - "endIndex": 7030, - "startIndex": 7026, - "textRun": { - "content": "lib/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7039, - "startIndex": 7030, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7040, - "startIndex": 7039, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 7044, - "startIndex": 7040, - "textRun": { - "content": "file", - "textStyle": {} - } - }, - { - "endIndex": 7092, - "startIndex": 7044, - "textRun": { - "content": " as part of the default Flutter file structure.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6987 - }, - { - "endIndex": 7093, - "paragraph": { - "elements": [ - { - "endIndex": 7093, - "startIndex": 7092, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7092 - }, - { - "endIndex": 7200, - "paragraph": { - "bullet": { - "listId": "kix.ibwufjck5e1", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 7094, - "startIndex": 7093, - "textRun": { - "content": "T", - "textStyle": {} - } - }, - { - "endIndex": 7142, - "startIndex": 7094, - "textRun": { - "content": "o create a starting point for the application, r", - "textStyle": {} - } - }, - { - "endIndex": 7165, - "startIndex": 7142, - "textRun": { - "content": "eplace the contents of ", - "textStyle": {} - } - }, - { - "endIndex": 7174, - "startIndex": 7165, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7199, - "startIndex": 7174, - "textRun": { - "content": " with the following code:", - "textStyle": {} - } - }, - { - "endIndex": 7200, - "startIndex": 7199, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7093 - }, - { - "endIndex": 7201, - "paragraph": { - "elements": [ - { - "endIndex": 7201, - "startIndex": 7200, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7200 - }, - { - "endIndex": 7215, - "paragraph": { - "elements": [ - { - "endIndex": 7214, - "startIndex": 7201, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_04/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 7215, - "startIndex": 7214, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.pfkw4b2rwt18", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 7201 - }, - { - "endIndex": 8060, - "startIndex": 7215, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 8059, - "startIndex": 7216, - "tableCells": [ - { - "content": [ - { - "endIndex": 7258, - "paragraph": { - "elements": [ - { - "endIndex": 7258, - "startIndex": 7218, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7218 - }, - { - "endIndex": 7259, - "paragraph": { - "elements": [ - { - "endIndex": 7259, - "startIndex": 7258, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7258 - }, - { - "endIndex": 7279, - "paragraph": { - "elements": [ - { - "endIndex": 7279, - "startIndex": 7259, - "textRun": { - "content": "import 'data.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7259 - }, - { - "endIndex": 7280, - "paragraph": { - "elements": [ - { - "endIndex": 7280, - "startIndex": 7279, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7279 - }, - { - "endIndex": 7294, - "paragraph": { - "elements": [ - { - "endIndex": 7294, - "startIndex": 7280, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7280 - }, - { - "endIndex": 7325, - "paragraph": { - "elements": [ - { - "endIndex": 7325, - "startIndex": 7294, - "textRun": { - "content": " runApp(const DocumentApp());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7294 - }, - { - "endIndex": 7327, - "paragraph": { - "elements": [ - { - "endIndex": 7327, - "startIndex": 7325, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7325 - }, - { - "endIndex": 7328, - "paragraph": { - "elements": [ - { - "endIndex": 7328, - "startIndex": 7327, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7327 - }, - { - "endIndex": 7372, - "paragraph": { - "elements": [ - { - "endIndex": 7372, - "startIndex": 7328, - "textRun": { - "content": "class DocumentApp extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7328 - }, - { - "endIndex": 7406, - "paragraph": { - "elements": [ - { - "endIndex": 7406, - "startIndex": 7372, - "textRun": { - "content": " const DocumentApp({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7372 - }, - { - "endIndex": 7407, - "paragraph": { - "elements": [ - { - "endIndex": 7407, - "startIndex": 7406, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7406 - }, - { - "endIndex": 7419, - "paragraph": { - "elements": [ - { - "endIndex": 7419, - "startIndex": 7407, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7407 - }, - { - "endIndex": 7458, - "paragraph": { - "elements": [ - { - "endIndex": 7458, - "startIndex": 7419, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7419 - }, - { - "endIndex": 7482, - "paragraph": { - "elements": [ - { - "endIndex": 7482, - "startIndex": 7458, - "textRun": { - "content": " return MaterialApp(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7458 - }, - { - "endIndex": 7526, - "paragraph": { - "elements": [ - { - "endIndex": 7526, - "startIndex": 7482, - "textRun": { - "content": " theme: ThemeData(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7482 - }, - { - "endIndex": 7554, - "paragraph": { - "elements": [ - { - "endIndex": 7554, - "startIndex": 7526, - "textRun": { - "content": " home: DocumentScreen(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7526 - }, - { - "endIndex": 7584, - "paragraph": { - "elements": [ - { - "endIndex": 7584, - "startIndex": 7554, - "textRun": { - "content": " document: Document(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7554 - }, - { - "endIndex": 7593, - "paragraph": { - "elements": [ - { - "endIndex": 7593, - "startIndex": 7584, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7584 - }, - { - "endIndex": 7600, - "paragraph": { - "elements": [ - { - "endIndex": 7600, - "startIndex": 7593, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7593 - }, - { - "endIndex": 7604, - "paragraph": { - "elements": [ - { - "endIndex": 7604, - "startIndex": 7600, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7600 - }, - { - "endIndex": 7606, - "paragraph": { - "elements": [ - { - "endIndex": 7606, - "startIndex": 7604, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7604 - }, - { - "endIndex": 7607, - "paragraph": { - "elements": [ - { - "endIndex": 7607, - "startIndex": 7606, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7606 - }, - { - "endIndex": 7654, - "paragraph": { - "elements": [ - { - "endIndex": 7654, - "startIndex": 7607, - "textRun": { - "content": "class DocumentScreen extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7607 - }, - { - "endIndex": 7681, - "paragraph": { - "elements": [ - { - "endIndex": 7681, - "startIndex": 7654, - "textRun": { - "content": " final Document document;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7654 - }, - { - "endIndex": 7682, - "paragraph": { - "elements": [ - { - "endIndex": 7682, - "startIndex": 7681, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7681 - }, - { - "endIndex": 7707, - "paragraph": { - "elements": [ - { - "endIndex": 7707, - "startIndex": 7682, - "textRun": { - "content": " const DocumentScreen({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7682 - }, - { - "endIndex": 7735, - "paragraph": { - "elements": [ - { - "endIndex": 7735, - "startIndex": 7707, - "textRun": { - "content": " required this.document,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7707 - }, - { - "endIndex": 7750, - "paragraph": { - "elements": [ - { - "endIndex": 7750, - "startIndex": 7735, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7735 - }, - { - "endIndex": 7756, - "paragraph": { - "elements": [ - { - "endIndex": 7756, - "startIndex": 7750, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7750 - }, - { - "endIndex": 7757, - "paragraph": { - "elements": [ - { - "endIndex": 7757, - "startIndex": 7756, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7756 - }, - { - "endIndex": 7769, - "paragraph": { - "elements": [ - { - "endIndex": 7769, - "startIndex": 7757, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7757 - }, - { - "endIndex": 7808, - "paragraph": { - "elements": [ - { - "endIndex": 7808, - "startIndex": 7769, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7769 - }, - { - "endIndex": 7829, - "paragraph": { - "elements": [ - { - "endIndex": 7829, - "startIndex": 7808, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7808 - }, - { - "endIndex": 7851, - "paragraph": { - "elements": [ - { - "endIndex": 7851, - "startIndex": 7829, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7829 - }, - { - "endIndex": 7897, - "paragraph": { - "elements": [ - { - "endIndex": 7897, - "startIndex": 7851, - "textRun": { - "content": " title: const Text('Title goes here'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7851 - }, - { - "endIndex": 7906, - "paragraph": { - "elements": [ - { - "endIndex": 7906, - "startIndex": 7897, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7897 - }, - { - "endIndex": 7932, - "paragraph": { - "elements": [ - { - "endIndex": 7932, - "startIndex": 7906, - "textRun": { - "content": " body: const Column(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7906 - }, - { - "endIndex": 7952, - "paragraph": { - "elements": [ - { - "endIndex": 7952, - "startIndex": 7932, - "textRun": { - "content": " children: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7932 - }, - { - "endIndex": 7970, - "paragraph": { - "elements": [ - { - "endIndex": 7970, - "startIndex": 7952, - "textRun": { - "content": " Center(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7952 - }, - { - "endIndex": 8013, - "paragraph": { - "elements": [ - { - "endIndex": 8013, - "startIndex": 7970, - "textRun": { - "content": " child: Text('Body goes here'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7970 - }, - { - "endIndex": 8026, - "paragraph": { - "elements": [ - { - "endIndex": 8026, - "startIndex": 8013, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8013 - }, - { - "endIndex": 8037, - "paragraph": { - "elements": [ - { - "endIndex": 8037, - "startIndex": 8026, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8026 - }, - { - "endIndex": 8046, - "paragraph": { - "elements": [ - { - "endIndex": 8046, - "startIndex": 8037, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8037 - }, - { - "endIndex": 8053, - "paragraph": { - "elements": [ - { - "endIndex": 8053, - "startIndex": 8046, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8046 - }, - { - "endIndex": 8057, - "paragraph": { - "elements": [ - { - "endIndex": 8057, - "startIndex": 8053, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8053 - }, - { - "endIndex": 8059, - "paragraph": { - "elements": [ - { - "endIndex": 8058, - "startIndex": 8057, - "textRun": { - "content": "}", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8059, - "startIndex": 8058, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8057 - } - ], - "endIndex": 8059, - "startIndex": 7217, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 8061, - "paragraph": { - "elements": [ - { - "endIndex": 8061, - "startIndex": 8060, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8060 - }, - { - "endIndex": 8109, - "paragraph": { - "elements": [ - { - "endIndex": 8109, - "startIndex": 8061, - "textRun": { - "content": "You added the following two widgets to the app:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8061 - }, - { - "endIndex": 8187, - "paragraph": { - "bullet": { - "listId": "kix.enu2fgnbdejh", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 8120, - "startIndex": 8109, - "textRun": { - "content": "DocumentApp", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8151, - "startIndex": 8120, - "textRun": { - "content": " sets up the latest version of ", - "textStyle": {} - } - }, - { - "endIndex": 8166, - "startIndex": 8151, - "textRun": { - "content": "Material Design", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/development/ui/material" - }, - "underline": true - } - } - }, - { - "endIndex": 8187, - "startIndex": 8166, - "textRun": { - "content": " for theming the UI.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8109 - }, - { - "endIndex": 8269, - "paragraph": { - "bullet": { - "listId": "kix.enu2fgnbdejh", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 8201, - "startIndex": 8187, - "textRun": { - "content": "DocumentScreen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8251, - "startIndex": 8201, - "textRun": { - "content": " provides the visual layout of the page using the ", - "textStyle": {} - } - }, - { - "endIndex": 8259, - "startIndex": 8251, - "textRun": { - "content": "Scaffold", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8266, - "startIndex": 8259, - "textRun": { - "content": " widget", - "textStyle": {} - } - }, - { - "endIndex": 8269, - "startIndex": 8266, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8187 - }, - { - "endIndex": 8270, - "paragraph": { - "elements": [ - { - "endIndex": 8270, - "startIndex": 8269, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8269 - }, - { - "endIndex": 8361, - "startIndex": 8270, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 8360, - "startIndex": 8271, - "tableCells": [ - { - "content": [ - { - "endIndex": 8360, - "paragraph": { - "elements": [ - { - "endIndex": 8278, - "startIndex": 8273, - "textRun": { - "content": "Tip: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 8292, - "startIndex": 8278, - "textRun": { - "content": "Splitting your", - "textStyle": {} - } - }, - { - "endIndex": 8343, - "startIndex": 8292, - "textRun": { - "content": " UI into separate widgets reduces the size of your ", - "textStyle": {} - } - }, - { - "endIndex": 8350, - "startIndex": 8343, - "textRun": { - "content": "build()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8360, - "startIndex": 8350, - "textRun": { - "content": " methods.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8273 - } - ], - "endIndex": 8360, - "startIndex": 8272, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 8362, - "paragraph": { - "elements": [ - { - "endIndex": 8362, - "startIndex": 8361, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8361 - }, - { - "endIndex": 8467, - "paragraph": { - "bullet": { - "listId": "kix.ibwufjck5e1", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 8452, - "startIndex": 8362, - "textRun": { - "content": "To make sure everything is running smoothly, run the app on your host machine by clicking ", - "textStyle": {} - } - }, - { - "endIndex": 8465, - "startIndex": 8452, - "textRun": { - "content": "Run and Debug", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 8467, - "startIndex": 8465, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8362 - }, - { - "endIndex": 8468, - "paragraph": { - "elements": [ - { - "endIndex": 8468, - "startIndex": 8467, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8467 - }, - { - "endIndex": 8470, - "paragraph": { - "elements": [ - { - "endIndex": 8469, - "inlineObjectElement": { - "inlineObjectId": "kix.nsv6tkuk1bk8", - "textStyle": {} - }, - "startIndex": 8468 - }, - { - "endIndex": 8470, - "startIndex": 8469, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8468 - }, - { - "endIndex": 8471, - "paragraph": { - "elements": [ - { - "endIndex": 8471, - "startIndex": 8470, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8470 - }, - { - "endIndex": 8617, - "paragraph": { - "bullet": { - "listId": "kix.ibwufjck5e1", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 8617, - "startIndex": 8471, - "textRun": { - "content": "By default, Flutter chooses whichever target platform is available. To change the target platform, select the current platform on the Status Bar:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8471 - }, - { - "endIndex": 8618, - "paragraph": { - "elements": [ - { - "endIndex": 8618, - "startIndex": 8617, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8617 - }, - { - "endIndex": 8620, - "paragraph": { - "elements": [ - { - "endIndex": 8619, - "inlineObjectElement": { - "inlineObjectId": "kix.zbxtro32lc4c", - "textStyle": {} - }, - "startIndex": 8618 - }, - { - "endIndex": 8620, - "startIndex": 8619, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8618 - }, - { - "endIndex": 8621, - "paragraph": { - "elements": [ - { - "endIndex": 8621, - "startIndex": 8620, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8620 - }, - { - "endIndex": 8722, - "paragraph": { - "elements": [ - { - "endIndex": 8660, - "startIndex": 8621, - "textRun": { - "content": "You should see an empty frame with the ", - "textStyle": {} - } - }, - { - "endIndex": 8665, - "startIndex": 8660, - "textRun": { - "content": "title", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8670, - "startIndex": 8665, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 8674, - "startIndex": 8670, - "textRun": { - "content": "body", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8699, - "startIndex": 8674, - "textRun": { - "content": " elements defined in the ", - "textStyle": {} - } - }, - { - "endIndex": 8713, - "startIndex": 8699, - "textRun": { - "content": "DocumentScreen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8722, - "startIndex": 8713, - "textRun": { - "content": " widget:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8621 - }, - { - "endIndex": 8723, - "paragraph": { - "elements": [ - { - "endIndex": 8723, - "startIndex": 8722, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8722 - }, - { - "endIndex": 8725, - "paragraph": { - "elements": [ - { - "endIndex": 8724, - "inlineObjectElement": { - "inlineObjectId": "kix.bmryu6vhq6z", - "textStyle": { - "italic": true - } - }, - "startIndex": 8723 - }, - { - "endIndex": 8725, - "startIndex": 8724, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8723 - }, - { - "endIndex": 8751, - "paragraph": { - "elements": [ - { - "endIndex": 8750, - "startIndex": 8725, - "textRun": { - "content": "Create and return records", - "textStyle": {} - } - }, - { - "endIndex": 8751, - "startIndex": 8750, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.3kiny5cugr9k", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 8725 - }, - { - "endIndex": 8766, - "paragraph": { - "elements": [ - { - "endIndex": 8765, - "startIndex": 8751, - "textRun": { - "content": "Duration: 3:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8766, - "startIndex": 8765, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8751 - }, - { - "endIndex": 8767, - "paragraph": { - "elements": [ - { - "endIndex": 8767, - "startIndex": 8766, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8766 - }, - { - "endIndex": 8952, - "paragraph": { - "elements": [ - { - "endIndex": 8781, - "startIndex": 8767, - "textRun": { - "content": "In this step, ", - "textStyle": {} - } - }, - { - "endIndex": 8844, - "startIndex": 8781, - "textRun": { - "content": "you use records to return multiple values from a function call.", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 8881, - "startIndex": 8844, - "textRun": { - "content": " Then, you call that function in the ", - "textStyle": {} - } - }, - { - "endIndex": 8895, - "startIndex": 8881, - "textRun": { - "content": "DocumentScreen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8896, - "startIndex": 8895, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 8952, - "startIndex": 8896, - "textRun": { - "content": "widget to access the values and reflect them in the UI.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8767 - }, - { - "endIndex": 8953, - "paragraph": { - "elements": [ - { - "endIndex": 8953, - "startIndex": 8952, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8952 - }, - { - "endIndex": 8980, - "paragraph": { - "elements": [ - { - "endIndex": 8979, - "startIndex": 8953, - "textRun": { - "content": "Create and return a record", - "textStyle": {} - } - }, - { - "endIndex": 8980, - "startIndex": 8979, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.8sr849kjw46b", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 8953 - }, - { - "endIndex": 9079, - "paragraph": { - "bullet": { - "listId": "kix.crxhbxpwrhf5", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 8983, - "startIndex": 8980, - "textRun": { - "content": "In ", - "textStyle": {} - } - }, - { - "endIndex": 8992, - "startIndex": 8983, - "textRun": { - "content": "data.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8997, - "startIndex": 8992, - "textRun": { - "content": ", add", - "textStyle": {} - } - }, - { - "endIndex": 9040, - "startIndex": 8997, - "textRun": { - "content": " a new getter method to the Document class ", - "textStyle": {} - } - }, - { - "endIndex": 9046, - "startIndex": 9040, - "textRun": { - "content": "called", - "textStyle": {} - } - }, - { - "endIndex": 9047, - "startIndex": 9046, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 9055, - "startIndex": 9047, - "textRun": { - "content": "metadata", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9056, - "startIndex": 9055, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 9078, - "startIndex": 9056, - "textRun": { - "content": "that returns a record:", - "textStyle": {} - } - }, - { - "endIndex": 9079, - "startIndex": 9078, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8980 - }, - { - "endIndex": 9093, - "paragraph": { - "elements": [ - { - "endIndex": 9092, - "startIndex": 9079, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_05/lib/data.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 9093, - "startIndex": 9092, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.cvgunwoh6oqy", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 9079 - }, - { - "endIndex": 9473, - "startIndex": 9093, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 9472, - "startIndex": 9094, - "tableCells": [ - { - "content": [ - { - "endIndex": 9119, - "paragraph": { - "elements": [ - { - "endIndex": 9119, - "startIndex": 9096, - "textRun": { - "content": "import 'dart:convert';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9096 - }, - { - "endIndex": 9120, - "paragraph": { - "elements": [ - { - "endIndex": 9120, - "startIndex": 9119, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9119 - }, - { - "endIndex": 9137, - "paragraph": { - "elements": [ - { - "endIndex": 9137, - "startIndex": 9120, - "textRun": { - "content": "class Document {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9120 - }, - { - "endIndex": 9173, - "paragraph": { - "elements": [ - { - "endIndex": 9173, - "startIndex": 9137, - "textRun": { - "content": " final Map _json;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9137 - }, - { - "endIndex": 9222, - "paragraph": { - "elements": [ - { - "endIndex": 9222, - "startIndex": 9173, - "textRun": { - "content": " Document() : _json = jsonDecode(documentJson);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9173 - }, - { - "endIndex": 9223, - "paragraph": { - "elements": [ - { - "endIndex": 9223, - "startIndex": 9222, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9222 - }, - { - "endIndex": 9300, - "paragraph": { - "elements": [ - { - "endIndex": 9300, - "startIndex": 9223, - "textRun": { - "content": " (String, {DateTime modified}) get metadata { // Add from here...\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9223 - }, - { - "endIndex": 9333, - "paragraph": { - "elements": [ - { - "endIndex": 9333, - "startIndex": 9300, - "textRun": { - "content": " const title = 'My Document';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9300 - }, - { - "endIndex": 9365, - "paragraph": { - "elements": [ - { - "endIndex": 9365, - "startIndex": 9333, - "textRun": { - "content": " final now = DateTime.now();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9333 - }, - { - "endIndex": 9366, - "paragraph": { - "elements": [ - { - "endIndex": 9366, - "startIndex": 9365, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9365 - }, - { - "endIndex": 9401, - "paragraph": { - "elements": [ - { - "endIndex": 9401, - "startIndex": 9366, - "textRun": { - "content": " return (title, modified: now);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9366 - }, - { - "endIndex": 9470, - "paragraph": { - "elements": [ - { - "endIndex": 9470, - "startIndex": 9401, - "textRun": { - "content": " } // to here.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9401 - }, - { - "endIndex": 9472, - "paragraph": { - "elements": [ - { - "endIndex": 9472, - "startIndex": 9470, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9470 - } - ], - "endIndex": 9472, - "startIndex": 9095, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 9474, - "paragraph": { - "elements": [ - { - "endIndex": 9474, - "startIndex": 9473, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9473 - }, - { - "endIndex": 9601, - "paragraph": { - "elements": [ - { - "endIndex": 9555, - "startIndex": 9474, - "textRun": { - "content": "The return type for this function is a record with two fields, one with the type ", - "textStyle": {} - } - }, - { - "endIndex": 9561, - "startIndex": 9555, - "textRun": { - "content": "String", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9591, - "startIndex": 9561, - "textRun": { - "content": ", and the other with the type ", - "textStyle": {} - } - }, - { - "endIndex": 9599, - "startIndex": 9591, - "textRun": { - "content": "DateTime", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9601, - "startIndex": 9599, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9474 - }, - { - "endIndex": 9602, - "paragraph": { - "elements": [ - { - "endIndex": 9602, - "startIndex": 9601, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9601 - }, - { - "endIndex": 9716, - "paragraph": { - "elements": [ - { - "endIndex": 9692, - "startIndex": 9602, - "textRun": { - "content": "The return statement constructs a new record by enclosing the two values in parenthesis, ", - "textStyle": {} - } - }, - { - "endIndex": 9714, - "startIndex": 9692, - "textRun": { - "content": "(title, modified: now)", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9716, - "startIndex": 9714, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9602 - }, - { - "endIndex": 9717, - "paragraph": { - "elements": [ - { - "endIndex": 9717, - "startIndex": 9716, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9716 - }, - { - "endIndex": 9800, - "paragraph": { - "elements": [ - { - "endIndex": 9790, - "startIndex": 9717, - "textRun": { - "content": "The first field is positional and unnamed, and the second field is named ", - "textStyle": {} - } - }, - { - "endIndex": 9798, - "startIndex": 9790, - "textRun": { - "content": "modified", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9800, - "startIndex": 9798, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9717 - }, - { - "endIndex": 9801, - "paragraph": { - "elements": [ - { - "endIndex": 9801, - "startIndex": 9800, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9800 - }, - { - "endIndex": 10161, - "startIndex": 9801, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 10160, - "startIndex": 9802, - "tableCells": [ - { - "content": [ - { - "endIndex": 9813, - "paragraph": { - "elements": [ - { - "endIndex": 9813, - "startIndex": 9804, - "textRun": { - "content": "Summary:\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9804 - }, - { - "endIndex": 9878, - "paragraph": { - "bullet": { - "listId": "kix.y57tybes7g6b", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 9878, - "startIndex": 9813, - "textRun": { - "content": "Records are comma-delimited field lists enclosed in parentheses.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9813 - }, - { - "endIndex": 9963, - "paragraph": { - "bullet": { - "listId": "kix.y57tybes7g6b", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 9963, - "startIndex": 9878, - "textRun": { - "content": "Record fields can each have a different type, so records can collect multiple types.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9878 - }, - { - "endIndex": 10052, - "paragraph": { - "bullet": { - "listId": "kix.y57tybes7g6b", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 10052, - "startIndex": 9963, - "textRun": { - "content": "Records can contain both named and positional fields, like argument lists in a function.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9963 - }, - { - "endIndex": 10160, - "paragraph": { - "bullet": { - "listId": "kix.y57tybes7g6b", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 10160, - "startIndex": 10052, - "textRun": { - "content": "Records can be returned from a function, so they enable you to return multiple values from a function call.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10052 - } - ], - "endIndex": 10160, - "startIndex": 9803, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 10182, - "paragraph": { - "elements": [ - { - "endIndex": 10182, - "startIndex": 10161, - "textRun": { - "content": "Access record fields\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.m7t4gd6sit79", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 10161 - }, - { - "endIndex": 10319, - "paragraph": { - "bullet": { - "listId": "kix.cnamwo3k2086", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 10189, - "startIndex": 10182, - "textRun": { - "content": "In the ", - "textStyle": {} - } - }, - { - "endIndex": 10203, - "startIndex": 10189, - "textRun": { - "content": "DocumentScreen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10221, - "startIndex": 10203, - "textRun": { - "content": " widget, call the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 10229, - "startIndex": 10221, - "textRun": { - "content": "metadata", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10244, - "startIndex": 10229, - "textRun": { - "content": " getter method ", - "textStyle": {} - } - }, - { - "endIndex": 10251, - "startIndex": 10244, - "textRun": { - "content": "in the ", - "textStyle": {} - } - }, - { - "endIndex": 10256, - "startIndex": 10251, - "textRun": { - "content": "build", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10319, - "startIndex": 10256, - "textRun": { - "content": " method so that you can get your record and access its values:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10182 - }, - { - "endIndex": 10333, - "paragraph": { - "elements": [ - { - "endIndex": 10332, - "startIndex": 10319, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_05/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 10333, - "startIndex": 10332, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6k8szvspvapq", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 10319 - }, - { - "endIndex": 10968, - "startIndex": 10333, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 10967, - "startIndex": 10334, - "tableCells": [ - { - "content": [ - { - "endIndex": 10383, - "paragraph": { - "elements": [ - { - "endIndex": 10383, - "startIndex": 10336, - "textRun": { - "content": "class DocumentScreen extends StatelessWidget {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10336 - }, - { - "endIndex": 10410, - "paragraph": { - "elements": [ - { - "endIndex": 10410, - "startIndex": 10383, - "textRun": { - "content": " final Document document;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10383 - }, - { - "endIndex": 10411, - "paragraph": { - "elements": [ - { - "endIndex": 10411, - "startIndex": 10410, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10410 - }, - { - "endIndex": 10436, - "paragraph": { - "elements": [ - { - "endIndex": 10436, - "startIndex": 10411, - "textRun": { - "content": " const DocumentScreen({\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10411 - }, - { - "endIndex": 10464, - "paragraph": { - "elements": [ - { - "endIndex": 10464, - "startIndex": 10436, - "textRun": { - "content": " required this.document,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10436 - }, - { - "endIndex": 10479, - "paragraph": { - "elements": [ - { - "endIndex": 10479, - "startIndex": 10464, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10464 - }, - { - "endIndex": 10485, - "paragraph": { - "elements": [ - { - "endIndex": 10485, - "startIndex": 10479, - "textRun": { - "content": " });\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10479 - }, - { - "endIndex": 10486, - "paragraph": { - "elements": [ - { - "endIndex": 10486, - "startIndex": 10485, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10485 - }, - { - "endIndex": 10498, - "paragraph": { - "elements": [ - { - "endIndex": 10498, - "startIndex": 10486, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10486 - }, - { - "endIndex": 10537, - "paragraph": { - "elements": [ - { - "endIndex": 10537, - "startIndex": 10498, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10498 - }, - { - "endIndex": 10614, - "paragraph": { - "elements": [ - { - "endIndex": 10614, - "startIndex": 10537, - "textRun": { - "content": " final metadataRecord = document.metadata; // Add this line.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10537 - }, - { - "endIndex": 10615, - "paragraph": { - "elements": [ - { - "endIndex": 10615, - "startIndex": 10614, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10614 - }, - { - "endIndex": 10636, - "paragraph": { - "elements": [ - { - "endIndex": 10636, - "startIndex": 10615, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10615 - }, - { - "endIndex": 10658, - "paragraph": { - "elements": [ - { - "endIndex": 10658, - "startIndex": 10636, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10636 - }, - { - "endIndex": 10738, - "paragraph": { - "elements": [ - { - "endIndex": 10738, - "startIndex": 10658, - "textRun": { - "content": " title: Text(metadataRecord.$1), // Modify this line,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10658 - }, - { - "endIndex": 10747, - "paragraph": { - "elements": [ - { - "endIndex": 10747, - "startIndex": 10738, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10738 - }, - { - "endIndex": 10767, - "paragraph": { - "elements": [ - { - "endIndex": 10767, - "startIndex": 10747, - "textRun": { - "content": " body: Column(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10747 - }, - { - "endIndex": 10787, - "paragraph": { - "elements": [ - { - "endIndex": 10787, - "startIndex": 10767, - "textRun": { - "content": " children: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10767 - }, - { - "endIndex": 10805, - "paragraph": { - "elements": [ - { - "endIndex": 10805, - "startIndex": 10787, - "textRun": { - "content": " Center(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10787 - }, - { - "endIndex": 10830, - "paragraph": { - "elements": [ - { - "endIndex": 10830, - "startIndex": 10805, - "textRun": { - "content": " child: Text(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10805 - }, - { - "endIndex": 10906, - "paragraph": { - "elements": [ - { - "endIndex": 10906, - "startIndex": 10830, - "textRun": { - "content": " 'Last modified ${metadataRecord.modified}', // And this one.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10830 - }, - { - "endIndex": 10921, - "paragraph": { - "elements": [ - { - "endIndex": 10921, - "startIndex": 10906, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10906 - }, - { - "endIndex": 10934, - "paragraph": { - "elements": [ - { - "endIndex": 10934, - "startIndex": 10921, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10921 - }, - { - "endIndex": 10945, - "paragraph": { - "elements": [ - { - "endIndex": 10945, - "startIndex": 10934, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10934 - }, - { - "endIndex": 10954, - "paragraph": { - "elements": [ - { - "endIndex": 10954, - "startIndex": 10945, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10945 - }, - { - "endIndex": 10961, - "paragraph": { - "elements": [ - { - "endIndex": 10961, - "startIndex": 10954, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10954 - }, - { - "endIndex": 10965, - "paragraph": { - "elements": [ - { - "endIndex": 10965, - "startIndex": 10961, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10961 - }, - { - "endIndex": 10967, - "paragraph": { - "elements": [ - { - "endIndex": 10967, - "startIndex": 10965, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10965 - } - ], - "endIndex": 10967, - "startIndex": 10335, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 10969, - "paragraph": { - "elements": [ - { - "endIndex": 10969, - "startIndex": 10968, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10968 - }, - { - "endIndex": 11188, - "paragraph": { - "elements": [ - { - "endIndex": 10973, - "startIndex": 10969, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 10981, - "startIndex": 10973, - "textRun": { - "content": "metadata", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11054, - "startIndex": 10981, - "textRun": { - "content": " getter method returns a record, which is assigned to the local variable ", - "textStyle": {} - } - }, - { - "endIndex": 11068, - "startIndex": 11054, - "textRun": { - "content": "metadataRecord", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11188, - "startIndex": 11068, - "textRun": { - "content": ". Records are a light and easy way to return multiple values from a single function call and assign them to a variable.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10969 - }, - { - "endIndex": 11189, - "paragraph": { - "elements": [ - { - "endIndex": 11189, - "startIndex": 11188, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11188 - }, - { - "endIndex": 11291, - "paragraph": { - "elements": [ - { - "endIndex": 11291, - "startIndex": 11189, - "textRun": { - "content": "To access the individual fields composed in that record, you can use records’ built-in getter syntax.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11189 - }, - { - "endIndex": 11426, - "paragraph": { - "bullet": { - "listId": "kix.ul9cgkeua5dp", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 11347, - "startIndex": 11291, - "textRun": { - "content": "To get a positional field (a field without a name, like ", - "textStyle": {} - } - }, - { - "endIndex": 11352, - "startIndex": 11347, - "textRun": { - "content": "title", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11370, - "startIndex": 11352, - "textRun": { - "content": "), use the getter ", - "textStyle": {} - } - }, - { - "endIndex": 11376, - "startIndex": 11370, - "textRun": { - "content": "$", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11426, - "startIndex": 11376, - "textRun": { - "content": " on the record. This returns only unnamed fields.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11291 - }, - { - "endIndex": 11549, - "paragraph": { - "bullet": { - "listId": "kix.ul9cgkeua5dp", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 11444, - "startIndex": 11426, - "textRun": { - "content": "Named fields like ", - "textStyle": {} - } - }, - { - "endIndex": 11452, - "startIndex": 11444, - "textRun": { - "content": "modified", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11524, - "startIndex": 11452, - "textRun": { - "content": " don’t have a positional getter, so you can use its name directly, like ", - "textStyle": {} - } - }, - { - "endIndex": 11547, - "startIndex": 11524, - "textRun": { - "content": "metadataRecord.modified", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11549, - "startIndex": 11547, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11426 - }, - { - "endIndex": 11550, - "paragraph": { - "elements": [ - { - "endIndex": 11550, - "startIndex": 11549, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11549 - }, - { - "endIndex": 11656, - "paragraph": { - "elements": [ - { - "endIndex": 11617, - "startIndex": 11550, - "textRun": { - "content": "To determine the name of a getter for a positional field, start at ", - "textStyle": {} - } - }, - { - "endIndex": 11619, - "startIndex": 11617, - "textRun": { - "content": "$1", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11641, - "startIndex": 11619, - "textRun": { - "content": " and skip named fields", - "textStyle": {} - } - }, - { - "endIndex": 11656, - "startIndex": 11641, - "textRun": { - "content": ". For example:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11550 - }, - { - "endIndex": 11657, - "paragraph": { - "elements": [ - { - "endIndex": 11657, - "startIndex": 11656, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11656 - }, - { - "endIndex": 11831, - "startIndex": 11657, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 11830, - "startIndex": 11658, - "tableCells": [ - { - "content": [ - { - "endIndex": 11710, - "paragraph": { - "elements": [ - { - "endIndex": 11710, - "startIndex": 11660, - "textRun": { - "content": "var record = (named: 'v', 'y', named2: 'x', 'z');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11660 - }, - { - "endIndex": 11770, - "paragraph": { - "elements": [ - { - "endIndex": 11770, - "startIndex": 11710, - "textRun": { - "content": "print(record.$1); // prints y\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11710 - }, - { - "endIndex": 11830, - "paragraph": { - "elements": [ - { - "endIndex": 11829, - "startIndex": 11770, - "textRun": { - "content": "print(record.$2); // prints z", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11830, - "startIndex": 11829, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11770 - } - ], - "endIndex": 11830, - "startIndex": 11659, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 11832, - "paragraph": { - "elements": [ - { - "endIndex": 11832, - "startIndex": 11831, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11831 - }, - { - "endIndex": 11952, - "paragraph": { - "bullet": { - "listId": "kix.cnamwo3k2086", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 11952, - "startIndex": 11832, - "textRun": { - "content": "Hot reload to see the JSON values displayed in the app. The VS Code Dart plugin hot-reloads every time you save a file.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11832 - }, - { - "endIndex": 11953, - "paragraph": { - "elements": [ - { - "endIndex": 11953, - "startIndex": 11952, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11952 - }, - { - "endIndex": 11955, - "paragraph": { - "elements": [ - { - "endIndex": 11954, - "inlineObjectElement": { - "inlineObjectId": "kix.s1jfj82jdcu4", - "textStyle": { - "italic": true - } - }, - "startIndex": 11953 - }, - { - "endIndex": 11955, - "startIndex": 11954, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11953 - }, - { - "endIndex": 11956, - "paragraph": { - "elements": [ - { - "endIndex": 11956, - "startIndex": 11955, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11955 - }, - { - "endIndex": 12017, - "paragraph": { - "elements": [ - { - "endIndex": 12017, - "startIndex": 11956, - "textRun": { - "content": "You can see that each field did, in fact, maintain its type.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11956 - }, - { - "endIndex": 12073, - "paragraph": { - "bullet": { - "listId": "kix.43xuk7egr0s7", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 12021, - "startIndex": 12017, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 12027, - "startIndex": 12021, - "textRun": { - "content": "Text()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12073, - "startIndex": 12027, - "textRun": { - "content": " method takes a String as its first argument.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12017 - }, - { - "endIndex": 12166, - "paragraph": { - "bullet": { - "listId": "kix.43xuk7egr0s7", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 12077, - "startIndex": 12073, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 12085, - "startIndex": 12077, - "textRun": { - "content": "modified", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12131, - "startIndex": 12085, - "textRun": { - "content": " field is a DateTime, and is converted into a ", - "textStyle": {} - } - }, - { - "endIndex": 12137, - "startIndex": 12131, - "textRun": { - "content": "String", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12144, - "startIndex": 12137, - "textRun": { - "content": " using ", - "textStyle": {} - } - }, - { - "endIndex": 12164, - "startIndex": 12144, - "textRun": { - "content": "string interpolation", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://dart.dev/language/built-in-types#strings" - }, - "underline": true - } - } - }, - { - "endIndex": 12166, - "startIndex": 12164, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12073 - }, - { - "endIndex": 12167, - "paragraph": { - "elements": [ - { - "endIndex": 12167, - "startIndex": 12166, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12166 - }, - { - "endIndex": 12271, - "paragraph": { - "elements": [ - { - "endIndex": 12270, - "startIndex": 12167, - "textRun": { - "content": "The other type-safe way to return different types of data is to define a class, which is more verbose. ", - "textStyle": {} - } - }, - { - "endIndex": 12271, - "startIndex": 12270, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12167 - }, - { - "endIndex": 12307, - "paragraph": { - "elements": [ - { - "endIndex": 12299, - "startIndex": 12271, - "textRun": { - "content": "Match and destructure with p", - "textStyle": {} - } - }, - { - "endIndex": 12307, - "startIndex": 12299, - "textRun": { - "content": "atterns\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.568j9pkqmod0", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 12271 - }, - { - "endIndex": 12322, - "paragraph": { - "elements": [ - { - "endIndex": 12321, - "startIndex": 12307, - "textRun": { - "content": "Duration: 2:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 12322, - "startIndex": 12321, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12307 - }, - { - "endIndex": 12323, - "paragraph": { - "elements": [ - { - "endIndex": 12323, - "startIndex": 12322, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12322 - }, - { - "endIndex": 12445, - "paragraph": { - "elements": [ - { - "endIndex": 12435, - "startIndex": 12323, - "textRun": { - "content": "Records can efficiently collect different types of data and easily pass it around. Now, improve your code using ", - "textStyle": {} - } - }, - { - "endIndex": 12443, - "startIndex": 12435, - "textRun": { - "content": "patterns", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 12445, - "startIndex": 12443, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12323 - }, - { - "endIndex": 12446, - "paragraph": { - "elements": [ - { - "endIndex": 12446, - "startIndex": 12445, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12445 - }, - { - "endIndex": 12599, - "paragraph": { - "elements": [ - { - "endIndex": 12591, - "startIndex": 12446, - "textRun": { - "content": "A pattern represents a structure that one or more values can take, like a blueprint. Patterns compare against actual values to determine if they ", - "textStyle": {} - } - }, - { - "endIndex": 12596, - "startIndex": 12591, - "textRun": { - "content": "match", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 12599, - "startIndex": 12596, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12446 - }, - { - "endIndex": 12600, - "paragraph": { - "elements": [ - { - "endIndex": 12600, - "startIndex": 12599, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12599 - }, - { - "endIndex": 12813, - "paragraph": { - "elements": [ - { - "endIndex": 12632, - "startIndex": 12600, - "textRun": { - "content": "Some patterns, when they match, ", - "textStyle": {} - } - }, - { - "endIndex": 12643, - "startIndex": 12632, - "textRun": { - "content": "destructure", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 12813, - "startIndex": 12643, - "textRun": { - "content": " the matched value by pulling data out of it. Destructuring lets you unpack values from an object to assign them to local variables, or perform further matching on them.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12600 - }, - { - "endIndex": 12855, - "paragraph": { - "elements": [ - { - "endIndex": 12854, - "startIndex": 12813, - "textRun": { - "content": "Destructure a record into local variables", - "textStyle": {} - } - }, - { - "endIndex": 12855, - "startIndex": 12854, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.gpl49c2b0ub", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 12813 - }, - { - "endIndex": 12856, - "paragraph": { - "elements": [ - { - "endIndex": 12856, - "startIndex": 12855, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12855 - }, - { - "endIndex": 12974, - "paragraph": { - "bullet": { - "listId": "kix.oh906fh7glv8", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 12869, - "startIndex": 12856, - "textRun": { - "content": "Refactor the ", - "textStyle": {} - } - }, - { - "endIndex": 12874, - "startIndex": 12869, - "textRun": { - "content": "build", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12885, - "startIndex": 12874, - "textRun": { - "content": " method of ", - "textStyle": {} - } - }, - { - "endIndex": 12899, - "startIndex": 12885, - "textRun": { - "content": "DocumentScreen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12908, - "startIndex": 12899, - "textRun": { - "content": " to call ", - "textStyle": {} - } - }, - { - "endIndex": 12916, - "startIndex": 12908, - "textRun": { - "content": "metadata", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12944, - "startIndex": 12916, - "textRun": { - "content": " and use it to initialize a ", - "textStyle": {} - } - }, - { - "endIndex": 12972, - "startIndex": 12944, - "textRun": { - "content": "pattern variable declaration", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 12974, - "startIndex": 12972, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12856 - }, - { - "endIndex": 12988, - "paragraph": { - "elements": [ - { - "endIndex": 12987, - "startIndex": 12974, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_06_a/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 12988, - "startIndex": 12987, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.z05ke9eh3pmu", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 12974 - }, - { - "endIndex": 13603, - "startIndex": 12988, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 13602, - "startIndex": 12989, - "tableCells": [ - { - "content": [ - { - "endIndex": 13038, - "paragraph": { - "elements": [ - { - "endIndex": 13038, - "startIndex": 12991, - "textRun": { - "content": "class DocumentScreen extends StatelessWidget {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12991 - }, - { - "endIndex": 13065, - "paragraph": { - "elements": [ - { - "endIndex": 13065, - "startIndex": 13038, - "textRun": { - "content": " final Document document;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13038 - }, - { - "endIndex": 13066, - "paragraph": { - "elements": [ - { - "endIndex": 13066, - "startIndex": 13065, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13065 - }, - { - "endIndex": 13091, - "paragraph": { - "elements": [ - { - "endIndex": 13091, - "startIndex": 13066, - "textRun": { - "content": " const DocumentScreen({\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13066 - }, - { - "endIndex": 13119, - "paragraph": { - "elements": [ - { - "endIndex": 13119, - "startIndex": 13091, - "textRun": { - "content": " required this.document,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13091 - }, - { - "endIndex": 13134, - "paragraph": { - "elements": [ - { - "endIndex": 13134, - "startIndex": 13119, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13119 - }, - { - "endIndex": 13140, - "paragraph": { - "elements": [ - { - "endIndex": 13140, - "startIndex": 13134, - "textRun": { - "content": " });\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13134 - }, - { - "endIndex": 13141, - "paragraph": { - "elements": [ - { - "endIndex": 13141, - "startIndex": 13140, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13140 - }, - { - "endIndex": 13153, - "paragraph": { - "elements": [ - { - "endIndex": 13153, - "startIndex": 13141, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13141 - }, - { - "endIndex": 13192, - "paragraph": { - "elements": [ - { - "endIndex": 13192, - "startIndex": 13153, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13153 - }, - { - "endIndex": 13263, - "paragraph": { - "elements": [ - { - "endIndex": 13263, - "startIndex": 13192, - "textRun": { - "content": " final (title, modified: modified) = document.metadata; // Modify\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13192 - }, - { - "endIndex": 13264, - "paragraph": { - "elements": [ - { - "endIndex": 13264, - "startIndex": 13263, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13263 - }, - { - "endIndex": 13285, - "paragraph": { - "elements": [ - { - "endIndex": 13285, - "startIndex": 13264, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13264 - }, - { - "endIndex": 13307, - "paragraph": { - "elements": [ - { - "endIndex": 13307, - "startIndex": 13285, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13285 - }, - { - "endIndex": 13378, - "paragraph": { - "elements": [ - { - "endIndex": 13378, - "startIndex": 13307, - "textRun": { - "content": " title: Text(title), // Modify\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13307 - }, - { - "endIndex": 13387, - "paragraph": { - "elements": [ - { - "endIndex": 13387, - "startIndex": 13378, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13378 - }, - { - "endIndex": 13407, - "paragraph": { - "elements": [ - { - "endIndex": 13407, - "startIndex": 13387, - "textRun": { - "content": " body: Column(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13387 - }, - { - "endIndex": 13427, - "paragraph": { - "elements": [ - { - "endIndex": 13427, - "startIndex": 13407, - "textRun": { - "content": " children: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13407 - }, - { - "endIndex": 13445, - "paragraph": { - "elements": [ - { - "endIndex": 13445, - "startIndex": 13427, - "textRun": { - "content": " Center(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13427 - }, - { - "endIndex": 13470, - "paragraph": { - "elements": [ - { - "endIndex": 13470, - "startIndex": 13445, - "textRun": { - "content": " child: Text(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13445 - }, - { - "endIndex": 13541, - "paragraph": { - "elements": [ - { - "endIndex": 13541, - "startIndex": 13470, - "textRun": { - "content": " 'Last modified $modified', // Modify\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13470 - }, - { - "endIndex": 13556, - "paragraph": { - "elements": [ - { - "endIndex": 13556, - "startIndex": 13541, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13541 - }, - { - "endIndex": 13569, - "paragraph": { - "elements": [ - { - "endIndex": 13569, - "startIndex": 13556, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13556 - }, - { - "endIndex": 13580, - "paragraph": { - "elements": [ - { - "endIndex": 13580, - "startIndex": 13569, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13569 - }, - { - "endIndex": 13589, - "paragraph": { - "elements": [ - { - "endIndex": 13589, - "startIndex": 13580, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13580 - }, - { - "endIndex": 13596, - "paragraph": { - "elements": [ - { - "endIndex": 13596, - "startIndex": 13589, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13589 - }, - { - "endIndex": 13600, - "paragraph": { - "elements": [ - { - "endIndex": 13600, - "startIndex": 13596, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13596 - }, - { - "endIndex": 13602, - "paragraph": { - "elements": [ - { - "endIndex": 13602, - "startIndex": 13600, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13600 - } - ], - "endIndex": 13602, - "startIndex": 12990, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 13604, - "paragraph": { - "elements": [ - { - "endIndex": 13604, - "startIndex": 13603, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13603 - }, - { - "endIndex": 13748, - "paragraph": { - "elements": [ - { - "endIndex": 13622, - "startIndex": 13604, - "textRun": { - "content": "The record pattern", - "textStyle": {} - } - }, - { - "endIndex": 13623, - "startIndex": 13622, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 13631, - "startIndex": 13623, - "textRun": { - "content": "(title, ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13639, - "startIndex": 13631, - "textRun": { - "content": "modified", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13650, - "startIndex": 13639, - "textRun": { - "content": ": modified)", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13664, - "startIndex": 13650, - "textRun": { - "content": " contains two ", - "textStyle": {} - } - }, - { - "endIndex": 13681, - "startIndex": 13664, - "textRun": { - "content": "variable patterns", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 13686, - "startIndex": 13681, - "textRun": { - "content": " that", - "textStyle": {} - } - }, - { - "endIndex": 13738, - "startIndex": 13686, - "textRun": { - "content": " match against the fields of the record returned by ", - "textStyle": {} - } - }, - { - "endIndex": 13746, - "startIndex": 13738, - "textRun": { - "content": "metadata", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13748, - "startIndex": 13746, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13604 - }, - { - "endIndex": 13866, - "paragraph": { - "bullet": { - "listId": "kix.mqctj3bturgq", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 13856, - "startIndex": 13748, - "textRun": { - "content": "The expression matches the subpattern because the result is a record with two fields, one of which is named ", - "textStyle": {} - } - }, - { - "endIndex": 13864, - "startIndex": 13856, - "textRun": { - "content": "modified", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13866, - "startIndex": 13864, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13748 - }, - { - "endIndex": 14074, - "paragraph": { - "bullet": { - "listId": "kix.mqctj3bturgq", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 14038, - "startIndex": 13866, - "textRun": { - "content": "Because they match, the variable declaration pattern destructures the expression, accessing its values and binding them to new local variables of the same types and names, ", - "textStyle": {} - } - }, - { - "endIndex": 14050, - "startIndex": 14038, - "textRun": { - "content": "String title", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14055, - "startIndex": 14050, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 14072, - "startIndex": 14055, - "textRun": { - "content": "DateTime modified", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14073, - "startIndex": 14072, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 14074, - "startIndex": 14073, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13866 - }, - { - "endIndex": 14075, - "paragraph": { - "elements": [ - { - "endIndex": 14075, - "startIndex": 14074, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14074 - }, - { - "endIndex": 14226, - "paragraph": { - "elements": [ - { - "endIndex": 14183, - "startIndex": 14075, - "textRun": { - "content": "There is a shorthand for when the name of a field and the variable populating it are the same. Refactor the ", - "textStyle": {} - } - }, - { - "endIndex": 14188, - "startIndex": 14183, - "textRun": { - "content": "build", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14199, - "startIndex": 14188, - "textRun": { - "content": " method of ", - "textStyle": {} - } - }, - { - "endIndex": 14213, - "startIndex": 14199, - "textRun": { - "content": "DocumentScreen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14226, - "startIndex": 14213, - "textRun": { - "content": " as follows.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14075 - }, - { - "endIndex": 14227, - "paragraph": { - "elements": [ - { - "endIndex": 14227, - "startIndex": 14226, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14226 - }, - { - "endIndex": 14241, - "paragraph": { - "elements": [ - { - "endIndex": 14240, - "startIndex": 14227, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_06_b/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 14241, - "startIndex": 14240, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.utlztqy2hktb", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 14227 - }, - { - "endIndex": 14783, - "startIndex": 14241, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 14782, - "startIndex": 14242, - "tableCells": [ - { - "content": [ - { - "endIndex": 14291, - "paragraph": { - "elements": [ - { - "endIndex": 14291, - "startIndex": 14244, - "textRun": { - "content": "class DocumentScreen extends StatelessWidget {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14244 - }, - { - "endIndex": 14318, - "paragraph": { - "elements": [ - { - "endIndex": 14318, - "startIndex": 14291, - "textRun": { - "content": " final Document document;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14291 - }, - { - "endIndex": 14319, - "paragraph": { - "elements": [ - { - "endIndex": 14319, - "startIndex": 14318, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14318 - }, - { - "endIndex": 14344, - "paragraph": { - "elements": [ - { - "endIndex": 14344, - "startIndex": 14319, - "textRun": { - "content": " const DocumentScreen({\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14319 - }, - { - "endIndex": 14372, - "paragraph": { - "elements": [ - { - "endIndex": 14372, - "startIndex": 14344, - "textRun": { - "content": " required this.document,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14344 - }, - { - "endIndex": 14387, - "paragraph": { - "elements": [ - { - "endIndex": 14387, - "startIndex": 14372, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14372 - }, - { - "endIndex": 14393, - "paragraph": { - "elements": [ - { - "endIndex": 14393, - "startIndex": 14387, - "textRun": { - "content": " });\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14387 - }, - { - "endIndex": 14394, - "paragraph": { - "elements": [ - { - "endIndex": 14394, - "startIndex": 14393, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14393 - }, - { - "endIndex": 14406, - "paragraph": { - "elements": [ - { - "endIndex": 14406, - "startIndex": 14394, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14394 - }, - { - "endIndex": 14445, - "paragraph": { - "elements": [ - { - "endIndex": 14445, - "startIndex": 14406, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14406 - }, - { - "endIndex": 14516, - "paragraph": { - "elements": [ - { - "endIndex": 14516, - "startIndex": 14445, - "textRun": { - "content": " final (title, :modified) = document.metadata; // Modify\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14445 - }, - { - "endIndex": 14517, - "paragraph": { - "elements": [ - { - "endIndex": 14517, - "startIndex": 14516, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14516 - }, - { - "endIndex": 14538, - "paragraph": { - "elements": [ - { - "endIndex": 14538, - "startIndex": 14517, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14517 - }, - { - "endIndex": 14560, - "paragraph": { - "elements": [ - { - "endIndex": 14560, - "startIndex": 14538, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14538 - }, - { - "endIndex": 14588, - "paragraph": { - "elements": [ - { - "endIndex": 14588, - "startIndex": 14560, - "textRun": { - "content": " title: Text(title),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14560 - }, - { - "endIndex": 14597, - "paragraph": { - "elements": [ - { - "endIndex": 14597, - "startIndex": 14588, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14588 - }, - { - "endIndex": 14617, - "paragraph": { - "elements": [ - { - "endIndex": 14617, - "startIndex": 14597, - "textRun": { - "content": " body: Column(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14597 - }, - { - "endIndex": 14637, - "paragraph": { - "elements": [ - { - "endIndex": 14637, - "startIndex": 14617, - "textRun": { - "content": " children: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14617 - }, - { - "endIndex": 14655, - "paragraph": { - "elements": [ - { - "endIndex": 14655, - "startIndex": 14637, - "textRun": { - "content": " Center(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14637 - }, - { - "endIndex": 14680, - "paragraph": { - "elements": [ - { - "endIndex": 14680, - "startIndex": 14655, - "textRun": { - "content": " child: Text(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14655 - }, - { - "endIndex": 14721, - "paragraph": { - "elements": [ - { - "endIndex": 14721, - "startIndex": 14680, - "textRun": { - "content": " 'Last modified $modified',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14680 - }, - { - "endIndex": 14736, - "paragraph": { - "elements": [ - { - "endIndex": 14736, - "startIndex": 14721, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14721 - }, - { - "endIndex": 14749, - "paragraph": { - "elements": [ - { - "endIndex": 14749, - "startIndex": 14736, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14736 - }, - { - "endIndex": 14760, - "paragraph": { - "elements": [ - { - "endIndex": 14760, - "startIndex": 14749, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14749 - }, - { - "endIndex": 14769, - "paragraph": { - "elements": [ - { - "endIndex": 14769, - "startIndex": 14760, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14760 - }, - { - "endIndex": 14776, - "paragraph": { - "elements": [ - { - "endIndex": 14776, - "startIndex": 14769, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14769 - }, - { - "endIndex": 14780, - "paragraph": { - "elements": [ - { - "endIndex": 14780, - "startIndex": 14776, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14776 - }, - { - "endIndex": 14782, - "paragraph": { - "elements": [ - { - "endIndex": 14782, - "startIndex": 14780, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14780 - } - ], - "endIndex": 14782, - "startIndex": 14243, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 14784, - "paragraph": { - "elements": [ - { - "endIndex": 14784, - "startIndex": 14783, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14783 - }, - { - "endIndex": 14785, - "paragraph": { - "elements": [ - { - "endIndex": 14785, - "startIndex": 14784, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14784 - }, - { - "endIndex": 14968, - "paragraph": { - "elements": [ - { - "endIndex": 14820, - "startIndex": 14785, - "textRun": { - "content": "The syntax of the variable pattern ", - "textStyle": {} - } - }, - { - "endIndex": 14829, - "startIndex": 14820, - "textRun": { - "content": ":modified", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14847, - "startIndex": 14829, - "textRun": { - "content": " is shorthand for ", - "textStyle": {} - } - }, - { - "endIndex": 14865, - "startIndex": 14847, - "textRun": { - "content": "modified: modified", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14935, - "startIndex": 14865, - "textRun": { - "content": ". If you want a new local variable of a different name, you can write ", - "textStyle": {} - } - }, - { - "endIndex": 14958, - "startIndex": 14935, - "textRun": { - "content": "modified: localModified", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14966, - "startIndex": 14958, - "textRun": { - "content": " instead", - "textStyle": {} - } - }, - { - "endIndex": 14968, - "startIndex": 14966, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14785 - }, - { - "endIndex": 14969, - "paragraph": { - "elements": [ - { - "endIndex": 14969, - "startIndex": 14968, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14968 - }, - { - "endIndex": 15100, - "paragraph": { - "bullet": { - "listId": "kix.oh906fh7glv8", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 15100, - "startIndex": 14969, - "textRun": { - "content": "Hot reload to see the same result as in the previous step. The behavior is exactly the same; you just made your code more concise.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14969 - }, - { - "endIndex": 15129, - "paragraph": { - "elements": [ - { - "endIndex": 15129, - "startIndex": 15100, - "textRun": { - "content": "Use patterns to extract data\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.pycw5b4t4lns", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 15100 - }, - { - "endIndex": 15144, - "paragraph": { - "elements": [ - { - "endIndex": 15143, - "startIndex": 15129, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 15144, - "startIndex": 15143, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15129 - }, - { - "endIndex": 15145, - "paragraph": { - "elements": [ - { - "endIndex": 15145, - "startIndex": 15144, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15144 - }, - { - "endIndex": 15345, - "paragraph": { - "elements": [ - { - "endIndex": 15228, - "startIndex": 15145, - "textRun": { - "content": "In certain contexts, patterns don’t only match and destructure but can also make a ", - "textStyle": {} - } - }, - { - "endIndex": 15236, - "startIndex": 15228, - "textRun": { - "content": "decision", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 15243, - "startIndex": 15236, - "textRun": { - "content": " about ", - "textStyle": {} - } - }, - { - "endIndex": 15261, - "startIndex": 15243, - "textRun": { - "content": "what the code does", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 15324, - "startIndex": 15261, - "textRun": { - "content": ", based on whether or not the pattern matches. These are called", - "textStyle": {} - } - }, - { - "endIndex": 15343, - "startIndex": 15324, - "textRun": { - "content": " refutable patterns", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 15345, - "startIndex": 15343, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15145 - }, - { - "endIndex": 15346, - "paragraph": { - "elements": [ - { - "endIndex": 15346, - "startIndex": 15345, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15345 - }, - { - "endIndex": 15632, - "paragraph": { - "elements": [ - { - "endIndex": 15347, - "startIndex": 15346, - "textRun": { - "content": "T", - "textStyle": {} - } - }, - { - "endIndex": 15410, - "startIndex": 15347, - "textRun": { - "content": "he variable declaration pattern you used in the last step is an", - "textStyle": {} - } - }, - { - "endIndex": 15411, - "startIndex": 15410, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 15430, - "startIndex": 15411, - "textRun": { - "content": "irrefutable pattern", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 15632, - "startIndex": 15430, - "textRun": { - "content": ": the value must match the pattern or it’s an error and destructuring won’t happen. Think of any variable declaration or assignment; you can’t assign a value to a variable if they’re not the same type.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15346 - }, - { - "endIndex": 15633, - "paragraph": { - "elements": [ - { - "endIndex": 15633, - "startIndex": 15632, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15632 - }, - { - "endIndex": 15707, - "paragraph": { - "elements": [ - { - "endIndex": 15707, - "startIndex": 15633, - "textRun": { - "content": "Refutable patterns, on the other hand, are used in control flow contexts:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15633 - }, - { - "endIndex": 15774, - "paragraph": { - "bullet": { - "listId": "kix.d8meck8mgbh6", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 15712, - "startIndex": 15707, - "textRun": { - "content": "They ", - "textStyle": {} - } - }, - { - "endIndex": 15718, - "startIndex": 15712, - "textRun": { - "content": "expect", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 15774, - "startIndex": 15718, - "textRun": { - "content": " that some values they compare against will not match. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15707 - }, - { - "endIndex": 15864, - "paragraph": { - "bullet": { - "listId": "kix.d8meck8mgbh6", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 15792, - "startIndex": 15774, - "textRun": { - "content": "They are meant to ", - "textStyle": {} - } - }, - { - "endIndex": 15818, - "startIndex": 15792, - "textRun": { - "content": "influence the control flow", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 15864, - "startIndex": 15818, - "textRun": { - "content": ", based on whether or not the value matches. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15774 - }, - { - "endIndex": 15968, - "paragraph": { - "bullet": { - "listId": "kix.d8meck8mgbh6", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 15869, - "startIndex": 15864, - "textRun": { - "content": "They ", - "textStyle": {} - } - }, - { - "endIndex": 15894, - "startIndex": 15869, - "textRun": { - "content": "don’t interrupt execution", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 15968, - "startIndex": 15894, - "textRun": { - "content": " with an error if they don’t match, they just move to the next statement.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15864 - }, - { - "endIndex": 16045, - "paragraph": { - "bullet": { - "listId": "kix.d8meck8mgbh6", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 16017, - "startIndex": 15968, - "textRun": { - "content": "They can destructure and bind variables that are ", - "textStyle": {} - } - }, - { - "endIndex": 16028, - "startIndex": 16017, - "textRun": { - "content": "only usable", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 16045, - "startIndex": 16028, - "textRun": { - "content": " when they match\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15968 - }, - { - "endIndex": 16046, - "paragraph": { - "elements": [ - { - "endIndex": 16046, - "startIndex": 16045, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16045 - }, - { - "endIndex": 16080, - "paragraph": { - "elements": [ - { - "endIndex": 16080, - "startIndex": 16046, - "textRun": { - "content": "Read JSON values without patterns\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.yf61kg5owa9m", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 16046 - }, - { - "endIndex": 16190, - "paragraph": { - "elements": [ - { - "endIndex": 16190, - "startIndex": 16080, - "textRun": { - "content": "In this section, you read data without pattern matching to see how patterns can help you work with JSON data.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16080 - }, - { - "endIndex": 16191, - "paragraph": { - "elements": [ - { - "endIndex": 16191, - "startIndex": 16190, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16190 - }, - { - "endIndex": 16344, - "paragraph": { - "bullet": { - "listId": "kix.2s25y2v84mq6", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 16223, - "startIndex": 16191, - "textRun": { - "content": "Replace the previous version of ", - "textStyle": {} - } - }, - { - "endIndex": 16231, - "startIndex": 16223, - "textRun": { - "content": "metadata", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16268, - "startIndex": 16231, - "textRun": { - "content": " with one that reads values from the ", - "textStyle": {} - } - }, - { - "endIndex": 16273, - "startIndex": 16268, - "textRun": { - "content": "_json", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16310, - "startIndex": 16273, - "textRun": { - "content": " map. Copy and paste this version of ", - "textStyle": {} - } - }, - { - "endIndex": 16318, - "startIndex": 16310, - "textRun": { - "content": "metadata", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16328, - "startIndex": 16318, - "textRun": { - "content": " into the ", - "textStyle": {} - } - }, - { - "endIndex": 16336, - "startIndex": 16328, - "textRun": { - "content": "Document", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16344, - "startIndex": 16336, - "textRun": { - "content": " class:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16191 - }, - { - "endIndex": 16358, - "paragraph": { - "elements": [ - { - "endIndex": 16357, - "startIndex": 16344, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_07_a/lib/data.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 16358, - "startIndex": 16357, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.xtpw6x4ct4ba", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 16344 - }, - { - "endIndex": 16966, - "startIndex": 16358, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16965, - "startIndex": 16359, - "tableCells": [ - { - "content": [ - { - "endIndex": 16378, - "paragraph": { - "elements": [ - { - "endIndex": 16378, - "startIndex": 16361, - "textRun": { - "content": "class Document {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16361 - }, - { - "endIndex": 16414, - "paragraph": { - "elements": [ - { - "endIndex": 16414, - "startIndex": 16378, - "textRun": { - "content": " final Map _json;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16378 - }, - { - "endIndex": 16463, - "paragraph": { - "elements": [ - { - "endIndex": 16463, - "startIndex": 16414, - "textRun": { - "content": " Document() : _json = jsonDecode(documentJson);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16414 - }, - { - "endIndex": 16464, - "paragraph": { - "elements": [ - { - "endIndex": 16464, - "startIndex": 16463, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16463 - }, - { - "endIndex": 16511, - "paragraph": { - "elements": [ - { - "endIndex": 16511, - "startIndex": 16464, - "textRun": { - "content": " (String, {DateTime modified}) get metadata {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16464 - }, - { - "endIndex": 16595, - "paragraph": { - "elements": [ - { - "endIndex": 16595, - "startIndex": 16511, - "textRun": { - "content": " if (_json.containsKey('metadata')) { // Modify from here...\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16511 - }, - { - "endIndex": 16641, - "paragraph": { - "elements": [ - { - "endIndex": 16641, - "startIndex": 16595, - "textRun": { - "content": " final metadataJson = _json['metadata'];\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16595 - }, - { - "endIndex": 16674, - "paragraph": { - "elements": [ - { - "endIndex": 16674, - "startIndex": 16641, - "textRun": { - "content": " if (metadataJson is Map) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16641 - }, - { - "endIndex": 16729, - "paragraph": { - "elements": [ - { - "endIndex": 16729, - "startIndex": 16674, - "textRun": { - "content": " final title = metadataJson['title'] as String;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16674 - }, - { - "endIndex": 16759, - "paragraph": { - "elements": [ - { - "endIndex": 16759, - "startIndex": 16729, - "textRun": { - "content": " final localModified =\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16729 - }, - { - "endIndex": 16823, - "paragraph": { - "elements": [ - { - "endIndex": 16823, - "startIndex": 16759, - "textRun": { - "content": " DateTime.parse(metadataJson['modified'] as String);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16759 - }, - { - "endIndex": 16872, - "paragraph": { - "elements": [ - { - "endIndex": 16872, - "startIndex": 16823, - "textRun": { - "content": " return (title, modified: localModified);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16823 - }, - { - "endIndex": 16880, - "paragraph": { - "elements": [ - { - "endIndex": 16880, - "startIndex": 16872, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16872 - }, - { - "endIndex": 16886, - "paragraph": { - "elements": [ - { - "endIndex": 16886, - "startIndex": 16880, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16880 - }, - { - "endIndex": 16959, - "paragraph": { - "elements": [ - { - "endIndex": 16959, - "startIndex": 16886, - "textRun": { - "content": " throw const FormatException('Unexpected JSON'); // to here.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16886 - }, - { - "endIndex": 16963, - "paragraph": { - "elements": [ - { - "endIndex": 16963, - "startIndex": 16959, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16959 - }, - { - "endIndex": 16965, - "paragraph": { - "elements": [ - { - "endIndex": 16965, - "startIndex": 16963, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16963 - } - ], - "endIndex": 16965, - "startIndex": 16360, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16967, - "paragraph": { - "elements": [ - { - "endIndex": 16967, - "startIndex": 16966, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16966 - }, - { - "endIndex": 17192, - "paragraph": { - "elements": [ - { - "endIndex": 17192, - "startIndex": 16967, - "textRun": { - "content": "This code validates that the data is structured correctly without using patterns. In a later step, you use pattern matching to perform the same validation using less code. It performs three checks before doing anything else:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16967 - }, - { - "endIndex": 17276, - "paragraph": { - "bullet": { - "listId": "kix.fxg6r2ea28qw", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 17219, - "startIndex": 17192, - "textRun": { - "content": "The JSON contains the data ", - "textStyle": {} - } - }, - { - "endIndex": 17228, - "startIndex": 17219, - "textRun": { - "content": "structure", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 17241, - "startIndex": 17228, - "textRun": { - "content": " you expect:\u000b", - "textStyle": {} - } - }, - { - "endIndex": 17275, - "startIndex": 17241, - "textRun": { - "content": "if (_json.containsKey('metadata'))", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17276, - "startIndex": 17275, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17192 - }, - { - "endIndex": 17335, - "paragraph": { - "bullet": { - "listId": "kix.fxg6r2ea28qw", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 17279, - "startIndex": 17276, - "textRun": { - "content": "The", - "textStyle": {} - } - }, - { - "endIndex": 17293, - "startIndex": 17279, - "textRun": { - "content": " data has the ", - "textStyle": {} - } - }, - { - "endIndex": 17297, - "startIndex": 17293, - "textRun": { - "content": "type", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 17310, - "startIndex": 17297, - "textRun": { - "content": " you expect:\u000b", - "textStyle": {} - } - }, - { - "endIndex": 17335, - "startIndex": 17310, - "textRun": { - "content": "if (metadataJson is Map)\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17276 - }, - { - "endIndex": 17415, - "paragraph": { - "bullet": { - "listId": "kix.fxg6r2ea28qw", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - } - } - }, - "elements": [ - { - "endIndex": 17352, - "startIndex": 17335, - "textRun": { - "content": "That the data is ", - "textStyle": {} - } - }, - { - "endIndex": 17360, - "startIndex": 17352, - "textRun": { - "content": "not null", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 17414, - "startIndex": 17360, - "textRun": { - "content": ", which is implicitly confirmed in the previous check.", - "textStyle": {} - } - }, - { - "endIndex": 17415, - "startIndex": 17414, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17335 - }, - { - "endIndex": 17452, - "paragraph": { - "elements": [ - { - "endIndex": 17452, - "startIndex": 17415, - "textRun": { - "content": "Read JSON values using a map pattern\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6jvsgpwu5vaj", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 17415 - }, - { - "endIndex": 17555, - "paragraph": { - "elements": [ - { - "endIndex": 17542, - "startIndex": 17452, - "textRun": { - "content": "With a refutable pattern, you can verify that the JSON has the expected structure using a ", - "textStyle": {} - } - }, - { - "endIndex": 17553, - "startIndex": 17542, - "textRun": { - "content": "map pattern", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 17555, - "startIndex": 17553, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17452 - }, - { - "endIndex": 17556, - "paragraph": { - "elements": [ - { - "endIndex": 17556, - "startIndex": 17555, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17555 - }, - { - "endIndex": 17613, - "paragraph": { - "bullet": { - "listId": "kix.7zli105oii42", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 17588, - "startIndex": 17556, - "textRun": { - "content": "Replace the previous version of ", - "textStyle": {} - } - }, - { - "endIndex": 17596, - "startIndex": 17588, - "textRun": { - "content": "metadata", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17613, - "startIndex": 17596, - "textRun": { - "content": " with this code:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17556 - }, - { - "endIndex": 17627, - "paragraph": { - "elements": [ - { - "endIndex": 17626, - "startIndex": 17613, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_07_b/lib/data.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 17627, - "startIndex": 17626, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.up9oxn6751gl", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 17613 - }, - { - "endIndex": 18217, - "startIndex": 17627, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 18216, - "startIndex": 17628, - "tableCells": [ - { - "content": [ - { - "endIndex": 17647, - "paragraph": { - "elements": [ - { - "endIndex": 17647, - "startIndex": 17630, - "textRun": { - "content": "class Document {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17630 - }, - { - "endIndex": 17683, - "paragraph": { - "elements": [ - { - "endIndex": 17683, - "startIndex": 17647, - "textRun": { - "content": " final Map _json;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17647 - }, - { - "endIndex": 17732, - "paragraph": { - "elements": [ - { - "endIndex": 17732, - "startIndex": 17683, - "textRun": { - "content": " Document() : _json = jsonDecode(documentJson);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17683 - }, - { - "endIndex": 17733, - "paragraph": { - "elements": [ - { - "endIndex": 17733, - "startIndex": 17732, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17732 - }, - { - "endIndex": 17780, - "paragraph": { - "elements": [ - { - "endIndex": 17780, - "startIndex": 17733, - "textRun": { - "content": " (String, {DateTime modified}) get metadata {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17733 - }, - { - "endIndex": 17862, - "paragraph": { - "elements": [ - { - "endIndex": 17862, - "startIndex": 17780, - "textRun": { - "content": " if (_json // Modify from here…\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17780 - }, - { - "endIndex": 17877, - "paragraph": { - "elements": [ - { - "endIndex": 17877, - "startIndex": 17862, - "textRun": { - "content": " case {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17862 - }, - { - "endIndex": 17901, - "paragraph": { - "elements": [ - { - "endIndex": 17901, - "startIndex": 17877, - "textRun": { - "content": " 'metadata': {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17877 - }, - { - "endIndex": 17936, - "paragraph": { - "elements": [ - { - "endIndex": 17936, - "startIndex": 17901, - "textRun": { - "content": " 'title': String title,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17901 - }, - { - "endIndex": 17982, - "paragraph": { - "elements": [ - { - "endIndex": 17982, - "startIndex": 17936, - "textRun": { - "content": " 'modified': String localModified,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17936 - }, - { - "endIndex": 17994, - "paragraph": { - "elements": [ - { - "endIndex": 17994, - "startIndex": 17982, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17982 - }, - { - "endIndex": 18007, - "paragraph": { - "elements": [ - { - "endIndex": 18007, - "startIndex": 17994, - "textRun": { - "content": " }) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17994 - }, - { - "endIndex": 18070, - "paragraph": { - "elements": [ - { - "endIndex": 18070, - "startIndex": 18007, - "textRun": { - "content": " return (title, modified: DateTime.parse(localModified));\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18007 - }, - { - "endIndex": 18083, - "paragraph": { - "elements": [ - { - "endIndex": 18083, - "startIndex": 18070, - "textRun": { - "content": " } else {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18070 - }, - { - "endIndex": 18137, - "paragraph": { - "elements": [ - { - "endIndex": 18137, - "startIndex": 18083, - "textRun": { - "content": " throw const FormatException('Unexpected JSON');\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18083 - }, - { - "endIndex": 18210, - "paragraph": { - "elements": [ - { - "endIndex": 18210, - "startIndex": 18137, - "textRun": { - "content": " } // to here.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18137 - }, - { - "endIndex": 18214, - "paragraph": { - "elements": [ - { - "endIndex": 18214, - "startIndex": 18210, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18210 - }, - { - "endIndex": 18216, - "paragraph": { - "elements": [ - { - "endIndex": 18216, - "startIndex": 18214, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18214 - } - ], - "endIndex": 18216, - "startIndex": 17629, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 18218, - "paragraph": { - "elements": [ - { - "endIndex": 18218, - "startIndex": 18217, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18217 - }, - { - "endIndex": 18520, - "paragraph": { - "elements": [ - { - "endIndex": 18287, - "startIndex": 18218, - "textRun": { - "content": "Here, you see a new kind of if-statement (introduced in Dart 3), the ", - "textStyle": {} - } - }, - { - "endIndex": 18294, - "startIndex": 18287, - "textRun": { - "content": "if-case", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 18296, - "startIndex": 18294, - "textRun": { - "content": ". ", - "textStyle": {} - } - }, - { - "endIndex": 18364, - "startIndex": 18296, - "textRun": { - "content": "The case body only executes if the case pattern matches the data in ", - "textStyle": {} - } - }, - { - "endIndex": 18369, - "startIndex": 18364, - "textRun": { - "content": "_json", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18445, - "startIndex": 18369, - "textRun": { - "content": ". This match accomplishes the same checks you wrote in the first version of ", - "textStyle": {} - } - }, - { - "endIndex": 18453, - "startIndex": 18445, - "textRun": { - "content": "metadata", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18520, - "startIndex": 18453, - "textRun": { - "content": " to validate the incoming JSON. This code validates the following:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18218 - }, - { - "endIndex": 18541, - "paragraph": { - "bullet": { - "listId": "kix.w3xdpsln97hm", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 18525, - "startIndex": 18520, - "textRun": { - "content": "_json", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18541, - "startIndex": 18525, - "textRun": { - "content": " is a Map type.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18520 - }, - { - "endIndex": 18572, - "paragraph": { - "bullet": { - "listId": "kix.w3xdpsln97hm", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 18546, - "startIndex": 18541, - "textRun": { - "content": "_json", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18558, - "startIndex": 18546, - "textRun": { - "content": " contains a ", - "textStyle": {} - } - }, - { - "endIndex": 18566, - "startIndex": 18558, - "textRun": { - "content": "metadata", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18571, - "startIndex": 18566, - "textRun": { - "content": " key.", - "textStyle": {} - } - }, - { - "endIndex": 18572, - "startIndex": 18571, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18541 - }, - { - "endIndex": 18591, - "paragraph": { - "bullet": { - "listId": "kix.w3xdpsln97hm", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 18577, - "startIndex": 18572, - "textRun": { - "content": "_json", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18591, - "startIndex": 18577, - "textRun": { - "content": " is not null.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18572 - }, - { - "endIndex": 18629, - "paragraph": { - "bullet": { - "listId": "kix.w3xdpsln97hm", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 18608, - "startIndex": 18591, - "textRun": { - "content": "_json['metadata']", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18629, - "startIndex": 18608, - "textRun": { - "content": " is also a Map type.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18591 - }, - { - "endIndex": 18685, - "paragraph": { - "bullet": { - "listId": "kix.w3xdpsln97hm", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 18646, - "startIndex": 18629, - "textRun": { - "content": "_json['metadata']", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18665, - "startIndex": 18646, - "textRun": { - "content": " contains the keys ", - "textStyle": {} - } - }, - { - "endIndex": 18670, - "startIndex": 18665, - "textRun": { - "content": "title", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18675, - "startIndex": 18670, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 18683, - "startIndex": 18675, - "textRun": { - "content": "modified", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18685, - "startIndex": 18683, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18629 - }, - { - "endIndex": 18738, - "paragraph": { - "bullet": { - "listId": "kix.w3xdpsln97hm", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 18690, - "startIndex": 18685, - "textRun": { - "content": "title", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18695, - "startIndex": 18690, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 18708, - "startIndex": 18695, - "textRun": { - "content": "localModified", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18737, - "startIndex": 18708, - "textRun": { - "content": " are strings and aren't null.", - "textStyle": {} - } - }, - { - "endIndex": 18738, - "startIndex": 18737, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18685 - }, - { - "endIndex": 18739, - "paragraph": { - "elements": [ - { - "endIndex": 18739, - "startIndex": 18738, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18738 - }, - { - "endIndex": 18990, - "paragraph": { - "elements": [ - { - "endIndex": 18771, - "startIndex": 18739, - "textRun": { - "content": "If the value doesn’t match, the ", - "textStyle": {} - } - }, - { - "endIndex": 18786, - "startIndex": 18771, - "textRun": { - "content": "pattern refutes", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 18839, - "startIndex": 18786, - "textRun": { - "content": " (refuses to continue execution) and proceeds to the ", - "textStyle": {} - } - }, - { - "endIndex": 18843, - "startIndex": 18839, - "textRun": { - "content": "else", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18919, - "startIndex": 18843, - "textRun": { - "content": " clause. If the match is successful, the pattern destructures the values of ", - "textStyle": {} - } - }, - { - "endIndex": 18924, - "startIndex": 18919, - "textRun": { - "content": "title", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18929, - "startIndex": 18924, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 18937, - "startIndex": 18929, - "textRun": { - "content": "modified", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18990, - "startIndex": 18937, - "textRun": { - "content": " from the map and binds them to new local variables.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18739 - }, - { - "endIndex": 18991, - "paragraph": { - "elements": [ - { - "endIndex": 18991, - "startIndex": 18990, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18990 - }, - { - "endIndex": 19088, - "paragraph": { - "elements": [ - { - "endIndex": 19028, - "startIndex": 18991, - "textRun": { - "content": "For a full list of patterns, see the ", - "textStyle": {} - } - }, - { - "endIndex": 19057, - "startIndex": 19028, - "textRun": { - "content": "table in the Patterns section", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/dart-lang/language/blob/master/accepted/future-releases/0546-patterns/feature-specification.md#patterns" - }, - "underline": true - } - } - }, - { - "endIndex": 19088, - "startIndex": 19057, - "textRun": { - "content": " of the feature specification.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18991 - }, - { - "endIndex": 19089, - "paragraph": { - "elements": [ - { - "endIndex": 19089, - "startIndex": 19088, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19088 - }, - { - "endIndex": 19200, - "startIndex": 19089, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 19199, - "startIndex": 19090, - "tableCells": [ - { - "content": [ - { - "endIndex": 19199, - "paragraph": { - "elements": [ - { - "endIndex": 19101, - "startIndex": 19092, - "textRun": { - "content": "Summary: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19102, - "startIndex": 19101, - "textRun": { - "content": "U", - "textStyle": {} - } - }, - { - "endIndex": 19199, - "startIndex": 19102, - "textRun": { - "content": "sing patterns in this step tests types, destructures, and binds values using a single statement.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19092 - } - ], - "endIndex": 19199, - "startIndex": 19091, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 19234, - "paragraph": { - "elements": [ - { - "endIndex": 19234, - "startIndex": 19200, - "textRun": { - "content": "Prepare the app for more patterns\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hkoplv4js2dj", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 19200 - }, - { - "endIndex": 19249, - "paragraph": { - "elements": [ - { - "endIndex": 19248, - "startIndex": 19234, - "textRun": { - "content": "Duration: 2:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19249, - "startIndex": 19248, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19234 - }, - { - "endIndex": 19250, - "paragraph": { - "elements": [ - { - "endIndex": 19250, - "startIndex": 19249, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19249 - }, - { - "endIndex": 19438, - "paragraph": { - "elements": [ - { - "endIndex": 19274, - "startIndex": 19250, - "textRun": { - "content": "So far, you address the ", - "textStyle": {} - } - }, - { - "endIndex": 19282, - "startIndex": 19274, - "textRun": { - "content": "metadata", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19397, - "startIndex": 19282, - "textRun": { - "content": " part of the JSON data. In this step, you refine your business logic a bit more in order to handle the data in the ", - "textStyle": {} - } - }, - { - "endIndex": 19403, - "startIndex": 19397, - "textRun": { - "content": "blocks", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19408, - "startIndex": 19403, - "textRun": { - "content": " list", - "textStyle": {} - } - }, - { - "endIndex": 19438, - "startIndex": 19408, - "textRun": { - "content": " and render it into your app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19250 - }, - { - "endIndex": 19440, - "paragraph": { - "elements": [ - { - "endIndex": 19440, - "startIndex": 19438, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19438 - }, - { - "endIndex": 19568, - "startIndex": 19440, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 19567, - "startIndex": 19441, - "tableCells": [ - { - "content": [ - { - "endIndex": 19445, - "paragraph": { - "elements": [ - { - "endIndex": 19445, - "startIndex": 19443, - "textRun": { - "content": "{\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19443 - }, - { - "endIndex": 19461, - "paragraph": { - "elements": [ - { - "endIndex": 19461, - "startIndex": 19445, - "textRun": { - "content": " \"metadata\": {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19445 - }, - { - "endIndex": 19472, - "paragraph": { - "elements": [ - { - "endIndex": 19472, - "startIndex": 19461, - "textRun": { - "content": " // ...\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19461 - }, - { - "endIndex": 19477, - "paragraph": { - "elements": [ - { - "endIndex": 19477, - "startIndex": 19472, - "textRun": { - "content": " },\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19472 - }, - { - "endIndex": 19491, - "paragraph": { - "elements": [ - { - "endIndex": 19491, - "startIndex": 19477, - "textRun": { - "content": " \"blocks\": [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19477 - }, - { - "endIndex": 19497, - "paragraph": { - "elements": [ - { - "endIndex": 19497, - "startIndex": 19491, - "textRun": { - "content": " {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19491 - }, - { - "endIndex": 19517, - "paragraph": { - "elements": [ - { - "endIndex": 19517, - "startIndex": 19497, - "textRun": { - "content": " \"type\": \"h1\",\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19497 - }, - { - "endIndex": 19543, - "paragraph": { - "elements": [ - { - "endIndex": 19543, - "startIndex": 19517, - "textRun": { - "content": " \"text\": \"Chapter 1\"\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19517 - }, - { - "endIndex": 19550, - "paragraph": { - "elements": [ - { - "endIndex": 19550, - "startIndex": 19543, - "textRun": { - "content": " },\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19543 - }, - { - "endIndex": 19561, - "paragraph": { - "elements": [ - { - "endIndex": 19561, - "startIndex": 19550, - "textRun": { - "content": " // ...\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19550 - }, - { - "endIndex": 19565, - "paragraph": { - "elements": [ - { - "endIndex": 19565, - "startIndex": 19561, - "textRun": { - "content": " ]\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19561 - }, - { - "endIndex": 19567, - "paragraph": { - "elements": [ - { - "endIndex": 19567, - "startIndex": 19565, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19565 - } - ], - "endIndex": 19567, - "startIndex": 19442, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 19569, - "paragraph": { - "elements": [ - { - "endIndex": 19569, - "startIndex": 19568, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19568 - }, - { - "endIndex": 19601, - "paragraph": { - "elements": [ - { - "endIndex": 19600, - "startIndex": 19569, - "textRun": { - "content": "Create a class that stores data", - "textStyle": {} - } - }, - { - "endIndex": 19601, - "startIndex": 19600, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.e2lkdi57402r", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 19569 - }, - { - "endIndex": 19720, - "paragraph": { - "bullet": { - "listId": "kix.ugzokp4cwudf", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 19618, - "startIndex": 19601, - "textRun": { - "content": "Add a new class, ", - "textStyle": {} - } - }, - { - "endIndex": 19623, - "startIndex": 19618, - "textRun": { - "content": "Block", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19628, - "startIndex": 19623, - "textRun": { - "content": ", to ", - "textStyle": {} - } - }, - { - "endIndex": 19637, - "startIndex": 19628, - "textRun": { - "content": "data.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19719, - "startIndex": 19637, - "textRun": { - "content": ", which is used to read and store the data for one of the blocks in the JSON data.", - "textStyle": {} - } - }, - { - "endIndex": 19720, - "startIndex": 19719, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19601 - }, - { - "endIndex": 19734, - "paragraph": { - "elements": [ - { - "endIndex": 19733, - "startIndex": 19720, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_08/lib/data.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 19734, - "startIndex": 19733, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ge9la6aiy6ve", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 19720 - }, - { - "endIndex": 20060, - "startIndex": 19734, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 20059, - "startIndex": 19735, - "tableCells": [ - { - "content": [ - { - "endIndex": 19751, - "paragraph": { - "elements": [ - { - "endIndex": 19751, - "startIndex": 19737, - "textRun": { - "content": "class Block {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19737 - }, - { - "endIndex": 19772, - "paragraph": { - "elements": [ - { - "endIndex": 19772, - "startIndex": 19751, - "textRun": { - "content": " final String type;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19751 - }, - { - "endIndex": 19793, - "paragraph": { - "elements": [ - { - "endIndex": 19793, - "startIndex": 19772, - "textRun": { - "content": " final String text;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19772 - }, - { - "endIndex": 19824, - "paragraph": { - "elements": [ - { - "endIndex": 19824, - "startIndex": 19793, - "textRun": { - "content": " Block(this.type, this.text);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19793 - }, - { - "endIndex": 19825, - "paragraph": { - "elements": [ - { - "endIndex": 19825, - "startIndex": 19824, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19824 - }, - { - "endIndex": 19879, - "paragraph": { - "elements": [ - { - "endIndex": 19879, - "startIndex": 19825, - "textRun": { - "content": " factory Block.fromJson(Map json) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19825 - }, - { - "endIndex": 19941, - "paragraph": { - "elements": [ - { - "endIndex": 19941, - "startIndex": 19879, - "textRun": { - "content": " if (json case {'type': final type, 'text': final text}) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19879 - }, - { - "endIndex": 19973, - "paragraph": { - "elements": [ - { - "endIndex": 19973, - "startIndex": 19941, - "textRun": { - "content": " return Block(type, text);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19941 - }, - { - "endIndex": 19986, - "paragraph": { - "elements": [ - { - "endIndex": 19986, - "startIndex": 19973, - "textRun": { - "content": " } else {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19973 - }, - { - "endIndex": 20047, - "paragraph": { - "elements": [ - { - "endIndex": 20047, - "startIndex": 19986, - "textRun": { - "content": " throw const FormatException('Unexpected JSON format');\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19986 - }, - { - "endIndex": 20053, - "paragraph": { - "elements": [ - { - "endIndex": 20053, - "startIndex": 20047, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20047 - }, - { - "endIndex": 20057, - "paragraph": { - "elements": [ - { - "endIndex": 20057, - "startIndex": 20053, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20053 - }, - { - "endIndex": 20059, - "paragraph": { - "elements": [ - { - "endIndex": 20059, - "startIndex": 20057, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20057 - } - ], - "endIndex": 20059, - "startIndex": 19736, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 20061, - "paragraph": { - "elements": [ - { - "endIndex": 20061, - "startIndex": 20060, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20060 - }, - { - "endIndex": 20163, - "paragraph": { - "elements": [ - { - "endIndex": 20085, - "startIndex": 20061, - "textRun": { - "content": "The factory constructor ", - "textStyle": {} - } - }, - { - "endIndex": 20095, - "startIndex": 20085, - "textRun": { - "content": "fromJson()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20163, - "startIndex": 20095, - "textRun": { - "content": " uses the same if-case with a map pattern that you’ve seen before. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20061 - }, - { - "endIndex": 20164, - "paragraph": { - "elements": [ - { - "endIndex": 20164, - "startIndex": 20163, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20163 - }, - { - "endIndex": 20388, - "paragraph": { - "elements": [ - { - "endIndex": 20180, - "startIndex": 20164, - "textRun": { - "content": "Notice that the ", - "textStyle": {} - } - }, - { - "endIndex": 20184, - "startIndex": 20180, - "textRun": { - "content": "json", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20239, - "startIndex": 20184, - "textRun": { - "content": " matches the map pattern, even though one of the keys, ", - "textStyle": {} - } - }, - { - "endIndex": 20246, - "startIndex": 20239, - "textRun": { - "content": "checked", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20254, - "startIndex": 20246, - "textRun": { - "content": ", is not", - "textStyle": {} - } - }, - { - "endIndex": 20388, - "startIndex": 20254, - "textRun": { - "content": " accounted for in the pattern. Map patterns ignore any entries in the map object that aren’t explicitly accounted for in the pattern.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20164 - }, - { - "endIndex": 20419, - "paragraph": { - "elements": [ - { - "endIndex": 20418, - "startIndex": 20388, - "textRun": { - "content": "Return a list of Block objects", - "textStyle": {} - } - }, - { - "endIndex": 20419, - "startIndex": 20418, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.n19bd2b94m9o", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 20388 - }, - { - "endIndex": 20594, - "paragraph": { - "bullet": { - "listId": "kix.9k9nrzl80p49", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20426, - "startIndex": 20419, - "textRun": { - "content": "Next, a", - "textStyle": {} - } - }, - { - "endIndex": 20445, - "startIndex": 20426, - "textRun": { - "content": "dd a new function, ", - "textStyle": {} - } - }, - { - "endIndex": 20456, - "startIndex": 20445, - "textRun": { - "content": "getBlocks()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20457, - "startIndex": 20456, - "textRun": { - "content": ",", - "textStyle": {} - } - }, - { - "endIndex": 20458, - "startIndex": 20457, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 20465, - "startIndex": 20458, - "textRun": { - "content": "to the ", - "textStyle": {} - } - }, - { - "endIndex": 20473, - "startIndex": 20465, - "textRun": { - "content": "Document", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20481, - "startIndex": 20473, - "textRun": { - "content": " class. ", - "textStyle": {} - } - }, - { - "endIndex": 20492, - "startIndex": 20481, - "textRun": { - "content": "getBlocks()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20531, - "startIndex": 20492, - "textRun": { - "content": " parses the JSON into instances of the ", - "textStyle": {} - } - }, - { - "endIndex": 20536, - "startIndex": 20531, - "textRun": { - "content": "Block", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20544, - "startIndex": 20536, - "textRun": { - "content": " class a", - "textStyle": {} - } - }, - { - "endIndex": 20593, - "startIndex": 20544, - "textRun": { - "content": "nd returns a list of blocks to render in your UI:", - "textStyle": {} - } - }, - { - "endIndex": 20594, - "startIndex": 20593, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20419 - }, - { - "endIndex": 20608, - "paragraph": { - "elements": [ - { - "endIndex": 20607, - "startIndex": 20594, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_08/lib/data.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 20608, - "startIndex": 20607, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.jmifchr63cwh", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 20594 - }, - { - "endIndex": 21425, - "startIndex": 20608, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 21424, - "startIndex": 20609, - "tableCells": [ - { - "content": [ - { - "endIndex": 20628, - "paragraph": { - "elements": [ - { - "endIndex": 20628, - "startIndex": 20611, - "textRun": { - "content": "class Document {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20611 - }, - { - "endIndex": 20664, - "paragraph": { - "elements": [ - { - "endIndex": 20664, - "startIndex": 20628, - "textRun": { - "content": " final Map _json;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20628 - }, - { - "endIndex": 20713, - "paragraph": { - "elements": [ - { - "endIndex": 20713, - "startIndex": 20664, - "textRun": { - "content": " Document() : _json = jsonDecode(documentJson);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20664 - }, - { - "endIndex": 20714, - "paragraph": { - "elements": [ - { - "endIndex": 20714, - "startIndex": 20713, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20713 - }, - { - "endIndex": 20761, - "paragraph": { - "elements": [ - { - "endIndex": 20761, - "startIndex": 20714, - "textRun": { - "content": " (String, {DateTime modified}) get metadata {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20714 - }, - { - "endIndex": 20775, - "paragraph": { - "elements": [ - { - "endIndex": 20775, - "startIndex": 20761, - "textRun": { - "content": " if (_json\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20761 - }, - { - "endIndex": 20790, - "paragraph": { - "elements": [ - { - "endIndex": 20790, - "startIndex": 20775, - "textRun": { - "content": " case {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20775 - }, - { - "endIndex": 20814, - "paragraph": { - "elements": [ - { - "endIndex": 20814, - "startIndex": 20790, - "textRun": { - "content": " 'metadata': {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20790 - }, - { - "endIndex": 20849, - "paragraph": { - "elements": [ - { - "endIndex": 20849, - "startIndex": 20814, - "textRun": { - "content": " 'title': String title,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20814 - }, - { - "endIndex": 20895, - "paragraph": { - "elements": [ - { - "endIndex": 20895, - "startIndex": 20849, - "textRun": { - "content": " 'modified': String localModified,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20849 - }, - { - "endIndex": 20907, - "paragraph": { - "elements": [ - { - "endIndex": 20907, - "startIndex": 20895, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20895 - }, - { - "endIndex": 20920, - "paragraph": { - "elements": [ - { - "endIndex": 20920, - "startIndex": 20907, - "textRun": { - "content": " }) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20907 - }, - { - "endIndex": 20983, - "paragraph": { - "elements": [ - { - "endIndex": 20983, - "startIndex": 20920, - "textRun": { - "content": " return (title, modified: DateTime.parse(localModified));\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20920 - }, - { - "endIndex": 20996, - "paragraph": { - "elements": [ - { - "endIndex": 20996, - "startIndex": 20983, - "textRun": { - "content": " } else {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20983 - }, - { - "endIndex": 21050, - "paragraph": { - "elements": [ - { - "endIndex": 21050, - "startIndex": 20996, - "textRun": { - "content": " throw const FormatException('Unexpected JSON');\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20996 - }, - { - "endIndex": 21056, - "paragraph": { - "elements": [ - { - "endIndex": 21056, - "startIndex": 21050, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21050 - }, - { - "endIndex": 21060, - "paragraph": { - "elements": [ - { - "endIndex": 21060, - "startIndex": 21056, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21056 - }, - { - "endIndex": 21061, - "paragraph": { - "elements": [ - { - "endIndex": 21061, - "startIndex": 21060, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21060 - }, - { - "endIndex": 21141, - "paragraph": { - "elements": [ - { - "endIndex": 21141, - "startIndex": 21061, - "textRun": { - "content": " List getBlocks() { // Add from here… \n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21061 - }, - { - "endIndex": 21191, - "paragraph": { - "elements": [ - { - "endIndex": 21191, - "startIndex": 21141, - "textRun": { - "content": " if (_json case {'blocks': List blocksJson}) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21141 - }, - { - "endIndex": 21269, - "paragraph": { - "elements": [ - { - "endIndex": 21269, - "startIndex": 21191, - "textRun": { - "content": " return [for (final blockJson in blocksJson) Block.fromJson(blockJson)];\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21191 - }, - { - "endIndex": 21282, - "paragraph": { - "elements": [ - { - "endIndex": 21282, - "startIndex": 21269, - "textRun": { - "content": " } else {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21269 - }, - { - "endIndex": 21343, - "paragraph": { - "elements": [ - { - "endIndex": 21343, - "startIndex": 21282, - "textRun": { - "content": " throw const FormatException('Unexpected JSON format');\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21282 - }, - { - "endIndex": 21349, - "paragraph": { - "elements": [ - { - "endIndex": 21349, - "startIndex": 21343, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21343 - }, - { - "endIndex": 21422, - "paragraph": { - "elements": [ - { - "endIndex": 21422, - "startIndex": 21349, - "textRun": { - "content": " } // to here.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21349 - }, - { - "endIndex": 21424, - "paragraph": { - "elements": [ - { - "endIndex": 21424, - "startIndex": 21422, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21422 - } - ], - "endIndex": 21424, - "startIndex": 20610, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 21426, - "paragraph": { - "elements": [ - { - "endIndex": 21426, - "startIndex": 21425, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21425 - }, - { - "endIndex": 21715, - "paragraph": { - "elements": [ - { - "endIndex": 21430, - "startIndex": 21426, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 21441, - "startIndex": 21430, - "textRun": { - "content": "getBlocks()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21469, - "startIndex": 21441, - "textRun": { - "content": " function returns a list of ", - "textStyle": {} - } - }, - { - "endIndex": 21474, - "startIndex": 21469, - "textRun": { - "content": "Block", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21606, - "startIndex": 21474, - "textRun": { - "content": " objects, which you use later in order to build the UI. A familiar if-case statement performs validation and casts the value of the ", - "textStyle": {} - } - }, - { - "endIndex": 21612, - "startIndex": 21606, - "textRun": { - "content": "blocks", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21633, - "startIndex": 21612, - "textRun": { - "content": " metadata into a new ", - "textStyle": {} - } - }, - { - "endIndex": 21637, - "startIndex": 21633, - "textRun": { - "content": "List", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21644, - "startIndex": 21637, - "textRun": { - "content": " named ", - "textStyle": {} - } - }, - { - "endIndex": 21654, - "startIndex": 21644, - "textRun": { - "content": "blocksJson", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21689, - "startIndex": 21654, - "textRun": { - "content": " (without patterns, you’d need the ", - "textStyle": {} - } - }, - { - "endIndex": 21697, - "startIndex": 21689, - "textRun": { - "content": "toList()", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.dart.dev/stable/dart-core/Iterable/toList.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21714, - "startIndex": 21697, - "textRun": { - "content": " method to cast).", - "textStyle": {} - } - }, - { - "endIndex": 21715, - "startIndex": 21714, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21426 - }, - { - "endIndex": 21716, - "paragraph": { - "elements": [ - { - "endIndex": 21716, - "startIndex": 21715, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21715 - }, - { - "endIndex": 21809, - "paragraph": { - "elements": [ - { - "endIndex": 21744, - "startIndex": 21716, - "textRun": { - "content": "The list literal contains a ", - "textStyle": {} - } - }, - { - "endIndex": 21758, - "startIndex": 21744, - "textRun": { - "content": "collection for", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://dart.dev/language/collections#collection-operators" - }, - "underline": true - } - } - }, - { - "endIndex": 21794, - "startIndex": 21758, - "textRun": { - "content": " in order to fill the new list with ", - "textStyle": {} - } - }, - { - "endIndex": 21799, - "startIndex": 21794, - "textRun": { - "content": "Block", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21808, - "startIndex": 21799, - "textRun": { - "content": " objects.", - "textStyle": {} - } - }, - { - "endIndex": 21809, - "startIndex": 21808, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21716 - }, - { - "endIndex": 21810, - "paragraph": { - "elements": [ - { - "endIndex": 21810, - "startIndex": 21809, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21809 - }, - { - "endIndex": 21980, - "paragraph": { - "elements": [ - { - "endIndex": 21979, - "startIndex": 21810, - "textRun": { - "content": "This section doesn’t introduce any pattern-related features you haven’t already tried in this codelab. In the next step, you prepare to render the list items in your UI.", - "textStyle": {} - } - }, - { - "endIndex": 21980, - "startIndex": 21979, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21810 - }, - { - "endIndex": 22017, - "paragraph": { - "elements": [ - { - "endIndex": 22017, - "startIndex": 21980, - "textRun": { - "content": "Use patterns to display the document\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.i44naeu2u775", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 21980 - }, - { - "endIndex": 22032, - "paragraph": { - "elements": [ - { - "endIndex": 22032, - "startIndex": 22017, - "textRun": { - "content": "Duration: 4:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22017 - }, - { - "endIndex": 22316, - "paragraph": { - "elements": [ - { - "endIndex": 22039, - "startIndex": 22032, - "textRun": { - "content": "You now", - "textStyle": {} - } - }, - { - "endIndex": 22094, - "startIndex": 22039, - "textRun": { - "content": " successfully destructure and recompose your JSON data,", - "textStyle": {} - } - }, - { - "endIndex": 22316, - "startIndex": 22094, - "textRun": { - "content": " using an if-case statement and refutable patterns. But if-case is only one of the enhancements to control flow structures that come with patterns. Now, you apply your knowledge of refutable patterns to switch statements.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22032 - }, - { - "endIndex": 22378, - "paragraph": { - "elements": [ - { - "endIndex": 22377, - "startIndex": 22316, - "textRun": { - "content": "Control what’s rendered using patterns with switch statements", - "textStyle": {} - } - }, - { - "endIndex": 22378, - "startIndex": 22377, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.mrd1p7wmy500", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 22316 - }, - { - "endIndex": 22493, - "paragraph": { - "bullet": { - "listId": "kix.a3xmjtope7n9", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 22381, - "startIndex": 22378, - "textRun": { - "content": "In ", - "textStyle": {} - } - }, - { - "endIndex": 22390, - "startIndex": 22381, - "textRun": { - "content": "main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22413, - "startIndex": 22390, - "textRun": { - "content": ", create a new widget, ", - "textStyle": {} - } - }, - { - "endIndex": 22424, - "startIndex": 22413, - "textRun": { - "content": "BlockWidget", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22425, - "startIndex": 22424, - "textRun": { - "content": ",", - "textStyle": {} - } - }, - { - "endIndex": 22481, - "startIndex": 22425, - "textRun": { - "content": " that determines the styling of each block based on its ", - "textStyle": {} - } - }, - { - "endIndex": 22485, - "startIndex": 22481, - "textRun": { - "content": "type", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22492, - "startIndex": 22485, - "textRun": { - "content": " field.", - "textStyle": {} - } - }, - { - "endIndex": 22493, - "startIndex": 22492, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22378 - }, - { - "endIndex": 22507, - "paragraph": { - "elements": [ - { - "endIndex": 22506, - "startIndex": 22493, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_09/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 22507, - "startIndex": 22506, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.lfig9orpitjc", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 22493 - }, - { - "endIndex": 23147, - "startIndex": 22507, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 23146, - "startIndex": 22508, - "tableCells": [ - { - "content": [ - { - "endIndex": 22554, - "paragraph": { - "elements": [ - { - "endIndex": 22554, - "startIndex": 22510, - "textRun": { - "content": "class BlockWidget extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22510 - }, - { - "endIndex": 22575, - "paragraph": { - "elements": [ - { - "endIndex": 22575, - "startIndex": 22554, - "textRun": { - "content": " final Block block;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22554 - }, - { - "endIndex": 22576, - "paragraph": { - "elements": [ - { - "endIndex": 22576, - "startIndex": 22575, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22575 - }, - { - "endIndex": 22598, - "paragraph": { - "elements": [ - { - "endIndex": 22598, - "startIndex": 22576, - "textRun": { - "content": " const BlockWidget({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22576 - }, - { - "endIndex": 22623, - "paragraph": { - "elements": [ - { - "endIndex": 22623, - "startIndex": 22598, - "textRun": { - "content": " required this.block,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22598 - }, - { - "endIndex": 22638, - "paragraph": { - "elements": [ - { - "endIndex": 22638, - "startIndex": 22623, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22623 - }, - { - "endIndex": 22644, - "paragraph": { - "elements": [ - { - "endIndex": 22644, - "startIndex": 22638, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22638 - }, - { - "endIndex": 22645, - "paragraph": { - "elements": [ - { - "endIndex": 22645, - "startIndex": 22644, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22644 - }, - { - "endIndex": 22657, - "paragraph": { - "elements": [ - { - "endIndex": 22657, - "startIndex": 22645, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22645 - }, - { - "endIndex": 22696, - "paragraph": { - "elements": [ - { - "endIndex": 22696, - "startIndex": 22657, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22657 - }, - { - "endIndex": 22722, - "paragraph": { - "elements": [ - { - "endIndex": 22722, - "startIndex": 22696, - "textRun": { - "content": " TextStyle? textStyle;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22696 - }, - { - "endIndex": 22748, - "paragraph": { - "elements": [ - { - "endIndex": 22748, - "startIndex": 22722, - "textRun": { - "content": " switch (block.type) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22722 - }, - { - "endIndex": 22765, - "paragraph": { - "elements": [ - { - "endIndex": 22765, - "startIndex": 22748, - "textRun": { - "content": " case 'h1':\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22748 - }, - { - "endIndex": 22828, - "paragraph": { - "elements": [ - { - "endIndex": 22828, - "startIndex": 22765, - "textRun": { - "content": " textStyle = Theme.of(context).textTheme.displayMedium;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22765 - }, - { - "endIndex": 22858, - "paragraph": { - "elements": [ - { - "endIndex": 22858, - "startIndex": 22828, - "textRun": { - "content": " case 'p' || 'checkbox':\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22828 - }, - { - "endIndex": 22918, - "paragraph": { - "elements": [ - { - "endIndex": 22918, - "startIndex": 22858, - "textRun": { - "content": " textStyle = Theme.of(context).textTheme.bodyMedium;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22858 - }, - { - "endIndex": 22932, - "paragraph": { - "elements": [ - { - "endIndex": 22932, - "startIndex": 22918, - "textRun": { - "content": " case _:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22918 - }, - { - "endIndex": 22991, - "paragraph": { - "elements": [ - { - "endIndex": 22991, - "startIndex": 22932, - "textRun": { - "content": " textStyle = Theme.of(context).textTheme.bodySmall;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22932 - }, - { - "endIndex": 22997, - "paragraph": { - "elements": [ - { - "endIndex": 22997, - "startIndex": 22991, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22991 - }, - { - "endIndex": 22998, - "paragraph": { - "elements": [ - { - "endIndex": 22998, - "startIndex": 22997, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22997 - }, - { - "endIndex": 23020, - "paragraph": { - "elements": [ - { - "endIndex": 23020, - "startIndex": 22998, - "textRun": { - "content": " return Container(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22998 - }, - { - "endIndex": 23059, - "paragraph": { - "elements": [ - { - "endIndex": 23059, - "startIndex": 23020, - "textRun": { - "content": " margin: const EdgeInsets.all(8),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23020 - }, - { - "endIndex": 23078, - "paragraph": { - "elements": [ - { - "endIndex": 23078, - "startIndex": 23059, - "textRun": { - "content": " child: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23059 - }, - { - "endIndex": 23098, - "paragraph": { - "elements": [ - { - "endIndex": 23098, - "startIndex": 23078, - "textRun": { - "content": " block.text,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23078 - }, - { - "endIndex": 23124, - "paragraph": { - "elements": [ - { - "endIndex": 23124, - "startIndex": 23098, - "textRun": { - "content": " style: textStyle,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23098 - }, - { - "endIndex": 23133, - "paragraph": { - "elements": [ - { - "endIndex": 23133, - "startIndex": 23124, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23124 - }, - { - "endIndex": 23140, - "paragraph": { - "elements": [ - { - "endIndex": 23140, - "startIndex": 23133, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23133 - }, - { - "endIndex": 23144, - "paragraph": { - "elements": [ - { - "endIndex": 23144, - "startIndex": 23140, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23140 - }, - { - "endIndex": 23146, - "paragraph": { - "elements": [ - { - "endIndex": 23146, - "startIndex": 23144, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23144 - } - ], - "endIndex": 23146, - "startIndex": 22509, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 23148, - "paragraph": { - "elements": [ - { - "endIndex": 23148, - "startIndex": 23147, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23147 - }, - { - "endIndex": 23239, - "paragraph": { - "elements": [ - { - "endIndex": 23176, - "startIndex": 23148, - "textRun": { - "content": "The switch statement in the ", - "textStyle": {} - } - }, - { - "endIndex": 23181, - "startIndex": 23176, - "textRun": { - "content": "build", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23205, - "startIndex": 23181, - "textRun": { - "content": " method switches on the ", - "textStyle": {} - } - }, - { - "endIndex": 23209, - "startIndex": 23205, - "textRun": { - "content": "type", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23223, - "startIndex": 23209, - "textRun": { - "content": " field of the ", - "textStyle": {} - } - }, - { - "endIndex": 23228, - "startIndex": 23223, - "textRun": { - "content": "block", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23235, - "startIndex": 23228, - "textRun": { - "content": " object", - "textStyle": {} - } - }, - { - "endIndex": 23239, - "startIndex": 23235, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23148 - }, - { - "endIndex": 23240, - "paragraph": { - "elements": [ - { - "endIndex": 23240, - "startIndex": 23239, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23239 - }, - { - "endIndex": 23367, - "paragraph": { - "bullet": { - "listId": "kix.vjp0z582afkw", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 23272, - "startIndex": 23240, - "textRun": { - "content": "The first case statement uses a ", - "textStyle": {} - } - }, - { - "endIndex": 23295, - "startIndex": 23272, - "textRun": { - "content": "constant string pattern", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 23320, - "startIndex": 23295, - "textRun": { - "content": ". The pattern matches if ", - "textStyle": {} - } - }, - { - "endIndex": 23330, - "startIndex": 23320, - "textRun": { - "content": "block.type", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23362, - "startIndex": 23330, - "textRun": { - "content": " is equal to the constant value ", - "textStyle": {} - } - }, - { - "endIndex": 23364, - "startIndex": 23362, - "textRun": { - "content": "h1", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23367, - "startIndex": 23364, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23240 - }, - { - "endIndex": 23368, - "paragraph": { - "elements": [ - { - "endIndex": 23368, - "startIndex": 23367, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23367 - }, - { - "endIndex": 23559, - "paragraph": { - "bullet": { - "listId": "kix.vjp0z582afkw", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 23401, - "startIndex": 23368, - "textRun": { - "content": "The second case statement uses a ", - "textStyle": {} - } - }, - { - "endIndex": 23419, - "startIndex": 23401, - "textRun": { - "content": "logical-or pattern", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 23497, - "startIndex": 23419, - "textRun": { - "content": " with two constant string patterns as its subpatterns. The pattern matches if ", - "textStyle": {} - } - }, - { - "endIndex": 23507, - "startIndex": 23497, - "textRun": { - "content": "block.type", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23542, - "startIndex": 23507, - "textRun": { - "content": " matches either of the subpatterns ", - "textStyle": {} - } - }, - { - "endIndex": 23543, - "startIndex": 23542, - "textRun": { - "content": "p", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23547, - "startIndex": 23543, - "textRun": { - "content": " or ", - "textStyle": {} - } - }, - { - "endIndex": 23555, - "startIndex": 23547, - "textRun": { - "content": "checkbox", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23559, - "startIndex": 23555, - "textRun": { - "content": ". \u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23368 - }, - { - "endIndex": 23621, - "startIndex": 23559, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 23620, - "startIndex": 23560, - "tableCells": [ - { - "content": [ - { - "endIndex": 23620, - "paragraph": { - "elements": [ - { - "endIndex": 23576, - "startIndex": 23562, - "textRun": { - "content": "Did you know? ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 23596, - "startIndex": 23576, - "textRun": { - "content": "logical-and patterns", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 23598, - "startIndex": 23596, - "textRun": { - "content": " (", - "textStyle": {} - } - }, - { - "endIndex": 23600, - "startIndex": 23598, - "textRun": { - "content": "&&", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23619, - "startIndex": 23600, - "textRun": { - "content": ") can also be used.", - "textStyle": {} - } - }, - { - "endIndex": 23620, - "startIndex": 23619, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23562 - } - ], - "endIndex": 23620, - "startIndex": 23561, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 23622, - "paragraph": { - "elements": [ - { - "endIndex": 23622, - "startIndex": 23621, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23621 - }, - { - "endIndex": 23984, - "paragraph": { - "bullet": { - "listId": "kix.vjp0z582afkw", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 23642, - "startIndex": 23622, - "textRun": { - "content": "The final case is a ", - "textStyle": {} - } - }, - { - "endIndex": 23658, - "startIndex": 23642, - "textRun": { - "content": "wildcard pattern", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 23660, - "startIndex": 23658, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 23661, - "startIndex": 23660, - "textRun": { - "content": "_", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23736, - "startIndex": 23661, - "textRun": { - "content": ". Wildcards in switch cases match everything else. They behave the same as ", - "textStyle": {} - } - }, - { - "endIndex": 23743, - "startIndex": 23736, - "textRun": { - "content": "default", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23945, - "startIndex": 23743, - "textRun": { - "content": " clauses, which are still allowed in switch statements (they’re just a little more verbose).\u000b\u000bWildcard patterns can be used wherever a pattern is allowed—for example, in a variable declaration pattern:\u000b", - "textStyle": {} - } - }, - { - "endIndex": 23982, - "startIndex": 23945, - "textRun": { - "content": " var (title, _) = document.metadata;", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.23137255, - "green": 0.23137255, - "red": 0.23137255 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23983, - "startIndex": 23982, - "textRun": { - "content": "\u000b", - "textStyle": {} - } - }, - { - "endIndex": 23984, - "startIndex": 23983, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23622 - }, - { - "endIndex": 24071, - "paragraph": { - "elements": [ - { - "endIndex": 24071, - "startIndex": 23984, - "textRun": { - "content": "In this context, the wildcard doesn’t bind any variable. It discards the second field.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23984 - }, - { - "endIndex": 24072, - "paragraph": { - "elements": [ - { - "endIndex": 24072, - "startIndex": 24071, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24071 - }, - { - "endIndex": 24073, - "paragraph": { - "elements": [ - { - "endIndex": 24073, - "startIndex": 24072, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24072 - }, - { - "endIndex": 24227, - "startIndex": 24073, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 24226, - "startIndex": 24074, - "tableCells": [ - { - "content": [ - { - "endIndex": 24226, - "paragraph": { - "elements": [ - { - "endIndex": 24081, - "startIndex": 24076, - "textRun": { - "content": "Note:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 24082, - "startIndex": 24081, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 24118, - "startIndex": 24082, - "textRun": { - "content": "Switch statements no longer require ", - "textStyle": {} - } - }, - { - "endIndex": 24123, - "startIndex": 24118, - "textRun": { - "content": "break", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24226, - "startIndex": 24123, - "textRun": { - "content": " as of Dart 3. Non-empty cases jump to the end of the statement when they reach the end of their body.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24076 - } - ], - "endIndex": 24226, - "startIndex": 24075, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 24228, - "paragraph": { - "elements": [ - { - "endIndex": 24228, - "startIndex": 24227, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24227 - }, - { - "endIndex": 24322, - "paragraph": { - "elements": [ - { - "endIndex": 24292, - "startIndex": 24228, - "textRun": { - "content": "In the next section, you learn about more switch features after ", - "textStyle": {} - } - }, - { - "endIndex": 24306, - "startIndex": 24292, - "textRun": { - "content": "displaying the", - "textStyle": {} - } - }, - { - "endIndex": 24307, - "startIndex": 24306, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 24312, - "startIndex": 24307, - "textRun": { - "content": "Block", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24321, - "startIndex": 24312, - "textRun": { - "content": " objects.", - "textStyle": {} - } - }, - { - "endIndex": 24322, - "startIndex": 24321, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24228 - }, - { - "endIndex": 24351, - "paragraph": { - "elements": [ - { - "endIndex": 24350, - "startIndex": 24322, - "textRun": { - "content": "Display the document content", - "textStyle": {} - } - }, - { - "endIndex": 24351, - "startIndex": 24350, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.m3ty4akt3v4k", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 24322 - }, - { - "endIndex": 24483, - "paragraph": { - "elements": [ - { - "endIndex": 24401, - "startIndex": 24351, - "textRun": { - "content": "Create a local variable that contains the list of ", - "textStyle": {} - } - }, - { - "endIndex": 24406, - "startIndex": 24401, - "textRun": { - "content": "Block", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24426, - "startIndex": 24406, - "textRun": { - "content": " objects by calling ", - "textStyle": {} - } - }, - { - "endIndex": 24437, - "startIndex": 24426, - "textRun": { - "content": "getBlocks()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24445, - "startIndex": 24437, - "textRun": { - "content": " in the ", - "textStyle": {} - } - }, - { - "endIndex": 24459, - "startIndex": 24445, - "textRun": { - "content": "DocumentScreen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24469, - "startIndex": 24459, - "textRun": { - "content": " widget's ", - "textStyle": {} - } - }, - { - "endIndex": 24474, - "startIndex": 24469, - "textRun": { - "content": "build", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24483, - "startIndex": 24474, - "textRun": { - "content": " method.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24351 - }, - { - "endIndex": 24484, - "paragraph": { - "elements": [ - { - "endIndex": 24484, - "startIndex": 24483, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24483 - }, - { - "endIndex": 24560, - "paragraph": { - "bullet": { - "listId": "kix.e3w5dzmwqs7s", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 24505, - "startIndex": 24484, - "textRun": { - "content": "Replace the existing ", - "textStyle": {} - } - }, - { - "endIndex": 24510, - "startIndex": 24505, - "textRun": { - "content": "build", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24521, - "startIndex": 24510, - "textRun": { - "content": " method in ", - "textStyle": {} - } - }, - { - "endIndex": 24540, - "startIndex": 24521, - "textRun": { - "content": "DocumentationScreen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24560, - "startIndex": 24540, - "textRun": { - "content": " with this version:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24484 - }, - { - "endIndex": 24574, - "paragraph": { - "elements": [ - { - "endIndex": 24573, - "startIndex": 24560, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_09/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 24574, - "startIndex": 24573, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.2jxf0i2gbgxq", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 24560 - }, - { - "endIndex": 25466, - "startIndex": 24574, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 25465, - "startIndex": 24575, - "tableCells": [ - { - "content": [ - { - "endIndex": 24624, - "paragraph": { - "elements": [ - { - "endIndex": 24624, - "startIndex": 24577, - "textRun": { - "content": "class DocumentScreen extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24577 - }, - { - "endIndex": 24651, - "paragraph": { - "elements": [ - { - "endIndex": 24651, - "startIndex": 24624, - "textRun": { - "content": " final Document document;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24624 - }, - { - "endIndex": 24652, - "paragraph": { - "elements": [ - { - "endIndex": 24652, - "startIndex": 24651, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24651 - }, - { - "endIndex": 24677, - "paragraph": { - "elements": [ - { - "endIndex": 24677, - "startIndex": 24652, - "textRun": { - "content": " const DocumentScreen({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24652 - }, - { - "endIndex": 24705, - "paragraph": { - "elements": [ - { - "endIndex": 24705, - "startIndex": 24677, - "textRun": { - "content": " required this.document,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24677 - }, - { - "endIndex": 24720, - "paragraph": { - "elements": [ - { - "endIndex": 24720, - "startIndex": 24705, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24705 - }, - { - "endIndex": 24726, - "paragraph": { - "elements": [ - { - "endIndex": 24726, - "startIndex": 24720, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24720 - }, - { - "endIndex": 24727, - "paragraph": { - "elements": [ - { - "endIndex": 24727, - "startIndex": 24726, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24726 - }, - { - "endIndex": 24739, - "paragraph": { - "elements": [ - { - "endIndex": 24739, - "startIndex": 24727, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24727 - }, - { - "endIndex": 24778, - "paragraph": { - "elements": [ - { - "endIndex": 24778, - "startIndex": 24739, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24739 - }, - { - "endIndex": 24828, - "paragraph": { - "elements": [ - { - "endIndex": 24828, - "startIndex": 24778, - "textRun": { - "content": " final (title, :modified) = document.metadata;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24778 - }, - { - "endIndex": 24912, - "paragraph": { - "elements": [ - { - "endIndex": 24912, - "startIndex": 24828, - "textRun": { - "content": " final blocks = document.getBlocks(); // Add this line\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24828 - }, - { - "endIndex": 24913, - "paragraph": { - "elements": [ - { - "endIndex": 24913, - "startIndex": 24912, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24912 - }, - { - "endIndex": 24934, - "paragraph": { - "elements": [ - { - "endIndex": 24934, - "startIndex": 24913, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24913 - }, - { - "endIndex": 24956, - "paragraph": { - "elements": [ - { - "endIndex": 24956, - "startIndex": 24934, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24934 - }, - { - "endIndex": 24984, - "paragraph": { - "elements": [ - { - "endIndex": 24984, - "startIndex": 24956, - "textRun": { - "content": " title: Text(title),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24956 - }, - { - "endIndex": 24993, - "paragraph": { - "elements": [ - { - "endIndex": 24993, - "startIndex": 24984, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24984 - }, - { - "endIndex": 25013, - "paragraph": { - "elements": [ - { - "endIndex": 25013, - "startIndex": 24993, - "textRun": { - "content": " body: Column(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24993 - }, - { - "endIndex": 25033, - "paragraph": { - "elements": [ - { - "endIndex": 25033, - "startIndex": 25013, - "textRun": { - "content": " children: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25013 - }, - { - "endIndex": 25120, - "paragraph": { - "elements": [ - { - "endIndex": 25120, - "startIndex": 25033, - "textRun": { - "content": " Text('Last modified: $modified'), // Modify from here\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25033 - }, - { - "endIndex": 25140, - "paragraph": { - "elements": [ - { - "endIndex": 25140, - "startIndex": 25120, - "textRun": { - "content": " Expanded(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25120 - }, - { - "endIndex": 25177, - "paragraph": { - "elements": [ - { - "endIndex": 25177, - "startIndex": 25140, - "textRun": { - "content": " child: ListView.builder(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25140 - }, - { - "endIndex": 25217, - "paragraph": { - "elements": [ - { - "endIndex": 25217, - "startIndex": 25177, - "textRun": { - "content": " itemCount: blocks.length,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25177 - }, - { - "endIndex": 25263, - "paragraph": { - "elements": [ - { - "endIndex": 25263, - "startIndex": 25217, - "textRun": { - "content": " itemBuilder: (context, index) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25217 - }, - { - "endIndex": 25321, - "paragraph": { - "elements": [ - { - "endIndex": 25321, - "startIndex": 25263, - "textRun": { - "content": " return BlockWidget(block: blocks[index]);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25263 - }, - { - "endIndex": 25338, - "paragraph": { - "elements": [ - { - "endIndex": 25338, - "startIndex": 25321, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25321 - }, - { - "endIndex": 25353, - "paragraph": { - "elements": [ - { - "endIndex": 25353, - "startIndex": 25338, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25338 - }, - { - "endIndex": 25432, - "paragraph": { - "elements": [ - { - "endIndex": 25432, - "startIndex": 25353, - "textRun": { - "content": " ), // to here.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25353 - }, - { - "endIndex": 25443, - "paragraph": { - "elements": [ - { - "endIndex": 25443, - "startIndex": 25432, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25432 - }, - { - "endIndex": 25452, - "paragraph": { - "elements": [ - { - "endIndex": 25452, - "startIndex": 25443, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25443 - }, - { - "endIndex": 25459, - "paragraph": { - "elements": [ - { - "endIndex": 25459, - "startIndex": 25452, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25452 - }, - { - "endIndex": 25463, - "paragraph": { - "elements": [ - { - "endIndex": 25463, - "startIndex": 25459, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25459 - }, - { - "endIndex": 25465, - "paragraph": { - "elements": [ - { - "endIndex": 25465, - "startIndex": 25463, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25463 - } - ], - "endIndex": 25465, - "startIndex": 24576, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 25467, - "paragraph": { - "elements": [ - { - "endIndex": 25467, - "startIndex": 25466, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25466 - }, - { - "endIndex": 25616, - "paragraph": { - "elements": [ - { - "endIndex": 25476, - "startIndex": 25467, - "textRun": { - "content": "The line ", - "textStyle": {} - } - }, - { - "endIndex": 25509, - "startIndex": 25476, - "textRun": { - "content": "BlockWidget(block: blocks[index])", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25523, - "startIndex": 25509, - "textRun": { - "content": " constructs a ", - "textStyle": {} - } - }, - { - "endIndex": 25534, - "startIndex": 25523, - "textRun": { - "content": "BlockWidget", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25596, - "startIndex": 25534, - "textRun": { - "content": " widget for each item in the list of blocks returned from the ", - "textStyle": {} - } - }, - { - "endIndex": 25607, - "startIndex": 25596, - "textRun": { - "content": "getBlocks()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25616, - "startIndex": 25607, - "textRun": { - "content": " method.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25467 - }, - { - "endIndex": 25617, - "paragraph": { - "elements": [ - { - "endIndex": 25617, - "startIndex": 25616, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25616 - }, - { - "endIndex": 25694, - "paragraph": { - "bullet": { - "listId": "kix.e3w5dzmwqs7s", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 25693, - "startIndex": 25617, - "textRun": { - "content": "Run the application, and then you should see the blocks appearing on screen:", - "textStyle": {} - } - }, - { - "endIndex": 25694, - "startIndex": 25693, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25617 - }, - { - "endIndex": 25696, - "paragraph": { - "elements": [ - { - "endIndex": 25695, - "inlineObjectElement": { - "inlineObjectId": "kix.aljudv3bph0l", - "textStyle": {} - }, - "startIndex": 25694 - }, - { - "endIndex": 25696, - "startIndex": 25695, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25694 - }, - { - "endIndex": 25719, - "paragraph": { - "elements": [ - { - "endIndex": 25718, - "startIndex": 25696, - "textRun": { - "content": "Use switch expressions", - "textStyle": {} - } - }, - { - "endIndex": 25719, - "startIndex": 25718, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.is937g7djrt5", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 25696 - }, - { - "endIndex": 25734, - "paragraph": { - "elements": [ - { - "endIndex": 25733, - "startIndex": 25719, - "textRun": { - "content": "Duration: 4:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 25734, - "startIndex": 25733, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25719 - }, - { - "endIndex": 25735, - "paragraph": { - "elements": [ - { - "endIndex": 25735, - "startIndex": 25734, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25734 - }, - { - "endIndex": 25948, - "paragraph": { - "elements": [ - { - "endIndex": 25773, - "startIndex": 25735, - "textRun": { - "content": "Patterns add a lot of capabilities to ", - "textStyle": {} - } - }, - { - "endIndex": 25779, - "startIndex": 25773, - "textRun": { - "content": "switch", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25784, - "startIndex": 25779, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 25788, - "startIndex": 25784, - "textRun": { - "content": "case", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25835, - "startIndex": 25788, - "textRun": { - "content": ". To make them usable in more places, Dart has ", - "textStyle": {} - } - }, - { - "endIndex": 25853, - "startIndex": 25835, - "textRun": { - "content": "switch expressions", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 25947, - "startIndex": 25853, - "textRun": { - "content": ". A series of cases can provide a value directly to a variable assignment or return statement.", - "textStyle": {} - } - }, - { - "endIndex": 25948, - "startIndex": 25947, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25735 - }, - { - "endIndex": 26002, - "paragraph": { - "elements": [ - { - "endIndex": 26001, - "startIndex": 25948, - "textRun": { - "content": "Convert the switch statement into a switch expression", - "textStyle": {} - } - }, - { - "endIndex": 26002, - "startIndex": 26001, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8627451, - "green": 0.81960785, - "red": 0.91764706 - } - } - }, - "bold": true, - "fontSize": { - "magnitude": 15.0, - "unit": "PT" - }, - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ny6l3hlbb3ze", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 25948 - }, - { - "endIndex": 26077, - "paragraph": { - "elements": [ - { - "endIndex": 26029, - "startIndex": 26002, - "textRun": { - "content": "The Dart analyzer provides ", - "textStyle": {} - } - }, - { - "endIndex": 26036, - "startIndex": 26029, - "textRun": { - "content": "assists", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 26077, - "startIndex": 26036, - "textRun": { - "content": " to help you make changes to your code. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26002 - }, - { - "endIndex": 26078, - "paragraph": { - "elements": [ - { - "endIndex": 26078, - "startIndex": 26077, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26077 - }, - { - "endIndex": 26146, - "paragraph": { - "bullet": { - "listId": "kix.hhw26oq82tbj", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 26146, - "startIndex": 26078, - "textRun": { - "content": "Move your cursor to the switch statement from the previous section.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26078 - }, - { - "endIndex": 26209, - "paragraph": { - "bullet": { - "listId": "kix.hhw26oq82tbj", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 26209, - "startIndex": 26146, - "textRun": { - "content": "Click on the lightbulb in order to view the available assists.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26146 - }, - { - "endIndex": 26257, - "paragraph": { - "bullet": { - "listId": "kix.hhw26oq82tbj", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 26220, - "startIndex": 26209, - "textRun": { - "content": "Select the ", - "textStyle": {} - } - }, - { - "endIndex": 26248, - "startIndex": 26220, - "textRun": { - "content": "Convert to switch expression", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 26257, - "startIndex": 26248, - "textRun": { - "content": " assist.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26209 - }, - { - "endIndex": 26259, - "paragraph": { - "elements": [ - { - "endIndex": 26258, - "inlineObjectElement": { - "inlineObjectId": "kix.tnem4r9wfxkz", - "textStyle": {} - }, - "startIndex": 26257 - }, - { - "endIndex": 26259, - "startIndex": 26258, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26257 - }, - { - "endIndex": 26305, - "paragraph": { - "elements": [ - { - "endIndex": 26305, - "startIndex": 26259, - "textRun": { - "content": "The new version of this code looks like this:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26259 - }, - { - "endIndex": 26319, - "paragraph": { - "elements": [ - { - "endIndex": 26318, - "startIndex": 26305, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_10/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 26319, - "startIndex": 26318, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ux4uol8rfg8y", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 26305 - }, - { - "endIndex": 27035, - "startIndex": 26319, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 27034, - "startIndex": 26320, - "tableCells": [ - { - "content": [ - { - "endIndex": 26366, - "paragraph": { - "elements": [ - { - "endIndex": 26366, - "startIndex": 26322, - "textRun": { - "content": "class BlockWidget extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26322 - }, - { - "endIndex": 26387, - "paragraph": { - "elements": [ - { - "endIndex": 26387, - "startIndex": 26366, - "textRun": { - "content": " final Block block;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26366 - }, - { - "endIndex": 26388, - "paragraph": { - "elements": [ - { - "endIndex": 26388, - "startIndex": 26387, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26387 - }, - { - "endIndex": 26410, - "paragraph": { - "elements": [ - { - "endIndex": 26410, - "startIndex": 26388, - "textRun": { - "content": " const BlockWidget({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26388 - }, - { - "endIndex": 26435, - "paragraph": { - "elements": [ - { - "endIndex": 26435, - "startIndex": 26410, - "textRun": { - "content": " required this.block,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26410 - }, - { - "endIndex": 26450, - "paragraph": { - "elements": [ - { - "endIndex": 26450, - "startIndex": 26435, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26435 - }, - { - "endIndex": 26456, - "paragraph": { - "elements": [ - { - "endIndex": 26456, - "startIndex": 26450, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26450 - }, - { - "endIndex": 26457, - "paragraph": { - "elements": [ - { - "endIndex": 26457, - "startIndex": 26456, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26456 - }, - { - "endIndex": 26469, - "paragraph": { - "elements": [ - { - "endIndex": 26469, - "startIndex": 26457, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26457 - }, - { - "endIndex": 26508, - "paragraph": { - "elements": [ - { - "endIndex": 26508, - "startIndex": 26469, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26469 - }, - { - "endIndex": 26595, - "paragraph": { - "elements": [ - { - "endIndex": 26595, - "startIndex": 26508, - "textRun": { - "content": " TextStyle? textStyle; // Modify from here\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26508 - }, - { - "endIndex": 26633, - "paragraph": { - "elements": [ - { - "endIndex": 26633, - "startIndex": 26595, - "textRun": { - "content": " textStyle = switch (block.type) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26595 - }, - { - "endIndex": 26690, - "paragraph": { - "elements": [ - { - "endIndex": 26690, - "startIndex": 26633, - "textRun": { - "content": " 'h1' => Theme.of(context).textTheme.displayMedium,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26633 - }, - { - "endIndex": 26757, - "paragraph": { - "elements": [ - { - "endIndex": 26757, - "startIndex": 26690, - "textRun": { - "content": " 'p' || 'checkbox' => Theme.of(context).textTheme.bodyMedium,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26690 - }, - { - "endIndex": 26806, - "paragraph": { - "elements": [ - { - "endIndex": 26806, - "startIndex": 26757, - "textRun": { - "content": " _ => Theme.of(context).textTheme.bodySmall\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26757 - }, - { - "endIndex": 26885, - "paragraph": { - "elements": [ - { - "endIndex": 26885, - "startIndex": 26806, - "textRun": { - "content": " }; // to here.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26806 - }, - { - "endIndex": 26886, - "paragraph": { - "elements": [ - { - "endIndex": 26886, - "startIndex": 26885, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26885 - }, - { - "endIndex": 26908, - "paragraph": { - "elements": [ - { - "endIndex": 26908, - "startIndex": 26886, - "textRun": { - "content": " return Container(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26886 - }, - { - "endIndex": 26947, - "paragraph": { - "elements": [ - { - "endIndex": 26947, - "startIndex": 26908, - "textRun": { - "content": " margin: const EdgeInsets.all(8),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26908 - }, - { - "endIndex": 26966, - "paragraph": { - "elements": [ - { - "endIndex": 26966, - "startIndex": 26947, - "textRun": { - "content": " child: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26947 - }, - { - "endIndex": 26986, - "paragraph": { - "elements": [ - { - "endIndex": 26986, - "startIndex": 26966, - "textRun": { - "content": " block.text,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26966 - }, - { - "endIndex": 27012, - "paragraph": { - "elements": [ - { - "endIndex": 27012, - "startIndex": 26986, - "textRun": { - "content": " style: textStyle,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26986 - }, - { - "endIndex": 27021, - "paragraph": { - "elements": [ - { - "endIndex": 27021, - "startIndex": 27012, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27012 - }, - { - "endIndex": 27028, - "paragraph": { - "elements": [ - { - "endIndex": 27028, - "startIndex": 27021, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27021 - }, - { - "endIndex": 27032, - "paragraph": { - "elements": [ - { - "endIndex": 27032, - "startIndex": 27028, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27028 - }, - { - "endIndex": 27034, - "paragraph": { - "elements": [ - { - "endIndex": 27034, - "startIndex": 27032, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27032 - } - ], - "endIndex": 27034, - "startIndex": 26321, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 27036, - "paragraph": { - "elements": [ - { - "endIndex": 27036, - "startIndex": 27035, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27035 - }, - { - "endIndex": 27296, - "paragraph": { - "elements": [ - { - "endIndex": 27115, - "startIndex": 27036, - "textRun": { - "content": "A switch expression looks similar to a switch statement, but it eliminates the ", - "textStyle": {} - } - }, - { - "endIndex": 27119, - "startIndex": 27115, - "textRun": { - "content": "case", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27137, - "startIndex": 27119, - "textRun": { - "content": " keyword and uses ", - "textStyle": {} - } - }, - { - "endIndex": 27139, - "startIndex": 27137, - "textRun": { - "content": "=>", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27184, - "startIndex": 27139, - "textRun": { - "content": " to separate the pattern from the case body. ", - "textStyle": {} - } - }, - { - "endIndex": 27295, - "startIndex": 27184, - "textRun": { - "content": "Unlike switch statements, switch expressions return a value and can be used anywhere an expression can be used.", - "textStyle": {} - } - }, - { - "endIndex": 27296, - "startIndex": 27295, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27036 - }, - { - "endIndex": 27316, - "paragraph": { - "elements": [ - { - "endIndex": 27316, - "startIndex": 27296, - "textRun": { - "content": "Use object patterns\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.o28rbfr3i2hm", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 27296 - }, - { - "endIndex": 27331, - "paragraph": { - "elements": [ - { - "endIndex": 27330, - "startIndex": 27316, - "textRun": { - "content": "Duration: 4:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 27331, - "startIndex": 27330, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27316 - }, - { - "endIndex": 27332, - "paragraph": { - "elements": [ - { - "endIndex": 27332, - "startIndex": 27331, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27331 - }, - { - "endIndex": 27531, - "paragraph": { - "elements": [ - { - "endIndex": 27434, - "startIndex": 27332, - "textRun": { - "content": "Dart is an object-oriented language, so patterns apply to all objects. In this step, you switch on an ", - "textStyle": {} - } - }, - { - "endIndex": 27448, - "startIndex": 27434, - "textRun": { - "content": "object pattern", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 27531, - "startIndex": 27448, - "textRun": { - "content": " and destructure object properties to enhance the date rendering logic of your UI.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27332 - }, - { - "endIndex": 27532, - "paragraph": { - "elements": [ - { - "endIndex": 27532, - "startIndex": 27531, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27531 - }, - { - "endIndex": 27674, - "startIndex": 27532, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 27673, - "startIndex": 27533, - "tableCells": [ - { - "content": [ - { - "endIndex": 27673, - "paragraph": { - "elements": [ - { - "endIndex": 27541, - "startIndex": 27535, - "textRun": { - "content": "Note: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 27549, - "startIndex": 27541, - "textRun": { - "content": "There's ", - "textStyle": {} - } - }, - { - "endIndex": 27551, - "startIndex": 27549, - "textRun": { - "content": "no", - "textStyle": {} - } - }, - { - "endIndex": 27571, - "startIndex": 27551, - "textRun": { - "content": " migration necessary", - "textStyle": {} - } - }, - { - "endIndex": 27574, - "startIndex": 27571, - "textRun": { - "content": " to", - "textStyle": {} - } - }, - { - "endIndex": 27673, - "startIndex": 27574, - "textRun": { - "content": " support patterns; you can immediately start using pattern matching on your existing Dart classes.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27535 - } - ], - "endIndex": 27673, - "startIndex": 27534, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 27714, - "paragraph": { - "elements": [ - { - "endIndex": 27714, - "startIndex": 27674, - "textRun": { - "content": "Extract properties from object patterns\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hiek3z8bfnbt", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 27674 - }, - { - "endIndex": 27799, - "paragraph": { - "elements": [ - { - "endIndex": 27799, - "startIndex": 27714, - "textRun": { - "content": "In this section, you improve how the last modified date is displayed using patterns.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27714 - }, - { - "endIndex": 27800, - "paragraph": { - "elements": [ - { - "endIndex": 27800, - "startIndex": 27799, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27799 - }, - { - "endIndex": 27840, - "paragraph": { - "bullet": { - "listId": "kix.vada968rkket", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 27808, - "startIndex": 27800, - "textRun": { - "content": "Add the ", - "textStyle": {} - } - }, - { - "endIndex": 27818, - "startIndex": 27808, - "textRun": { - "content": "formatDate", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27829, - "startIndex": 27818, - "textRun": { - "content": " method to ", - "textStyle": {} - } - }, - { - "endIndex": 27838, - "startIndex": 27829, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27840, - "startIndex": 27838, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27800 - }, - { - "endIndex": 27841, - "paragraph": { - "elements": [ - { - "endIndex": 27841, - "startIndex": 27840, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27840 - }, - { - "endIndex": 27855, - "paragraph": { - "elements": [ - { - "endIndex": 27854, - "startIndex": 27841, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_11_a/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 27855, - "startIndex": 27854, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.vivylxd16zs", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 27841 - }, - { - "endIndex": 28273, - "startIndex": 27855, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 28272, - "startIndex": 27856, - "tableCells": [ - { - "content": [ - { - "endIndex": 27897, - "paragraph": { - "elements": [ - { - "endIndex": 27897, - "startIndex": 27858, - "textRun": { - "content": "String formatDate(DateTime dateTime) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27858 - }, - { - "endIndex": 27929, - "paragraph": { - "elements": [ - { - "endIndex": 27929, - "startIndex": 27897, - "textRun": { - "content": " final today = DateTime.now();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27897 - }, - { - "endIndex": 27978, - "paragraph": { - "elements": [ - { - "endIndex": 27978, - "startIndex": 27929, - "textRun": { - "content": " final difference = dateTime.difference(today);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27929 - }, - { - "endIndex": 27979, - "paragraph": { - "elements": [ - { - "endIndex": 27979, - "startIndex": 27978, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27978 - }, - { - "endIndex": 28010, - "paragraph": { - "elements": [ - { - "endIndex": 28010, - "startIndex": 27979, - "textRun": { - "content": " return switch (difference) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27979 - }, - { - "endIndex": 28046, - "paragraph": { - "elements": [ - { - "endIndex": 28046, - "startIndex": 28010, - "textRun": { - "content": " Duration(inDays: 0) => 'today',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28010 - }, - { - "endIndex": 28085, - "paragraph": { - "elements": [ - { - "endIndex": 28085, - "startIndex": 28046, - "textRun": { - "content": " Duration(inDays: 1) => 'tomorrow',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28046 - }, - { - "endIndex": 28126, - "paragraph": { - "elements": [ - { - "endIndex": 28126, - "startIndex": 28085, - "textRun": { - "content": " Duration(inDays: -1) => 'yesterday',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28085 - }, - { - "endIndex": 28206, - "paragraph": { - "elements": [ - { - "endIndex": 28206, - "startIndex": 28126, - "textRun": { - "content": " Duration(inDays: final days, isNegative: true) => '${days.abs()} days ago',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28126 - }, - { - "endIndex": 28265, - "paragraph": { - "elements": [ - { - "endIndex": 28265, - "startIndex": 28206, - "textRun": { - "content": " Duration(inDays: final days) => '$days days from now',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28206 - }, - { - "endIndex": 28270, - "paragraph": { - "elements": [ - { - "endIndex": 28270, - "startIndex": 28265, - "textRun": { - "content": " };\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28265 - }, - { - "endIndex": 28272, - "paragraph": { - "elements": [ - { - "endIndex": 28272, - "startIndex": 28270, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28270 - } - ], - "endIndex": 28272, - "startIndex": 27857, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 28274, - "paragraph": { - "elements": [ - { - "endIndex": 28274, - "startIndex": 28273, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28273 - }, - { - "endIndex": 28461, - "paragraph": { - "elements": [ - { - "endIndex": 28341, - "startIndex": 28274, - "textRun": { - "content": "This method returns a switch expression that switches on the value ", - "textStyle": {} - } - }, - { - "endIndex": 28351, - "startIndex": 28341, - "textRun": { - "content": "difference", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28355, - "startIndex": 28351, - "textRun": { - "content": ", a ", - "textStyle": {} - } - }, - { - "endIndex": 28356, - "startIndex": 28355, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 28364, - "startIndex": 28356, - "textRun": { - "content": "Duration", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.dart.dev/stable/dart-core/Duration-class.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28371, - "startIndex": 28364, - "textRun": { - "content": " object", - "textStyle": {} - } - }, - { - "endIndex": 28412, - "startIndex": 28371, - "textRun": { - "content": ". It represents the span of time between ", - "textStyle": {} - } - }, - { - "endIndex": 28417, - "startIndex": 28412, - "textRun": { - "content": "today", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28426, - "startIndex": 28417, - "textRun": { - "content": " and the ", - "textStyle": {} - } - }, - { - "endIndex": 28434, - "startIndex": 28426, - "textRun": { - "content": "modified", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28461, - "startIndex": 28434, - "textRun": { - "content": " value from the JSON data.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28274 - }, - { - "endIndex": 28462, - "paragraph": { - "elements": [ - { - "endIndex": 28462, - "startIndex": 28461, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28461 - }, - { - "endIndex": 28733, - "paragraph": { - "elements": [ - { - "endIndex": 28583, - "startIndex": 28462, - "textRun": { - "content": "Each case of the switch expression is using an object pattern that matches by calling getters on the object’s properties ", - "textStyle": {} - } - }, - { - "endIndex": 28589, - "startIndex": 28583, - "textRun": { - "content": "inDays", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28594, - "startIndex": 28589, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 28604, - "startIndex": 28594, - "textRun": { - "content": "isNegative", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28714, - "startIndex": 28604, - "textRun": { - "content": ". The syntax looks like it might be constructing a Duration object, but it's actually accessing fields on the ", - "textStyle": {} - } - }, - { - "endIndex": 28724, - "startIndex": 28714, - "textRun": { - "content": "difference", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28725, - "startIndex": 28724, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 28733, - "startIndex": 28725, - "textRun": { - "content": "object.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28462 - }, - { - "endIndex": 28734, - "paragraph": { - "elements": [ - { - "endIndex": 28734, - "startIndex": 28733, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28733 - }, - { - "endIndex": 28867, - "paragraph": { - "elements": [ - { - "endIndex": 28781, - "startIndex": 28734, - "textRun": { - "content": "The first three cases use constant subpatterns ", - "textStyle": {} - } - }, - { - "endIndex": 28782, - "startIndex": 28781, - "textRun": { - "content": "0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28784, - "startIndex": 28782, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 28785, - "startIndex": 28784, - "textRun": { - "content": "1", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28791, - "startIndex": 28785, - "textRun": { - "content": ", and ", - "textStyle": {} - } - }, - { - "endIndex": 28793, - "startIndex": 28791, - "textRun": { - "content": "-1", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28823, - "startIndex": 28793, - "textRun": { - "content": " to match the object property ", - "textStyle": {} - } - }, - { - "endIndex": 28829, - "startIndex": 28823, - "textRun": { - "content": "inDays", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28866, - "startIndex": 28829, - "textRun": { - "content": " and return the corresponding string.", - "textStyle": {} - } - }, - { - "endIndex": 28867, - "startIndex": 28866, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28734 - }, - { - "endIndex": 28868, - "paragraph": { - "elements": [ - { - "endIndex": 28868, - "startIndex": 28867, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28867 - }, - { - "endIndex": 28943, - "paragraph": { - "elements": [ - { - "endIndex": 28943, - "startIndex": 28868, - "textRun": { - "content": "The last two cases handle durations beyond today, yesterday, and tomorrow:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28868 - }, - { - "endIndex": 29082, - "paragraph": { - "bullet": { - "listId": "kix.l36nsyz7nfdm", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 28950, - "startIndex": 28943, - "textRun": { - "content": "If the ", - "textStyle": {} - } - }, - { - "endIndex": 28960, - "startIndex": 28950, - "textRun": { - "content": "isNegative", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28982, - "startIndex": 28960, - "textRun": { - "content": " property matches the ", - "textStyle": {} - } - }, - { - "endIndex": 29007, - "startIndex": 28982, - "textRun": { - "content": "boolean constant pattern ", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 29011, - "startIndex": 29007, - "textRun": { - "content": "true", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29072, - "startIndex": 29011, - "textRun": { - "content": ", meaning the modification date was in the past, it displays ", - "textStyle": {} - } - }, - { - "endIndex": 29080, - "startIndex": 29072, - "textRun": { - "content": "days ago", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 29082, - "startIndex": 29080, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28943 - }, - { - "endIndex": 29298, - "paragraph": { - "bullet": { - "listId": "kix.l36nsyz7nfdm", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 29208, - "startIndex": 29082, - "textRun": { - "content": "If that case doesn’t catch the difference, then duration must be a positive number of days (no need to explicitly verify with ", - "textStyle": {} - } - }, - { - "endIndex": 29225, - "startIndex": 29208, - "textRun": { - "content": "isNegative: false", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29283, - "startIndex": 29225, - "textRun": { - "content": "), so the modification date is in the future and displays ", - "textStyle": {} - } - }, - { - "endIndex": 29296, - "startIndex": 29283, - "textRun": { - "content": "days from now", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 29297, - "startIndex": 29296, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 29298, - "startIndex": 29297, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29082 - }, - { - "endIndex": 29329, - "paragraph": { - "elements": [ - { - "endIndex": 29328, - "startIndex": 29298, - "textRun": { - "content": "Add formatting logic for weeks", - "textStyle": {} - } - }, - { - "endIndex": 29329, - "startIndex": 29328, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.954rbgsdumm6", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 29298 - }, - { - "endIndex": 29467, - "paragraph": { - "bullet": { - "listId": "kix.mjlhrnhvhdy4", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 29460, - "startIndex": 29329, - "textRun": { - "content": "Add two new cases to your formatting function in order to identify durations longer than 7 days so that the UI can display them as ", - "textStyle": {} - } - }, - { - "endIndex": 29465, - "startIndex": 29460, - "textRun": { - "content": "weeks", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 29466, - "startIndex": 29465, - "textRun": { - "content": ":", - "textStyle": {} - } - }, - { - "endIndex": 29467, - "startIndex": 29466, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29329 - }, - { - "endIndex": 29468, - "paragraph": { - "elements": [ - { - "endIndex": 29468, - "startIndex": 29467, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29467 - }, - { - "endIndex": 29482, - "paragraph": { - "elements": [ - { - "endIndex": 29481, - "startIndex": 29468, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_11_b/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 29482, - "startIndex": 29481, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.io2pno42mpr0", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 29468 - }, - { - "endIndex": 30142, - "startIndex": 29482, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 30141, - "startIndex": 29483, - "tableCells": [ - { - "content": [ - { - "endIndex": 29524, - "paragraph": { - "elements": [ - { - "endIndex": 29524, - "startIndex": 29485, - "textRun": { - "content": "String formatDate(DateTime dateTime) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29485 - }, - { - "endIndex": 29556, - "paragraph": { - "elements": [ - { - "endIndex": 29556, - "startIndex": 29524, - "textRun": { - "content": " final today = DateTime.now();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29524 - }, - { - "endIndex": 29605, - "paragraph": { - "elements": [ - { - "endIndex": 29605, - "startIndex": 29556, - "textRun": { - "content": " final difference = dateTime.difference(today);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29556 - }, - { - "endIndex": 29606, - "paragraph": { - "elements": [ - { - "endIndex": 29606, - "startIndex": 29605, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29605 - }, - { - "endIndex": 29637, - "paragraph": { - "elements": [ - { - "endIndex": 29637, - "startIndex": 29606, - "textRun": { - "content": " return switch (difference) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29606 - }, - { - "endIndex": 29673, - "paragraph": { - "elements": [ - { - "endIndex": 29673, - "startIndex": 29637, - "textRun": { - "content": " Duration(inDays: 0) => 'today',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29637 - }, - { - "endIndex": 29712, - "paragraph": { - "elements": [ - { - "endIndex": 29712, - "startIndex": 29673, - "textRun": { - "content": " Duration(inDays: 1) => 'tomorrow',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29673 - }, - { - "endIndex": 29753, - "paragraph": { - "elements": [ - { - "endIndex": 29753, - "startIndex": 29712, - "textRun": { - "content": " Duration(inDays: -1) => 'yesterday',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29712 - }, - { - "endIndex": 29851, - "paragraph": { - "elements": [ - { - "endIndex": 29851, - "startIndex": 29753, - "textRun": { - "content": " Duration(inDays: final days) when days > 7 => '${days ~/ 7} weeks from now', // Add from here\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29753 - }, - { - "endIndex": 29902, - "paragraph": { - "elements": [ - { - "endIndex": 29902, - "startIndex": 29851, - "textRun": { - "content": " Duration(inDays: final days) when days < -7 =>\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29851 - }, - { - "endIndex": 29995, - "paragraph": { - "elements": [ - { - "endIndex": 29995, - "startIndex": 29902, - "textRun": { - "content": " '${days.abs() ~/ 7} weeks ago', // to here.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29902 - }, - { - "endIndex": 30075, - "paragraph": { - "elements": [ - { - "endIndex": 30075, - "startIndex": 29995, - "textRun": { - "content": " Duration(inDays: final days, isNegative: true) => '${days.abs()} days ago',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29995 - }, - { - "endIndex": 30134, - "paragraph": { - "elements": [ - { - "endIndex": 30134, - "startIndex": 30075, - "textRun": { - "content": " Duration(inDays: final days) => '$days days from now',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30075 - }, - { - "endIndex": 30139, - "paragraph": { - "elements": [ - { - "endIndex": 30139, - "startIndex": 30134, - "textRun": { - "content": " };\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30134 - }, - { - "endIndex": 30141, - "paragraph": { - "elements": [ - { - "endIndex": 30141, - "startIndex": 30139, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30139 - } - ], - "endIndex": 30141, - "startIndex": 29484, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 30143, - "paragraph": { - "elements": [ - { - "endIndex": 30143, - "startIndex": 30142, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30142 - }, - { - "endIndex": 30179, - "paragraph": { - "elements": [ - { - "endIndex": 30164, - "startIndex": 30143, - "textRun": { - "content": "This code introduces ", - "textStyle": {} - } - }, - { - "endIndex": 30177, - "startIndex": 30164, - "textRun": { - "content": "guard clauses", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 30178, - "startIndex": 30177, - "textRun": { - "content": ":", - "textStyle": {} - } - }, - { - "endIndex": 30179, - "startIndex": 30178, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30143 - }, - { - "endIndex": 30238, - "paragraph": { - "bullet": { - "listId": "kix.g0n6mr9338xd", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 30203, - "startIndex": 30179, - "textRun": { - "content": "A guard clause uses the ", - "textStyle": {} - } - }, - { - "endIndex": 30207, - "startIndex": 30203, - "textRun": { - "content": "when", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30238, - "startIndex": 30207, - "textRun": { - "content": " keyword after a case pattern.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30179 - }, - { - "endIndex": 30311, - "paragraph": { - "bullet": { - "listId": "kix.g0n6mr9338xd", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 30311, - "startIndex": 30238, - "textRun": { - "content": "They can be used in if-cases, switch statements, and switch expressions.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30238 - }, - { - "endIndex": 30370, - "paragraph": { - "bullet": { - "listId": "kix.g0n6mr9338xd", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 30350, - "startIndex": 30311, - "textRun": { - "content": "They only add a condition to a pattern ", - "textStyle": {} - } - }, - { - "endIndex": 30368, - "startIndex": 30350, - "textRun": { - "content": "after it's matched", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 30370, - "startIndex": 30368, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30311 - }, - { - "endIndex": 30482, - "paragraph": { - "bullet": { - "listId": "kix.g0n6mr9338xd", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 30432, - "startIndex": 30370, - "textRun": { - "content": "If the guard clause evaluates to false, the entire pattern is ", - "textStyle": {} - } - }, - { - "endIndex": 30439, - "startIndex": 30432, - "textRun": { - "content": "refuted", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 30440, - "startIndex": 30439, - "textRun": { - "content": ",", - "textStyle": {} - } - }, - { - "endIndex": 30444, - "startIndex": 30440, - "textRun": { - "content": " and", - "textStyle": {} - } - }, - { - "endIndex": 30482, - "startIndex": 30444, - "textRun": { - "content": " execution proceeds to the next case.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30370 - }, - { - "endIndex": 30521, - "paragraph": { - "elements": [ - { - "endIndex": 30521, - "startIndex": 30482, - "textRun": { - "content": "Add the newly formatted date to the UI\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.mnuqwgraocl9", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 30482 - }, - { - "endIndex": 30604, - "paragraph": { - "bullet": { - "listId": "kix.oowm3okhp1if", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 30541, - "startIndex": 30521, - "textRun": { - "content": "Finally, update the ", - "textStyle": {} - } - }, - { - "endIndex": 30546, - "startIndex": 30541, - "textRun": { - "content": "build", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30557, - "startIndex": 30546, - "textRun": { - "content": " method in ", - "textStyle": {} - } - }, - { - "endIndex": 30571, - "startIndex": 30557, - "textRun": { - "content": "DocumentScreen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30583, - "startIndex": 30571, - "textRun": { - "content": " to use the ", - "textStyle": {} - } - }, - { - "endIndex": 30593, - "startIndex": 30583, - "textRun": { - "content": "formatDate", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30604, - "startIndex": 30593, - "textRun": { - "content": " function:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30521 - }, - { - "endIndex": 30618, - "paragraph": { - "elements": [ - { - "endIndex": 30617, - "startIndex": 30604, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_11_b/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 30618, - "startIndex": 30617, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.33yq3djwxg2k", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 30604 - }, - { - "endIndex": 31485, - "startIndex": 30618, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 31484, - "startIndex": 30619, - "tableCells": [ - { - "content": [ - { - "endIndex": 30668, - "paragraph": { - "elements": [ - { - "endIndex": 30668, - "startIndex": 30621, - "textRun": { - "content": "class DocumentScreen extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30621 - }, - { - "endIndex": 30695, - "paragraph": { - "elements": [ - { - "endIndex": 30695, - "startIndex": 30668, - "textRun": { - "content": " final Document document;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30668 - }, - { - "endIndex": 30696, - "paragraph": { - "elements": [ - { - "endIndex": 30696, - "startIndex": 30695, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30695 - }, - { - "endIndex": 30721, - "paragraph": { - "elements": [ - { - "endIndex": 30721, - "startIndex": 30696, - "textRun": { - "content": " const DocumentScreen({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30696 - }, - { - "endIndex": 30749, - "paragraph": { - "elements": [ - { - "endIndex": 30749, - "startIndex": 30721, - "textRun": { - "content": " required this.document,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30721 - }, - { - "endIndex": 30764, - "paragraph": { - "elements": [ - { - "endIndex": 30764, - "startIndex": 30749, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30749 - }, - { - "endIndex": 30770, - "paragraph": { - "elements": [ - { - "endIndex": 30770, - "startIndex": 30764, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30764 - }, - { - "endIndex": 30771, - "paragraph": { - "elements": [ - { - "endIndex": 30771, - "startIndex": 30770, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30770 - }, - { - "endIndex": 30783, - "paragraph": { - "elements": [ - { - "endIndex": 30783, - "startIndex": 30771, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30771 - }, - { - "endIndex": 30822, - "paragraph": { - "elements": [ - { - "endIndex": 30822, - "startIndex": 30783, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30783 - }, - { - "endIndex": 30872, - "paragraph": { - "elements": [ - { - "endIndex": 30872, - "startIndex": 30822, - "textRun": { - "content": " final (title, :modified) = document.metadata;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30822 - }, - { - "endIndex": 30956, - "paragraph": { - "elements": [ - { - "endIndex": 30956, - "startIndex": 30872, - "textRun": { - "content": " final formattedModifiedDate = formatDate(modified); // Add this line\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30872 - }, - { - "endIndex": 30997, - "paragraph": { - "elements": [ - { - "endIndex": 30997, - "startIndex": 30956, - "textRun": { - "content": " final blocks = document.getBlocks();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30956 - }, - { - "endIndex": 30998, - "paragraph": { - "elements": [ - { - "endIndex": 30998, - "startIndex": 30997, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30997 - }, - { - "endIndex": 31019, - "paragraph": { - "elements": [ - { - "endIndex": 31019, - "startIndex": 30998, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30998 - }, - { - "endIndex": 31041, - "paragraph": { - "elements": [ - { - "endIndex": 31041, - "startIndex": 31019, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31019 - }, - { - "endIndex": 31069, - "paragraph": { - "elements": [ - { - "endIndex": 31069, - "startIndex": 31041, - "textRun": { - "content": " title: Text(title),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31041 - }, - { - "endIndex": 31078, - "paragraph": { - "elements": [ - { - "endIndex": 31078, - "startIndex": 31069, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31069 - }, - { - "endIndex": 31098, - "paragraph": { - "elements": [ - { - "endIndex": 31098, - "startIndex": 31078, - "textRun": { - "content": " body: Column(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31078 - }, - { - "endIndex": 31118, - "paragraph": { - "elements": [ - { - "endIndex": 31118, - "startIndex": 31098, - "textRun": { - "content": " children: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31098 - }, - { - "endIndex": 31205, - "paragraph": { - "elements": [ - { - "endIndex": 31205, - "startIndex": 31118, - "textRun": { - "content": " Text('Last modified: $formattedModifiedDate'), // Modify this line\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31118 - }, - { - "endIndex": 31225, - "paragraph": { - "elements": [ - { - "endIndex": 31225, - "startIndex": 31205, - "textRun": { - "content": " Expanded(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31205 - }, - { - "endIndex": 31262, - "paragraph": { - "elements": [ - { - "endIndex": 31262, - "startIndex": 31225, - "textRun": { - "content": " child: ListView.builder(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31225 - }, - { - "endIndex": 31302, - "paragraph": { - "elements": [ - { - "endIndex": 31302, - "startIndex": 31262, - "textRun": { - "content": " itemCount: blocks.length,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31262 - }, - { - "endIndex": 31348, - "paragraph": { - "elements": [ - { - "endIndex": 31348, - "startIndex": 31302, - "textRun": { - "content": " itemBuilder: (context, index) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31302 - }, - { - "endIndex": 31406, - "paragraph": { - "elements": [ - { - "endIndex": 31406, - "startIndex": 31348, - "textRun": { - "content": " return BlockWidget(block: blocks[index]);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31348 - }, - { - "endIndex": 31423, - "paragraph": { - "elements": [ - { - "endIndex": 31423, - "startIndex": 31406, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31406 - }, - { - "endIndex": 31438, - "paragraph": { - "elements": [ - { - "endIndex": 31438, - "startIndex": 31423, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31423 - }, - { - "endIndex": 31451, - "paragraph": { - "elements": [ - { - "endIndex": 31451, - "startIndex": 31438, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31438 - }, - { - "endIndex": 31462, - "paragraph": { - "elements": [ - { - "endIndex": 31462, - "startIndex": 31451, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31451 - }, - { - "endIndex": 31471, - "paragraph": { - "elements": [ - { - "endIndex": 31471, - "startIndex": 31462, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31462 - }, - { - "endIndex": 31478, - "paragraph": { - "elements": [ - { - "endIndex": 31478, - "startIndex": 31471, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31471 - }, - { - "endIndex": 31482, - "paragraph": { - "elements": [ - { - "endIndex": 31482, - "startIndex": 31478, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31478 - }, - { - "endIndex": 31484, - "paragraph": { - "elements": [ - { - "endIndex": 31484, - "startIndex": 31482, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31482 - } - ], - "endIndex": 31484, - "startIndex": 30620, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 31486, - "paragraph": { - "elements": [ - { - "endIndex": 31486, - "startIndex": 31485, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31485 - }, - { - "endIndex": 31529, - "paragraph": { - "bullet": { - "listId": "kix.oowm3okhp1if", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 31529, - "startIndex": 31486, - "textRun": { - "content": "Hot reload to see the changes in your app:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31486 - }, - { - "endIndex": 31531, - "paragraph": { - "elements": [ - { - "endIndex": 31530, - "inlineObjectElement": { - "inlineObjectId": "kix.60qoxad1aw8", - "textStyle": {} - }, - "startIndex": 31529 - }, - { - "endIndex": 31531, - "startIndex": 31530, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31529 - }, - { - "endIndex": 31532, - "paragraph": { - "elements": [ - { - "endIndex": 31532, - "startIndex": 31531, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31531 - }, - { - "endIndex": 31570, - "paragraph": { - "elements": [ - { - "endIndex": 31570, - "startIndex": 31532, - "textRun": { - "content": "Seal a class for exhaustive switching\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.qhrafs2obyf8", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 31532 - }, - { - "endIndex": 31585, - "paragraph": { - "elements": [ - { - "endIndex": 31584, - "startIndex": 31570, - "textRun": { - "content": "Duration: 4:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 31585, - "startIndex": 31584, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31570 - }, - { - "endIndex": 31586, - "paragraph": { - "elements": [ - { - "endIndex": 31586, - "startIndex": 31585, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31585 - }, - { - "endIndex": 31903, - "paragraph": { - "elements": [ - { - "endIndex": 31845, - "startIndex": 31586, - "textRun": { - "content": "Notice that you didn’t use a wildcard or default case at the end of the last switch. Though it’s good practice to always include a case for values that might fall through, it’s ok in a simple example like this since you know the cases you defined account for ", - "textStyle": {} - } - }, - { - "endIndex": 31871, - "startIndex": 31845, - "textRun": { - "content": "all of the possible values", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 31872, - "startIndex": 31871, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 31878, - "startIndex": 31872, - "textRun": { - "content": "inDays", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 31903, - "startIndex": 31878, - "textRun": { - "content": " could potentially take.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31586 - }, - { - "endIndex": 31904, - "paragraph": { - "elements": [ - { - "endIndex": 31904, - "startIndex": 31903, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31903 - }, - { - "endIndex": 32225, - "paragraph": { - "elements": [ - { - "endIndex": 31959, - "startIndex": 31904, - "textRun": { - "content": "When every case in a switch is handled, it’s called an ", - "textStyle": {} - } - }, - { - "endIndex": 31969, - "startIndex": 31959, - "textRun": { - "content": "exhaustive", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 31970, - "startIndex": 31969, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 31976, - "startIndex": 31970, - "textRun": { - "content": "switch", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 32006, - "startIndex": 31976, - "textRun": { - "content": ". For example, switching on a ", - "textStyle": {} - } - }, - { - "endIndex": 32010, - "startIndex": 32006, - "textRun": { - "content": "bool", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32052, - "startIndex": 32010, - "textRun": { - "content": " type is exhaustive when it has cases for ", - "textStyle": {} - } - }, - { - "endIndex": 32056, - "startIndex": 32052, - "textRun": { - "content": "true", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32061, - "startIndex": 32056, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 32066, - "startIndex": 32061, - "textRun": { - "content": "false", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32084, - "startIndex": 32066, - "textRun": { - "content": ". Switching on an ", - "textStyle": {} - } - }, - { - "endIndex": 32088, - "startIndex": 32084, - "textRun": { - "content": "enum", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32191, - "startIndex": 32088, - "textRun": { - "content": " type is exhaustive when there are cases for each of the enum’s values, too, because enums represent a ", - "textStyle": {} - } - }, - { - "endIndex": 32203, - "startIndex": 32191, - "textRun": { - "content": "fixed number", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 32207, - "startIndex": 32203, - "textRun": { - "content": " of ", - "textStyle": {} - } - }, - { - "endIndex": 32222, - "startIndex": 32207, - "textRun": { - "content": "constant values", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 32225, - "startIndex": 32222, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31904 - }, - { - "endIndex": 32226, - "paragraph": { - "elements": [ - { - "endIndex": 32226, - "startIndex": 32225, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32225 - }, - { - "endIndex": 32386, - "paragraph": { - "elements": [ - { - "endIndex": 32242, - "startIndex": 32226, - "textRun": { - "content": "Dart 3 extended ", - "textStyle": {} - } - }, - { - "endIndex": 32265, - "startIndex": 32242, - "textRun": { - "content": "exhaustiveness checking", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 32327, - "startIndex": 32265, - "textRun": { - "content": " to objects and class hierarchies with the new class modifier ", - "textStyle": {} - } - }, - { - "endIndex": 32333, - "startIndex": 32327, - "textRun": { - "content": "sealed", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32349, - "startIndex": 32333, - "textRun": { - "content": ". Refactor your ", - "textStyle": {} - } - }, - { - "endIndex": 32354, - "startIndex": 32349, - "textRun": { - "content": "Block", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32386, - "startIndex": 32354, - "textRun": { - "content": " class as a sealed superclass. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32226 - }, - { - "endIndex": 32387, - "paragraph": { - "elements": [ - { - "endIndex": 32387, - "startIndex": 32386, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32386 - }, - { - "endIndex": 32409, - "paragraph": { - "elements": [ - { - "endIndex": 32408, - "startIndex": 32387, - "textRun": { - "content": "Create the subclasses", - "textStyle": {} - } - }, - { - "endIndex": 32409, - "startIndex": 32408, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.r3jqucu93ahb", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 32387 - }, - { - "endIndex": 32514, - "paragraph": { - "bullet": { - "listId": "kix.cnrmyad97l0c", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 32412, - "startIndex": 32409, - "textRun": { - "content": "In ", - "textStyle": {} - } - }, - { - "endIndex": 32421, - "startIndex": 32412, - "textRun": { - "content": "data.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32448, - "startIndex": 32421, - "textRun": { - "content": ", create three new classes—", - "textStyle": {} - } - }, - { - "endIndex": 32459, - "startIndex": 32448, - "textRun": { - "content": "HeaderBlock", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32460, - "startIndex": 32459, - "textRun": { - "content": ",", - "textStyle": {} - } - }, - { - "endIndex": 32461, - "startIndex": 32460, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 32475, - "startIndex": 32461, - "textRun": { - "content": "ParagraphBlock", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32481, - "startIndex": 32475, - "textRun": { - "content": ", and ", - "textStyle": {} - } - }, - { - "endIndex": 32494, - "startIndex": 32481, - "textRun": { - "content": "CheckboxBlock", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32507, - "startIndex": 32494, - "textRun": { - "content": "—that extend ", - "textStyle": {} - } - }, - { - "endIndex": 32512, - "startIndex": 32507, - "textRun": { - "content": "Block", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32513, - "startIndex": 32512, - "textRun": { - "content": ":", - "textStyle": {} - } - }, - { - "endIndex": 32514, - "startIndex": 32513, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32409 - }, - { - "endIndex": 32528, - "paragraph": { - "elements": [ - { - "endIndex": 32527, - "startIndex": 32514, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_12/lib/data.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 32528, - "startIndex": 32527, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6y1ysytcknvf", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 32514 - }, - { - "endIndex": 32833, - "startIndex": 32528, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 32832, - "startIndex": 32529, - "tableCells": [ - { - "content": [ - { - "endIndex": 32565, - "paragraph": { - "elements": [ - { - "endIndex": 32565, - "startIndex": 32531, - "textRun": { - "content": "class HeaderBlock extends Block {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32531 - }, - { - "endIndex": 32586, - "paragraph": { - "elements": [ - { - "endIndex": 32586, - "startIndex": 32565, - "textRun": { - "content": " final String text;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32565 - }, - { - "endIndex": 32612, - "paragraph": { - "elements": [ - { - "endIndex": 32612, - "startIndex": 32586, - "textRun": { - "content": " HeaderBlock(this.text);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32586 - }, - { - "endIndex": 32614, - "paragraph": { - "elements": [ - { - "endIndex": 32614, - "startIndex": 32612, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32612 - }, - { - "endIndex": 32615, - "paragraph": { - "elements": [ - { - "endIndex": 32615, - "startIndex": 32614, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32614 - }, - { - "endIndex": 32652, - "paragraph": { - "elements": [ - { - "endIndex": 32652, - "startIndex": 32615, - "textRun": { - "content": "class ParagraphBlock extends Block {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32615 - }, - { - "endIndex": 32673, - "paragraph": { - "elements": [ - { - "endIndex": 32673, - "startIndex": 32652, - "textRun": { - "content": " final String text;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32652 - }, - { - "endIndex": 32702, - "paragraph": { - "elements": [ - { - "endIndex": 32702, - "startIndex": 32673, - "textRun": { - "content": " ParagraphBlock(this.text);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32673 - }, - { - "endIndex": 32704, - "paragraph": { - "elements": [ - { - "endIndex": 32704, - "startIndex": 32702, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32702 - }, - { - "endIndex": 32705, - "paragraph": { - "elements": [ - { - "endIndex": 32705, - "startIndex": 32704, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32704 - }, - { - "endIndex": 32741, - "paragraph": { - "elements": [ - { - "endIndex": 32741, - "startIndex": 32705, - "textRun": { - "content": "class CheckboxBlock extends Block {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32705 - }, - { - "endIndex": 32762, - "paragraph": { - "elements": [ - { - "endIndex": 32762, - "startIndex": 32741, - "textRun": { - "content": " final String text;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32741 - }, - { - "endIndex": 32786, - "paragraph": { - "elements": [ - { - "endIndex": 32786, - "startIndex": 32762, - "textRun": { - "content": " final bool isChecked;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32762 - }, - { - "endIndex": 32830, - "paragraph": { - "elements": [ - { - "endIndex": 32830, - "startIndex": 32786, - "textRun": { - "content": " CheckboxBlock(this.text, this.isChecked);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32786 - }, - { - "endIndex": 32832, - "paragraph": { - "elements": [ - { - "endIndex": 32832, - "startIndex": 32830, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32830 - } - ], - "endIndex": 32832, - "startIndex": 32530, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 32834, - "paragraph": { - "elements": [ - { - "endIndex": 32834, - "startIndex": 32833, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32833 - }, - { - "endIndex": 32949, - "paragraph": { - "elements": [ - { - "endIndex": 32885, - "startIndex": 32834, - "textRun": { - "content": "Each of these classes corresponds to the different ", - "textStyle": {} - } - }, - { - "endIndex": 32889, - "startIndex": 32885, - "textRun": { - "content": "type", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32921, - "startIndex": 32889, - "textRun": { - "content": " values from the original JSON: ", - "textStyle": {} - } - }, - { - "endIndex": 32925, - "startIndex": 32921, - "textRun": { - "content": "'h1'", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32927, - "startIndex": 32925, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 32930, - "startIndex": 32927, - "textRun": { - "content": "'p'", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32936, - "startIndex": 32930, - "textRun": { - "content": ", and ", - "textStyle": {} - } - }, - { - "endIndex": 32946, - "startIndex": 32936, - "textRun": { - "content": "'checkbox'", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32949, - "startIndex": 32946, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32834 - }, - { - "endIndex": 32969, - "paragraph": { - "elements": [ - { - "endIndex": 32969, - "startIndex": 32949, - "textRun": { - "content": "Seal the superclass\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.g3xt9adlan98", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 32949 - }, - { - "endIndex": 32970, - "paragraph": { - "elements": [ - { - "endIndex": 32970, - "startIndex": 32969, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32969 - }, - { - "endIndex": 33127, - "paragraph": { - "bullet": { - "listId": "kix.h7q0mubnyxr0", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 32979, - "startIndex": 32970, - "textRun": { - "content": "Mark the ", - "textStyle": {} - } - }, - { - "endIndex": 32984, - "startIndex": 32979, - "textRun": { - "content": "Block", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32994, - "startIndex": 32984, - "textRun": { - "content": " class as ", - "textStyle": {} - } - }, - { - "endIndex": 33000, - "startIndex": 32994, - "textRun": { - "content": "sealed", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33099, - "startIndex": 33000, - "textRun": { - "content": ". Then, refactor the if-case as a switch expression that returns the subclass corresponding to the ", - "textStyle": {} - } - }, - { - "endIndex": 33103, - "startIndex": 33099, - "textRun": { - "content": "type", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33127, - "startIndex": 33103, - "textRun": { - "content": " specified in the JSON:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32970 - }, - { - "endIndex": 33141, - "paragraph": { - "elements": [ - { - "endIndex": 33140, - "startIndex": 33127, - "textRun": { - "content": "lib/data.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_12/lib/data.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 33141, - "startIndex": 33140, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.8e7nmbgjwwar", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 33127 - }, - { - "endIndex": 33582, - "startIndex": 33141, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 33581, - "startIndex": 33142, - "tableCells": [ - { - "content": [ - { - "endIndex": 33165, - "paragraph": { - "elements": [ - { - "endIndex": 33165, - "startIndex": 33144, - "textRun": { - "content": "sealed class Block {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33144 - }, - { - "endIndex": 33176, - "paragraph": { - "elements": [ - { - "endIndex": 33176, - "startIndex": 33165, - "textRun": { - "content": " Block();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33165 - }, - { - "endIndex": 33177, - "paragraph": { - "elements": [ - { - "endIndex": 33177, - "startIndex": 33176, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33176 - }, - { - "endIndex": 33231, - "paragraph": { - "elements": [ - { - "endIndex": 33231, - "startIndex": 33177, - "textRun": { - "content": " factory Block.fromJson(Map json) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33177 - }, - { - "endIndex": 33258, - "paragraph": { - "elements": [ - { - "endIndex": 33258, - "startIndex": 33231, - "textRun": { - "content": " return switch (json) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33231 - }, - { - "endIndex": 33322, - "paragraph": { - "elements": [ - { - "endIndex": 33322, - "startIndex": 33258, - "textRun": { - "content": " {'type': 'h1', 'text': String text} => HeaderBlock(text),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33258 - }, - { - "endIndex": 33388, - "paragraph": { - "elements": [ - { - "endIndex": 33388, - "startIndex": 33322, - "textRun": { - "content": " {'type': 'p', 'text': String text} => ParagraphBlock(text),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33322 - }, - { - "endIndex": 33464, - "paragraph": { - "elements": [ - { - "endIndex": 33464, - "startIndex": 33388, - "textRun": { - "content": " {'type': 'checkbox', 'text': String text, 'checked': bool checked} =>\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33388 - }, - { - "endIndex": 33502, - "paragraph": { - "elements": [ - { - "endIndex": 33502, - "startIndex": 33464, - "textRun": { - "content": " CheckboxBlock(text, checked),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33464 - }, - { - "endIndex": 33568, - "paragraph": { - "elements": [ - { - "endIndex": 33568, - "startIndex": 33502, - "textRun": { - "content": " _ => throw const FormatException('Unexpected JSON format'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33502 - }, - { - "endIndex": 33575, - "paragraph": { - "elements": [ - { - "endIndex": 33575, - "startIndex": 33568, - "textRun": { - "content": " };\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33568 - }, - { - "endIndex": 33579, - "paragraph": { - "elements": [ - { - "endIndex": 33579, - "startIndex": 33575, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33575 - }, - { - "endIndex": 33581, - "paragraph": { - "elements": [ - { - "endIndex": 33581, - "startIndex": 33579, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33579 - } - ], - "endIndex": 33581, - "startIndex": 33143, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 33583, - "paragraph": { - "elements": [ - { - "endIndex": 33583, - "startIndex": 33582, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33582 - }, - { - "endIndex": 33833, - "paragraph": { - "elements": [ - { - "endIndex": 33587, - "startIndex": 33583, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 33593, - "startIndex": 33587, - "textRun": { - "content": "sealed", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33607, - "startIndex": 33593, - "textRun": { - "content": " keyword is a ", - "textStyle": {} - } - }, - { - "endIndex": 33621, - "startIndex": 33607, - "textRun": { - "content": "class modifier", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 33641, - "startIndex": 33621, - "textRun": { - "content": " that means you can ", - "textStyle": {} - } - }, - { - "endIndex": 33676, - "startIndex": 33641, - "textRun": { - "content": "only extend or implement this class", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 33677, - "startIndex": 33676, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 33696, - "startIndex": 33677, - "textRun": { - "content": "in the same library", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 33832, - "startIndex": 33696, - "textRun": { - "content": ". Since the analyzer knows the subtypes of this class, it reports an error if a switch fails to cover one of them and isn't exhaustive. ", - "textStyle": {} - } - }, - { - "endIndex": 33833, - "startIndex": 33832, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33583 - }, - { - "endIndex": 33885, - "paragraph": { - "elements": [ - { - "endIndex": 33884, - "startIndex": 33833, - "textRun": { - "content": "Use a switch expression in order to display widgets", - "textStyle": {} - } - }, - { - "endIndex": 33885, - "startIndex": 33884, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.foj9vhgbov84", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 33833 - }, - { - "endIndex": 33993, - "paragraph": { - "bullet": { - "listId": "kix.owc2joioiufz", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 33896, - "startIndex": 33885, - "textRun": { - "content": "Update the ", - "textStyle": {} - } - }, - { - "endIndex": 33907, - "startIndex": 33896, - "textRun": { - "content": "BlockWidget", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.5019608, - "red": 0.09411765 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto Mono", - "weight": 400 - } - } - } - }, - { - "endIndex": 33917, - "startIndex": 33907, - "textRun": { - "content": " class in ", - "textStyle": {} - } - }, - { - "endIndex": 33926, - "startIndex": 33917, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33992, - "startIndex": 33926, - "textRun": { - "content": " with a switch expression that uses object patterns for each case:", - "textStyle": {} - } - }, - { - "endIndex": 33993, - "startIndex": 33992, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33885 - }, - { - "endIndex": 34007, - "paragraph": { - "elements": [ - { - "endIndex": 34006, - "startIndex": 33993, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/dart-patterns-and-records/step_12/lib/data.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 34007, - "startIndex": 34006, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.m6cm9c15guwi", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 33993 - }, - { - "endIndex": 34696, - "startIndex": 34007, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 34695, - "startIndex": 34008, - "tableCells": [ - { - "content": [ - { - "endIndex": 34054, - "paragraph": { - "elements": [ - { - "endIndex": 34054, - "startIndex": 34010, - "textRun": { - "content": "class BlockWidget extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34010 - }, - { - "endIndex": 34075, - "paragraph": { - "elements": [ - { - "endIndex": 34075, - "startIndex": 34054, - "textRun": { - "content": " final Block block;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34054 - }, - { - "endIndex": 34076, - "paragraph": { - "elements": [ - { - "endIndex": 34076, - "startIndex": 34075, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34075 - }, - { - "endIndex": 34098, - "paragraph": { - "elements": [ - { - "endIndex": 34098, - "startIndex": 34076, - "textRun": { - "content": " const BlockWidget({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34076 - }, - { - "endIndex": 34123, - "paragraph": { - "elements": [ - { - "endIndex": 34123, - "startIndex": 34098, - "textRun": { - "content": " required this.block,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34098 - }, - { - "endIndex": 34138, - "paragraph": { - "elements": [ - { - "endIndex": 34138, - "startIndex": 34123, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34123 - }, - { - "endIndex": 34144, - "paragraph": { - "elements": [ - { - "endIndex": 34144, - "startIndex": 34138, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34138 - }, - { - "endIndex": 34145, - "paragraph": { - "elements": [ - { - "endIndex": 34145, - "startIndex": 34144, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34144 - }, - { - "endIndex": 34157, - "paragraph": { - "elements": [ - { - "endIndex": 34157, - "startIndex": 34145, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34145 - }, - { - "endIndex": 34196, - "paragraph": { - "elements": [ - { - "endIndex": 34196, - "startIndex": 34157, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34157 - }, - { - "endIndex": 34218, - "paragraph": { - "elements": [ - { - "endIndex": 34218, - "startIndex": 34196, - "textRun": { - "content": " return Container(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34196 - }, - { - "endIndex": 34257, - "paragraph": { - "elements": [ - { - "endIndex": 34257, - "startIndex": 34218, - "textRun": { - "content": " margin: const EdgeInsets.all(8),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34218 - }, - { - "endIndex": 34287, - "paragraph": { - "elements": [ - { - "endIndex": 34287, - "startIndex": 34257, - "textRun": { - "content": " child: switch (block) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34257 - }, - { - "endIndex": 34329, - "paragraph": { - "elements": [ - { - "endIndex": 34329, - "startIndex": 34287, - "textRun": { - "content": " HeaderBlock(:final text) => Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34287 - }, - { - "endIndex": 34347, - "paragraph": { - "elements": [ - { - "endIndex": 34347, - "startIndex": 34329, - "textRun": { - "content": " text,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34329 - }, - { - "endIndex": 34409, - "paragraph": { - "elements": [ - { - "endIndex": 34409, - "startIndex": 34347, - "textRun": { - "content": " style: Theme.of(context).textTheme.displayMedium,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34347 - }, - { - "endIndex": 34422, - "paragraph": { - "elements": [ - { - "endIndex": 34422, - "startIndex": 34409, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34409 - }, - { - "endIndex": 34473, - "paragraph": { - "elements": [ - { - "endIndex": 34473, - "startIndex": 34422, - "textRun": { - "content": " ParagraphBlock(:final text) => Text(text),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34422 - }, - { - "endIndex": 34534, - "paragraph": { - "elements": [ - { - "endIndex": 34534, - "startIndex": 34473, - "textRun": { - "content": " CheckboxBlock(:final text, :final isChecked) => Row(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34473 - }, - { - "endIndex": 34558, - "paragraph": { - "elements": [ - { - "endIndex": 34558, - "startIndex": 34534, - "textRun": { - "content": " children: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34534 - }, - { - "endIndex": 34619, - "paragraph": { - "elements": [ - { - "endIndex": 34619, - "startIndex": 34558, - "textRun": { - "content": " Checkbox(value: isChecked, onChanged: (_) {}),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34558 - }, - { - "endIndex": 34645, - "paragraph": { - "elements": [ - { - "endIndex": 34645, - "startIndex": 34619, - "textRun": { - "content": " Text(text),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34619 - }, - { - "endIndex": 34660, - "paragraph": { - "elements": [ - { - "endIndex": 34660, - "startIndex": 34645, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34645 - }, - { - "endIndex": 34673, - "paragraph": { - "elements": [ - { - "endIndex": 34673, - "startIndex": 34660, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34660 - }, - { - "endIndex": 34682, - "paragraph": { - "elements": [ - { - "endIndex": 34682, - "startIndex": 34673, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34673 - }, - { - "endIndex": 34689, - "paragraph": { - "elements": [ - { - "endIndex": 34689, - "startIndex": 34682, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34682 - }, - { - "endIndex": 34693, - "paragraph": { - "elements": [ - { - "endIndex": 34693, - "startIndex": 34689, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34689 - }, - { - "endIndex": 34695, - "paragraph": { - "elements": [ - { - "endIndex": 34695, - "startIndex": 34693, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34693 - } - ], - "endIndex": 34695, - "startIndex": 34009, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 34697, - "paragraph": { - "elements": [ - { - "endIndex": 34697, - "startIndex": 34696, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34696 - }, - { - "endIndex": 34980, - "paragraph": { - "elements": [ - { - "endIndex": 34722, - "startIndex": 34697, - "textRun": { - "content": "In your first version of ", - "textStyle": {} - } - }, - { - "endIndex": 34733, - "startIndex": 34722, - "textRun": { - "content": "BlockWidget", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34764, - "startIndex": 34733, - "textRun": { - "content": ", you switched on a field of a ", - "textStyle": {} - } - }, - { - "endIndex": 34769, - "startIndex": 34764, - "textRun": { - "content": "Block", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34798, - "startIndex": 34769, - "textRun": { - "content": " object in order to return a ", - "textStyle": {} - } - }, - { - "endIndex": 34807, - "startIndex": 34798, - "textRun": { - "content": "TextStyle", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34809, - "startIndex": 34807, - "textRun": { - "content": ". ", - "textStyle": {} - } - }, - { - "endIndex": 34844, - "startIndex": 34809, - "textRun": { - "content": "Now, you switch an instance of the ", - "textStyle": {} - } - }, - { - "endIndex": 34849, - "startIndex": 34844, - "textRun": { - "content": "Block", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34882, - "startIndex": 34849, - "textRun": { - "content": " object itself and match against ", - "textStyle": {} - } - }, - { - "endIndex": 34897, - "startIndex": 34882, - "textRun": { - "content": "object patterns", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 34980, - "startIndex": 34897, - "textRun": { - "content": " that represent its subclasses, extracting the object’s properties in the process.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34697 - }, - { - "endIndex": 34981, - "paragraph": { - "elements": [ - { - "endIndex": 34981, - "startIndex": 34980, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34980 - }, - { - "endIndex": 35103, - "paragraph": { - "elements": [ - { - "endIndex": 35081, - "startIndex": 34981, - "textRun": { - "content": "The Dart analyzer can check that each subclass is handled in the switch expression because you made ", - "textStyle": {} - } - }, - { - "endIndex": 35086, - "startIndex": 35081, - "textRun": { - "content": "Block", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35087, - "startIndex": 35086, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 35103, - "startIndex": 35087, - "textRun": { - "content": "a sealed class.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34981 - }, - { - "endIndex": 35104, - "paragraph": { - "elements": [ - { - "endIndex": 35104, - "startIndex": 35103, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 35103 - }, - { - "endIndex": 35215, - "startIndex": 35104, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 35214, - "startIndex": 35105, - "tableCells": [ - { - "content": [ - { - "endIndex": 35212, - "paragraph": { - "elements": [ - { - "endIndex": 35119, - "startIndex": 35107, - "textRun": { - "content": "Try it out: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 35212, - "startIndex": 35119, - "textRun": { - "content": "Try removing one of the subclass cases from the switch expression and see the error kick in:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35107 - }, - { - "endIndex": 35214, - "paragraph": { - "elements": [ - { - "endIndex": 35213, - "inlineObjectElement": { - "inlineObjectId": "kix.9j9m3o5h8cgz", - "textStyle": {} - }, - "startIndex": 35212 - }, - { - "endIndex": 35214, - "startIndex": 35213, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35212 - } - ], - "endIndex": 35214, - "startIndex": 35106, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8039216, - "green": 0.8980392, - "red": 0.9882353 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 35216, - "paragraph": { - "elements": [ - { - "endIndex": 35216, - "startIndex": 35215, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 35215 - }, - { - "endIndex": 35377, - "paragraph": { - "elements": [ - { - "endIndex": 35303, - "startIndex": 35216, - "textRun": { - "content": "Also note that using a switch expression here lets you pass the result directly to the ", - "textStyle": {} - } - }, - { - "endIndex": 35308, - "startIndex": 35303, - "textRun": { - "content": "child", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35376, - "startIndex": 35308, - "textRun": { - "content": " element, as opposed to the separate return statement needed before.", - "textStyle": {} - } - }, - { - "endIndex": 35377, - "startIndex": 35376, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 35216 - }, - { - "endIndex": 35378, - "paragraph": { - "elements": [ - { - "endIndex": 35378, - "startIndex": 35377, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 35377 - }, - { - "endIndex": 35448, - "paragraph": { - "bullet": { - "listId": "kix.owc2joioiufz", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 35447, - "startIndex": 35378, - "textRun": { - "content": "Hot reload to see the checkbox JSON data rendered for the first time:", - "textStyle": {} - } - }, - { - "endIndex": 35448, - "startIndex": 35447, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35378 - }, - { - "endIndex": 35450, - "paragraph": { - "elements": [ - { - "endIndex": 35449, - "inlineObjectElement": { - "inlineObjectId": "kix.2vt8xivqsaai", - "textStyle": {} - }, - "startIndex": 35448 - }, - { - "endIndex": 35450, - "startIndex": 35449, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 35448 - }, - { - "endIndex": 35629, - "startIndex": 35450, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 35628, - "startIndex": 35451, - "tableCells": [ - { - "content": [ - { - "endIndex": 35626, - "paragraph": { - "elements": [ - { - "endIndex": 35465, - "startIndex": 35453, - "textRun": { - "content": "Try it out: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 35495, - "startIndex": 35465, - "textRun": { - "content": "Try changing the value of the ", - "textStyle": {} - } - }, - { - "endIndex": 35502, - "startIndex": 35495, - "textRun": { - "content": "checked", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35514, - "startIndex": 35502, - "textRun": { - "content": " key in the ", - "textStyle": {} - } - }, - { - "endIndex": 35522, - "startIndex": 35514, - "textRun": { - "content": "Document", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35548, - "startIndex": 35522, - "textRun": { - "content": " class, where you defined ", - "textStyle": {} - } - }, - { - "endIndex": 35560, - "startIndex": 35548, - "textRun": { - "content": "documentJson", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35564, - "startIndex": 35560, - "textRun": { - "content": " to ", - "textStyle": {} - } - }, - { - "endIndex": 35568, - "startIndex": 35564, - "textRun": { - "content": "true", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35580, - "startIndex": 35568, - "textRun": { - "content": " instead of ", - "textStyle": {} - } - }, - { - "endIndex": 35585, - "startIndex": 35580, - "textRun": { - "content": "false", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35626, - "startIndex": 35585, - "textRun": { - "content": ". Hot reload again to see the UI update!\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 35453 - }, - { - "endIndex": 35628, - "paragraph": { - "elements": [ - { - "endIndex": 35627, - "inlineObjectElement": { - "inlineObjectId": "kix.hkv7ogwidmgz", - "textStyle": {} - }, - "startIndex": 35626 - }, - { - "endIndex": 35628, - "startIndex": 35627, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 35626 - } - ], - "endIndex": 35628, - "startIndex": 35452, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 35630, - "paragraph": { - "elements": [ - { - "endIndex": 35630, - "startIndex": 35629, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.garrhsvz303o", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 35629 - }, - { - "endIndex": 35646, - "paragraph": { - "elements": [ - { - "endIndex": 35646, - "startIndex": 35630, - "textRun": { - "content": "Congratulations\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.s22qmcj4zu61", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 35630 - }, - { - "endIndex": 35661, - "paragraph": { - "elements": [ - { - "endIndex": 35660, - "startIndex": 35646, - "textRun": { - "content": "Duration: 0:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 35661, - "startIndex": 35660, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35646 - }, - { - "endIndex": 35662, - "paragraph": { - "elements": [ - { - "endIndex": 35662, - "startIndex": 35661, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35661 - }, - { - "endIndex": 35918, - "paragraph": { - "elements": [ - { - "endIndex": 35894, - "startIndex": 35662, - "textRun": { - "content": "You successfully experimented with patterns, records, enhanced switch and case, and sealed classes. You covered a lot of information—but only barely scratched the surface of these features. For more information on patterns, see the ", - "textStyle": {} - } - }, - { - "endIndex": 35915, - "startIndex": 35894, - "textRun": { - "content": "feature specification", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/dart-lang/language/blob/master/accepted/future-releases/0546-patterns/feature-specification.md" - }, - "underline": true - } - } - }, - { - "endIndex": 35916, - "startIndex": 35915, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 35918, - "startIndex": 35916, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35662 - }, - { - "endIndex": 35919, - "paragraph": { - "elements": [ - { - "endIndex": 35919, - "startIndex": 35918, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35918 - }, - { - "endIndex": 36114, - "paragraph": { - "elements": [ - { - "endIndex": 36079, - "startIndex": 35919, - "textRun": { - "content": "The different pattern types, different contexts in which they can appear, and the potential nesting of subpatterns make the possibilities in behavior seemingly ", - "textStyle": {} - } - }, - { - "endIndex": 36086, - "startIndex": 36079, - "textRun": { - "content": "endless", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 36114, - "startIndex": 36086, - "textRun": { - "content": ". But they’re easy to see. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35919 - }, - { - "endIndex": 36115, - "paragraph": { - "elements": [ - { - "endIndex": 36115, - "startIndex": 36114, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 36114 - }, - { - "endIndex": 36291, - "paragraph": { - "elements": [ - { - "endIndex": 36290, - "startIndex": 36115, - "textRun": { - "content": "You can imagine all kinds of ways to display content in Flutter using patterns. Using patterns, you can safely extract data in order to build your UI in a few lines of code. ", - "textStyle": {} - } - }, - { - "endIndex": 36291, - "startIndex": 36290, - "textRun": { - "content": "\n", - "textStyle": { - "italic": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 36115 - }, - { - "endIndex": 36304, - "paragraph": { - "elements": [ - { - "endIndex": 36304, - "startIndex": 36291, - "textRun": { - "content": "What’s next?\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.9mqifffit2ew", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 36291 - }, - { - "endIndex": 36452, - "paragraph": { - "bullet": { - "listId": "kix.wvu40wq536ni", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 36408, - "startIndex": 36304, - "textRun": { - "content": "Check out the documentation on patterns, records, enhanced switch and cases, and class modifiers in the ", - "textStyle": {} - } - }, - { - "endIndex": 36424, - "startIndex": 36408, - "textRun": { - "content": "Language section", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://dart.dev/language" - }, - "underline": true - } - } - }, - { - "endIndex": 36451, - "startIndex": 36424, - "textRun": { - "content": " of the Dart documentation.", - "textStyle": {} - } - }, - { - "endIndex": 36452, - "startIndex": 36451, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36304 - }, - { - "endIndex": 36467, - "paragraph": { - "elements": [ - { - "endIndex": 36467, - "startIndex": 36452, - "textRun": { - "content": "Reference docs\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.an95hoqxrlhg", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 36452 - }, - { - "endIndex": 36543, - "paragraph": { - "elements": [ - { - "endIndex": 36514, - "startIndex": 36467, - "textRun": { - "content": "See the full sample code, step by step, in the ", - "textStyle": {} - } - }, - { - "endIndex": 36530, - "startIndex": 36514, - "textRun": { - "content": "flutter/codelabs", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/tree/main/dart-patterns-and-records" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36541, - "startIndex": 36530, - "textRun": { - "content": " repository", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/tree/main/dart-patterns-and-records" - }, - "underline": true - } - } - }, - { - "endIndex": 36543, - "startIndex": 36541, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36467 - }, - { - "endIndex": 36544, - "paragraph": { - "elements": [ - { - "endIndex": 36544, - "startIndex": 36543, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36543 - }, - { - "endIndex": 36630, - "paragraph": { - "elements": [ - { - "endIndex": 36630, - "startIndex": 36544, - "textRun": { - "content": "For in-depth specifications for each new feature, check out the original design docs:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36544 - }, - { - "endIndex": 36639, - "paragraph": { - "bullet": { - "listId": "kix.3ow5k7pnx7ga", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 36638, - "startIndex": 36630, - "textRun": { - "content": "Patterns", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/dart-lang/language/blob/master/accepted/future-releases/0546-patterns/feature-specification.md" - }, - "underline": true - } - } - }, - { - "endIndex": 36639, - "startIndex": 36638, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36630 - }, - { - "endIndex": 36647, - "paragraph": { - "bullet": { - "listId": "kix.3ow5k7pnx7ga", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 36646, - "startIndex": 36639, - "textRun": { - "content": "Records", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/dart-lang/language/blob/master/accepted/future-releases/records/records-feature-specification.md" - }, - "underline": true - } - } - }, - { - "endIndex": 36647, - "startIndex": 36646, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36639 - }, - { - "endIndex": 36671, - "paragraph": { - "bullet": { - "listId": "kix.3ow5k7pnx7ga", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 36670, - "startIndex": 36647, - "textRun": { - "content": "Exhaustiveness checking", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/dart-lang/language/blob/master/accepted/future-releases/0546-patterns/exhaustiveness.md" - }, - "underline": true - } - } - }, - { - "endIndex": 36671, - "startIndex": 36670, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36647 - }, - { - "endIndex": 36686, - "paragraph": { - "bullet": { - "listId": "kix.3ow5k7pnx7ga", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 36685, - "startIndex": 36671, - "textRun": { - "content": "Sealed classes", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/dart-lang/language/blob/master/accepted/future-releases/sealed-types/feature-specification.md" - }, - "underline": true - } - } - }, - { - "endIndex": 36686, - "startIndex": 36685, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36671 - }, - { - "endIndex": 36687, - "paragraph": { - "elements": [ - { - "endIndex": 36687, - "startIndex": 36686, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.30980393, - "green": 0.65882355, - "red": 0.41568628 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 36686 - } - ] - }, - "documentId": "17L9jk2dhTFrdEqyLb6Wxhq0NeRrtzpQLLJv09qROsA8", - "documentStyle": { - "background": { - "color": {} - }, - "defaultHeaderId": "kix.ldti39ul455", - "marginBottom": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72.0, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792.0, - "unit": "PT" - }, - "width": { - "magnitude": 612.0, - "unit": "PT" - } - } - }, - "headers": { - "kix.ldti39ul455": { - "content": [ - { - "endIndex": 1, - "paragraph": { - "elements": [ - { - "endIndex": 1, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - } - } - ], - "headerId": "kix.ldti39ul455" - } - }, - "inlineObjects": { - "kix.2vt8xivqsaai": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "A screenshot of the app that displays the checkbox 'Learn Dart 3'", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/LxocZBIoJI6-zdCJTTsNsDb28JK0raQ5gbz-W6fOhCyyo54apgksVuvpAjRmF7lN8AhD9apIPeOyjxQbXd9h4gTlojZIDayUuBtDjFZEo3AxHzYWVO0w5P5qydA6ndEaeEqAxmhP7GLsbayjet0CJLxrb3sor7CaHZJCgqY997O7pvPXVrsxl0bjqkn_S1ga55cDZqPr", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 380.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.2vt8xivqsaai" - }, - "kix.60qoxad1aw8": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "A screenshot of the app that displays a string 'Last modified: 2 weeks ago' using the formatDate() function.", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/LcjqDDR0MkwZBDeR_zxhYlbHEzFYKPhDF3frfU4512YuL36apbncEZpD_1GpdvWoJ4LZc-gXtKhu27o-Wkk697zj_nIvX1hmU7yHe4HXhx63GvtihYEbnBiYUXzdKYxeRSAMlca1fOvx-l3j5VhTP1-ZVNt7WoWQBAabb8pDSKX79VX6oeXbXZfL-L9SbOg5_cE0yC2a", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 380.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.60qoxad1aw8" - }, - "kix.9j9m3o5h8cgz": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "A screenshot of a warning in VS Code that warns that not all cases are exhaustively checked.", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/0sovsx2wT0y2-LgeFVZuqu0FSGCQGzzS1esRXQC7MWy1Ttdt6XT2tGG0o3jf31IOy6lWHB5ffgiFKYGWHTP9SEaPsBxfwCiuCiAbFrUB6RIJfQU0zf-qr3-dmmI1H2GPqCGRfXOl3PigCTSuh1bhbdy63xIwt8cYInbX6Cz_bSuMLbQD13UXLfv66QNRr56ePNxshMt3", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 74.0, - "unit": "PT" - }, - "width": { - "magnitude": 457.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.9j9m3o5h8cgz" - }, - "kix.aljudv3bph0l": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "Screenshot of the app displaying content from the 'blocks' section of the JSON data.", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/mqVuLFKDmKC3K8nLvBXCypJxJ1zArzOkaKhM-x04ULtaC-dSTz7fETGHQdwUuoqO7Pmw303vJ6DZfQMvYOCGcJM3pgeVIZNJ5MVxUffa6OfBDNdJBSMQHG2_2SIwyS6RJ4Eqd3UoT42_jeJZlsnzfXDFPv0C1RZ3kHxxYBUDEEgiGdEKJkABWkpDxoerxh81aHi-0LiZ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 380.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.aljudv3bph0l" - }, - "kix.bmryu6vhq6z": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "A screenshot of the application built in this step.", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/-zn_EmzlI2ICIRSzOZ7x_ruzUIs8_jzKq5AHdwcbqsL749Wx9EGS5-utpED44KLBCC3K8lQYEACvc5Gmj4ClCHxtXRpvMpQYPqLIXnwPr4a6ha2dZELsDed3uj2_PqwYooMRBiQN91nAEPcRAPsNxqWlmDX2e2PI6e_CtMcFo80I-vjVRiMIog3MXMH1g6LBBqeWplxR", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 380.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.bmryu6vhq6z" - }, - "kix.ctv7dbuxjvub": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "The final application you build in this codelab, a document with a title, the last modification date, headers and paragraphs.", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/rpvXm2SClTeygPAwBe6fnm0hc2yuq6EXO5OKJraTwoQAfCyJ-6drne7KS3xuaUzrfZpa6sIYKQ1GOQJcjROhKsh9appF5YV7mW8dSY-ghAwxt6GKGcOmILIJl_lS8phuUmFdxhu1dsakKJZfh5wM2lnA_baJCXdQ8gO1fGv8kwNQMh6wXM1VITRDfo7W2xA5iUm10IUJ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 380.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ctv7dbuxjvub" - }, - "kix.hkv7ogwidmgz": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "A screenshot of the app that contains a checkbox 'Learn Dart 3' that is now checked.", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/ghGgmQCw4kdLqKaQwQ2-p5vBF580o70zZ6Vk5BAwg--Vg2YN0RbjS-k4w6ja4xZt2PoCzj_PCh3YAQjqm5xn8rB6-kSfo2FLHasSQVVi23vgCNNqsVUaY7SHZzFrhXfb_qPDkT9gEFFz9_N9DyzfnRYbgnQ11OXo3Kvezum06IRjxjjqqvpz8RgIeHRG9se9E-yV-ZaF", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 371.0, - "unit": "PT" - }, - "width": { - "magnitude": 457.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.hkv7ogwidmgz" - }, - "kix.nsv6tkuk1bk8": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "An image of the 'Run and debug' button, available in 'Run and debug' section of the activity bar on the left hand side.", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/VZkiL9GAYU_3shld1rVYDhIhLvJ9KeBCHuqpQIQRJniCILSBOZ5iqPua_BJMHwST1Q18c0ZdYhPxrgiZPZB8EkTLVtOnGD92zjkldXyQ6ojhNDIPGfcDeyDUVBVEcHNuwGj0djIBXrLWgPivkRNNeLuWM4QdwaET7bcy9voUtj5eCtkrbWFnh-F-OGZSNk6fd1ZBcbAl", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 304.875, - "unit": "PT" - }, - "width": { - "magnitude": 280.4459134615385, - "unit": "PT" - } - } - } - }, - "objectId": "kix.nsv6tkuk1bk8" - }, - "kix.qfmyzzrv0fkx": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "A screenshot of VS Code displaying the project created with the 'flutter create' command.", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/O9FAilaxzlwDClZpjAi3woD20NfS371Tzj_grVM4hAorCGD0Sh1PrjgRz3aDmJwNXf6avbOxeEvdy28GwJzpD6bNABJJ9DzO1S9TOF0Bz-39HeP7UusNoD-rMqiByhv7CuVkh1uOuWW_ELgddbki2YBL1v2lj8UGE4DrmsBs3vasrGixDNOcoAEbcCLWF8z0YBRTeDb7", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 362.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qfmyzzrv0fkx" - }, - "kix.s1jfj82jdcu4": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "A screenshot of the app, which displays the title and modified date.", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/TeFHvLsTjVE4Mf5B2Uy88We3zr0Kw6nT-ZD5MWgXGZQ42aLc5EjC3vdnyOO9ACdPWiTpeMj0sxEb0AubqNwWqP7kPaas1BSpPXeNOokLB8bxtHd9oumWA9CZh9rmhrnV-ZTkt4enXDXZh9Yu2Gjsfa4YFqL2i3LW-ROL33cMeTFYpYsg0EzHhlSAJTdrHPuW7LHfattp", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 380.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.s1jfj82jdcu4" - }, - "kix.tnem4r9wfxkz": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "A screenshot of the 'convert to switch expression' assist available in VS Code.", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/EJSdGV5x7fqQyOT3GOVZgkInvG1tBvsZ_NPxI3l7HHGgD8m-zQlV9swlVCsQ60RjJkC1qjDcnfmu0m5l_vscv99CtuRclhDvUMLAHCHlhag5ADKcMwFVuqAfMe2a-GGyR7ckg2LeoKmnsJBUiPR2RS_D0mgARJZp7B6jdJ15xFnC-EhY5YwEBkr84c6y0NFixzKi_-lH", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 198.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.tnem4r9wfxkz" - }, - "kix.zbxtro32lc4c": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "A screenshot of the target platform selector in VS Code.", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/84R282BeXX7meOADeWBmYyU87RSNzV8aN5_xvTyd3AjIABlkC9Fy4kr1OJR8vLoDc96xvVArbUGVkbb4660uGn0YPRKUKGdU80aMr46W2Rz5fYNh6ts6FPp3f6G__R0LjTtfh5m3lIcP_-01cKy67LY56CdzSUWCzsmZTQcxCLEp5yNLSUzEOXJo6lsDinX4kgehyc67", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 160.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.zbxtro32lc4c" - } - }, - "lists": { - "kix.1tjhv41sn0xa": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.1ztzk92hrth8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.242u43sl0yx2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.29md3ly3lepf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2ctr6ys6ni0e": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2gaihzs8s2ee": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2jnyqucbt2t6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2s25y2v84mq6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2whi3gkwlssd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3cjxume1ox5j": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3dvia6cjfor2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3l2774habcsr": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3ow5k7pnx7ga": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.43xuk7egr0s7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4ojr2d3yr7nz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4x1zl3kbw569": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4yb7edsq6e7h": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.58ht9hwr19e3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5hb992swn8xf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5jdr984vfzt1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5q2x329ym1hh": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.26666668, - "green": 0.26666668, - "red": 0.26666668 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5qwnfoilsrt1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5xnshm3wa472": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6f05htw8422z": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6fpfw8gudx4f": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6gnjj5cgrcnt": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6i1on1k3iuin": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6j918luqnpw7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6m37iee3p8wg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.73xf6whm0eds": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7c0e2x8uy18q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7cnpkqyuk55g": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7or0vngkfvx7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7uh5pgoi33tb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7unw3ed52cvl": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7zli105oii42": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.83lp1z9knfuo": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.8bm96xhzoe5y": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.8rkybgc0eke": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.92njtm9f6jkd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.98e48u1wcy7a": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.98vmteiu60y4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9k9nrzl80p49": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9kx8oi36elid": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9pk2r7tbztni": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9u3cg917bqs8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9ueckdtpugb1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9uhh20xkbn6m": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9z83l2c17pcu": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.a3xmjtope7n9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.a4bdodccweep": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.a9n5e5f1az1v": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.agpmvda4vr7h": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.an6zxid0uolo": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.anq6omciu13j": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ao8m1u77ptws": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 9.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.13333334, - "green": 0.13333334, - "red": 0.13333334 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 9.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.13333334, - "green": 0.13333334, - "red": 0.13333334 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.as2n1giwwdse": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.b1f0apbixzro": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.b7qotwh7gtna": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.bmk2w9stijyg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.c7ejcv2rhol9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cbv3p81ktfkm": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ch36e5q38239": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cnamwo3k2086": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cnrmyad97l0c": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.crxhbxpwrhf5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cvq51i3qoyu5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cw1c2jqsuto": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cxasg6ivb43i": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.d8meck8mgbh6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.dt4hcarn6v3s": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.e3w5dzmwqs7s": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.e7rm6cchwfxs": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.enu2fgnbdejh": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.f3mtn21egf47": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.f9bz4vrobr4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fa4ji89str8f": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fg889guo8ue2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fj7194xw5fjn": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fxg6r2ea28qw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g0n6mr9338xd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g801zwj9tdo5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g846847cbhgd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g8ukrj6l25im": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.gawmxw84fbl": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.gpkppvve7lf6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.h7q0mubnyxr0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.h91oxjavbxs": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.hhw26oq82tbj": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.hnxe8uaki5ye": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.huc4gmkwuq3u": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ibwufjck5e1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ighvy8mje2ni": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 342.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 360.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 378.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 396.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 414.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 432.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.imsafi72ulmz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.j2ckn4bxfuh7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jhke3wkzan7s": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jkp7jly57b9l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jthb937lwrgi": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jus06vdmlro7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.k0g7fgw2pxb9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.k644zz41ai58": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kh0gu8ggzrfl": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kjyum9q5klsd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kmgukliniasp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l2nxb9cf1l7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l36nsyz7nfdm": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l9tvvj4pt5te": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.leupdeo3omsb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.lgekdwzh9r79": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.m4wzpkxru5e2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.mjlhrnhvhdy4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.mn4kck4i9su5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.mq7j6bh64ejd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.mqctj3bturgq": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.my7kdbk31nco": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.nw9e0rbdtf2n": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.o6y9eyfrksu6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.o72pyift6jdv": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.odzjfc6rqek1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.oerq1n8ypay0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.oh906fh7glv8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.oowm3okhp1if": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.orlmx6e2glni": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.owc2joioiufz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.pcizye4e9dah": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.phibiqsq7jjd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.pvf8i7z50kj2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.q5glzqgk6j58": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.q5h44jiozc91": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.q759u59r2yjj": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qk785s5gz3e7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qnkbj287noea": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qvkatskfprp3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qx7bo6w9dag0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.r51tyrttcax1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.r8m6khspk25u": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rla1petjmkkw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rr7za3dc2v02": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rrgd3s9e8n6q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ruo5b0i6xyk": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rup19lwpb96r": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.s154rj5xcbab": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.s3ytlwab2m4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.sbrgqgu1eihb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.sjzj7ysn5gcf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.slxd9egkb7ci": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.sqqfdjlv2hm9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ss5r6gmvu828": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.swc20l9iro9p": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.t0z3ko6guoqz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.t55mzdddlz10": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tismz98me1tb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tjxkb9tlcarv": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tobmpp8mbh7q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tp7tyr4v6ukt": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tsgw4oeo22hd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.u1nuvkrm9h9f": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ugzokp4cwudf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ul9cgkeua5dp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ulxzvayuxl7p": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.uye62wdrnhk7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.v58qrdjinxbw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vada968rkket": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vc2fcwdxd37v": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vjp0z582afkw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vjwh1q79kyod": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vqg3y0tuey4i": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vqia47e8h1og": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vwvs454chlx5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.w3xdpsln97hm": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wa0nkis9zlxf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wvtqhihdjvtw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wvu40wq536ni": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.x2xqmh4hm4pa": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.xj4zd89gdvlp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.y4auuiny9mus": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 342.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 360.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 378.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 396.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.y57tybes7g6b": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ys8rp5gxh2y2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z1u1i7qvii2l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z25dkq3ogzpp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z2hyt12r7kc1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z46ih1vlabol": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6fjw6cht0bf", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ecgsg25eeya7", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.4pgk284l6s7z", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.9ujhi55jbp4b", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_4", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.yjfswb1t0sub", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_5", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.91dfhsx5n4l3", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_6", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.uvzknuxefxg9", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "TITLE", - "pageBreakBefore": false - }, - "textStyle": { - "fontSize": { - "magnitude": 21.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - ] - }, - "revisionId": "ANeT5PQpeoK4ecgbeGzkWjExyAhyuIuHqYPuSj1gjw8lJ0f7BmbGuTC7REmQ8QMpuUrfgQbpeiAOPl_DbBsLGA", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "title": "Dive into Dart’s patterns and records - revised" -} \ No newline at end of file diff --git a/tooling/claat_export_images/test/data/exports/1CdlksSvxBE2XRBVZtOKpfMUO68OLJDLdQc7mxN_zABg.json b/tooling/claat_export_images/test/data/exports/1CdlksSvxBE2XRBVZtOKpfMUO68OLJDLdQc7mxN_zABg.json deleted file mode 100644 index 78a65e270c..0000000000 --- a/tooling/claat_export_images/test/data/exports/1CdlksSvxBE2XRBVZtOKpfMUO68OLJDLdQc7mxN_zABg.json +++ /dev/null @@ -1,163567 +0,0 @@ -{ - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 40, - "paragraph": { - "elements": [ - { - "endIndex": 40, - "startIndex": 1, - "textRun": { - "content": "Building a Cupertino app with Flutter \n", - "textStyle": { - "fontSize": { - "magnitude": 21.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "headingId": "h.jztxf2i9w61x", - "namedStyleType": "TITLE", - "pageBreakBefore": false, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1 - }, - { - "endIndex": 41, - "paragraph": { - "elements": [ - { - "endIndex": 41, - "startIndex": 40, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 40 - }, - { - "endIndex": 71, - "paragraph": { - "elements": [ - { - "endIndex": 70, - "startIndex": 41, - "textRun": { - "content": "Last update: 5/11/2020, brett", - "textStyle": { - "fontSize": { - "magnitude": 8.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 71, - "startIndex": 70, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "END", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41 - }, - { - "endIndex": 522, - "startIndex": 71, - "table": { - "columns": 2, - "rows": 7, - "tableRows": [ - { - "endIndex": 265, - "startIndex": 72, - "tableCells": [ - { - "content": [ - { - "endIndex": 82, - "paragraph": { - "elements": [ - { - "endIndex": 82, - "startIndex": 74, - "textRun": { - "content": "Summary\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 74 - } - ], - "endIndex": 82, - "startIndex": 73, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 265, - "paragraph": { - "elements": [ - { - "endIndex": 265, - "startIndex": 83, - "textRun": { - "content": "In this codelab, you’ll learn how to build an iOS style app with three tabs using the Cupertino widget library. You’ll also learn one approach to managing state across the screens.\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 83 - } - ], - "endIndex": 265, - "startIndex": 82, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 299, - "startIndex": 265, - "tableCells": [ - { - "content": [ - { - "endIndex": 271, - "paragraph": { - "elements": [ - { - "endIndex": 271, - "startIndex": 267, - "textRun": { - "content": "URL\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 267 - } - ], - "endIndex": 271, - "startIndex": 266, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 299, - "paragraph": { - "elements": [ - { - "endIndex": 299, - "startIndex": 272, - "textRun": { - "content": "codelabs/flutter-cupertino\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 272 - } - ], - "endIndex": 299, - "startIndex": 271, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 319, - "startIndex": 299, - "tableCells": [ - { - "content": [ - { - "endIndex": 310, - "paragraph": { - "elements": [ - { - "endIndex": 310, - "startIndex": 301, - "textRun": { - "content": "Category\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 301 - } - ], - "endIndex": 310, - "startIndex": 300, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 319, - "paragraph": { - "elements": [ - { - "endIndex": 319, - "startIndex": 311, - "textRun": { - "content": "Flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 311 - } - ], - "endIndex": 319, - "startIndex": 310, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 366, - "startIndex": 319, - "tableCells": [ - { - "content": [ - { - "endIndex": 333, - "paragraph": { - "elements": [ - { - "endIndex": 333, - "startIndex": 321, - "textRun": { - "content": "Environment\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 321 - } - ], - "endIndex": 333, - "startIndex": 320, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 366, - "paragraph": { - "elements": [ - { - "endIndex": 366, - "startIndex": 334, - "textRun": { - "content": "web, kiosk, io2019, tag-flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 334 - } - ], - "endIndex": 366, - "startIndex": 333, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 386, - "startIndex": 366, - "tableCells": [ - { - "content": [ - { - "endIndex": 375, - "paragraph": { - "elements": [ - { - "endIndex": 375, - "startIndex": 368, - "textRun": { - "content": "Status\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 368 - } - ], - "endIndex": 375, - "startIndex": 367, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 386, - "paragraph": { - "elements": [ - { - "endIndex": 386, - "startIndex": 376, - "textRun": { - "content": "Published\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 376 - } - ], - "endIndex": 386, - "startIndex": 375, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 445, - "startIndex": 386, - "tableCells": [ - { - "content": [ - { - "endIndex": 402, - "paragraph": { - "elements": [ - { - "endIndex": 402, - "startIndex": 388, - "textRun": { - "content": "Feedback Link\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 388 - } - ], - "endIndex": 402, - "startIndex": 387, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 445, - "paragraph": { - "elements": [ - { - "endIndex": 444, - "startIndex": 403, - "textRun": { - "content": "https://github.com/flutter/website/issues", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/website/issues" - }, - "underline": true - } - } - }, - { - "endIndex": 445, - "startIndex": 444, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 403 - } - ], - "endIndex": 445, - "startIndex": 402, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 521, - "startIndex": 445, - "tableCells": [ - { - "content": [ - { - "endIndex": 454, - "paragraph": { - "elements": [ - { - "endIndex": 454, - "startIndex": 447, - "textRun": { - "content": "Author\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 447 - } - ], - "endIndex": 454, - "startIndex": 446, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 521, - "paragraph": { - "elements": [ - { - "endIndex": 521, - "startIndex": 455, - "textRun": { - "content": "Shams Zakhour (shaza@), code author: Brett Morgan (brettmorgan@)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 455 - } - ], - "endIndex": 521, - "startIndex": 454, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "width": { - "magnitude": 101.25, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - }, - { - "width": { - "magnitude": 366.75, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - } - ] - } - } - }, - { - "endIndex": 523, - "paragraph": { - "elements": [ - { - "endIndex": 523, - "startIndex": 522, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 522 - }, - { - "endIndex": 524, - "paragraph": { - "elements": [ - { - "endIndex": 524, - "startIndex": 523, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 523 - }, - { - "endIndex": 1385, - "startIndex": 524, - "tableOfContents": { - "content": [ - { - "endIndex": 556, - "paragraph": { - "elements": [ - { - "endIndex": 555, - "startIndex": 525, - "textRun": { - "content": "NOTES (not visible externally)", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.s13wmcdxanl" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 556, - "startIndex": 555, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 525 - }, - { - "endIndex": 562, - "paragraph": { - "elements": [ - { - "endIndex": 561, - "startIndex": 556, - "textRun": { - "content": "TO DO", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.82wq77yl3tm2" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 562, - "startIndex": 561, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 556 - }, - { - "endIndex": 575, - "paragraph": { - "elements": [ - { - "endIndex": 574, - "startIndex": 562, - "textRun": { - "content": "Introduction", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.fen57cnztjix" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 575, - "startIndex": 574, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 562 - }, - { - "endIndex": 609, - "paragraph": { - "elements": [ - { - "endIndex": 608, - "startIndex": 575, - "textRun": { - "content": "What you’ll learn in this codelab", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.db9039bczytp" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 609, - "startIndex": 608, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 575 - }, - { - "endIndex": 657, - "paragraph": { - "elements": [ - { - "endIndex": 656, - "startIndex": 609, - "textRun": { - "content": "What would you like to learn from this codelab?", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.b7nxsg514qu3" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 657, - "startIndex": 656, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 609 - }, - { - "endIndex": 689, - "paragraph": { - "elements": [ - { - "endIndex": 688, - "startIndex": 657, - "textRun": { - "content": "Set up your Flutter environment", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.s4w3ehenj8fg" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 689, - "startIndex": 688, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 657 - }, - { - "endIndex": 722, - "paragraph": { - "elements": [ - { - "endIndex": 721, - "startIndex": 689, - "textRun": { - "content": "Create the initial Cupertino app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.y50a87mee90y" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 722, - "startIndex": 721, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 689 - }, - { - "endIndex": 736, - "paragraph": { - "elements": [ - { - "endIndex": 735, - "startIndex": 722, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ugeqcf3aw7wl" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 736, - "startIndex": 735, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 722 - }, - { - "endIndex": 752, - "paragraph": { - "elements": [ - { - "endIndex": 751, - "startIndex": 736, - "textRun": { - "content": "lib/styles.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.bkvo9kwy377f" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 752, - "startIndex": 751, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 736 - }, - { - "endIndex": 765, - "paragraph": { - "elements": [ - { - "endIndex": 764, - "startIndex": 752, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.bdyoueubv2p3" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 765, - "startIndex": 764, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 752 - }, - { - "endIndex": 778, - "paragraph": { - "elements": [ - { - "endIndex": 777, - "startIndex": 765, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.dni1skoy25yb" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 778, - "startIndex": 777, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 765 - }, - { - "endIndex": 791, - "paragraph": { - "elements": [ - { - "endIndex": 790, - "startIndex": 778, - "textRun": { - "content": "pubspec.yaml", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.j76cazl39nbp" - }, - "underline": true - } - } - }, - { - "endIndex": 791, - "startIndex": 790, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 778 - }, - { - "endIndex": 824, - "paragraph": { - "elements": [ - { - "endIndex": 823, - "startIndex": 791, - "textRun": { - "content": "Create structure for a 3-tab app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.b4ixhepuzky5" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 824, - "startIndex": 823, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 791 - }, - { - "endIndex": 837, - "paragraph": { - "elements": [ - { - "endIndex": 836, - "startIndex": 824, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.rtq7y8rxgsqq" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 837, - "startIndex": 836, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 824 - }, - { - "endIndex": 863, - "paragraph": { - "elements": [ - { - "endIndex": 862, - "startIndex": 837, - "textRun": { - "content": "lib/product_list_tab.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.1xfoo8a854ll" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 863, - "startIndex": 862, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 837 - }, - { - "endIndex": 883, - "paragraph": { - "elements": [ - { - "endIndex": 882, - "startIndex": 863, - "textRun": { - "content": "lib/search_tab.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.6oaiqusyrtlp" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 883, - "startIndex": 882, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 863 - }, - { - "endIndex": 910, - "paragraph": { - "elements": [ - { - "endIndex": 909, - "startIndex": 883, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.g7cz8ikgazp5" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 910, - "startIndex": 909, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 883 - }, - { - "endIndex": 923, - "paragraph": { - "elements": [ - { - "endIndex": 922, - "startIndex": 910, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.e715d3bub16k" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 923, - "startIndex": 922, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 910 - }, - { - "endIndex": 944, - "paragraph": { - "elements": [ - { - "endIndex": 943, - "startIndex": 923, - "textRun": { - "content": "Add state management", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.xt4mb2fzrrzz" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 944, - "startIndex": 943, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 923 - }, - { - "endIndex": 967, - "paragraph": { - "elements": [ - { - "endIndex": 966, - "startIndex": 944, - "textRun": { - "content": "lib/model/product.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.52zqj1lykg2a" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 967, - "startIndex": 966, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 944 - }, - { - "endIndex": 1002, - "paragraph": { - "elements": [ - { - "endIndex": 1001, - "startIndex": 967, - "textRun": { - "content": "lib/model/products_repository.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.nk6g7oocsqni" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1002, - "startIndex": 1001, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 967 - }, - { - "endIndex": 1033, - "paragraph": { - "elements": [ - { - "endIndex": 1032, - "startIndex": 1002, - "textRun": { - "content": "lib/model/app_state_model.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.hckjl3k0jhqs" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1033, - "startIndex": 1032, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1002 - }, - { - "endIndex": 1047, - "paragraph": { - "elements": [ - { - "endIndex": 1046, - "startIndex": 1033, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.hei6sqe0eql6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1047, - "startIndex": 1046, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1033 - }, - { - "endIndex": 1070, - "paragraph": { - "elements": [ - { - "endIndex": 1069, - "startIndex": 1047, - "textRun": { - "content": "List products for sale", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.oypkea3o1dqe" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1070, - "startIndex": 1069, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1047 - }, - { - "endIndex": 1096, - "paragraph": { - "elements": [ - { - "endIndex": 1095, - "startIndex": 1070, - "textRun": { - "content": "lib/product_row_item.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.witwcysqo1ag" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1096, - "startIndex": 1095, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1070 - }, - { - "endIndex": 1122, - "paragraph": { - "elements": [ - { - "endIndex": 1121, - "startIndex": 1096, - "textRun": { - "content": "lib/product_list_tab.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.51vwfsqul47s" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1122, - "startIndex": 1121, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1096 - }, - { - "endIndex": 1141, - "paragraph": { - "elements": [ - { - "endIndex": 1140, - "startIndex": 1122, - "textRun": { - "content": "Add product search", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.tr262bz9ptry" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1141, - "startIndex": 1140, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1122 - }, - { - "endIndex": 1161, - "paragraph": { - "elements": [ - { - "endIndex": 1160, - "startIndex": 1141, - "textRun": { - "content": "lib/search_tab.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.43owoidtk7t6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1161, - "startIndex": 1160, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1141 - }, - { - "endIndex": 1181, - "paragraph": { - "elements": [ - { - "endIndex": 1180, - "startIndex": 1161, - "textRun": { - "content": "lib/search_bar.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.7y7bmd1dcf0u" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1181, - "startIndex": 1180, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1161 - }, - { - "endIndex": 1199, - "paragraph": { - "elements": [ - { - "endIndex": 1198, - "startIndex": 1181, - "textRun": { - "content": "Add customer info", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.pupriqx4g35l" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1199, - "startIndex": 1198, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1181 - }, - { - "endIndex": 1226, - "paragraph": { - "elements": [ - { - "endIndex": 1225, - "startIndex": 1199, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.emjk1idkc237" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1226, - "startIndex": 1225, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1199 - }, - { - "endIndex": 1242, - "paragraph": { - "elements": [ - { - "endIndex": 1241, - "startIndex": 1226, - "textRun": { - "content": "Add date picker", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.e5tzms3h5q5z" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1242, - "startIndex": 1241, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1226 - }, - { - "endIndex": 1269, - "paragraph": { - "elements": [ - { - "endIndex": 1268, - "startIndex": 1242, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.fz4gk3fom4pq" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1269, - "startIndex": 1268, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1242 - }, - { - "endIndex": 1301, - "paragraph": { - "elements": [ - { - "endIndex": 1300, - "startIndex": 1269, - "textRun": { - "content": "Add selected items for purchase", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.v54t7y7qlce" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1301, - "startIndex": 1300, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1269 - }, - { - "endIndex": 1328, - "paragraph": { - "elements": [ - { - "endIndex": 1327, - "startIndex": 1301, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.wisrz9cj45h6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1328, - "startIndex": 1327, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1301 - }, - { - "endIndex": 1339, - "paragraph": { - "elements": [ - { - "endIndex": 1338, - "startIndex": 1328, - "textRun": { - "content": "Next steps", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.wyjmgdlwi2kp" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1339, - "startIndex": 1338, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1328 - }, - { - "endIndex": 1356, - "paragraph": { - "elements": [ - { - "endIndex": 1355, - "startIndex": 1339, - "textRun": { - "content": "Congratulations!", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.4w8rovwn8ql" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1356, - "startIndex": 1355, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1339 - }, - { - "endIndex": 1373, - "paragraph": { - "elements": [ - { - "endIndex": 1372, - "startIndex": 1356, - "textRun": { - "content": "Other next steps", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.8ahw5cvmt2v7" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1373, - "startIndex": 1372, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1356 - }, - { - "endIndex": 1384, - "paragraph": { - "elements": [ - { - "endIndex": 1383, - "startIndex": 1373, - "textRun": { - "content": "Learn more", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.uddyhgetvtq1" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1384, - "startIndex": 1383, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1373 - } - ] - } - }, - { - "endIndex": 1386, - "paragraph": { - "elements": [ - { - "endIndex": 1386, - "startIndex": 1385, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1385 - }, - { - "endIndex": 1388, - "paragraph": { - "elements": [ - { - "endIndex": 1387, - "horizontalRule": { - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 1386 - }, - { - "endIndex": 1388, - "startIndex": 1387, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1386 - }, - { - "endIndex": 1419, - "paragraph": { - "elements": [ - { - "endIndex": 1419, - "startIndex": 1388, - "textRun": { - "content": "NOTES (not visible externally)\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.s13wmcdxanl", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1388 - }, - { - "endIndex": 1437, - "paragraph": { - "elements": [ - { - "endIndex": 1437, - "startIndex": 1419, - "textRun": { - "content": "Environment: None\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1419 - }, - { - "endIndex": 1438, - "paragraph": { - "elements": [ - { - "endIndex": 1438, - "startIndex": 1437, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1437 - }, - { - "endIndex": 1535, - "paragraph": { - "elements": [ - { - "endIndex": 1467, - "startIndex": 1438, - "textRun": { - "content": "This codelab is published at ", - "textStyle": {} - } - }, - { - "endIndex": 1515, - "startIndex": 1467, - "textRun": { - "content": "https://codelabs.developers.google.com/codelabs/", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://codelabs.developers.google.com/codelabs/flutter-cupertino" - }, - "underline": true - } - } - }, - { - "endIndex": 1532, - "startIndex": 1515, - "textRun": { - "content": "flutter-cupertino", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://codelabs.developers.google.com/codelabs/flutter-cupertino" - }, - "underline": true - } - } - }, - { - "endIndex": 1535, - "startIndex": 1532, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1438 - }, - { - "endIndex": 1541, - "paragraph": { - "elements": [ - { - "endIndex": 1541, - "startIndex": 1535, - "textRun": { - "content": "TO DO\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.82wq77yl3tm2", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1535 - }, - { - "endIndex": 1555, - "paragraph": { - "bullet": { - "listId": "kix.5ah5xu7h8s7d", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 1555, - "startIndex": 1541, - "textRun": { - "content": "Periodically:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1541 - }, - { - "endIndex": 1647, - "paragraph": { - "bullet": { - "listId": "kix.5ah5xu7h8s7d", - "nestingLevel": 1, - "textStyle": {} - }, - "elements": [ - { - "endIndex": 1588, - "startIndex": 1555, - "textRun": { - "content": "Fix all reported codelab issues: ", - "textStyle": {} - } - }, - { - "endIndex": 1646, - "startIndex": 1588, - "textRun": { - "content": "https://github.com/flutter/website/labels/codelab-external", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/website/labels/codelab-external" - }, - "underline": true - } - } - }, - { - "endIndex": 1647, - "startIndex": 1646, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1555 - }, - { - "endIndex": 1720, - "paragraph": { - "bullet": { - "listId": "kix.5ah5xu7h8s7d", - "nestingLevel": 1, - "textStyle": {} - }, - "elements": [ - { - "endIndex": 1720, - "startIndex": 1647, - "textRun": { - "content": "Preview rendered pages, especially for problem spots like colored boxes.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1647 - }, - { - "endIndex": 1731, - "paragraph": { - "bullet": { - "listId": "kix.5ah5xu7h8s7d", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 1731, - "startIndex": 1720, - "textRun": { - "content": "After I/O:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1720 - }, - { - "endIndex": 1782, - "paragraph": { - "bullet": { - "listId": "kix.5ah5xu7h8s7d", - "nestingLevel": 1, - "textStyle": {} - }, - "elements": [ - { - "endIndex": 1755, - "startIndex": 1731, - "textRun": { - "content": "Depending on analytics, ", - "textStyle": {} - } - }, - { - "endIndex": 1760, - "startIndex": 1755, - "textRun": { - "content": "maybe", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 1782, - "startIndex": 1760, - "textRun": { - "content": " split into two labs.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1731 - }, - { - "endIndex": 1831, - "paragraph": { - "bullet": { - "listId": "kix.5ah5xu7h8s7d", - "nestingLevel": 1, - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 1831, - "startIndex": 1782, - "textRun": { - "content": "The code needs updating as per lots of feedback.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1782 - }, - { - "endIndex": 1897, - "paragraph": { - "bullet": { - "listId": "kix.5ah5xu7h8s7d", - "nestingLevel": 1, - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 1872, - "startIndex": 1831, - "textRun": { - "content": "The text needs updating as per feedback, ", - "textStyle": {} - } - }, - { - "endIndex": 1875, - "startIndex": 1872, - "textRun": { - "content": "and", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 1896, - "startIndex": 1875, - "textRun": { - "content": " as per code changes.", - "textStyle": {} - } - }, - { - "endIndex": 1897, - "startIndex": 1896, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1831 - }, - { - "endIndex": 1910, - "paragraph": { - "elements": [ - { - "endIndex": 1910, - "startIndex": 1897, - "textRun": { - "content": "Introduction\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.fen57cnztjix", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1897 - }, - { - "endIndex": 1925, - "paragraph": { - "elements": [ - { - "endIndex": 1924, - "startIndex": 1910, - "textRun": { - "content": "Duration: 1:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - }, - { - "endIndex": 1925, - "startIndex": 1924, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1910 - }, - { - "endIndex": 1926, - "paragraph": { - "elements": [ - { - "endIndex": 1926, - "startIndex": 1925, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1925 - }, - { - "endIndex": 1969, - "paragraph": { - "elements": [ - { - "endIndex": 1969, - "startIndex": 1926, - "textRun": { - "content": "Welcome to the Flutter Cupertino codelab! \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1926 - }, - { - "endIndex": 1970, - "paragraph": { - "elements": [ - { - "endIndex": 1970, - "startIndex": 1969, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1969 - }, - { - "endIndex": 2143, - "paragraph": { - "elements": [ - { - "endIndex": 2125, - "startIndex": 1970, - "textRun": { - "content": "In this codelab, you’ll create a Cupertino (iOS-style) app using Flutter. The Flutter SDK ships with two styled widget libraries (in addition to the basic ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2139, - "startIndex": 2125, - "textRun": { - "content": "widget library", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/flutter/widgets/widgets-library.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2143, - "startIndex": 2139, - "textRun": { - "content": "): \n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1970 - }, - { - "endIndex": 2236, - "paragraph": { - "bullet": { - "listId": "kix.6gd81zfekbpn", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2159, - "startIndex": 2143, - "textRun": { - "content": "Material widgets", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/flutter/material/material-library.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2236, - "startIndex": 2159, - "textRun": { - "content": " implements the Material design language for iOS, Android, web, and desktop.\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 2143 - }, - { - "endIndex": 2342, - "paragraph": { - "bullet": { - "listId": "kix.6gd81zfekbpn", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2253, - "startIndex": 2236, - "textRun": { - "content": "Cupertino widgets", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/flutter/cupertino/cupertino-library.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2342, - "startIndex": 2253, - "textRun": { - "content": " implements the current iOS design language based on Apple’s Human Interface Guidelines.\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 2236 - }, - { - "endIndex": 2651, - "paragraph": { - "elements": [ - { - "endIndex": 2572, - "startIndex": 2342, - "textRun": { - "content": "Why write a Cupertino app? The Material design language was created for any platform, not just Android. When you write a Material app in Flutter, it has the Material look and feel on all devices, even iOS. If you want your app to ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2576, - "startIndex": 2572, - "textRun": { - "content": "look", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2651, - "startIndex": 2576, - "textRun": { - "content": " like a standard iOS-styled app, then you would use the Cupertino library.\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 2342 - }, - { - "endIndex": 2872, - "paragraph": { - "elements": [ - { - "endIndex": 2872, - "startIndex": 2651, - "textRun": { - "content": "You can technically run a Cupertino app on either Android or iOS, but (due to licensing issues) Cupertino won’t have the correct fonts on Android. For this reason, use an iOS-specific device when writing a Cupertino app.\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 2651 - }, - { - "endIndex": 3026, - "paragraph": { - "elements": [ - { - "endIndex": 3026, - "startIndex": 2872, - "textRun": { - "content": "You’ll implement a Cupertino style shopping app containing three tabs: one for the product list, one for a product search, and one for the shopping cart.\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 2872 - }, - { - "endIndex": 3029, - "paragraph": { - "elements": [ - { - "endIndex": 3027, - "inlineObjectElement": { - "inlineObjectId": "kix.fwvmqdoszqx0", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 3026 - }, - { - "endIndex": 3028, - "inlineObjectElement": { - "inlineObjectId": "kix.soz9ovsim2t7", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 3027 - }, - { - "endIndex": 3029, - "startIndex": 3028, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3026 - }, - { - "endIndex": 3031, - "paragraph": { - "elements": [ - { - "endIndex": 3030, - "inlineObjectElement": { - "inlineObjectId": "kix.s5061uxle1g5", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 3029 - }, - { - "endIndex": 3031, - "startIndex": 3030, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3029 - }, - { - "endIndex": 3065, - "paragraph": { - "elements": [ - { - "endIndex": 3065, - "startIndex": 3031, - "textRun": { - "content": "What you’ll learn in this codelab\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.db9039bczytp", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3031 - }, - { - "endIndex": 3125, - "paragraph": { - "bullet": { - "listId": "kix.vy7lz9wk80w9", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3124, - "startIndex": 3065, - "textRun": { - "content": "How to build a Flutter app with an iOS style look and feel.", - "textStyle": {} - } - }, - { - "endIndex": 3125, - "startIndex": 3124, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3065 - }, - { - "endIndex": 3180, - "paragraph": { - "bullet": { - "listId": "kix.vy7lz9wk80w9", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3180, - "startIndex": 3125, - "textRun": { - "content": "How to create multiple tabs and navigate between them.\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3125 - }, - { - "endIndex": 3245, - "paragraph": { - "bullet": { - "listId": "kix.vy7lz9wk80w9", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3195, - "startIndex": 3180, - "textRun": { - "content": "How to use the ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3203, - "startIndex": 3195, - "textRun": { - "content": "provider", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 3244, - "startIndex": 3203, - "textRun": { - "content": " package to manage state between screens.", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3245, - "startIndex": 3244, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3180 - }, - { - "endIndex": 3246, - "paragraph": { - "elements": [ - { - "endIndex": 3246, - "startIndex": 3245, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3245 - }, - { - "endIndex": 3512, - "startIndex": 3246, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 3511, - "startIndex": 3247, - "tableCells": [ - { - "content": [ - { - "endIndex": 3297, - "paragraph": { - "elements": [ - { - "endIndex": 3297, - "startIndex": 3249, - "textRun": { - "content": "What would you like to learn from this codelab?\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.b7nxsg514qu3", - "namedStyleType": "HEADING_4", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3249 - }, - { - "endIndex": 3347, - "paragraph": { - "bullet": { - "listId": "kix.sixpu8qi20f", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3347, - "startIndex": 3297, - "textRun": { - "content": "I'm new to the topic, and I want a good overview.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3297 - }, - { - "endIndex": 3406, - "paragraph": { - "bullet": { - "listId": "kix.sixpu8qi20f", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3406, - "startIndex": 3347, - "textRun": { - "content": "I know something about this topic, but I want a refresher.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3347 - }, - { - "endIndex": 3457, - "paragraph": { - "bullet": { - "listId": "kix.sixpu8qi20f", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3457, - "startIndex": 3406, - "textRun": { - "content": "I'm looking for example code to use in my project.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3406 - }, - { - "endIndex": 3511, - "paragraph": { - "bullet": { - "listId": "kix.sixpu8qi20f", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3511, - "startIndex": 3457, - "textRun": { - "content": "I'm looking for an explanation of something specific.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3457 - } - ], - "endIndex": 3511, - "startIndex": 3248, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.8862745, - "red": 0.8117647 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 3513, - "paragraph": { - "elements": [ - { - "endIndex": 3513, - "startIndex": 3512, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3512 - }, - { - "endIndex": 3515, - "paragraph": { - "elements": [ - { - "endIndex": 3514, - "horizontalRule": { - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 3513 - }, - { - "endIndex": 3515, - "startIndex": 3514, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3513 - }, - { - "endIndex": 3547, - "paragraph": { - "elements": [ - { - "endIndex": 3547, - "startIndex": 3515, - "textRun": { - "content": "Set up your Flutter environment\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.s4w3ehenj8fg", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3515 - }, - { - "endIndex": 3563, - "paragraph": { - "elements": [ - { - "endIndex": 3563, - "startIndex": 3547, - "textRun": { - "content": "Duration: 10:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3547 - }, - { - "endIndex": 3580, - "paragraph": { - "elements": [ - { - "endIndex": 3580, - "startIndex": 3563, - "textRun": { - "content": "Environment: web\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3563 - }, - { - "endIndex": 3581, - "paragraph": { - "elements": [ - { - "endIndex": 3581, - "startIndex": 3580, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3580 - }, - { - "endIndex": 3846, - "paragraph": { - "elements": [ - { - "endIndex": 3639, - "startIndex": 3581, - "textRun": { - "content": "You need two pieces of software to complete this lab: the ", - "textStyle": {} - } - }, - { - "endIndex": 3650, - "startIndex": 3639, - "textRun": { - "content": "Flutter SDK", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/get-started/install/" - }, - "underline": true - } - } - }, - { - "endIndex": 3655, - "startIndex": 3650, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 3664, - "startIndex": 3655, - "textRun": { - "content": "an editor", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/get-started/editor/" - }, - "underline": true - } - } - }, - { - "endIndex": 3812, - "startIndex": 3664, - "textRun": { - "content": ". You can use your preferred editor, such as Android Studio or IntelliJ with the Flutter and Dart plugins installed, or Visual Studio Code with the ", - "textStyle": {} - } - }, - { - "endIndex": 3844, - "startIndex": 3812, - "textRun": { - "content": "Dart Code and Flutter extensions", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://marketplace.visualstudio.com/items?itemName=Dart-Code.dart-code" - }, - "underline": true - } - } - }, - { - "endIndex": 3846, - "startIndex": 3844, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3581 - }, - { - "endIndex": 3847, - "paragraph": { - "elements": [ - { - "endIndex": 3847, - "startIndex": 3846, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3846 - }, - { - "endIndex": 3908, - "paragraph": { - "elements": [ - { - "endIndex": 3908, - "startIndex": 3847, - "textRun": { - "content": "You can run this codelab using one of the following devices:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3847 - }, - { - "endIndex": 3909, - "paragraph": { - "elements": [ - { - "endIndex": 3909, - "startIndex": 3908, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3908 - }, - { - "endIndex": 3959, - "paragraph": { - "bullet": { - "listId": "kix.bu6c7uq7w19k", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3920, - "startIndex": 3909, - "textRun": { - "content": "A physical ", - "textStyle": {} - } - }, - { - "endIndex": 3923, - "startIndex": 3920, - "textRun": { - "content": "iOS", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/setup-macos/#deploy-to-ios-devices" - }, - "underline": true - } - } - }, - { - "endIndex": 3959, - "startIndex": 3923, - "textRun": { - "content": " device connected to your computer.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3909 - }, - { - "endIndex": 3978, - "paragraph": { - "bullet": { - "listId": "kix.bu6c7uq7w19k", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3962, - "startIndex": 3959, - "textRun": { - "content": "The", - "textStyle": {} - } - }, - { - "endIndex": 3976, - "startIndex": 3962, - "textRun": { - "content": " iOS simulator", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/setup-macos/#set-up-the-ios-simulator" - }, - "underline": true - } - } - }, - { - "endIndex": 3978, - "startIndex": 3976, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3959 - }, - { - "endIndex": 3979, - "paragraph": { - "elements": [ - { - "endIndex": 3979, - "startIndex": 3978, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3978 - }, - { - "endIndex": 3997, - "paragraph": { - "elements": [ - { - "endIndex": 3997, - "startIndex": 3979, - "textRun": { - "content": "You’ll also need:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3979 - }, - { - "endIndex": 4026, - "paragraph": { - "bullet": { - "listId": "kix.bu6c7uq7w19k", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 4026, - "startIndex": 3997, - "textRun": { - "content": "A Mac configured with Xcode.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3997 - }, - { - "endIndex": 4028, - "paragraph": { - "elements": [ - { - "endIndex": 4027, - "horizontalRule": { - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 4026 - }, - { - "endIndex": 4028, - "startIndex": 4027, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4026 - }, - { - "endIndex": 4061, - "paragraph": { - "elements": [ - { - "endIndex": 4060, - "startIndex": 4028, - "textRun": { - "content": "Create the initial Cupertino app", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 4061, - "startIndex": 4060, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.y50a87mee90y", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4028 - }, - { - "endIndex": 4076, - "paragraph": { - "elements": [ - { - "endIndex": 4075, - "startIndex": 4061, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - }, - { - "endIndex": 4076, - "startIndex": 4075, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4061 - }, - { - "endIndex": 4077, - "paragraph": { - "elements": [ - { - "endIndex": 4077, - "startIndex": 4076, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4076 - }, - { - "endIndex": 4132, - "paragraph": { - "elements": [ - { - "endIndex": 4109, - "startIndex": 4077, - "textRun": { - "content": "Create the initial app using a ", - "textStyle": {} - } - }, - { - "endIndex": 4130, - "startIndex": 4109, - "textRun": { - "content": "CupertinoPageScaffold", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4132, - "startIndex": 4130, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4077 - }, - { - "endIndex": 4133, - "paragraph": { - "elements": [ - { - "endIndex": 4133, - "startIndex": 4132, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4132 - }, - { - "endIndex": 4194, - "paragraph": { - "elements": [ - { - "endIndex": 4134, - "inlineObjectElement": { - "inlineObjectId": "kix.a6o0pcx9wx9l", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 4133 - }, - { - "endIndex": 4166, - "startIndex": 4134, - "textRun": { - "content": "Create a Flutter project called ", - "textStyle": {} - } - }, - { - "endIndex": 4181, - "startIndex": 4166, - "textRun": { - "content": "cupertino_store", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 4194, - "startIndex": 4181, - "textRun": { - "content": " as follows.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4133 - }, - { - "endIndex": 4195, - "paragraph": { - "elements": [ - { - "endIndex": 4195, - "startIndex": 4194, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4194 - }, - { - "endIndex": 4269, - "startIndex": 4195, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4268, - "startIndex": 4196, - "tableCells": [ - { - "content": [ - { - "endIndex": 4247, - "paragraph": { - "elements": [ - { - "endIndex": 4247, - "startIndex": 4198, - "textRun": { - "content": "$ flutter create cupertino_store --platforms=ios\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4198 - }, - { - "endIndex": 4268, - "paragraph": { - "elements": [ - { - "endIndex": 4268, - "startIndex": 4247, - "textRun": { - "content": "$ cd cupertino_store\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4247 - } - ], - "endIndex": 4268, - "startIndex": 4197, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4270, - "paragraph": { - "elements": [ - { - "endIndex": 4270, - "startIndex": 4269, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4269 - }, - { - "endIndex": 4475, - "paragraph": { - "elements": [ - { - "endIndex": 4271, - "inlineObjectElement": { - "inlineObjectId": "kix.dn155uykb33a", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 4270 - }, - { - "endIndex": 4272, - "startIndex": 4271, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 4296, - "startIndex": 4272, - "textRun": { - "content": "Replace the contents of ", - "textStyle": {} - } - }, - { - "endIndex": 4309, - "startIndex": 4296, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4339, - "startIndex": 4309, - "textRun": { - "content": ".\u000bDelete all of the code from ", - "textStyle": {} - } - }, - { - "endIndex": 4352, - "startIndex": 4339, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4405, - "startIndex": 4352, - "textRun": { - "content": ", which creates a Material-themed button counting app", - "textStyle": {} - } - }, - { - "endIndex": 4475, - "startIndex": 4405, - "textRun": { - "content": ". Replace with the following code, which initializes a Cupertino app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4270 - }, - { - "endIndex": 4489, - "paragraph": { - "elements": [ - { - "endIndex": 4488, - "startIndex": 4475, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_00/lib/main.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 4489, - "startIndex": 4488, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ugeqcf3aw7wl", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4475 - }, - { - "endIndex": 4615, - "startIndex": 4489, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4614, - "startIndex": 4490, - "tableCells": [ - { - "content": [ - { - "endIndex": 4533, - "paragraph": { - "elements": [ - { - "endIndex": 4533, - "startIndex": 4492, - "textRun": { - "content": "import 'package:flutter/cupertino.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4492 - }, - { - "endIndex": 4534, - "paragraph": { - "elements": [ - { - "endIndex": 4534, - "startIndex": 4533, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4533 - }, - { - "endIndex": 4553, - "paragraph": { - "elements": [ - { - "endIndex": 4553, - "startIndex": 4534, - "textRun": { - "content": "import 'app.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4534 - }, - { - "endIndex": 4554, - "paragraph": { - "elements": [ - { - "endIndex": 4554, - "startIndex": 4553, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4553 - }, - { - "endIndex": 4568, - "paragraph": { - "elements": [ - { - "endIndex": 4568, - "startIndex": 4554, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4554 - }, - { - "endIndex": 4612, - "paragraph": { - "elements": [ - { - "endIndex": 4612, - "startIndex": 4568, - "textRun": { - "content": " return runApp(const CupertinoStoreApp());\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4568 - }, - { - "endIndex": 4614, - "paragraph": { - "elements": [ - { - "endIndex": 4613, - "startIndex": 4612, - "textRun": { - "content": "}", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4614, - "startIndex": 4613, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4612 - } - ], - "endIndex": 4614, - "startIndex": 4491, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4616, - "paragraph": { - "elements": [ - { - "endIndex": 4616, - "startIndex": 4615, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4615 - }, - { - "endIndex": 4631, - "paragraph": { - "elements": [ - { - "endIndex": 4617, - "inlineObjectElement": { - "inlineObjectId": "kix.e5rxik9cxejk", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 4616 - }, - { - "endIndex": 4631, - "startIndex": 4617, - "textRun": { - "content": " Observations\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4616 - }, - { - "endIndex": 4735, - "paragraph": { - "bullet": { - "listId": "kix.5gy96ltvl5jg", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "elements": [ - { - "endIndex": 4735, - "startIndex": 4631, - "textRun": { - "content": "Import the Cupertino package. This makes all the Cupertino widgets and constants available to your app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4631 - }, - { - "endIndex": 4736, - "paragraph": { - "elements": [ - { - "endIndex": 4736, - "startIndex": 4735, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4735 - }, - { - "endIndex": 4928, - "paragraph": { - "elements": [ - { - "endIndex": 4737, - "inlineObjectElement": { - "inlineObjectId": "kix.kuchfeb0fq7s", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 4736 - }, - { - "endIndex": 4738, - "startIndex": 4737, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 4745, - "startIndex": 4738, - "textRun": { - "content": "Create ", - "textStyle": {} - } - }, - { - "endIndex": 4760, - "startIndex": 4745, - "textRun": { - "content": "lib/styles.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4780, - "startIndex": 4760, - "textRun": { - "content": ".\u000bAdd a file to the ", - "textStyle": {} - } - }, - { - "endIndex": 4783, - "startIndex": 4780, - "textRun": { - "content": "lib", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4801, - "startIndex": 4783, - "textRun": { - "content": " directory called ", - "textStyle": {} - } - }, - { - "endIndex": 4812, - "startIndex": 4801, - "textRun": { - "content": "styles.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4819, - "startIndex": 4812, - "textRun": { - "content": ". The ", - "textStyle": {} - } - }, - { - "endIndex": 4825, - "startIndex": 4819, - "textRun": { - "content": "Styles", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4928, - "startIndex": 4825, - "textRun": { - "content": " class defines the text and color styling to customize the app. Add the following content to the file.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4736 - }, - { - "endIndex": 4944, - "paragraph": { - "elements": [ - { - "endIndex": 4943, - "startIndex": 4928, - "textRun": { - "content": "lib/styles.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_00/lib/styles.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 4944, - "startIndex": 4943, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.bkvo9kwy377f", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4928 - }, - { - "endIndex": 6431, - "startIndex": 4944, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 6430, - "startIndex": 4945, - "tableCells": [ - { - "content": [ - { - "endIndex": 5004, - "paragraph": { - "elements": [ - { - "endIndex": 5004, - "startIndex": 4947, - "textRun": { - "content": "// Copyright 2018 The Flutter team. All rights reserved.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4947 - }, - { - "endIndex": 5078, - "paragraph": { - "elements": [ - { - "endIndex": 5078, - "startIndex": 5004, - "textRun": { - "content": "// Use of this source code is governed by a BSD-style license that can be\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5004 - }, - { - "endIndex": 5108, - "paragraph": { - "elements": [ - { - "endIndex": 5108, - "startIndex": 5078, - "textRun": { - "content": "// found in the LICENSE file.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5078 - }, - { - "endIndex": 5109, - "paragraph": { - "elements": [ - { - "endIndex": 5109, - "startIndex": 5108, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5108 - }, - { - "endIndex": 5150, - "paragraph": { - "elements": [ - { - "endIndex": 5150, - "startIndex": 5109, - "textRun": { - "content": "import 'package:flutter/cupertino.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5109 - }, - { - "endIndex": 5151, - "paragraph": { - "elements": [ - { - "endIndex": 5151, - "startIndex": 5150, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5150 - }, - { - "endIndex": 5175, - "paragraph": { - "elements": [ - { - "endIndex": 5175, - "startIndex": 5151, - "textRun": { - "content": "abstract class Styles {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5151 - }, - { - "endIndex": 5232, - "paragraph": { - "elements": [ - { - "endIndex": 5232, - "startIndex": 5175, - "textRun": { - "content": " static const TextStyle productRowItemName = TextStyle(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5175 - }, - { - "endIndex": 5273, - "paragraph": { - "elements": [ - { - "endIndex": 5273, - "startIndex": 5232, - "textRun": { - "content": " color: Color.fromRGBO(0, 0, 0, 0.8),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5232 - }, - { - "endIndex": 5291, - "paragraph": { - "elements": [ - { - "endIndex": 5291, - "startIndex": 5273, - "textRun": { - "content": " fontSize: 18,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5273 - }, - { - "endIndex": 5324, - "paragraph": { - "elements": [ - { - "endIndex": 5324, - "startIndex": 5291, - "textRun": { - "content": " fontStyle: FontStyle.normal,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5291 - }, - { - "endIndex": 5359, - "paragraph": { - "elements": [ - { - "endIndex": 5359, - "startIndex": 5324, - "textRun": { - "content": " fontWeight: FontWeight.normal,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5324 - }, - { - "endIndex": 5364, - "paragraph": { - "elements": [ - { - "endIndex": 5364, - "startIndex": 5359, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5359 - }, - { - "endIndex": 5365, - "paragraph": { - "elements": [ - { - "endIndex": 5365, - "startIndex": 5364, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5364 - }, - { - "endIndex": 5419, - "paragraph": { - "elements": [ - { - "endIndex": 5419, - "startIndex": 5365, - "textRun": { - "content": " static const TextStyle productRowTotal = TextStyle(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5365 - }, - { - "endIndex": 5460, - "paragraph": { - "elements": [ - { - "endIndex": 5460, - "startIndex": 5419, - "textRun": { - "content": " color: Color.fromRGBO(0, 0, 0, 0.8),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5419 - }, - { - "endIndex": 5478, - "paragraph": { - "elements": [ - { - "endIndex": 5478, - "startIndex": 5460, - "textRun": { - "content": " fontSize: 18,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5460 - }, - { - "endIndex": 5511, - "paragraph": { - "elements": [ - { - "endIndex": 5511, - "startIndex": 5478, - "textRun": { - "content": " fontStyle: FontStyle.normal,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5478 - }, - { - "endIndex": 5544, - "paragraph": { - "elements": [ - { - "endIndex": 5544, - "startIndex": 5511, - "textRun": { - "content": " fontWeight: FontWeight.bold,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5511 - }, - { - "endIndex": 5549, - "paragraph": { - "elements": [ - { - "endIndex": 5549, - "startIndex": 5544, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5544 - }, - { - "endIndex": 5550, - "paragraph": { - "elements": [ - { - "endIndex": 5550, - "startIndex": 5549, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5549 - }, - { - "endIndex": 5608, - "paragraph": { - "elements": [ - { - "endIndex": 5608, - "startIndex": 5550, - "textRun": { - "content": " static const TextStyle productRowItemPrice = TextStyle(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5550 - }, - { - "endIndex": 5638, - "paragraph": { - "elements": [ - { - "endIndex": 5638, - "startIndex": 5608, - "textRun": { - "content": " color: Color(0xFF8E8E93),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5608 - }, - { - "endIndex": 5656, - "paragraph": { - "elements": [ - { - "endIndex": 5656, - "startIndex": 5638, - "textRun": { - "content": " fontSize: 13,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5638 - }, - { - "endIndex": 5689, - "paragraph": { - "elements": [ - { - "endIndex": 5689, - "startIndex": 5656, - "textRun": { - "content": " fontWeight: FontWeight.w300,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5656 - }, - { - "endIndex": 5694, - "paragraph": { - "elements": [ - { - "endIndex": 5694, - "startIndex": 5689, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5689 - }, - { - "endIndex": 5695, - "paragraph": { - "elements": [ - { - "endIndex": 5695, - "startIndex": 5694, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5694 - }, - { - "endIndex": 5744, - "paragraph": { - "elements": [ - { - "endIndex": 5744, - "startIndex": 5695, - "textRun": { - "content": " static const TextStyle searchText = TextStyle(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5695 - }, - { - "endIndex": 5783, - "paragraph": { - "elements": [ - { - "endIndex": 5783, - "startIndex": 5744, - "textRun": { - "content": " color: Color.fromRGBO(0, 0, 0, 1),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5744 - }, - { - "endIndex": 5801, - "paragraph": { - "elements": [ - { - "endIndex": 5801, - "startIndex": 5783, - "textRun": { - "content": " fontSize: 14,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5783 - }, - { - "endIndex": 5834, - "paragraph": { - "elements": [ - { - "endIndex": 5834, - "startIndex": 5801, - "textRun": { - "content": " fontStyle: FontStyle.normal,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5801 - }, - { - "endIndex": 5869, - "paragraph": { - "elements": [ - { - "endIndex": 5869, - "startIndex": 5834, - "textRun": { - "content": " fontWeight: FontWeight.normal,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5834 - }, - { - "endIndex": 5874, - "paragraph": { - "elements": [ - { - "endIndex": 5874, - "startIndex": 5869, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5869 - }, - { - "endIndex": 5875, - "paragraph": { - "elements": [ - { - "endIndex": 5875, - "startIndex": 5874, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5874 - }, - { - "endIndex": 5931, - "paragraph": { - "elements": [ - { - "endIndex": 5931, - "startIndex": 5875, - "textRun": { - "content": " static const TextStyle deliveryTimeLabel = TextStyle(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5875 - }, - { - "endIndex": 5961, - "paragraph": { - "elements": [ - { - "endIndex": 5961, - "startIndex": 5931, - "textRun": { - "content": " color: Color(0xFFC2C2C2),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5931 - }, - { - "endIndex": 5994, - "paragraph": { - "elements": [ - { - "endIndex": 5994, - "startIndex": 5961, - "textRun": { - "content": " fontWeight: FontWeight.w300,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5961 - }, - { - "endIndex": 5999, - "paragraph": { - "elements": [ - { - "endIndex": 5999, - "startIndex": 5994, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5994 - }, - { - "endIndex": 6000, - "paragraph": { - "elements": [ - { - "endIndex": 6000, - "startIndex": 5999, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5999 - }, - { - "endIndex": 6051, - "paragraph": { - "elements": [ - { - "endIndex": 6051, - "startIndex": 6000, - "textRun": { - "content": " static const TextStyle deliveryTime = TextStyle(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6000 - }, - { - "endIndex": 6092, - "paragraph": { - "elements": [ - { - "endIndex": 6092, - "startIndex": 6051, - "textRun": { - "content": " color: CupertinoColors.inactiveGray,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6051 - }, - { - "endIndex": 6097, - "paragraph": { - "elements": [ - { - "endIndex": 6097, - "startIndex": 6092, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6092 - }, - { - "endIndex": 6098, - "paragraph": { - "elements": [ - { - "endIndex": 6098, - "startIndex": 6097, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6097 - }, - { - "endIndex": 6158, - "paragraph": { - "elements": [ - { - "endIndex": 6158, - "startIndex": 6098, - "textRun": { - "content": " static const Color productRowDivider = Color(0xFFD9D9D9);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6098 - }, - { - "endIndex": 6159, - "paragraph": { - "elements": [ - { - "endIndex": 6159, - "startIndex": 6158, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6158 - }, - { - "endIndex": 6220, - "paragraph": { - "elements": [ - { - "endIndex": 6220, - "startIndex": 6159, - "textRun": { - "content": " static const Color scaffoldBackground = Color(0xfff0f0f0);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6159 - }, - { - "endIndex": 6221, - "paragraph": { - "elements": [ - { - "endIndex": 6221, - "startIndex": 6220, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6220 - }, - { - "endIndex": 6280, - "paragraph": { - "elements": [ - { - "endIndex": 6280, - "startIndex": 6221, - "textRun": { - "content": " static const Color searchBackground = Color(0xffe0e0e0);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6221 - }, - { - "endIndex": 6281, - "paragraph": { - "elements": [ - { - "endIndex": 6281, - "startIndex": 6280, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6280 - }, - { - "endIndex": 6354, - "paragraph": { - "elements": [ - { - "endIndex": 6354, - "startIndex": 6281, - "textRun": { - "content": " static const Color searchCursorColor = Color.fromRGBO(0, 122, 255, 1);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6281 - }, - { - "endIndex": 6355, - "paragraph": { - "elements": [ - { - "endIndex": 6355, - "startIndex": 6354, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6354 - }, - { - "endIndex": 6428, - "paragraph": { - "elements": [ - { - "endIndex": 6428, - "startIndex": 6355, - "textRun": { - "content": " static const Color searchIconColor = Color.fromRGBO(128, 128, 128, 1);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6355 - }, - { - "endIndex": 6430, - "paragraph": { - "elements": [ - { - "endIndex": 6430, - "startIndex": 6428, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6428 - } - ], - "endIndex": 6430, - "startIndex": 4946, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6432, - "paragraph": { - "elements": [ - { - "endIndex": 6432, - "startIndex": 6431, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 6431 - }, - { - "endIndex": 6447, - "paragraph": { - "elements": [ - { - "endIndex": 6433, - "inlineObjectElement": { - "inlineObjectId": "kix.dpxhcsr6vso1", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 6432 - }, - { - "endIndex": 6447, - "startIndex": 6433, - "textRun": { - "content": " Observations\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 6432 - }, - { - "endIndex": 6707, - "paragraph": { - "bullet": { - "listId": "kix.5gy96ltvl5jg", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "elements": [ - { - "endIndex": 6707, - "startIndex": 6447, - "textRun": { - "content": "We can centralize style definitions in a way that is similar to how web developers centralize their style markup in CSS files by grouping all of our definitions in a single file. This gives us the easiest way to reuse and redefine styles across the whole app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6447 - }, - { - "endIndex": 6708, - "paragraph": { - "elements": [ - { - "endIndex": 6708, - "startIndex": 6707, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6707 - }, - { - "endIndex": 6826, - "paragraph": { - "elements": [ - { - "endIndex": 6709, - "inlineObjectElement": { - "inlineObjectId": "kix.bi27oln27lsu", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 6708 - }, - { - "endIndex": 6710, - "startIndex": 6709, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 6717, - "startIndex": 6710, - "textRun": { - "content": "Create ", - "textStyle": {} - } - }, - { - "endIndex": 6729, - "startIndex": 6717, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6742, - "startIndex": 6729, - "textRun": { - "content": " and add the ", - "textStyle": {} - } - }, - { - "endIndex": 6759, - "startIndex": 6742, - "textRun": { - "content": "CupertinoStoreApp", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6785, - "startIndex": 6759, - "textRun": { - "content": " class.\u000bAdd the following ", - "textStyle": {} - } - }, - { - "endIndex": 6802, - "startIndex": 6785, - "textRun": { - "content": "CupertinoStoreApp", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6812, - "startIndex": 6802, - "textRun": { - "content": " class to ", - "textStyle": {} - } - }, - { - "endIndex": 6824, - "startIndex": 6812, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6826, - "startIndex": 6824, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 6708 - }, - { - "endIndex": 6839, - "paragraph": { - "elements": [ - { - "endIndex": 6838, - "startIndex": 6826, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_00/lib/app.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 6839, - "startIndex": 6838, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.bdyoueubv2p3", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 6826 - }, - { - "endIndex": 7439, - "startIndex": 6839, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 7438, - "startIndex": 6840, - "tableCells": [ - { - "content": [ - { - "endIndex": 6883, - "paragraph": { - "elements": [ - { - "endIndex": 6883, - "startIndex": 6842, - "textRun": { - "content": "import 'package:flutter/cupertino.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6842 - }, - { - "endIndex": 6923, - "paragraph": { - "elements": [ - { - "endIndex": 6923, - "startIndex": 6883, - "textRun": { - "content": "import 'package:flutter/services.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6883 - }, - { - "endIndex": 6924, - "paragraph": { - "elements": [ - { - "endIndex": 6924, - "startIndex": 6923, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6923 - }, - { - "endIndex": 6974, - "paragraph": { - "elements": [ - { - "endIndex": 6974, - "startIndex": 6924, - "textRun": { - "content": "class CupertinoStoreApp extends StatelessWidget {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6924 - }, - { - "endIndex": 7014, - "paragraph": { - "elements": [ - { - "endIndex": 7014, - "startIndex": 6974, - "textRun": { - "content": " const CupertinoStoreApp({super.key});\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6974 - }, - { - "endIndex": 7015, - "paragraph": { - "elements": [ - { - "endIndex": 7015, - "startIndex": 7014, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7014 - }, - { - "endIndex": 7027, - "paragraph": { - "elements": [ - { - "endIndex": 7027, - "startIndex": 7015, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7015 - }, - { - "endIndex": 7066, - "paragraph": { - "elements": [ - { - "endIndex": 7066, - "startIndex": 7027, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7027 - }, - { - "endIndex": 7131, - "paragraph": { - "elements": [ - { - "endIndex": 7131, - "startIndex": 7066, - "textRun": { - "content": " // This app is designed only to work vertically, so we limit\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7066 - }, - { - "endIndex": 7176, - "paragraph": { - "elements": [ - { - "endIndex": 7176, - "startIndex": 7131, - "textRun": { - "content": " // orientations to portrait up and down.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7131 - }, - { - "endIndex": 7219, - "paragraph": { - "elements": [ - { - "endIndex": 7219, - "startIndex": 7176, - "textRun": { - "content": " SystemChrome.setPreferredOrientations(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7176 - }, - { - "endIndex": 7292, - "paragraph": { - "elements": [ - { - "endIndex": 7292, - "startIndex": 7219, - "textRun": { - "content": " [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7219 - }, - { - "endIndex": 7293, - "paragraph": { - "elements": [ - { - "endIndex": 7293, - "startIndex": 7292, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7292 - }, - { - "endIndex": 7324, - "paragraph": { - "elements": [ - { - "endIndex": 7324, - "startIndex": 7293, - "textRun": { - "content": " return const CupertinoApp(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7293 - }, - { - "endIndex": 7387, - "paragraph": { - "elements": [ - { - "endIndex": 7387, - "startIndex": 7324, - "textRun": { - "content": " theme: CupertinoThemeData(brightness: Brightness.light),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7324 - }, - { - "endIndex": 7425, - "paragraph": { - "elements": [ - { - "endIndex": 7425, - "startIndex": 7387, - "textRun": { - "content": " home: CupertinoStoreHomePage(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7387 - }, - { - "endIndex": 7432, - "paragraph": { - "elements": [ - { - "endIndex": 7432, - "startIndex": 7425, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7425 - }, - { - "endIndex": 7436, - "paragraph": { - "elements": [ - { - "endIndex": 7436, - "startIndex": 7432, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7432 - }, - { - "endIndex": 7438, - "paragraph": { - "elements": [ - { - "endIndex": 7437, - "startIndex": 7436, - "textRun": { - "content": "}", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7438, - "startIndex": 7437, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7436 - } - ], - "endIndex": 7438, - "startIndex": 6841, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 7440, - "paragraph": { - "elements": [ - { - "endIndex": 7440, - "startIndex": 7439, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 7439 - }, - { - "endIndex": 7455, - "paragraph": { - "elements": [ - { - "endIndex": 7441, - "inlineObjectElement": { - "inlineObjectId": "kix.cd8xfhza25dp", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 7440 - }, - { - "endIndex": 7455, - "startIndex": 7441, - "textRun": { - "content": " Observations\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 7440 - }, - { - "endIndex": 7596, - "paragraph": { - "bullet": { - "listId": "kix.5gy96ltvl5jg", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 7466, - "startIndex": 7455, - "textRun": { - "content": "Import the ", - "textStyle": {} - } - }, - { - "endIndex": 7482, - "startIndex": 7466, - "textRun": { - "content": "services library", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.flutter.dev/flutter/services/services-library.html" - }, - "underline": true - } - } - }, - { - "endIndex": 7596, - "startIndex": 7482, - "textRun": { - "content": ". This makes the platform services, like the clipboard and setting the device orientation, available to your app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7455 - }, - { - "endIndex": 7746, - "paragraph": { - "bullet": { - "listId": "kix.5gy96ltvl5jg", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "elements": [ - { - "endIndex": 7609, - "startIndex": 7596, - "textRun": { - "content": "Instantiates ", - "textStyle": {} - } - }, - { - "endIndex": 7621, - "startIndex": 7609, - "textRun": { - "content": "CupertinoApp", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7746, - "startIndex": 7621, - "textRun": { - "content": ", which provides theming, navigation, text direction, and other defaults required to create an app that an iOS user expects.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7596 - }, - { - "endIndex": 7801, - "paragraph": { - "bullet": { - "listId": "kix.5gy96ltvl5jg", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 7761, - "startIndex": 7746, - "textRun": { - "content": "Instantiates a ", - "textStyle": {} - } - }, - { - "endIndex": 7783, - "startIndex": 7761, - "textRun": { - "content": "CupertinoStoreHomePage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7801, - "startIndex": 7783, - "textRun": { - "content": " as the homepage.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7746 - }, - { - "endIndex": 7896, - "paragraph": { - "bullet": { - "listId": "kix.5gy96ltvl5jg", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 7895, - "startIndex": 7801, - "textRun": { - "content": "The app is designed to only work vertically, so the device orientation is limited to portrait.", - "textStyle": {} - } - }, - { - "endIndex": 7896, - "startIndex": 7895, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7801 - }, - { - "endIndex": 7897, - "paragraph": { - "elements": [ - { - "endIndex": 7897, - "startIndex": 7896, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7896 - }, - { - "endIndex": 8039, - "paragraph": { - "elements": [ - { - "endIndex": 7898, - "inlineObjectElement": { - "inlineObjectId": "kix.v9dvbqwvoncu", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 7897 - }, - { - "endIndex": 7899, - "startIndex": 7898, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 7907, - "startIndex": 7899, - "textRun": { - "content": "Add the ", - "textStyle": {} - } - }, - { - "endIndex": 7929, - "startIndex": 7907, - "textRun": { - "content": "CupertinoStoreHomePage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7955, - "startIndex": 7929, - "textRun": { - "content": " class.\u000bAdd the following ", - "textStyle": {} - } - }, - { - "endIndex": 7977, - "startIndex": 7955, - "textRun": { - "content": "CupertinoStoreHomePage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7987, - "startIndex": 7977, - "textRun": { - "content": " class to ", - "textStyle": {} - } - }, - { - "endIndex": 7999, - "startIndex": 7987, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8039, - "startIndex": 7999, - "textRun": { - "content": " to create the layout for the homepage.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 7897 - }, - { - "endIndex": 8052, - "paragraph": { - "elements": [ - { - "endIndex": 8051, - "startIndex": 8039, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/googlecodelabs/flutter-cupertino-store/blob/master/step-00/lib/app.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 8052, - "startIndex": 8051, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.dni1skoy25yb", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 8039 - }, - { - "endIndex": 8381, - "startIndex": 8052, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 8380, - "startIndex": 8053, - "tableCells": [ - { - "content": [ - { - "endIndex": 8110, - "paragraph": { - "elements": [ - { - "endIndex": 8110, - "startIndex": 8055, - "textRun": { - "content": "class CupertinoStoreHomePage extends StatelessWidget {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8055 - }, - { - "endIndex": 8155, - "paragraph": { - "elements": [ - { - "endIndex": 8155, - "startIndex": 8110, - "textRun": { - "content": " const CupertinoStoreHomePage({super.key});\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8110 - }, - { - "endIndex": 8156, - "paragraph": { - "elements": [ - { - "endIndex": 8156, - "startIndex": 8155, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8155 - }, - { - "endIndex": 8168, - "paragraph": { - "elements": [ - { - "endIndex": 8168, - "startIndex": 8156, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8156 - }, - { - "endIndex": 8207, - "paragraph": { - "elements": [ - { - "endIndex": 8207, - "startIndex": 8168, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8168 - }, - { - "endIndex": 8247, - "paragraph": { - "elements": [ - { - "endIndex": 8247, - "startIndex": 8207, - "textRun": { - "content": " return const CupertinoPageScaffold(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8207 - }, - { - "endIndex": 8292, - "paragraph": { - "elements": [ - { - "endIndex": 8292, - "startIndex": 8247, - "textRun": { - "content": " navigationBar: CupertinoNavigationBar(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8247 - }, - { - "endIndex": 8333, - "paragraph": { - "elements": [ - { - "endIndex": 8333, - "startIndex": 8292, - "textRun": { - "content": " middle: Text('Cupertino Store'),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8292 - }, - { - "endIndex": 8342, - "paragraph": { - "elements": [ - { - "endIndex": 8342, - "startIndex": 8333, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8333 - }, - { - "endIndex": 8367, - "paragraph": { - "elements": [ - { - "endIndex": 8367, - "startIndex": 8342, - "textRun": { - "content": " child: SizedBox(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8342 - }, - { - "endIndex": 8374, - "paragraph": { - "elements": [ - { - "endIndex": 8374, - "startIndex": 8367, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8367 - }, - { - "endIndex": 8378, - "paragraph": { - "elements": [ - { - "endIndex": 8378, - "startIndex": 8374, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8374 - }, - { - "endIndex": 8380, - "paragraph": { - "elements": [ - { - "endIndex": 8379, - "startIndex": 8378, - "textRun": { - "content": "}", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8380, - "startIndex": 8379, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8378 - } - ], - "endIndex": 8380, - "startIndex": 8054, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 8382, - "paragraph": { - "elements": [ - { - "endIndex": 8382, - "startIndex": 8381, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 8381 - }, - { - "endIndex": 8397, - "paragraph": { - "elements": [ - { - "endIndex": 8383, - "inlineObjectElement": { - "inlineObjectId": "kix.12hzp12m6yl4", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 8382 - }, - { - "endIndex": 8396, - "startIndex": 8383, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 8397, - "startIndex": 8396, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 8382 - }, - { - "endIndex": 8670, - "paragraph": { - "bullet": { - "listId": "kix.6luzkckg0z03", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 8457, - "startIndex": 8397, - "textRun": { - "content": "The Cupertino package provides two types of page scaffolds. ", - "textStyle": {} - } - }, - { - "endIndex": 8478, - "startIndex": 8457, - "textRun": { - "content": "CupertinoPageScaffold", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8670, - "startIndex": 8478, - "textRun": { - "content": " supports single pages and accepts a Cupertino-style navigation bar, background color, and holds the widget tree for the page. You’ll learn about the second type of scaffold in the next step.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 8397 - }, - { - "endIndex": 8748, - "paragraph": { - "bullet": { - "listId": "kix.6luzkckg0z03", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 8748, - "startIndex": 8670, - "textRun": { - "content": "This page has a title, and the widget tree contains a single empty container.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 8670 - }, - { - "endIndex": 8891, - "paragraph": { - "elements": [ - { - "endIndex": 8749, - "inlineObjectElement": { - "inlineObjectId": "kix.gmc5gg7me4x3", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 8748 - }, - { - "endIndex": 8750, - "startIndex": 8749, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 8891, - "startIndex": 8750, - "textRun": { - "content": "Update the Flutter package dependencies.\u000bAdd Flutter package dependencies by running the following command at the top level of your project.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 8748 - }, - { - "endIndex": 9264, - "startIndex": 8891, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 9263, - "startIndex": 8892, - "tableCells": [ - { - "content": [ - { - "endIndex": 8940, - "paragraph": { - "elements": [ - { - "endIndex": 8940, - "startIndex": 8894, - "textRun": { - "content": "$ flutter pub add intl provider shrine_images\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8894 - }, - { - "endIndex": 8966, - "paragraph": { - "elements": [ - { - "endIndex": 8966, - "startIndex": 8940, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8940 - }, - { - "endIndex": 9005, - "paragraph": { - "elements": [ - { - "endIndex": 9005, - "startIndex": 8966, - "textRun": { - "content": " collection 1.17.0 (1.17.1 available)\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8966 - }, - { - "endIndex": 9019, - "paragraph": { - "elements": [ - { - "endIndex": 9019, - "startIndex": 9005, - "textRun": { - "content": "+ intl 0.18.0\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9005 - }, - { - "endIndex": 9048, - "paragraph": { - "elements": [ - { - "endIndex": 9048, - "startIndex": 9019, - "textRun": { - "content": " js 0.6.5 (0.6.7 available)\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9019 - }, - { - "endIndex": 9086, - "paragraph": { - "elements": [ - { - "endIndex": 9086, - "startIndex": 9048, - "textRun": { - "content": " matcher 0.12.13 (0.12.14 available)\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9048 - }, - { - "endIndex": 9117, - "paragraph": { - "elements": [ - { - "endIndex": 9117, - "startIndex": 9086, - "textRun": { - "content": " meta 1.8.0 (1.9.0 available)\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9086 - }, - { - "endIndex": 9132, - "paragraph": { - "elements": [ - { - "endIndex": 9132, - "startIndex": 9117, - "textRun": { - "content": "+ nested 1.0.0\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9117 - }, - { - "endIndex": 9163, - "paragraph": { - "elements": [ - { - "endIndex": 9163, - "startIndex": 9132, - "textRun": { - "content": " path 1.8.2 (1.8.3 available)\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9132 - }, - { - "endIndex": 9180, - "paragraph": { - "elements": [ - { - "endIndex": 9180, - "startIndex": 9163, - "textRun": { - "content": "+ provider 6.0.5\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9163 - }, - { - "endIndex": 9202, - "paragraph": { - "elements": [ - { - "endIndex": 9202, - "startIndex": 9180, - "textRun": { - "content": "+ shrine_images 2.0.2\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9180 - }, - { - "endIndex": 9239, - "paragraph": { - "elements": [ - { - "endIndex": 9239, - "startIndex": 9202, - "textRun": { - "content": " test_api 0.4.16 (0.4.18 available)\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9202 - }, - { - "endIndex": 9263, - "paragraph": { - "elements": [ - { - "endIndex": 9263, - "startIndex": 9239, - "textRun": { - "content": "Changed 4 dependencies!\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9239 - } - ], - "endIndex": 9263, - "startIndex": 8893, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 9265, - "paragraph": { - "elements": [ - { - "endIndex": 9265, - "startIndex": 9264, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 9264 - }, - { - "endIndex": 9542, - "paragraph": { - "elements": [ - { - "endIndex": 9269, - "startIndex": 9265, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 9273, - "startIndex": 9269, - "textRun": { - "content": "intl", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/intl" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9329, - "startIndex": 9273, - "textRun": { - "content": " package will be used in the last step for formatting, t", - "textStyle": {} - } - }, - { - "endIndex": 9332, - "startIndex": 9329, - "textRun": { - "content": "he ", - "textStyle": {} - } - }, - { - "endIndex": 9340, - "startIndex": 9332, - "textRun": { - "content": "provider", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/provider" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9393, - "startIndex": 9340, - "textRun": { - "content": " package will be used for state management, and the ", - "textStyle": {} - } - }, - { - "endIndex": 9406, - "startIndex": 9393, - "textRun": { - "content": "shrine_images", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/shrine_images" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9523, - "startIndex": 9406, - "textRun": { - "content": " package will be used for image assets. To access the images, add the following lines to the flutter section of your ", - "textStyle": {} - } - }, - { - "endIndex": 9535, - "startIndex": 9523, - "textRun": { - "content": "pubspec.yaml", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9542, - "startIndex": 9535, - "textRun": { - "content": " file.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 9265 - }, - { - "endIndex": 9555, - "paragraph": { - "elements": [ - { - "endIndex": 9554, - "startIndex": 9542, - "textRun": { - "content": "pubspec.yaml", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_00/pubspec.yaml" - }, - "underline": true - } - } - }, - { - "endIndex": 9555, - "startIndex": 9554, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.j76cazl39nbp", - "namedStyleType": "HEADING_3", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 9542 - }, - { - "endIndex": 11012, - "startIndex": 9555, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 11011, - "startIndex": 9556, - "tableCells": [ - { - "content": [ - { - "endIndex": 9567, - "paragraph": { - "elements": [ - { - "endIndex": 9567, - "startIndex": 9558, - "textRun": { - "content": "flutter:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9558 - }, - { - "endIndex": 9577, - "paragraph": { - "elements": [ - { - "endIndex": 9577, - "startIndex": 9567, - "textRun": { - "content": " assets:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9567 - }, - { - "endIndex": 9614, - "paragraph": { - "elements": [ - { - "endIndex": 9614, - "startIndex": 9577, - "textRun": { - "content": " - packages/shrine_images/0-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9577 - }, - { - "endIndex": 9651, - "paragraph": { - "elements": [ - { - "endIndex": 9651, - "startIndex": 9614, - "textRun": { - "content": " - packages/shrine_images/1-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9614 - }, - { - "endIndex": 9688, - "paragraph": { - "elements": [ - { - "endIndex": 9688, - "startIndex": 9651, - "textRun": { - "content": " - packages/shrine_images/2-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9651 - }, - { - "endIndex": 9725, - "paragraph": { - "elements": [ - { - "endIndex": 9725, - "startIndex": 9688, - "textRun": { - "content": " - packages/shrine_images/3-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9688 - }, - { - "endIndex": 9762, - "paragraph": { - "elements": [ - { - "endIndex": 9762, - "startIndex": 9725, - "textRun": { - "content": " - packages/shrine_images/4-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9725 - }, - { - "endIndex": 9799, - "paragraph": { - "elements": [ - { - "endIndex": 9799, - "startIndex": 9762, - "textRun": { - "content": " - packages/shrine_images/5-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9762 - }, - { - "endIndex": 9836, - "paragraph": { - "elements": [ - { - "endIndex": 9836, - "startIndex": 9799, - "textRun": { - "content": " - packages/shrine_images/6-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9799 - }, - { - "endIndex": 9873, - "paragraph": { - "elements": [ - { - "endIndex": 9873, - "startIndex": 9836, - "textRun": { - "content": " - packages/shrine_images/7-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9836 - }, - { - "endIndex": 9910, - "paragraph": { - "elements": [ - { - "endIndex": 9910, - "startIndex": 9873, - "textRun": { - "content": " - packages/shrine_images/8-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9873 - }, - { - "endIndex": 9947, - "paragraph": { - "elements": [ - { - "endIndex": 9947, - "startIndex": 9910, - "textRun": { - "content": " - packages/shrine_images/9-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9910 - }, - { - "endIndex": 9985, - "paragraph": { - "elements": [ - { - "endIndex": 9985, - "startIndex": 9947, - "textRun": { - "content": " - packages/shrine_images/10-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9947 - }, - { - "endIndex": 10023, - "paragraph": { - "elements": [ - { - "endIndex": 10023, - "startIndex": 9985, - "textRun": { - "content": " - packages/shrine_images/11-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9985 - }, - { - "endIndex": 10061, - "paragraph": { - "elements": [ - { - "endIndex": 10061, - "startIndex": 10023, - "textRun": { - "content": " - packages/shrine_images/12-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10023 - }, - { - "endIndex": 10099, - "paragraph": { - "elements": [ - { - "endIndex": 10099, - "startIndex": 10061, - "textRun": { - "content": " - packages/shrine_images/13-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10061 - }, - { - "endIndex": 10137, - "paragraph": { - "elements": [ - { - "endIndex": 10137, - "startIndex": 10099, - "textRun": { - "content": " - packages/shrine_images/14-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10099 - }, - { - "endIndex": 10175, - "paragraph": { - "elements": [ - { - "endIndex": 10175, - "startIndex": 10137, - "textRun": { - "content": " - packages/shrine_images/15-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10137 - }, - { - "endIndex": 10213, - "paragraph": { - "elements": [ - { - "endIndex": 10213, - "startIndex": 10175, - "textRun": { - "content": " - packages/shrine_images/16-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10175 - }, - { - "endIndex": 10251, - "paragraph": { - "elements": [ - { - "endIndex": 10251, - "startIndex": 10213, - "textRun": { - "content": " - packages/shrine_images/17-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10213 - }, - { - "endIndex": 10289, - "paragraph": { - "elements": [ - { - "endIndex": 10289, - "startIndex": 10251, - "textRun": { - "content": " - packages/shrine_images/18-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10251 - }, - { - "endIndex": 10327, - "paragraph": { - "elements": [ - { - "endIndex": 10327, - "startIndex": 10289, - "textRun": { - "content": " - packages/shrine_images/19-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10289 - }, - { - "endIndex": 10365, - "paragraph": { - "elements": [ - { - "endIndex": 10365, - "startIndex": 10327, - "textRun": { - "content": " - packages/shrine_images/20-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10327 - }, - { - "endIndex": 10403, - "paragraph": { - "elements": [ - { - "endIndex": 10403, - "startIndex": 10365, - "textRun": { - "content": " - packages/shrine_images/21-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10365 - }, - { - "endIndex": 10441, - "paragraph": { - "elements": [ - { - "endIndex": 10441, - "startIndex": 10403, - "textRun": { - "content": " - packages/shrine_images/22-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10403 - }, - { - "endIndex": 10479, - "paragraph": { - "elements": [ - { - "endIndex": 10479, - "startIndex": 10441, - "textRun": { - "content": " - packages/shrine_images/23-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10441 - }, - { - "endIndex": 10517, - "paragraph": { - "elements": [ - { - "endIndex": 10517, - "startIndex": 10479, - "textRun": { - "content": " - packages/shrine_images/24-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10479 - }, - { - "endIndex": 10555, - "paragraph": { - "elements": [ - { - "endIndex": 10555, - "startIndex": 10517, - "textRun": { - "content": " - packages/shrine_images/25-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10517 - }, - { - "endIndex": 10593, - "paragraph": { - "elements": [ - { - "endIndex": 10593, - "startIndex": 10555, - "textRun": { - "content": " - packages/shrine_images/26-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10555 - }, - { - "endIndex": 10631, - "paragraph": { - "elements": [ - { - "endIndex": 10631, - "startIndex": 10593, - "textRun": { - "content": " - packages/shrine_images/27-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10593 - }, - { - "endIndex": 10669, - "paragraph": { - "elements": [ - { - "endIndex": 10669, - "startIndex": 10631, - "textRun": { - "content": " - packages/shrine_images/28-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10631 - }, - { - "endIndex": 10707, - "paragraph": { - "elements": [ - { - "endIndex": 10707, - "startIndex": 10669, - "textRun": { - "content": " - packages/shrine_images/29-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10669 - }, - { - "endIndex": 10745, - "paragraph": { - "elements": [ - { - "endIndex": 10745, - "startIndex": 10707, - "textRun": { - "content": " - packages/shrine_images/30-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10707 - }, - { - "endIndex": 10783, - "paragraph": { - "elements": [ - { - "endIndex": 10783, - "startIndex": 10745, - "textRun": { - "content": " - packages/shrine_images/31-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10745 - }, - { - "endIndex": 10821, - "paragraph": { - "elements": [ - { - "endIndex": 10821, - "startIndex": 10783, - "textRun": { - "content": " - packages/shrine_images/32-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10783 - }, - { - "endIndex": 10859, - "paragraph": { - "elements": [ - { - "endIndex": 10859, - "startIndex": 10821, - "textRun": { - "content": " - packages/shrine_images/33-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10821 - }, - { - "endIndex": 10897, - "paragraph": { - "elements": [ - { - "endIndex": 10897, - "startIndex": 10859, - "textRun": { - "content": " - packages/shrine_images/34-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10859 - }, - { - "endIndex": 10935, - "paragraph": { - "elements": [ - { - "endIndex": 10935, - "startIndex": 10897, - "textRun": { - "content": " - packages/shrine_images/35-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10897 - }, - { - "endIndex": 10973, - "paragraph": { - "elements": [ - { - "endIndex": 10973, - "startIndex": 10935, - "textRun": { - "content": " - packages/shrine_images/36-0.jpg\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10935 - }, - { - "endIndex": 11011, - "paragraph": { - "elements": [ - { - "endIndex": 11010, - "startIndex": 10973, - "textRun": { - "content": " - packages/shrine_images/37-0.jpg", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11011, - "startIndex": 11010, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 14.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2627451, - "red": 0.2627451 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10973 - } - ], - "endIndex": 11011, - "startIndex": 9557, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 11014, - "paragraph": { - "elements": [ - { - "endIndex": 11014, - "startIndex": 11012, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.twmwboe3dbkx", - "namedStyleType": "HEADING_3", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11012 - }, - { - "endIndex": 11029, - "paragraph": { - "elements": [ - { - "endIndex": 11015, - "inlineObjectElement": { - "inlineObjectId": "kix.429ia1fn9nhk", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 11014 - }, - { - "endIndex": 11028, - "startIndex": 11015, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 11029, - "startIndex": 11028, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11014 - }, - { - "endIndex": 11132, - "paragraph": { - "bullet": { - "listId": "kix.6luzkckg0z03", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 11071, - "startIndex": 11029, - "textRun": { - "content": "This pulls in several packages, including ", - "textStyle": {} - } - }, - { - "endIndex": 11084, - "startIndex": 11071, - "textRun": { - "content": "shrine_images", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/shrine_images" - }, - "underline": true - } - } - }, - { - "endIndex": 11126, - "startIndex": 11084, - "textRun": { - "content": ", containing products for populating the s", - "textStyle": {} - } - }, - { - "endIndex": 11131, - "startIndex": 11126, - "textRun": { - "content": "tore.", - "textStyle": {} - } - }, - { - "endIndex": 11132, - "startIndex": 11131, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 11029 - }, - { - "endIndex": 11207, - "paragraph": { - "bullet": { - "listId": "kix.6luzkckg0z03", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 11136, - "startIndex": 11132, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 11144, - "startIndex": 11136, - "textRun": { - "content": "provider", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/provider" - }, - "underline": true - } - } - }, - { - "endIndex": 11207, - "startIndex": 11144, - "textRun": { - "content": " package provides a simple way to manage state across screens.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 11132 - }, - { - "endIndex": 11283, - "paragraph": { - "bullet": { - "listId": "kix.6luzkckg0z03", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 11211, - "startIndex": 11207, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 11215, - "startIndex": 11211, - "textRun": { - "content": "intl", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/intl" - }, - "underline": true - } - } - }, - { - "endIndex": 11283, - "startIndex": 11215, - "textRun": { - "content": " package provides internationalization and localization facilities.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 11207 - }, - { - "endIndex": 11359, - "paragraph": { - "bullet": { - "listId": "kix.6luzkckg0z03", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 11287, - "startIndex": 11283, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 11302, - "startIndex": 11287, - "textRun": { - "content": "cupertino_icons", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/cupertino_icons" - }, - "underline": true - } - } - }, - { - "endIndex": 11359, - "startIndex": 11302, - "textRun": { - "content": " package contains icon assets for the Cupertino widgets.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 11283 - }, - { - "endIndex": 11462, - "paragraph": { - "elements": [ - { - "endIndex": 11360, - "inlineObjectElement": { - "inlineObjectId": "kix.g4k6dalrj8z3", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 11359 - }, - { - "endIndex": 11361, - "startIndex": 11360, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 11372, - "startIndex": 11361, - "textRun": { - "content": "Run the app", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/test-drive" - }, - "underline": true - } - } - }, - { - "endIndex": 11462, - "startIndex": 11372, - "textRun": { - "content": ". You should see the following white screen containing the Cupertino navbar and a title:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11359 - }, - { - "endIndex": 11464, - "paragraph": { - "elements": [ - { - "endIndex": 11463, - "inlineObjectElement": { - "inlineObjectId": "kix.1rebc5i17d3x", - "textStyle": {} - }, - "startIndex": 11462 - }, - { - "endIndex": 11464, - "startIndex": 11463, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11462 - }, - { - "endIndex": 11465, - "paragraph": { - "elements": [ - { - "endIndex": 11465, - "startIndex": 11464, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11464 - }, - { - "endIndex": 11475, - "paragraph": { - "elements": [ - { - "endIndex": 11475, - "startIndex": 11465, - "textRun": { - "content": "Problems?\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11465 - }, - { - "endIndex": 11598, - "paragraph": { - "elements": [ - { - "endIndex": 11598, - "startIndex": 11475, - "textRun": { - "content": "If your app is not running correctly, look for typos. If needed, use the code at the following links to get back on track.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11475 - }, - { - "endIndex": 11599, - "paragraph": { - "elements": [ - { - "endIndex": 11599, - "startIndex": 11598, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11598 - }, - { - "endIndex": 11612, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 11611, - "startIndex": 11599, - "textRun": { - "content": "pubspec.yaml", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_00/pubspec.yaml" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11612, - "startIndex": 11611, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11599 - }, - { - "endIndex": 11625, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 11624, - "startIndex": 11612, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_00/lib/app.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11625, - "startIndex": 11624, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11612 - }, - { - "endIndex": 11639, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 11638, - "startIndex": 11625, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_00/lib/main.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11639, - "startIndex": 11638, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11625 - }, - { - "endIndex": 11655, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 11654, - "startIndex": 11639, - "textRun": { - "content": "lib/styles.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_00/lib/styles.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11655, - "startIndex": 11654, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11639 - }, - { - "endIndex": 11656, - "paragraph": { - "elements": [ - { - "endIndex": 11656, - "startIndex": 11655, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11655 - }, - { - "endIndex": 11658, - "paragraph": { - "elements": [ - { - "endIndex": 11657, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 11656 - }, - { - "endIndex": 11658, - "startIndex": 11657, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11656 - }, - { - "endIndex": 11691, - "paragraph": { - "elements": [ - { - "endIndex": 11690, - "startIndex": 11658, - "textRun": { - "content": "Create structure for a 3-tab app", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 11691, - "startIndex": 11690, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.b4ixhepuzky5", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11658 - }, - { - "endIndex": 11706, - "paragraph": { - "elements": [ - { - "endIndex": 11705, - "startIndex": 11691, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - }, - { - "endIndex": 11706, - "startIndex": 11705, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11691 - }, - { - "endIndex": 11707, - "paragraph": { - "elements": [ - { - "endIndex": 11707, - "startIndex": 11706, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11706 - }, - { - "endIndex": 11738, - "paragraph": { - "elements": [ - { - "endIndex": 11738, - "startIndex": 11707, - "textRun": { - "content": "The final app features 3 tabs:\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11707 - }, - { - "endIndex": 11751, - "paragraph": { - "bullet": { - "listId": "kix.os9i2e42g8ky", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 11751, - "startIndex": 11738, - "textRun": { - "content": "Product list\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 11738 - }, - { - "endIndex": 11766, - "paragraph": { - "bullet": { - "listId": "kix.os9i2e42g8ky", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 11766, - "startIndex": 11751, - "textRun": { - "content": "Product search\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 11751 - }, - { - "endIndex": 11780, - "paragraph": { - "bullet": { - "listId": "kix.os9i2e42g8ky", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 11780, - "startIndex": 11766, - "textRun": { - "content": "Shopping cart\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 11766 - }, - { - "endIndex": 11964, - "paragraph": { - "elements": [ - { - "endIndex": 11846, - "startIndex": 11780, - "textRun": { - "content": "In this step, you’ll update the home page with three tabs using a ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 11866, - "startIndex": 11846, - "textRun": { - "content": "CupertinoTabScaffold", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11964, - "startIndex": 11866, - "textRun": { - "content": ". You’ll also add a data source that provides the list of items for sale, with photos and prices.\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11780 - }, - { - "endIndex": 12203, - "paragraph": { - "elements": [ - { - "endIndex": 12000, - "startIndex": 11964, - "textRun": { - "content": "In the previous step, you created a ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 12022, - "startIndex": 12000, - "textRun": { - "content": "CupertinoStoreHomePage", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12037, - "startIndex": 12022, - "textRun": { - "content": " class using a ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 12058, - "startIndex": 12037, - "textRun": { - "content": "CupertinoPageScaffold", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12153, - "startIndex": 12058, - "textRun": { - "content": ". Use this scaffold for pages that have no tabs. The final app has three tabs, so swap out the ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 12162, - "startIndex": 12153, - "textRun": { - "content": "Cupertino", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12166, - "startIndex": 12162, - "textRun": { - "content": "Page", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12174, - "startIndex": 12166, - "textRun": { - "content": "Scaffold", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12181, - "startIndex": 12174, - "textRun": { - "content": " for a ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 12190, - "startIndex": 12181, - "textRun": { - "content": "Cupertino", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12193, - "startIndex": 12190, - "textRun": { - "content": "Tab", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12201, - "startIndex": 12193, - "textRun": { - "content": "Scaffold", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12203, - "startIndex": 12201, - "textRun": { - "content": ".\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11964 - }, - { - "endIndex": 12342, - "paragraph": { - "elements": [ - { - "endIndex": 12342, - "startIndex": 12203, - "textRun": { - "content": "Cupertino tab has a separate scaffold because on iOS, the bottom tab is commonly persistent above nested routes rather than inside pages. \n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 12203 - }, - { - "endIndex": 12458, - "paragraph": { - "elements": [ - { - "endIndex": 12343, - "inlineObjectElement": { - "inlineObjectId": "kix.j9pkj7tg0t9t", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 12342 - }, - { - "endIndex": 12344, - "startIndex": 12343, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 12351, - "startIndex": 12344, - "textRun": { - "content": "Update ", - "textStyle": {} - } - }, - { - "endIndex": 12363, - "startIndex": 12351, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12377, - "startIndex": 12363, - "textRun": { - "content": ".\u000bReplace the ", - "textStyle": {} - } - }, - { - "endIndex": 12399, - "startIndex": 12377, - "textRun": { - "content": "CupertinoStoreHomePage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12458, - "startIndex": 12399, - "textRun": { - "content": " class with the following, which sets up a 3-tab scaffold:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 12342 - }, - { - "endIndex": 12471, - "paragraph": { - "elements": [ - { - "endIndex": 12470, - "startIndex": 12458, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/app.dart#L36" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 12471, - "startIndex": 12470, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.rtq7y8rxgsqq", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 12458 - }, - { - "endIndex": 13803, - "startIndex": 12471, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 13802, - "startIndex": 12472, - "tableCells": [ - { - "content": [ - { - "endIndex": 12529, - "paragraph": { - "elements": [ - { - "endIndex": 12529, - "startIndex": 12474, - "textRun": { - "content": "class CupertinoStoreHomePage extends StatelessWidget {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12474 - }, - { - "endIndex": 12574, - "paragraph": { - "elements": [ - { - "endIndex": 12574, - "startIndex": 12529, - "textRun": { - "content": " const CupertinoStoreHomePage({super.key});\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12529 - }, - { - "endIndex": 12575, - "paragraph": { - "elements": [ - { - "endIndex": 12575, - "startIndex": 12574, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12574 - }, - { - "endIndex": 12587, - "paragraph": { - "elements": [ - { - "endIndex": 12587, - "startIndex": 12575, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12575 - }, - { - "endIndex": 12626, - "paragraph": { - "elements": [ - { - "endIndex": 12626, - "startIndex": 12587, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12587 - }, - { - "endIndex": 12659, - "paragraph": { - "elements": [ - { - "endIndex": 12659, - "startIndex": 12626, - "textRun": { - "content": " return CupertinoTabScaffold(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12626 - }, - { - "endIndex": 12690, - "paragraph": { - "elements": [ - { - "endIndex": 12690, - "startIndex": 12659, - "textRun": { - "content": " tabBar: CupertinoTabBar(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12659 - }, - { - "endIndex": 12738, - "paragraph": { - "elements": [ - { - "endIndex": 12738, - "startIndex": 12690, - "textRun": { - "content": " items: const [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12690 - }, - { - "endIndex": 12773, - "paragraph": { - "elements": [ - { - "endIndex": 12773, - "startIndex": 12738, - "textRun": { - "content": " BottomNavigationBarItem(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12738 - }, - { - "endIndex": 12818, - "paragraph": { - "elements": [ - { - "endIndex": 12818, - "startIndex": 12773, - "textRun": { - "content": " icon: Icon(CupertinoIcons.home),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12773 - }, - { - "endIndex": 12849, - "paragraph": { - "elements": [ - { - "endIndex": 12849, - "startIndex": 12818, - "textRun": { - "content": " label: 'Products',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12818 - }, - { - "endIndex": 12862, - "paragraph": { - "elements": [ - { - "endIndex": 12862, - "startIndex": 12849, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12849 - }, - { - "endIndex": 12897, - "paragraph": { - "elements": [ - { - "endIndex": 12897, - "startIndex": 12862, - "textRun": { - "content": " BottomNavigationBarItem(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12862 - }, - { - "endIndex": 12944, - "paragraph": { - "elements": [ - { - "endIndex": 12944, - "startIndex": 12897, - "textRun": { - "content": " icon: Icon(CupertinoIcons.search),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12897 - }, - { - "endIndex": 12973, - "paragraph": { - "elements": [ - { - "endIndex": 12973, - "startIndex": 12944, - "textRun": { - "content": " label: 'Search',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12944 - }, - { - "endIndex": 12986, - "paragraph": { - "elements": [ - { - "endIndex": 12986, - "startIndex": 12973, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12973 - }, - { - "endIndex": 13021, - "paragraph": { - "elements": [ - { - "endIndex": 13021, - "startIndex": 12986, - "textRun": { - "content": " BottomNavigationBarItem(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12986 - }, - { - "endIndex": 13075, - "paragraph": { - "elements": [ - { - "endIndex": 13075, - "startIndex": 13021, - "textRun": { - "content": " icon: Icon(CupertinoIcons.shopping_cart),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13021 - }, - { - "endIndex": 13102, - "paragraph": { - "elements": [ - { - "endIndex": 13102, - "startIndex": 13075, - "textRun": { - "content": " label: 'Cart',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13075 - }, - { - "endIndex": 13115, - "paragraph": { - "elements": [ - { - "endIndex": 13115, - "startIndex": 13102, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13102 - }, - { - "endIndex": 13126, - "paragraph": { - "elements": [ - { - "endIndex": 13126, - "startIndex": 13115, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13115 - }, - { - "endIndex": 13135, - "paragraph": { - "elements": [ - { - "endIndex": 13135, - "startIndex": 13126, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13126 - }, - { - "endIndex": 13172, - "paragraph": { - "elements": [ - { - "endIndex": 13172, - "startIndex": 13135, - "textRun": { - "content": " tabBuilder: (context, index) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13135 - }, - { - "endIndex": 13204, - "paragraph": { - "elements": [ - { - "endIndex": 13204, - "startIndex": 13172, - "textRun": { - "content": " return switch (index) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13172 - }, - { - "endIndex": 13237, - "paragraph": { - "elements": [ - { - "endIndex": 13237, - "startIndex": 13204, - "textRun": { - "content": " 0 => CupertinoTabView(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13204 - }, - { - "endIndex": 13302, - "paragraph": { - "elements": [ - { - "endIndex": 13302, - "startIndex": 13237, - "textRun": { - "content": " builder: (context) => const CupertinoPageScaffold(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13237 - }, - { - "endIndex": 13343, - "paragraph": { - "elements": [ - { - "endIndex": 13343, - "startIndex": 13302, - "textRun": { - "content": " child: ProductListTab(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13302 - }, - { - "endIndex": 13360, - "paragraph": { - "elements": [ - { - "endIndex": 13360, - "startIndex": 13343, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13343 - }, - { - "endIndex": 13375, - "paragraph": { - "elements": [ - { - "endIndex": 13375, - "startIndex": 13360, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13360 - }, - { - "endIndex": 13408, - "paragraph": { - "elements": [ - { - "endIndex": 13408, - "startIndex": 13375, - "textRun": { - "content": " 1 => CupertinoTabView(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13375 - }, - { - "endIndex": 13473, - "paragraph": { - "elements": [ - { - "endIndex": 13473, - "startIndex": 13408, - "textRun": { - "content": " builder: (context) => const CupertinoPageScaffold(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13408 - }, - { - "endIndex": 13509, - "paragraph": { - "elements": [ - { - "endIndex": 13509, - "startIndex": 13473, - "textRun": { - "content": " child: SearchTab(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13473 - }, - { - "endIndex": 13526, - "paragraph": { - "elements": [ - { - "endIndex": 13526, - "startIndex": 13509, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13509 - }, - { - "endIndex": 13541, - "paragraph": { - "elements": [ - { - "endIndex": 13541, - "startIndex": 13526, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13526 - }, - { - "endIndex": 13574, - "paragraph": { - "elements": [ - { - "endIndex": 13574, - "startIndex": 13541, - "textRun": { - "content": " 2 => CupertinoTabView(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13541 - }, - { - "endIndex": 13639, - "paragraph": { - "elements": [ - { - "endIndex": 13639, - "startIndex": 13574, - "textRun": { - "content": " builder: (context) => const CupertinoPageScaffold(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13574 - }, - { - "endIndex": 13681, - "paragraph": { - "elements": [ - { - "endIndex": 13681, - "startIndex": 13639, - "textRun": { - "content": " child: ShoppingCartTab(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13639 - }, - { - "endIndex": 13698, - "paragraph": { - "elements": [ - { - "endIndex": 13698, - "startIndex": 13681, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13681 - }, - { - "endIndex": 13713, - "paragraph": { - "elements": [ - { - "endIndex": 13713, - "startIndex": 13698, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13698 - }, - { - "endIndex": 13769, - "paragraph": { - "elements": [ - { - "endIndex": 13769, - "startIndex": 13713, - "textRun": { - "content": " _ => throw Exception('Invalid index $index'),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13713 - }, - { - "endIndex": 13780, - "paragraph": { - "elements": [ - { - "endIndex": 13780, - "startIndex": 13769, - "textRun": { - "content": " };\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13769 - }, - { - "endIndex": 13789, - "paragraph": { - "elements": [ - { - "endIndex": 13789, - "startIndex": 13780, - "textRun": { - "content": " },\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13780 - }, - { - "endIndex": 13796, - "paragraph": { - "elements": [ - { - "endIndex": 13796, - "startIndex": 13789, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13789 - }, - { - "endIndex": 13800, - "paragraph": { - "elements": [ - { - "endIndex": 13800, - "startIndex": 13796, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13796 - }, - { - "endIndex": 13802, - "paragraph": { - "elements": [ - { - "endIndex": 13801, - "startIndex": 13800, - "textRun": { - "content": "}", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13802, - "startIndex": 13801, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13800 - } - ], - "endIndex": 13802, - "startIndex": 12473, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 13804, - "paragraph": { - "elements": [ - { - "endIndex": 13804, - "startIndex": 13803, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 13803 - }, - { - "endIndex": 13819, - "paragraph": { - "elements": [ - { - "endIndex": 13805, - "inlineObjectElement": { - "inlineObjectId": "kix.b6v16npcloiq", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 13804 - }, - { - "endIndex": 13818, - "startIndex": 13805, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 13819, - "startIndex": 13818, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 13804 - }, - { - "endIndex": 13900, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 13834, - "startIndex": 13819, - "textRun": { - "content": "CupertinoTabBar", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13900, - "startIndex": 13834, - "textRun": { - "content": " requires at least two items, or you will see errors at run-time.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 13819 - }, - { - "endIndex": 14115, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 13904, - "startIndex": 13900, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 13915, - "startIndex": 13904, - "textRun": { - "content": "tabBuilder:", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14071, - "startIndex": 13915, - "textRun": { - "content": " is responsible for making sure the specified tab is built. In this case, it calls a class constructor to set up each respective tab, wrapping all three in ", - "textStyle": {} - } - }, - { - "endIndex": 14087, - "startIndex": 14071, - "textRun": { - "content": "CupertinoTabView", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14092, - "startIndex": 14087, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 14113, - "startIndex": 14092, - "textRun": { - "content": "CupertinoPageScaffold", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14115, - "startIndex": 14113, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 13900 - }, - { - "endIndex": 14309, - "paragraph": { - "elements": [ - { - "endIndex": 14116, - "inlineObjectElement": { - "inlineObjectId": "kix.7debthccg8n1", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 14115 - }, - { - "endIndex": 14117, - "startIndex": 14116, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 14176, - "startIndex": 14117, - "textRun": { - "content": "Add stub classes for the content of the new tabs.\u000bCreate a ", - "textStyle": {} - } - }, - { - "endIndex": 14201, - "startIndex": 14176, - "textRun": { - "content": "lib/product_list_tab.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14309, - "startIndex": 14201, - "textRun": { - "content": " file for the first tab that compiles cleanly, but only displays a white screen. Use the following content:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 14115 - }, - { - "endIndex": 14335, - "paragraph": { - "elements": [ - { - "endIndex": 14334, - "startIndex": 14309, - "textRun": { - "content": "lib/product_list_tab.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/product_list_tab.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 14335, - "startIndex": 14334, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.1xfoo8a854ll", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 14309 - }, - { - "endIndex": 14895, - "startIndex": 14335, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 14894, - "startIndex": 14336, - "tableCells": [ - { - "content": [ - { - "endIndex": 14379, - "paragraph": { - "elements": [ - { - "endIndex": 14379, - "startIndex": 14338, - "textRun": { - "content": "import 'package:flutter/cupertino.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14338 - }, - { - "endIndex": 14420, - "paragraph": { - "elements": [ - { - "endIndex": 14420, - "startIndex": 14379, - "textRun": { - "content": "import 'package:provider/provider.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14379 - }, - { - "endIndex": 14421, - "paragraph": { - "elements": [ - { - "endIndex": 14421, - "startIndex": 14420, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14420 - }, - { - "endIndex": 14458, - "paragraph": { - "elements": [ - { - "endIndex": 14458, - "startIndex": 14421, - "textRun": { - "content": "import 'model/app_state_model.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14421 - }, - { - "endIndex": 14459, - "paragraph": { - "elements": [ - { - "endIndex": 14459, - "startIndex": 14458, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14458 - }, - { - "endIndex": 14506, - "paragraph": { - "elements": [ - { - "endIndex": 14506, - "startIndex": 14459, - "textRun": { - "content": "class ProductListTab extends StatelessWidget {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14459 - }, - { - "endIndex": 14543, - "paragraph": { - "elements": [ - { - "endIndex": 14543, - "startIndex": 14506, - "textRun": { - "content": " const ProductListTab({super.key});\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14506 - }, - { - "endIndex": 14544, - "paragraph": { - "elements": [ - { - "endIndex": 14544, - "startIndex": 14543, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14543 - }, - { - "endIndex": 14556, - "paragraph": { - "elements": [ - { - "endIndex": 14556, - "startIndex": 14544, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14544 - }, - { - "endIndex": 14595, - "paragraph": { - "elements": [ - { - "endIndex": 14595, - "startIndex": 14556, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14556 - }, - { - "endIndex": 14631, - "paragraph": { - "elements": [ - { - "endIndex": 14631, - "startIndex": 14595, - "textRun": { - "content": " return Consumer(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14595 - }, - { - "endIndex": 14672, - "paragraph": { - "elements": [ - { - "endIndex": 14672, - "startIndex": 14631, - "textRun": { - "content": " builder: (context, model, child) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14631 - }, - { - "endIndex": 14711, - "paragraph": { - "elements": [ - { - "endIndex": 14711, - "startIndex": 14672, - "textRun": { - "content": " return const CustomScrollView(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14672 - }, - { - "endIndex": 14740, - "paragraph": { - "elements": [ - { - "endIndex": 14740, - "startIndex": 14711, - "textRun": { - "content": " slivers: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14711 - }, - { - "endIndex": 14782, - "paragraph": { - "elements": [ - { - "endIndex": 14782, - "startIndex": 14740, - "textRun": { - "content": " CupertinoSliverNavigationBar(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14740 - }, - { - "endIndex": 14833, - "paragraph": { - "elements": [ - { - "endIndex": 14833, - "startIndex": 14782, - "textRun": { - "content": " largeTitle: Text('Cupertino Store'),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14782 - }, - { - "endIndex": 14848, - "paragraph": { - "elements": [ - { - "endIndex": 14848, - "startIndex": 14833, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14833 - }, - { - "endIndex": 14861, - "paragraph": { - "elements": [ - { - "endIndex": 14861, - "startIndex": 14848, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14848 - }, - { - "endIndex": 14872, - "paragraph": { - "elements": [ - { - "endIndex": 14872, - "startIndex": 14861, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14861 - }, - { - "endIndex": 14881, - "paragraph": { - "elements": [ - { - "endIndex": 14881, - "startIndex": 14872, - "textRun": { - "content": " },\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14872 - }, - { - "endIndex": 14888, - "paragraph": { - "elements": [ - { - "endIndex": 14888, - "startIndex": 14881, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14881 - }, - { - "endIndex": 14892, - "paragraph": { - "elements": [ - { - "endIndex": 14892, - "startIndex": 14888, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14888 - }, - { - "endIndex": 14894, - "paragraph": { - "elements": [ - { - "endIndex": 14894, - "startIndex": 14892, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14892 - } - ], - "endIndex": 14894, - "startIndex": 14337, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 14896, - "paragraph": { - "elements": [ - { - "endIndex": 14896, - "startIndex": 14895, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 14895 - }, - { - "endIndex": 14911, - "paragraph": { - "elements": [ - { - "endIndex": 14897, - "inlineObjectElement": { - "inlineObjectId": "kix.a5e98fcpxd64", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 14896 - }, - { - "endIndex": 14911, - "startIndex": 14897, - "textRun": { - "content": " Observations\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 14896 - }, - { - "endIndex": 14955, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "elements": [ - { - "endIndex": 14955, - "startIndex": 14911, - "textRun": { - "content": "The product list tab is a stateless widget.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14911 - }, - { - "endIndex": 15055, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 14959, - "startIndex": 14955, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 14967, - "startIndex": 14959, - "textRun": { - "content": "Consumer", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14978, - "startIndex": 14967, - "textRun": { - "content": ", from the ", - "textStyle": {} - } - }, - { - "endIndex": 14986, - "startIndex": 14978, - "textRun": { - "content": "provider", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15055, - "startIndex": 14986, - "textRun": { - "content": " package, assists with state management. More about the model later.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 14955 - }, - { - "endIndex": 15318, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 15257, - "startIndex": 15055, - "textRun": { - "content": "There are 2 variants of the navigation bar on iOS. The common short static type seen since iOS 1, and the tall scrollable large title type introduced in iOS 11. This page implements the latter inside a ", - "textStyle": {} - } - }, - { - "endIndex": 15273, - "startIndex": 15257, - "textRun": { - "content": "CustomScrollView", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15281, - "startIndex": 15273, - "textRun": { - "content": " with a ", - "textStyle": {} - } - }, - { - "endIndex": 15309, - "startIndex": 15281, - "textRun": { - "content": "CupertinoSliverNavigationBar", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15318, - "startIndex": 15309, - "textRun": { - "content": " widget.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 15055 - }, - { - "endIndex": 15462, - "paragraph": { - "elements": [ - { - "endIndex": 15319, - "inlineObjectElement": { - "inlineObjectId": "kix.a33ljwd4qyfi", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 15318 - }, - { - "endIndex": 15320, - "startIndex": 15319, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 15353, - "startIndex": 15320, - "textRun": { - "content": "Add a search page stub.\u000bCreate a ", - "textStyle": {} - } - }, - { - "endIndex": 15372, - "startIndex": 15353, - "textRun": { - "content": "lib/search_tab.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15462, - "startIndex": 15372, - "textRun": { - "content": " file that compiles cleanly, but only displays a white screen. Use the following content:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 15318 - }, - { - "endIndex": 15482, - "paragraph": { - "elements": [ - { - "endIndex": 15481, - "startIndex": 15462, - "textRun": { - "content": "lib/search_tab.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/search_tab.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 15482, - "startIndex": 15481, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6oaiqusyrtlp", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 15462 - }, - { - "endIndex": 15955, - "startIndex": 15482, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 15954, - "startIndex": 15483, - "tableCells": [ - { - "content": [ - { - "endIndex": 15526, - "paragraph": { - "elements": [ - { - "endIndex": 15526, - "startIndex": 15485, - "textRun": { - "content": "import 'package:flutter/cupertino.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15485 - }, - { - "endIndex": 15527, - "paragraph": { - "elements": [ - { - "endIndex": 15527, - "startIndex": 15526, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15526 - }, - { - "endIndex": 15568, - "paragraph": { - "elements": [ - { - "endIndex": 15568, - "startIndex": 15527, - "textRun": { - "content": "class SearchTab extends StatefulWidget {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15527 - }, - { - "endIndex": 15600, - "paragraph": { - "elements": [ - { - "endIndex": 15600, - "startIndex": 15568, - "textRun": { - "content": " const SearchTab({super.key});\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15568 - }, - { - "endIndex": 15601, - "paragraph": { - "elements": [ - { - "endIndex": 15601, - "startIndex": 15600, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15600 - }, - { - "endIndex": 15613, - "paragraph": { - "elements": [ - { - "endIndex": 15613, - "startIndex": 15601, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15601 - }, - { - "endIndex": 15648, - "paragraph": { - "elements": [ - { - "endIndex": 15648, - "startIndex": 15613, - "textRun": { - "content": " State createState() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15613 - }, - { - "endIndex": 15678, - "paragraph": { - "elements": [ - { - "endIndex": 15678, - "startIndex": 15648, - "textRun": { - "content": " return _SearchTabState();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15648 - }, - { - "endIndex": 15682, - "paragraph": { - "elements": [ - { - "endIndex": 15682, - "startIndex": 15678, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15678 - }, - { - "endIndex": 15684, - "paragraph": { - "elements": [ - { - "endIndex": 15684, - "startIndex": 15682, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15682 - }, - { - "endIndex": 15685, - "paragraph": { - "elements": [ - { - "endIndex": 15685, - "startIndex": 15684, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15684 - }, - { - "endIndex": 15734, - "paragraph": { - "elements": [ - { - "endIndex": 15734, - "startIndex": 15685, - "textRun": { - "content": "class _SearchTabState extends State {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15685 - }, - { - "endIndex": 15746, - "paragraph": { - "elements": [ - { - "endIndex": 15746, - "startIndex": 15734, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15734 - }, - { - "endIndex": 15785, - "paragraph": { - "elements": [ - { - "endIndex": 15785, - "startIndex": 15746, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15746 - }, - { - "endIndex": 15820, - "paragraph": { - "elements": [ - { - "endIndex": 15820, - "startIndex": 15785, - "textRun": { - "content": " return const CustomScrollView(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15785 - }, - { - "endIndex": 15845, - "paragraph": { - "elements": [ - { - "endIndex": 15845, - "startIndex": 15820, - "textRun": { - "content": " slivers: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15820 - }, - { - "endIndex": 15883, - "paragraph": { - "elements": [ - { - "endIndex": 15883, - "startIndex": 15845, - "textRun": { - "content": " CupertinoSliverNavigationBar(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15845 - }, - { - "endIndex": 15921, - "paragraph": { - "elements": [ - { - "endIndex": 15921, - "startIndex": 15883, - "textRun": { - "content": " largeTitle: Text('Search'),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15883 - }, - { - "endIndex": 15932, - "paragraph": { - "elements": [ - { - "endIndex": 15932, - "startIndex": 15921, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15921 - }, - { - "endIndex": 15941, - "paragraph": { - "elements": [ - { - "endIndex": 15941, - "startIndex": 15932, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15932 - }, - { - "endIndex": 15948, - "paragraph": { - "elements": [ - { - "endIndex": 15948, - "startIndex": 15941, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15941 - }, - { - "endIndex": 15952, - "paragraph": { - "elements": [ - { - "endIndex": 15952, - "startIndex": 15948, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15948 - }, - { - "endIndex": 15954, - "paragraph": { - "elements": [ - { - "endIndex": 15954, - "startIndex": 15952, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15952 - } - ], - "endIndex": 15954, - "startIndex": 15484, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 15956, - "paragraph": { - "elements": [ - { - "endIndex": 15956, - "startIndex": 15955, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 15955 - }, - { - "endIndex": 15971, - "paragraph": { - "elements": [ - { - "endIndex": 15957, - "inlineObjectElement": { - "inlineObjectId": "kix.hnk1fonf71x5", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 15956 - }, - { - "endIndex": 15971, - "startIndex": 15957, - "textRun": { - "content": " Observations\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 15956 - }, - { - "endIndex": 16076, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 16076, - "startIndex": 15971, - "textRun": { - "content": "The search tab is a stateful widget because, as the user performs searches, the list of results changes.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15971 - }, - { - "endIndex": 16077, - "paragraph": { - "elements": [ - { - "endIndex": 16077, - "startIndex": 16076, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 16076 - }, - { - "endIndex": 16235, - "paragraph": { - "elements": [ - { - "endIndex": 16078, - "inlineObjectElement": { - "inlineObjectId": "kix.g4k3euxylmts", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 16077 - }, - { - "endIndex": 16079, - "startIndex": 16078, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 16119, - "startIndex": 16079, - "textRun": { - "content": "Add a shopping cart page stub.\u000bCreate a ", - "textStyle": {} - } - }, - { - "endIndex": 16145, - "startIndex": 16119, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16211, - "startIndex": 16145, - "textRun": { - "content": " file that compiles cleanly, but only displays a white screen. Use", - "textStyle": {} - } - }, - { - "endIndex": 16235, - "startIndex": 16211, - "textRun": { - "content": " the following content:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 16077 - }, - { - "endIndex": 16262, - "paragraph": { - "elements": [ - { - "endIndex": 16261, - "startIndex": 16235, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/shopping_cart_tab.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 16262, - "startIndex": 16261, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.g7cz8ikgazp5", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 16235 - }, - { - "endIndex": 16978, - "startIndex": 16262, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16977, - "startIndex": 16263, - "tableCells": [ - { - "content": [ - { - "endIndex": 16306, - "paragraph": { - "elements": [ - { - "endIndex": 16306, - "startIndex": 16265, - "textRun": { - "content": "import 'package:flutter/cupertino.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16265 - }, - { - "endIndex": 16347, - "paragraph": { - "elements": [ - { - "endIndex": 16347, - "startIndex": 16306, - "textRun": { - "content": "import 'package:provider/provider.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16306 - }, - { - "endIndex": 16348, - "paragraph": { - "elements": [ - { - "endIndex": 16348, - "startIndex": 16347, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16347 - }, - { - "endIndex": 16385, - "paragraph": { - "elements": [ - { - "endIndex": 16385, - "startIndex": 16348, - "textRun": { - "content": "import 'model/app_state_model.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16348 - }, - { - "endIndex": 16386, - "paragraph": { - "elements": [ - { - "endIndex": 16386, - "startIndex": 16385, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16385 - }, - { - "endIndex": 16433, - "paragraph": { - "elements": [ - { - "endIndex": 16433, - "startIndex": 16386, - "textRun": { - "content": "class ShoppingCartTab extends StatefulWidget {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16386 - }, - { - "endIndex": 16471, - "paragraph": { - "elements": [ - { - "endIndex": 16471, - "startIndex": 16433, - "textRun": { - "content": " const ShoppingCartTab({super.key});\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16433 - }, - { - "endIndex": 16472, - "paragraph": { - "elements": [ - { - "endIndex": 16472, - "startIndex": 16471, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16471 - }, - { - "endIndex": 16484, - "paragraph": { - "elements": [ - { - "endIndex": 16484, - "startIndex": 16472, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16472 - }, - { - "endIndex": 16525, - "paragraph": { - "elements": [ - { - "endIndex": 16525, - "startIndex": 16484, - "textRun": { - "content": " State createState() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16484 - }, - { - "endIndex": 16561, - "paragraph": { - "elements": [ - { - "endIndex": 16561, - "startIndex": 16525, - "textRun": { - "content": " return _ShoppingCartTabState();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16525 - }, - { - "endIndex": 16565, - "paragraph": { - "elements": [ - { - "endIndex": 16565, - "startIndex": 16561, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16561 - }, - { - "endIndex": 16567, - "paragraph": { - "elements": [ - { - "endIndex": 16567, - "startIndex": 16565, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16565 - }, - { - "endIndex": 16568, - "paragraph": { - "elements": [ - { - "endIndex": 16568, - "startIndex": 16567, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16567 - }, - { - "endIndex": 16629, - "paragraph": { - "elements": [ - { - "endIndex": 16629, - "startIndex": 16568, - "textRun": { - "content": "class _ShoppingCartTabState extends State {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16568 - }, - { - "endIndex": 16641, - "paragraph": { - "elements": [ - { - "endIndex": 16641, - "startIndex": 16629, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16629 - }, - { - "endIndex": 16680, - "paragraph": { - "elements": [ - { - "endIndex": 16680, - "startIndex": 16641, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16641 - }, - { - "endIndex": 16716, - "paragraph": { - "elements": [ - { - "endIndex": 16716, - "startIndex": 16680, - "textRun": { - "content": " return Consumer(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16680 - }, - { - "endIndex": 16757, - "paragraph": { - "elements": [ - { - "endIndex": 16757, - "startIndex": 16716, - "textRun": { - "content": " builder: (context, model, child) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16716 - }, - { - "endIndex": 16796, - "paragraph": { - "elements": [ - { - "endIndex": 16796, - "startIndex": 16757, - "textRun": { - "content": " return const CustomScrollView(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16757 - }, - { - "endIndex": 16825, - "paragraph": { - "elements": [ - { - "endIndex": 16825, - "startIndex": 16796, - "textRun": { - "content": " slivers: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16796 - }, - { - "endIndex": 16867, - "paragraph": { - "elements": [ - { - "endIndex": 16867, - "startIndex": 16825, - "textRun": { - "content": " CupertinoSliverNavigationBar(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16825 - }, - { - "endIndex": 16916, - "paragraph": { - "elements": [ - { - "endIndex": 16916, - "startIndex": 16867, - "textRun": { - "content": " largeTitle: Text('Shopping Cart'),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16867 - }, - { - "endIndex": 16931, - "paragraph": { - "elements": [ - { - "endIndex": 16931, - "startIndex": 16916, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16916 - }, - { - "endIndex": 16944, - "paragraph": { - "elements": [ - { - "endIndex": 16944, - "startIndex": 16931, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16931 - }, - { - "endIndex": 16955, - "paragraph": { - "elements": [ - { - "endIndex": 16955, - "startIndex": 16944, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16944 - }, - { - "endIndex": 16964, - "paragraph": { - "elements": [ - { - "endIndex": 16964, - "startIndex": 16955, - "textRun": { - "content": " },\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16955 - }, - { - "endIndex": 16971, - "paragraph": { - "elements": [ - { - "endIndex": 16971, - "startIndex": 16964, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16964 - }, - { - "endIndex": 16975, - "paragraph": { - "elements": [ - { - "endIndex": 16975, - "startIndex": 16971, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16971 - }, - { - "endIndex": 16977, - "paragraph": { - "elements": [ - { - "endIndex": 16977, - "startIndex": 16975, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16975 - } - ], - "endIndex": 16977, - "startIndex": 16264, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16979, - "paragraph": { - "elements": [ - { - "endIndex": 16979, - "startIndex": 16978, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 16978 - }, - { - "endIndex": 16994, - "paragraph": { - "elements": [ - { - "endIndex": 16980, - "inlineObjectElement": { - "inlineObjectId": "kix.qpb6hhjgmev", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 16979 - }, - { - "endIndex": 16994, - "startIndex": 16980, - "textRun": { - "content": " Observations\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 16979 - }, - { - "endIndex": 17105, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 17105, - "startIndex": 16994, - "textRun": { - "content": "The shopping cart tab is a stateful widget because it maintains the list of purchases and the customer’s info.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16994 - }, - { - "endIndex": 17145, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 17127, - "startIndex": 17105, - "textRun": { - "content": "This page also uses a ", - "textStyle": {} - } - }, - { - "endIndex": 17143, - "startIndex": 17127, - "textRun": { - "content": "CustomScrollView", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17145, - "startIndex": 17143, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17105 - }, - { - "endIndex": 17146, - "paragraph": { - "elements": [ - { - "endIndex": 17146, - "startIndex": 17145, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17145 - }, - { - "endIndex": 17246, - "paragraph": { - "elements": [ - { - "endIndex": 17147, - "inlineObjectElement": { - "inlineObjectId": "kix.xqiczfcx75xn", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 17146 - }, - { - "endIndex": 17148, - "startIndex": 17147, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 17201, - "startIndex": 17148, - "textRun": { - "content": "Update lib/app.dart.\u000bUpdate the import statements in ", - "textStyle": {} - } - }, - { - "endIndex": 17213, - "startIndex": 17201, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17246, - "startIndex": 17213, - "textRun": { - "content": " to pull in the new tab widgets:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 17146 - }, - { - "endIndex": 17259, - "paragraph": { - "elements": [ - { - "endIndex": 17258, - "startIndex": 17246, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/app.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 17259, - "startIndex": 17258, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.e715d3bub16k", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 17246 - }, - { - "endIndex": 17467, - "startIndex": 17259, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 17466, - "startIndex": 17260, - "tableCells": [ - { - "content": [ - { - "endIndex": 17303, - "paragraph": { - "elements": [ - { - "endIndex": 17303, - "startIndex": 17262, - "textRun": { - "content": "import 'package:flutter/cupertino.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17262 - }, - { - "endIndex": 17343, - "paragraph": { - "elements": [ - { - "endIndex": 17343, - "startIndex": 17303, - "textRun": { - "content": "import 'package:flutter/services.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17303 - }, - { - "endIndex": 17384, - "paragraph": { - "elements": [ - { - "endIndex": 17374, - "startIndex": 17343, - "textRun": { - "content": "import 'product_list_tab.dart';", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17383, - "startIndex": 17374, - "textRun": { - "content": " // NEW", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17384, - "startIndex": 17383, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17343 - }, - { - "endIndex": 17425, - "paragraph": { - "elements": [ - { - "endIndex": 17409, - "startIndex": 17384, - "textRun": { - "content": "import 'search_tab.dart';", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17424, - "startIndex": 17409, - "textRun": { - "content": " // NEW", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17425, - "startIndex": 17424, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17384 - }, - { - "endIndex": 17466, - "paragraph": { - "elements": [ - { - "endIndex": 17457, - "startIndex": 17425, - "textRun": { - "content": "import 'shopping_cart_tab.dart';", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17465, - "startIndex": 17457, - "textRun": { - "content": " // NEW", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17466, - "startIndex": 17465, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17425 - } - ], - "endIndex": 17466, - "startIndex": 17261, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 17469, - "paragraph": { - "elements": [ - { - "endIndex": 17469, - "startIndex": 17467, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17467 - }, - { - "endIndex": 17594, - "paragraph": { - "elements": [ - { - "endIndex": 17594, - "startIndex": 17469, - "textRun": { - "content": "In the second part of this step, continued on the next page, you’ll add code for managing and sharing state across the tabs.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17469 - }, - { - "endIndex": 17595, - "paragraph": { - "elements": [ - { - "endIndex": 17595, - "startIndex": 17594, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17594 - }, - { - "endIndex": 17597, - "paragraph": { - "elements": [ - { - "endIndex": 17596, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 17595 - }, - { - "endIndex": 17597, - "startIndex": 17596, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17595 - }, - { - "endIndex": 17618, - "paragraph": { - "elements": [ - { - "endIndex": 17617, - "startIndex": 17597, - "textRun": { - "content": "Add state management", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 17618, - "startIndex": 17617, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.xt4mb2fzrrzz", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 17597 - }, - { - "endIndex": 17633, - "paragraph": { - "elements": [ - { - "endIndex": 17633, - "startIndex": 17618, - "textRun": { - "content": "Duration: 5:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 17618 - }, - { - "endIndex": 17634, - "paragraph": { - "elements": [ - { - "endIndex": 17634, - "startIndex": 17633, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 17633 - }, - { - "endIndex": 17962, - "paragraph": { - "elements": [ - { - "endIndex": 17795, - "startIndex": 17634, - "textRun": { - "content": "The app has some common data that needs to be shared across multiple screens, so you need a simple way to flow the data to each of the objects that need it. The ", - "textStyle": {} - } - }, - { - "endIndex": 17803, - "startIndex": 17795, - "textRun": { - "content": "provider", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/provider" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17848, - "startIndex": 17803, - "textRun": { - "content": " package provides an easy way to do that. In ", - "textStyle": {} - } - }, - { - "endIndex": 17856, - "startIndex": 17848, - "textRun": { - "content": "provider", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17897, - "startIndex": 17856, - "textRun": { - "content": ", you define the data model and then use ", - "textStyle": {} - } - }, - { - "endIndex": 17919, - "startIndex": 17897, - "textRun": { - "content": "ChangeNotifierProvider", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17962, - "startIndex": 17919, - "textRun": { - "content": " to provide your data model down the tree.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 17634 - }, - { - "endIndex": 17963, - "paragraph": { - "elements": [ - { - "endIndex": 17963, - "startIndex": 17962, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 17962 - }, - { - "endIndex": 18125, - "paragraph": { - "elements": [ - { - "endIndex": 17964, - "inlineObjectElement": { - "inlineObjectId": "kix.j19zyb6jmntd", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 17963 - }, - { - "endIndex": 17965, - "startIndex": 17964, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 18005, - "startIndex": 17965, - "textRun": { - "content": "Create the data model classes.\u000bCreate a ", - "textStyle": {} - } - }, - { - "endIndex": 18010, - "startIndex": 18005, - "textRun": { - "content": "model", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18027, - "startIndex": 18010, - "textRun": { - "content": " directory under ", - "textStyle": {} - } - }, - { - "endIndex": 18030, - "startIndex": 18027, - "textRun": { - "content": "lib", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18038, - "startIndex": 18030, - "textRun": { - "content": ". Add a ", - "textStyle": {} - } - }, - { - "endIndex": 18060, - "startIndex": 18038, - "textRun": { - "content": "lib/model/product.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18125, - "startIndex": 18060, - "textRun": { - "content": " file that defines the product data coming from the data source:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 17963 - }, - { - "endIndex": 18148, - "paragraph": { - "elements": [ - { - "endIndex": 18147, - "startIndex": 18125, - "textRun": { - "content": "lib/model/product.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/model/product.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 18148, - "startIndex": 18147, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.52zqj1lykg2a", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 18125 - }, - { - "endIndex": 18633, - "startIndex": 18148, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 18632, - "startIndex": 18149, - "tableCells": [ - { - "content": [ - { - "endIndex": 18167, - "paragraph": { - "elements": [ - { - "endIndex": 18167, - "startIndex": 18151, - "textRun": { - "content": "enum Category {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18151 - }, - { - "endIndex": 18174, - "paragraph": { - "elements": [ - { - "endIndex": 18174, - "startIndex": 18167, - "textRun": { - "content": " all,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18167 - }, - { - "endIndex": 18189, - "paragraph": { - "elements": [ - { - "endIndex": 18189, - "startIndex": 18174, - "textRun": { - "content": " accessories,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18174 - }, - { - "endIndex": 18201, - "paragraph": { - "elements": [ - { - "endIndex": 18201, - "startIndex": 18189, - "textRun": { - "content": " clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18189 - }, - { - "endIndex": 18209, - "paragraph": { - "elements": [ - { - "endIndex": 18209, - "startIndex": 18201, - "textRun": { - "content": " home,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18201 - }, - { - "endIndex": 18211, - "paragraph": { - "elements": [ - { - "endIndex": 18211, - "startIndex": 18209, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18209 - }, - { - "endIndex": 18212, - "paragraph": { - "elements": [ - { - "endIndex": 18212, - "startIndex": 18211, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18211 - }, - { - "endIndex": 18228, - "paragraph": { - "elements": [ - { - "endIndex": 18228, - "startIndex": 18212, - "textRun": { - "content": "class Product {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18212 - }, - { - "endIndex": 18246, - "paragraph": { - "elements": [ - { - "endIndex": 18246, - "startIndex": 18228, - "textRun": { - "content": " const Product({\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18228 - }, - { - "endIndex": 18274, - "paragraph": { - "elements": [ - { - "endIndex": 18274, - "startIndex": 18246, - "textRun": { - "content": " required this.category,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18246 - }, - { - "endIndex": 18296, - "paragraph": { - "elements": [ - { - "endIndex": 18296, - "startIndex": 18274, - "textRun": { - "content": " required this.id,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18274 - }, - { - "endIndex": 18326, - "paragraph": { - "elements": [ - { - "endIndex": 18326, - "startIndex": 18296, - "textRun": { - "content": " required this.isFeatured,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18296 - }, - { - "endIndex": 18350, - "paragraph": { - "elements": [ - { - "endIndex": 18350, - "startIndex": 18326, - "textRun": { - "content": " required this.name,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18326 - }, - { - "endIndex": 18375, - "paragraph": { - "elements": [ - { - "endIndex": 18375, - "startIndex": 18350, - "textRun": { - "content": " required this.price,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18350 - }, - { - "endIndex": 18381, - "paragraph": { - "elements": [ - { - "endIndex": 18381, - "startIndex": 18375, - "textRun": { - "content": " });\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18375 - }, - { - "endIndex": 18382, - "paragraph": { - "elements": [ - { - "endIndex": 18382, - "startIndex": 18381, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18381 - }, - { - "endIndex": 18409, - "paragraph": { - "elements": [ - { - "endIndex": 18409, - "startIndex": 18382, - "textRun": { - "content": " final Category category;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18382 - }, - { - "endIndex": 18425, - "paragraph": { - "elements": [ - { - "endIndex": 18425, - "startIndex": 18409, - "textRun": { - "content": " final int id;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18409 - }, - { - "endIndex": 18450, - "paragraph": { - "elements": [ - { - "endIndex": 18450, - "startIndex": 18425, - "textRun": { - "content": " final bool isFeatured;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18425 - }, - { - "endIndex": 18471, - "paragraph": { - "elements": [ - { - "endIndex": 18471, - "startIndex": 18450, - "textRun": { - "content": " final String name;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18450 - }, - { - "endIndex": 18490, - "paragraph": { - "elements": [ - { - "endIndex": 18490, - "startIndex": 18471, - "textRun": { - "content": " final int price;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18471 - }, - { - "endIndex": 18491, - "paragraph": { - "elements": [ - { - "endIndex": 18491, - "startIndex": 18490, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18490 - }, - { - "endIndex": 18530, - "paragraph": { - "elements": [ - { - "endIndex": 18530, - "startIndex": 18491, - "textRun": { - "content": " String get assetName => '$id-0.jpg';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18491 - }, - { - "endIndex": 18576, - "paragraph": { - "elements": [ - { - "endIndex": 18576, - "startIndex": 18530, - "textRun": { - "content": " String get assetPackage => 'shrine_images';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18530 - }, - { - "endIndex": 18577, - "paragraph": { - "elements": [ - { - "endIndex": 18577, - "startIndex": 18576, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18576 - }, - { - "endIndex": 18589, - "paragraph": { - "elements": [ - { - "endIndex": 18589, - "startIndex": 18577, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18577 - }, - { - "endIndex": 18630, - "paragraph": { - "elements": [ - { - "endIndex": 18630, - "startIndex": 18589, - "textRun": { - "content": " String toString() => '$name (id=$id)';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18589 - }, - { - "endIndex": 18632, - "paragraph": { - "elements": [ - { - "endIndex": 18632, - "startIndex": 18630, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18630 - } - ], - "endIndex": 18632, - "startIndex": 18150, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 18634, - "paragraph": { - "elements": [ - { - "endIndex": 18634, - "startIndex": 18633, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 18633 - }, - { - "endIndex": 18649, - "paragraph": { - "elements": [ - { - "endIndex": 18635, - "inlineObjectElement": { - "inlineObjectId": "kix.m67ncn30m12r", - "textStyle": { - "bold": true - } - }, - "startIndex": 18634 - }, - { - "endIndex": 18649, - "startIndex": 18635, - "textRun": { - "content": " Observations\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 18634 - }, - { - "endIndex": 18714, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 18714, - "startIndex": 18649, - "textRun": { - "content": "Each instance of the Product class describes a product for sale.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18649 - }, - { - "endIndex": 18715, - "paragraph": { - "elements": [ - { - "endIndex": 18715, - "startIndex": 18714, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18714 - }, - { - "endIndex": 19016, - "paragraph": { - "elements": [ - { - "endIndex": 18719, - "startIndex": 18715, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 18737, - "startIndex": 18719, - "textRun": { - "content": "ProductsRepository", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18876, - "startIndex": 18737, - "textRun": { - "content": " class contains the full list of products for sale, along with their price, title text, and a category. Our app won’t do anything with the ", - "textStyle": {} - } - }, - { - "endIndex": 18886, - "startIndex": 18876, - "textRun": { - "content": "isFeatured", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18923, - "startIndex": 18886, - "textRun": { - "content": " property. The class also includes a ", - "textStyle": {} - } - }, - { - "endIndex": 18937, - "startIndex": 18923, - "textRun": { - "content": "loadProducts()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19016, - "startIndex": 18937, - "textRun": { - "content": " method that returns either all products, or all products in a given category.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 18715 - }, - { - "endIndex": 19218, - "paragraph": { - "elements": [ - { - "endIndex": 19017, - "inlineObjectElement": { - "inlineObjectId": "kix.glg57m40ll5b", - "textStyle": {} - }, - "startIndex": 19016 - }, - { - "endIndex": 19059, - "startIndex": 19017, - "textRun": { - "content": " Create the products repository.\u000bCreate a ", - "textStyle": {} - } - }, - { - "endIndex": 19093, - "startIndex": 19059, - "textRun": { - "content": "lib/model/products_repository.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19218, - "startIndex": 19093, - "textRun": { - "content": " file. This file contains all products for sale. Each product belongs to a category. Add the following contents to the file.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 19016 - }, - { - "endIndex": 19253, - "paragraph": { - "elements": [ - { - "endIndex": 19252, - "startIndex": 19218, - "textRun": { - "content": "lib/model/products_repository.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/model/products_repository.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 19253, - "startIndex": 19252, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.nk6g7oocsqni", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 19218 - }, - { - "endIndex": 24906, - "startIndex": 19253, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 24905, - "startIndex": 19254, - "tableCells": [ - { - "content": [ - { - "endIndex": 19279, - "paragraph": { - "elements": [ - { - "endIndex": 19279, - "startIndex": 19256, - "textRun": { - "content": "import 'product.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19256 - }, - { - "endIndex": 19280, - "paragraph": { - "elements": [ - { - "endIndex": 19280, - "startIndex": 19279, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19279 - }, - { - "endIndex": 19307, - "paragraph": { - "elements": [ - { - "endIndex": 19307, - "startIndex": 19280, - "textRun": { - "content": "class ProductsRepository {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19280 - }, - { - "endIndex": 19348, - "paragraph": { - "elements": [ - { - "endIndex": 19348, - "startIndex": 19307, - "textRun": { - "content": " static const _allProducts = [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19307 - }, - { - "endIndex": 19361, - "paragraph": { - "elements": [ - { - "endIndex": 19361, - "startIndex": 19348, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19348 - }, - { - "endIndex": 19399, - "paragraph": { - "elements": [ - { - "endIndex": 19399, - "startIndex": 19361, - "textRun": { - "content": " category: Category.accessories,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19361 - }, - { - "endIndex": 19412, - "paragraph": { - "elements": [ - { - "endIndex": 19412, - "startIndex": 19399, - "textRun": { - "content": " id: 0,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19399 - }, - { - "endIndex": 19436, - "paragraph": { - "elements": [ - { - "endIndex": 19436, - "startIndex": 19412, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19412 - }, - { - "endIndex": 19465, - "paragraph": { - "elements": [ - { - "endIndex": 19465, - "startIndex": 19436, - "textRun": { - "content": " name: 'Vagabond sack',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19436 - }, - { - "endIndex": 19483, - "paragraph": { - "elements": [ - { - "endIndex": 19483, - "startIndex": 19465, - "textRun": { - "content": " price: 120,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19465 - }, - { - "endIndex": 19490, - "paragraph": { - "elements": [ - { - "endIndex": 19490, - "startIndex": 19483, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19483 - }, - { - "endIndex": 19503, - "paragraph": { - "elements": [ - { - "endIndex": 19503, - "startIndex": 19490, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19490 - }, - { - "endIndex": 19541, - "paragraph": { - "elements": [ - { - "endIndex": 19541, - "startIndex": 19503, - "textRun": { - "content": " category: Category.accessories,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19503 - }, - { - "endIndex": 19554, - "paragraph": { - "elements": [ - { - "endIndex": 19554, - "startIndex": 19541, - "textRun": { - "content": " id: 1,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19541 - }, - { - "endIndex": 19578, - "paragraph": { - "elements": [ - { - "endIndex": 19578, - "startIndex": 19554, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19554 - }, - { - "endIndex": 19611, - "paragraph": { - "elements": [ - { - "endIndex": 19611, - "startIndex": 19578, - "textRun": { - "content": " name: 'Stella sunglasses',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19578 - }, - { - "endIndex": 19628, - "paragraph": { - "elements": [ - { - "endIndex": 19628, - "startIndex": 19611, - "textRun": { - "content": " price: 58,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19611 - }, - { - "endIndex": 19635, - "paragraph": { - "elements": [ - { - "endIndex": 19635, - "startIndex": 19628, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19628 - }, - { - "endIndex": 19648, - "paragraph": { - "elements": [ - { - "endIndex": 19648, - "startIndex": 19635, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19635 - }, - { - "endIndex": 19686, - "paragraph": { - "elements": [ - { - "endIndex": 19686, - "startIndex": 19648, - "textRun": { - "content": " category: Category.accessories,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19648 - }, - { - "endIndex": 19699, - "paragraph": { - "elements": [ - { - "endIndex": 19699, - "startIndex": 19686, - "textRun": { - "content": " id: 2,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19686 - }, - { - "endIndex": 19724, - "paragraph": { - "elements": [ - { - "endIndex": 19724, - "startIndex": 19699, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19699 - }, - { - "endIndex": 19752, - "paragraph": { - "elements": [ - { - "endIndex": 19752, - "startIndex": 19724, - "textRun": { - "content": " name: 'Whitney belt',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19724 - }, - { - "endIndex": 19769, - "paragraph": { - "elements": [ - { - "endIndex": 19769, - "startIndex": 19752, - "textRun": { - "content": " price: 35,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19752 - }, - { - "endIndex": 19776, - "paragraph": { - "elements": [ - { - "endIndex": 19776, - "startIndex": 19769, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19769 - }, - { - "endIndex": 19789, - "paragraph": { - "elements": [ - { - "endIndex": 19789, - "startIndex": 19776, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19776 - }, - { - "endIndex": 19827, - "paragraph": { - "elements": [ - { - "endIndex": 19827, - "startIndex": 19789, - "textRun": { - "content": " category: Category.accessories,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19789 - }, - { - "endIndex": 19840, - "paragraph": { - "elements": [ - { - "endIndex": 19840, - "startIndex": 19827, - "textRun": { - "content": " id: 3,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19827 - }, - { - "endIndex": 19864, - "paragraph": { - "elements": [ - { - "endIndex": 19864, - "startIndex": 19840, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19840 - }, - { - "endIndex": 19893, - "paragraph": { - "elements": [ - { - "endIndex": 19893, - "startIndex": 19864, - "textRun": { - "content": " name: 'Garden strand',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19864 - }, - { - "endIndex": 19910, - "paragraph": { - "elements": [ - { - "endIndex": 19910, - "startIndex": 19893, - "textRun": { - "content": " price: 98,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19893 - }, - { - "endIndex": 19917, - "paragraph": { - "elements": [ - { - "endIndex": 19917, - "startIndex": 19910, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19910 - }, - { - "endIndex": 19930, - "paragraph": { - "elements": [ - { - "endIndex": 19930, - "startIndex": 19917, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19917 - }, - { - "endIndex": 19968, - "paragraph": { - "elements": [ - { - "endIndex": 19968, - "startIndex": 19930, - "textRun": { - "content": " category: Category.accessories,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19930 - }, - { - "endIndex": 19981, - "paragraph": { - "elements": [ - { - "endIndex": 19981, - "startIndex": 19968, - "textRun": { - "content": " id: 4,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19968 - }, - { - "endIndex": 20006, - "paragraph": { - "elements": [ - { - "endIndex": 20006, - "startIndex": 19981, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19981 - }, - { - "endIndex": 20036, - "paragraph": { - "elements": [ - { - "endIndex": 20036, - "startIndex": 20006, - "textRun": { - "content": " name: 'Strut earrings',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20006 - }, - { - "endIndex": 20053, - "paragraph": { - "elements": [ - { - "endIndex": 20053, - "startIndex": 20036, - "textRun": { - "content": " price: 34,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20036 - }, - { - "endIndex": 20060, - "paragraph": { - "elements": [ - { - "endIndex": 20060, - "startIndex": 20053, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20053 - }, - { - "endIndex": 20073, - "paragraph": { - "elements": [ - { - "endIndex": 20073, - "startIndex": 20060, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20060 - }, - { - "endIndex": 20111, - "paragraph": { - "elements": [ - { - "endIndex": 20111, - "startIndex": 20073, - "textRun": { - "content": " category: Category.accessories,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20073 - }, - { - "endIndex": 20124, - "paragraph": { - "elements": [ - { - "endIndex": 20124, - "startIndex": 20111, - "textRun": { - "content": " id: 5,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20111 - }, - { - "endIndex": 20149, - "paragraph": { - "elements": [ - { - "endIndex": 20149, - "startIndex": 20124, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20124 - }, - { - "endIndex": 20178, - "paragraph": { - "elements": [ - { - "endIndex": 20178, - "startIndex": 20149, - "textRun": { - "content": " name: 'Varsity socks',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20149 - }, - { - "endIndex": 20195, - "paragraph": { - "elements": [ - { - "endIndex": 20195, - "startIndex": 20178, - "textRun": { - "content": " price: 12,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20178 - }, - { - "endIndex": 20202, - "paragraph": { - "elements": [ - { - "endIndex": 20202, - "startIndex": 20195, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20195 - }, - { - "endIndex": 20215, - "paragraph": { - "elements": [ - { - "endIndex": 20215, - "startIndex": 20202, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20202 - }, - { - "endIndex": 20253, - "paragraph": { - "elements": [ - { - "endIndex": 20253, - "startIndex": 20215, - "textRun": { - "content": " category: Category.accessories,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20215 - }, - { - "endIndex": 20266, - "paragraph": { - "elements": [ - { - "endIndex": 20266, - "startIndex": 20253, - "textRun": { - "content": " id: 6,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20253 - }, - { - "endIndex": 20291, - "paragraph": { - "elements": [ - { - "endIndex": 20291, - "startIndex": 20266, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20266 - }, - { - "endIndex": 20320, - "paragraph": { - "elements": [ - { - "endIndex": 20320, - "startIndex": 20291, - "textRun": { - "content": " name: 'Weave keyring',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20291 - }, - { - "endIndex": 20337, - "paragraph": { - "elements": [ - { - "endIndex": 20337, - "startIndex": 20320, - "textRun": { - "content": " price: 16,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20320 - }, - { - "endIndex": 20344, - "paragraph": { - "elements": [ - { - "endIndex": 20344, - "startIndex": 20337, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20337 - }, - { - "endIndex": 20357, - "paragraph": { - "elements": [ - { - "endIndex": 20357, - "startIndex": 20344, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20344 - }, - { - "endIndex": 20395, - "paragraph": { - "elements": [ - { - "endIndex": 20395, - "startIndex": 20357, - "textRun": { - "content": " category: Category.accessories,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20357 - }, - { - "endIndex": 20408, - "paragraph": { - "elements": [ - { - "endIndex": 20408, - "startIndex": 20395, - "textRun": { - "content": " id: 7,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20395 - }, - { - "endIndex": 20432, - "paragraph": { - "elements": [ - { - "endIndex": 20432, - "startIndex": 20408, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20408 - }, - { - "endIndex": 20458, - "paragraph": { - "elements": [ - { - "endIndex": 20458, - "startIndex": 20432, - "textRun": { - "content": " name: 'Gatsby hat',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20432 - }, - { - "endIndex": 20475, - "paragraph": { - "elements": [ - { - "endIndex": 20475, - "startIndex": 20458, - "textRun": { - "content": " price: 40,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20458 - }, - { - "endIndex": 20482, - "paragraph": { - "elements": [ - { - "endIndex": 20482, - "startIndex": 20475, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20475 - }, - { - "endIndex": 20495, - "paragraph": { - "elements": [ - { - "endIndex": 20495, - "startIndex": 20482, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20482 - }, - { - "endIndex": 20533, - "paragraph": { - "elements": [ - { - "endIndex": 20533, - "startIndex": 20495, - "textRun": { - "content": " category: Category.accessories,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20495 - }, - { - "endIndex": 20546, - "paragraph": { - "elements": [ - { - "endIndex": 20546, - "startIndex": 20533, - "textRun": { - "content": " id: 8,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20533 - }, - { - "endIndex": 20570, - "paragraph": { - "elements": [ - { - "endIndex": 20570, - "startIndex": 20546, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20546 - }, - { - "endIndex": 20595, - "paragraph": { - "elements": [ - { - "endIndex": 20595, - "startIndex": 20570, - "textRun": { - "content": " name: 'Shrug bag',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20570 - }, - { - "endIndex": 20613, - "paragraph": { - "elements": [ - { - "endIndex": 20613, - "startIndex": 20595, - "textRun": { - "content": " price: 198,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20595 - }, - { - "endIndex": 20620, - "paragraph": { - "elements": [ - { - "endIndex": 20620, - "startIndex": 20613, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20613 - }, - { - "endIndex": 20633, - "paragraph": { - "elements": [ - { - "endIndex": 20633, - "startIndex": 20620, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20620 - }, - { - "endIndex": 20664, - "paragraph": { - "elements": [ - { - "endIndex": 20664, - "startIndex": 20633, - "textRun": { - "content": " category: Category.home,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20633 - }, - { - "endIndex": 20677, - "paragraph": { - "elements": [ - { - "endIndex": 20677, - "startIndex": 20664, - "textRun": { - "content": " id: 9,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20664 - }, - { - "endIndex": 20701, - "paragraph": { - "elements": [ - { - "endIndex": 20701, - "startIndex": 20677, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20677 - }, - { - "endIndex": 20731, - "paragraph": { - "elements": [ - { - "endIndex": 20731, - "startIndex": 20701, - "textRun": { - "content": " name: 'Gilt desk trio',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20701 - }, - { - "endIndex": 20748, - "paragraph": { - "elements": [ - { - "endIndex": 20748, - "startIndex": 20731, - "textRun": { - "content": " price: 58,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20731 - }, - { - "endIndex": 20755, - "paragraph": { - "elements": [ - { - "endIndex": 20755, - "startIndex": 20748, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20748 - }, - { - "endIndex": 20768, - "paragraph": { - "elements": [ - { - "endIndex": 20768, - "startIndex": 20755, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20755 - }, - { - "endIndex": 20799, - "paragraph": { - "elements": [ - { - "endIndex": 20799, - "startIndex": 20768, - "textRun": { - "content": " category: Category.home,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20768 - }, - { - "endIndex": 20813, - "paragraph": { - "elements": [ - { - "endIndex": 20813, - "startIndex": 20799, - "textRun": { - "content": " id: 10,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20799 - }, - { - "endIndex": 20838, - "paragraph": { - "elements": [ - { - "endIndex": 20838, - "startIndex": 20813, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20813 - }, - { - "endIndex": 20870, - "paragraph": { - "elements": [ - { - "endIndex": 20870, - "startIndex": 20838, - "textRun": { - "content": " name: 'Copper wire rack',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20838 - }, - { - "endIndex": 20887, - "paragraph": { - "elements": [ - { - "endIndex": 20887, - "startIndex": 20870, - "textRun": { - "content": " price: 18,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20870 - }, - { - "endIndex": 20894, - "paragraph": { - "elements": [ - { - "endIndex": 20894, - "startIndex": 20887, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20887 - }, - { - "endIndex": 20907, - "paragraph": { - "elements": [ - { - "endIndex": 20907, - "startIndex": 20894, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20894 - }, - { - "endIndex": 20938, - "paragraph": { - "elements": [ - { - "endIndex": 20938, - "startIndex": 20907, - "textRun": { - "content": " category: Category.home,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20907 - }, - { - "endIndex": 20952, - "paragraph": { - "elements": [ - { - "endIndex": 20952, - "startIndex": 20938, - "textRun": { - "content": " id: 11,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20938 - }, - { - "endIndex": 20977, - "paragraph": { - "elements": [ - { - "endIndex": 20977, - "startIndex": 20952, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20952 - }, - { - "endIndex": 21011, - "paragraph": { - "elements": [ - { - "endIndex": 21011, - "startIndex": 20977, - "textRun": { - "content": " name: 'Soothe ceramic set',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20977 - }, - { - "endIndex": 21028, - "paragraph": { - "elements": [ - { - "endIndex": 21028, - "startIndex": 21011, - "textRun": { - "content": " price: 28,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21011 - }, - { - "endIndex": 21035, - "paragraph": { - "elements": [ - { - "endIndex": 21035, - "startIndex": 21028, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21028 - }, - { - "endIndex": 21048, - "paragraph": { - "elements": [ - { - "endIndex": 21048, - "startIndex": 21035, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21035 - }, - { - "endIndex": 21079, - "paragraph": { - "elements": [ - { - "endIndex": 21079, - "startIndex": 21048, - "textRun": { - "content": " category: Category.home,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21048 - }, - { - "endIndex": 21093, - "paragraph": { - "elements": [ - { - "endIndex": 21093, - "startIndex": 21079, - "textRun": { - "content": " id: 12,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21079 - }, - { - "endIndex": 21118, - "paragraph": { - "elements": [ - { - "endIndex": 21118, - "startIndex": 21093, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21093 - }, - { - "endIndex": 21149, - "paragraph": { - "elements": [ - { - "endIndex": 21149, - "startIndex": 21118, - "textRun": { - "content": " name: 'Hurrahs tea set',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21118 - }, - { - "endIndex": 21166, - "paragraph": { - "elements": [ - { - "endIndex": 21166, - "startIndex": 21149, - "textRun": { - "content": " price: 34,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21149 - }, - { - "endIndex": 21173, - "paragraph": { - "elements": [ - { - "endIndex": 21173, - "startIndex": 21166, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21166 - }, - { - "endIndex": 21186, - "paragraph": { - "elements": [ - { - "endIndex": 21186, - "startIndex": 21173, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21173 - }, - { - "endIndex": 21217, - "paragraph": { - "elements": [ - { - "endIndex": 21217, - "startIndex": 21186, - "textRun": { - "content": " category: Category.home,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21186 - }, - { - "endIndex": 21231, - "paragraph": { - "elements": [ - { - "endIndex": 21231, - "startIndex": 21217, - "textRun": { - "content": " id: 13,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21217 - }, - { - "endIndex": 21255, - "paragraph": { - "elements": [ - { - "endIndex": 21255, - "startIndex": 21231, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21231 - }, - { - "endIndex": 21285, - "paragraph": { - "elements": [ - { - "endIndex": 21285, - "startIndex": 21255, - "textRun": { - "content": " name: 'Blue stone mug',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21255 - }, - { - "endIndex": 21302, - "paragraph": { - "elements": [ - { - "endIndex": 21302, - "startIndex": 21285, - "textRun": { - "content": " price: 18,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21285 - }, - { - "endIndex": 21309, - "paragraph": { - "elements": [ - { - "endIndex": 21309, - "startIndex": 21302, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21302 - }, - { - "endIndex": 21322, - "paragraph": { - "elements": [ - { - "endIndex": 21322, - "startIndex": 21309, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21309 - }, - { - "endIndex": 21353, - "paragraph": { - "elements": [ - { - "endIndex": 21353, - "startIndex": 21322, - "textRun": { - "content": " category: Category.home,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21322 - }, - { - "endIndex": 21367, - "paragraph": { - "elements": [ - { - "endIndex": 21367, - "startIndex": 21353, - "textRun": { - "content": " id: 14,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21353 - }, - { - "endIndex": 21391, - "paragraph": { - "elements": [ - { - "endIndex": 21391, - "startIndex": 21367, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21367 - }, - { - "endIndex": 21421, - "paragraph": { - "elements": [ - { - "endIndex": 21421, - "startIndex": 21391, - "textRun": { - "content": " name: 'Rainwater tray',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21391 - }, - { - "endIndex": 21438, - "paragraph": { - "elements": [ - { - "endIndex": 21438, - "startIndex": 21421, - "textRun": { - "content": " price: 27,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21421 - }, - { - "endIndex": 21445, - "paragraph": { - "elements": [ - { - "endIndex": 21445, - "startIndex": 21438, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21438 - }, - { - "endIndex": 21458, - "paragraph": { - "elements": [ - { - "endIndex": 21458, - "startIndex": 21445, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21445 - }, - { - "endIndex": 21489, - "paragraph": { - "elements": [ - { - "endIndex": 21489, - "startIndex": 21458, - "textRun": { - "content": " category: Category.home,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21458 - }, - { - "endIndex": 21503, - "paragraph": { - "elements": [ - { - "endIndex": 21503, - "startIndex": 21489, - "textRun": { - "content": " id: 15,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21489 - }, - { - "endIndex": 21527, - "paragraph": { - "elements": [ - { - "endIndex": 21527, - "startIndex": 21503, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21503 - }, - { - "endIndex": 21559, - "paragraph": { - "elements": [ - { - "endIndex": 21559, - "startIndex": 21527, - "textRun": { - "content": " name: 'Chambray napkins',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21527 - }, - { - "endIndex": 21576, - "paragraph": { - "elements": [ - { - "endIndex": 21576, - "startIndex": 21559, - "textRun": { - "content": " price: 16,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21559 - }, - { - "endIndex": 21583, - "paragraph": { - "elements": [ - { - "endIndex": 21583, - "startIndex": 21576, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21576 - }, - { - "endIndex": 21596, - "paragraph": { - "elements": [ - { - "endIndex": 21596, - "startIndex": 21583, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21583 - }, - { - "endIndex": 21627, - "paragraph": { - "elements": [ - { - "endIndex": 21627, - "startIndex": 21596, - "textRun": { - "content": " category: Category.home,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21596 - }, - { - "endIndex": 21641, - "paragraph": { - "elements": [ - { - "endIndex": 21641, - "startIndex": 21627, - "textRun": { - "content": " id: 16,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21627 - }, - { - "endIndex": 21665, - "paragraph": { - "elements": [ - { - "endIndex": 21665, - "startIndex": 21641, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21641 - }, - { - "endIndex": 21699, - "paragraph": { - "elements": [ - { - "endIndex": 21699, - "startIndex": 21665, - "textRun": { - "content": " name: 'Succulent planters',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21665 - }, - { - "endIndex": 21716, - "paragraph": { - "elements": [ - { - "endIndex": 21716, - "startIndex": 21699, - "textRun": { - "content": " price: 16,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21699 - }, - { - "endIndex": 21723, - "paragraph": { - "elements": [ - { - "endIndex": 21723, - "startIndex": 21716, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21716 - }, - { - "endIndex": 21736, - "paragraph": { - "elements": [ - { - "endIndex": 21736, - "startIndex": 21723, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21723 - }, - { - "endIndex": 21767, - "paragraph": { - "elements": [ - { - "endIndex": 21767, - "startIndex": 21736, - "textRun": { - "content": " category: Category.home,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21736 - }, - { - "endIndex": 21781, - "paragraph": { - "elements": [ - { - "endIndex": 21781, - "startIndex": 21767, - "textRun": { - "content": " id: 17,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21767 - }, - { - "endIndex": 21806, - "paragraph": { - "elements": [ - { - "endIndex": 21806, - "startIndex": 21781, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21781 - }, - { - "endIndex": 21835, - "paragraph": { - "elements": [ - { - "endIndex": 21835, - "startIndex": 21806, - "textRun": { - "content": " name: 'Quartet table',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21806 - }, - { - "endIndex": 21853, - "paragraph": { - "elements": [ - { - "endIndex": 21853, - "startIndex": 21835, - "textRun": { - "content": " price: 175,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21835 - }, - { - "endIndex": 21860, - "paragraph": { - "elements": [ - { - "endIndex": 21860, - "startIndex": 21853, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21853 - }, - { - "endIndex": 21873, - "paragraph": { - "elements": [ - { - "endIndex": 21873, - "startIndex": 21860, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21860 - }, - { - "endIndex": 21904, - "paragraph": { - "elements": [ - { - "endIndex": 21904, - "startIndex": 21873, - "textRun": { - "content": " category: Category.home,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21873 - }, - { - "endIndex": 21918, - "paragraph": { - "elements": [ - { - "endIndex": 21918, - "startIndex": 21904, - "textRun": { - "content": " id: 18,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21904 - }, - { - "endIndex": 21942, - "paragraph": { - "elements": [ - { - "endIndex": 21942, - "startIndex": 21918, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21918 - }, - { - "endIndex": 21973, - "paragraph": { - "elements": [ - { - "endIndex": 21973, - "startIndex": 21942, - "textRun": { - "content": " name: 'Kitchen quattro',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21942 - }, - { - "endIndex": 21991, - "paragraph": { - "elements": [ - { - "endIndex": 21991, - "startIndex": 21973, - "textRun": { - "content": " price: 129,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21973 - }, - { - "endIndex": 21998, - "paragraph": { - "elements": [ - { - "endIndex": 21998, - "startIndex": 21991, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21991 - }, - { - "endIndex": 22011, - "paragraph": { - "elements": [ - { - "endIndex": 22011, - "startIndex": 21998, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21998 - }, - { - "endIndex": 22046, - "paragraph": { - "elements": [ - { - "endIndex": 22046, - "startIndex": 22011, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22011 - }, - { - "endIndex": 22060, - "paragraph": { - "elements": [ - { - "endIndex": 22060, - "startIndex": 22046, - "textRun": { - "content": " id: 19,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22046 - }, - { - "endIndex": 22085, - "paragraph": { - "elements": [ - { - "endIndex": 22085, - "startIndex": 22060, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22060 - }, - { - "endIndex": 22113, - "paragraph": { - "elements": [ - { - "endIndex": 22113, - "startIndex": 22085, - "textRun": { - "content": " name: 'Clay sweater',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22085 - }, - { - "endIndex": 22130, - "paragraph": { - "elements": [ - { - "endIndex": 22130, - "startIndex": 22113, - "textRun": { - "content": " price: 48,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22113 - }, - { - "endIndex": 22137, - "paragraph": { - "elements": [ - { - "endIndex": 22137, - "startIndex": 22130, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22130 - }, - { - "endIndex": 22150, - "paragraph": { - "elements": [ - { - "endIndex": 22150, - "startIndex": 22137, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22137 - }, - { - "endIndex": 22185, - "paragraph": { - "elements": [ - { - "endIndex": 22185, - "startIndex": 22150, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22150 - }, - { - "endIndex": 22199, - "paragraph": { - "elements": [ - { - "endIndex": 22199, - "startIndex": 22185, - "textRun": { - "content": " id: 20,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22185 - }, - { - "endIndex": 22224, - "paragraph": { - "elements": [ - { - "endIndex": 22224, - "startIndex": 22199, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22199 - }, - { - "endIndex": 22249, - "paragraph": { - "elements": [ - { - "endIndex": 22249, - "startIndex": 22224, - "textRun": { - "content": " name: 'Sea tunic',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22224 - }, - { - "endIndex": 22266, - "paragraph": { - "elements": [ - { - "endIndex": 22266, - "startIndex": 22249, - "textRun": { - "content": " price: 45,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22249 - }, - { - "endIndex": 22273, - "paragraph": { - "elements": [ - { - "endIndex": 22273, - "startIndex": 22266, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22266 - }, - { - "endIndex": 22286, - "paragraph": { - "elements": [ - { - "endIndex": 22286, - "startIndex": 22273, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22273 - }, - { - "endIndex": 22321, - "paragraph": { - "elements": [ - { - "endIndex": 22321, - "startIndex": 22286, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22286 - }, - { - "endIndex": 22335, - "paragraph": { - "elements": [ - { - "endIndex": 22335, - "startIndex": 22321, - "textRun": { - "content": " id: 21,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22321 - }, - { - "endIndex": 22360, - "paragraph": { - "elements": [ - { - "endIndex": 22360, - "startIndex": 22335, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22335 - }, - { - "endIndex": 22389, - "paragraph": { - "elements": [ - { - "endIndex": 22389, - "startIndex": 22360, - "textRun": { - "content": " name: 'Plaster tunic',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22360 - }, - { - "endIndex": 22406, - "paragraph": { - "elements": [ - { - "endIndex": 22406, - "startIndex": 22389, - "textRun": { - "content": " price: 38,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22389 - }, - { - "endIndex": 22413, - "paragraph": { - "elements": [ - { - "endIndex": 22413, - "startIndex": 22406, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22406 - }, - { - "endIndex": 22426, - "paragraph": { - "elements": [ - { - "endIndex": 22426, - "startIndex": 22413, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22413 - }, - { - "endIndex": 22461, - "paragraph": { - "elements": [ - { - "endIndex": 22461, - "startIndex": 22426, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22426 - }, - { - "endIndex": 22475, - "paragraph": { - "elements": [ - { - "endIndex": 22475, - "startIndex": 22461, - "textRun": { - "content": " id: 22,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22461 - }, - { - "endIndex": 22500, - "paragraph": { - "elements": [ - { - "endIndex": 22500, - "startIndex": 22475, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22475 - }, - { - "endIndex": 22537, - "paragraph": { - "elements": [ - { - "endIndex": 22537, - "startIndex": 22500, - "textRun": { - "content": " name: 'White pinstripe shirt',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22500 - }, - { - "endIndex": 22554, - "paragraph": { - "elements": [ - { - "endIndex": 22554, - "startIndex": 22537, - "textRun": { - "content": " price: 70,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22537 - }, - { - "endIndex": 22561, - "paragraph": { - "elements": [ - { - "endIndex": 22561, - "startIndex": 22554, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22554 - }, - { - "endIndex": 22574, - "paragraph": { - "elements": [ - { - "endIndex": 22574, - "startIndex": 22561, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22561 - }, - { - "endIndex": 22609, - "paragraph": { - "elements": [ - { - "endIndex": 22609, - "startIndex": 22574, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22574 - }, - { - "endIndex": 22623, - "paragraph": { - "elements": [ - { - "endIndex": 22623, - "startIndex": 22609, - "textRun": { - "content": " id: 23,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22609 - }, - { - "endIndex": 22648, - "paragraph": { - "elements": [ - { - "endIndex": 22648, - "startIndex": 22623, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22623 - }, - { - "endIndex": 22678, - "paragraph": { - "elements": [ - { - "endIndex": 22678, - "startIndex": 22648, - "textRun": { - "content": " name: 'Chambray shirt',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22648 - }, - { - "endIndex": 22695, - "paragraph": { - "elements": [ - { - "endIndex": 22695, - "startIndex": 22678, - "textRun": { - "content": " price: 70,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22678 - }, - { - "endIndex": 22702, - "paragraph": { - "elements": [ - { - "endIndex": 22702, - "startIndex": 22695, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22695 - }, - { - "endIndex": 22715, - "paragraph": { - "elements": [ - { - "endIndex": 22715, - "startIndex": 22702, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22702 - }, - { - "endIndex": 22750, - "paragraph": { - "elements": [ - { - "endIndex": 22750, - "startIndex": 22715, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22715 - }, - { - "endIndex": 22764, - "paragraph": { - "elements": [ - { - "endIndex": 22764, - "startIndex": 22750, - "textRun": { - "content": " id: 24,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22750 - }, - { - "endIndex": 22788, - "paragraph": { - "elements": [ - { - "endIndex": 22788, - "startIndex": 22764, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22764 - }, - { - "endIndex": 22821, - "paragraph": { - "elements": [ - { - "endIndex": 22821, - "startIndex": 22788, - "textRun": { - "content": " name: 'Seabreeze sweater',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22788 - }, - { - "endIndex": 22838, - "paragraph": { - "elements": [ - { - "endIndex": 22838, - "startIndex": 22821, - "textRun": { - "content": " price: 60,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22821 - }, - { - "endIndex": 22845, - "paragraph": { - "elements": [ - { - "endIndex": 22845, - "startIndex": 22838, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22838 - }, - { - "endIndex": 22858, - "paragraph": { - "elements": [ - { - "endIndex": 22858, - "startIndex": 22845, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22845 - }, - { - "endIndex": 22893, - "paragraph": { - "elements": [ - { - "endIndex": 22893, - "startIndex": 22858, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22858 - }, - { - "endIndex": 22907, - "paragraph": { - "elements": [ - { - "endIndex": 22907, - "startIndex": 22893, - "textRun": { - "content": " id: 25,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22893 - }, - { - "endIndex": 22932, - "paragraph": { - "elements": [ - { - "endIndex": 22932, - "startIndex": 22907, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22907 - }, - { - "endIndex": 22961, - "paragraph": { - "elements": [ - { - "endIndex": 22961, - "startIndex": 22932, - "textRun": { - "content": " name: 'Gentry jacket',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22932 - }, - { - "endIndex": 22979, - "paragraph": { - "elements": [ - { - "endIndex": 22979, - "startIndex": 22961, - "textRun": { - "content": " price: 178,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22961 - }, - { - "endIndex": 22986, - "paragraph": { - "elements": [ - { - "endIndex": 22986, - "startIndex": 22979, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22979 - }, - { - "endIndex": 22999, - "paragraph": { - "elements": [ - { - "endIndex": 22999, - "startIndex": 22986, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22986 - }, - { - "endIndex": 23034, - "paragraph": { - "elements": [ - { - "endIndex": 23034, - "startIndex": 22999, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22999 - }, - { - "endIndex": 23048, - "paragraph": { - "elements": [ - { - "endIndex": 23048, - "startIndex": 23034, - "textRun": { - "content": " id: 26,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23034 - }, - { - "endIndex": 23073, - "paragraph": { - "elements": [ - { - "endIndex": 23073, - "startIndex": 23048, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23048 - }, - { - "endIndex": 23102, - "paragraph": { - "elements": [ - { - "endIndex": 23102, - "startIndex": 23073, - "textRun": { - "content": " name: 'Navy trousers',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23073 - }, - { - "endIndex": 23119, - "paragraph": { - "elements": [ - { - "endIndex": 23119, - "startIndex": 23102, - "textRun": { - "content": " price: 74,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23102 - }, - { - "endIndex": 23126, - "paragraph": { - "elements": [ - { - "endIndex": 23126, - "startIndex": 23119, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23119 - }, - { - "endIndex": 23139, - "paragraph": { - "elements": [ - { - "endIndex": 23139, - "startIndex": 23126, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23126 - }, - { - "endIndex": 23174, - "paragraph": { - "elements": [ - { - "endIndex": 23174, - "startIndex": 23139, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23139 - }, - { - "endIndex": 23188, - "paragraph": { - "elements": [ - { - "endIndex": 23188, - "startIndex": 23174, - "textRun": { - "content": " id: 27,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23174 - }, - { - "endIndex": 23212, - "paragraph": { - "elements": [ - { - "endIndex": 23212, - "startIndex": 23188, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23188 - }, - { - "endIndex": 23249, - "paragraph": { - "elements": [ - { - "endIndex": 23249, - "startIndex": 23212, - "textRun": { - "content": " name: 'Walter henley (white)',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23212 - }, - { - "endIndex": 23266, - "paragraph": { - "elements": [ - { - "endIndex": 23266, - "startIndex": 23249, - "textRun": { - "content": " price: 38,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23249 - }, - { - "endIndex": 23273, - "paragraph": { - "elements": [ - { - "endIndex": 23273, - "startIndex": 23266, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23266 - }, - { - "endIndex": 23286, - "paragraph": { - "elements": [ - { - "endIndex": 23286, - "startIndex": 23273, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23273 - }, - { - "endIndex": 23321, - "paragraph": { - "elements": [ - { - "endIndex": 23321, - "startIndex": 23286, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23286 - }, - { - "endIndex": 23335, - "paragraph": { - "elements": [ - { - "endIndex": 23335, - "startIndex": 23321, - "textRun": { - "content": " id: 28,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23321 - }, - { - "endIndex": 23359, - "paragraph": { - "elements": [ - { - "endIndex": 23359, - "startIndex": 23335, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23335 - }, - { - "endIndex": 23394, - "paragraph": { - "elements": [ - { - "endIndex": 23394, - "startIndex": 23359, - "textRun": { - "content": " name: 'Surf and perf shirt',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23359 - }, - { - "endIndex": 23411, - "paragraph": { - "elements": [ - { - "endIndex": 23411, - "startIndex": 23394, - "textRun": { - "content": " price: 48,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23394 - }, - { - "endIndex": 23418, - "paragraph": { - "elements": [ - { - "endIndex": 23418, - "startIndex": 23411, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23411 - }, - { - "endIndex": 23431, - "paragraph": { - "elements": [ - { - "endIndex": 23431, - "startIndex": 23418, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23418 - }, - { - "endIndex": 23466, - "paragraph": { - "elements": [ - { - "endIndex": 23466, - "startIndex": 23431, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23431 - }, - { - "endIndex": 23480, - "paragraph": { - "elements": [ - { - "endIndex": 23480, - "startIndex": 23466, - "textRun": { - "content": " id: 29,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23466 - }, - { - "endIndex": 23504, - "paragraph": { - "elements": [ - { - "endIndex": 23504, - "startIndex": 23480, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23480 - }, - { - "endIndex": 23532, - "paragraph": { - "elements": [ - { - "endIndex": 23532, - "startIndex": 23504, - "textRun": { - "content": " name: 'Ginger scarf',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23504 - }, - { - "endIndex": 23549, - "paragraph": { - "elements": [ - { - "endIndex": 23549, - "startIndex": 23532, - "textRun": { - "content": " price: 98,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23532 - }, - { - "endIndex": 23556, - "paragraph": { - "elements": [ - { - "endIndex": 23556, - "startIndex": 23549, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23549 - }, - { - "endIndex": 23569, - "paragraph": { - "elements": [ - { - "endIndex": 23569, - "startIndex": 23556, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23556 - }, - { - "endIndex": 23604, - "paragraph": { - "elements": [ - { - "endIndex": 23604, - "startIndex": 23569, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23569 - }, - { - "endIndex": 23618, - "paragraph": { - "elements": [ - { - "endIndex": 23618, - "startIndex": 23604, - "textRun": { - "content": " id: 30,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23604 - }, - { - "endIndex": 23642, - "paragraph": { - "elements": [ - { - "endIndex": 23642, - "startIndex": 23618, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23618 - }, - { - "endIndex": 23674, - "paragraph": { - "elements": [ - { - "endIndex": 23674, - "startIndex": 23642, - "textRun": { - "content": " name: 'Ramona crossover',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23642 - }, - { - "endIndex": 23691, - "paragraph": { - "elements": [ - { - "endIndex": 23691, - "startIndex": 23674, - "textRun": { - "content": " price: 68,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23674 - }, - { - "endIndex": 23698, - "paragraph": { - "elements": [ - { - "endIndex": 23698, - "startIndex": 23691, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23691 - }, - { - "endIndex": 23711, - "paragraph": { - "elements": [ - { - "endIndex": 23711, - "startIndex": 23698, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23698 - }, - { - "endIndex": 23746, - "paragraph": { - "elements": [ - { - "endIndex": 23746, - "startIndex": 23711, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23711 - }, - { - "endIndex": 23760, - "paragraph": { - "elements": [ - { - "endIndex": 23760, - "startIndex": 23746, - "textRun": { - "content": " id: 31,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23746 - }, - { - "endIndex": 23785, - "paragraph": { - "elements": [ - { - "endIndex": 23785, - "startIndex": 23760, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23760 - }, - { - "endIndex": 23815, - "paragraph": { - "elements": [ - { - "endIndex": 23815, - "startIndex": 23785, - "textRun": { - "content": " name: 'Chambray shirt',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23785 - }, - { - "endIndex": 23832, - "paragraph": { - "elements": [ - { - "endIndex": 23832, - "startIndex": 23815, - "textRun": { - "content": " price: 38,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23815 - }, - { - "endIndex": 23839, - "paragraph": { - "elements": [ - { - "endIndex": 23839, - "startIndex": 23832, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23832 - }, - { - "endIndex": 23852, - "paragraph": { - "elements": [ - { - "endIndex": 23852, - "startIndex": 23839, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23839 - }, - { - "endIndex": 23887, - "paragraph": { - "elements": [ - { - "endIndex": 23887, - "startIndex": 23852, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23852 - }, - { - "endIndex": 23901, - "paragraph": { - "elements": [ - { - "endIndex": 23901, - "startIndex": 23887, - "textRun": { - "content": " id: 32,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23887 - }, - { - "endIndex": 23926, - "paragraph": { - "elements": [ - { - "endIndex": 23926, - "startIndex": 23901, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23901 - }, - { - "endIndex": 23962, - "paragraph": { - "elements": [ - { - "endIndex": 23962, - "startIndex": 23926, - "textRun": { - "content": " name: 'Classic white collar',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23926 - }, - { - "endIndex": 23979, - "paragraph": { - "elements": [ - { - "endIndex": 23979, - "startIndex": 23962, - "textRun": { - "content": " price: 58,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23962 - }, - { - "endIndex": 23986, - "paragraph": { - "elements": [ - { - "endIndex": 23986, - "startIndex": 23979, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23979 - }, - { - "endIndex": 23999, - "paragraph": { - "elements": [ - { - "endIndex": 23999, - "startIndex": 23986, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23986 - }, - { - "endIndex": 24034, - "paragraph": { - "elements": [ - { - "endIndex": 24034, - "startIndex": 23999, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23999 - }, - { - "endIndex": 24048, - "paragraph": { - "elements": [ - { - "endIndex": 24048, - "startIndex": 24034, - "textRun": { - "content": " id: 33,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24034 - }, - { - "endIndex": 24072, - "paragraph": { - "elements": [ - { - "endIndex": 24072, - "startIndex": 24048, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24048 - }, - { - "endIndex": 24106, - "paragraph": { - "elements": [ - { - "endIndex": 24106, - "startIndex": 24072, - "textRun": { - "content": " name: 'Cerise scallop tee',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24072 - }, - { - "endIndex": 24123, - "paragraph": { - "elements": [ - { - "endIndex": 24123, - "startIndex": 24106, - "textRun": { - "content": " price: 42,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24106 - }, - { - "endIndex": 24130, - "paragraph": { - "elements": [ - { - "endIndex": 24130, - "startIndex": 24123, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24123 - }, - { - "endIndex": 24143, - "paragraph": { - "elements": [ - { - "endIndex": 24143, - "startIndex": 24130, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24130 - }, - { - "endIndex": 24178, - "paragraph": { - "elements": [ - { - "endIndex": 24178, - "startIndex": 24143, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24143 - }, - { - "endIndex": 24192, - "paragraph": { - "elements": [ - { - "endIndex": 24192, - "startIndex": 24178, - "textRun": { - "content": " id: 34,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24178 - }, - { - "endIndex": 24217, - "paragraph": { - "elements": [ - { - "endIndex": 24217, - "startIndex": 24192, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24192 - }, - { - "endIndex": 24251, - "paragraph": { - "elements": [ - { - "endIndex": 24251, - "startIndex": 24217, - "textRun": { - "content": " name: 'Shoulder rolls tee',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24217 - }, - { - "endIndex": 24268, - "paragraph": { - "elements": [ - { - "endIndex": 24268, - "startIndex": 24251, - "textRun": { - "content": " price: 27,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24251 - }, - { - "endIndex": 24275, - "paragraph": { - "elements": [ - { - "endIndex": 24275, - "startIndex": 24268, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24268 - }, - { - "endIndex": 24288, - "paragraph": { - "elements": [ - { - "endIndex": 24288, - "startIndex": 24275, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24275 - }, - { - "endIndex": 24323, - "paragraph": { - "elements": [ - { - "endIndex": 24323, - "startIndex": 24288, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24288 - }, - { - "endIndex": 24337, - "paragraph": { - "elements": [ - { - "endIndex": 24337, - "startIndex": 24323, - "textRun": { - "content": " id: 35,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24323 - }, - { - "endIndex": 24362, - "paragraph": { - "elements": [ - { - "endIndex": 24362, - "startIndex": 24337, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24337 - }, - { - "endIndex": 24394, - "paragraph": { - "elements": [ - { - "endIndex": 24394, - "startIndex": 24362, - "textRun": { - "content": " name: 'Grey slouch tank',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24362 - }, - { - "endIndex": 24411, - "paragraph": { - "elements": [ - { - "endIndex": 24411, - "startIndex": 24394, - "textRun": { - "content": " price: 24,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24394 - }, - { - "endIndex": 24418, - "paragraph": { - "elements": [ - { - "endIndex": 24418, - "startIndex": 24411, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24411 - }, - { - "endIndex": 24431, - "paragraph": { - "elements": [ - { - "endIndex": 24431, - "startIndex": 24418, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24418 - }, - { - "endIndex": 24466, - "paragraph": { - "elements": [ - { - "endIndex": 24466, - "startIndex": 24431, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24431 - }, - { - "endIndex": 24480, - "paragraph": { - "elements": [ - { - "endIndex": 24480, - "startIndex": 24466, - "textRun": { - "content": " id: 36,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24466 - }, - { - "endIndex": 24505, - "paragraph": { - "elements": [ - { - "endIndex": 24505, - "startIndex": 24480, - "textRun": { - "content": " isFeatured: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24480 - }, - { - "endIndex": 24535, - "paragraph": { - "elements": [ - { - "endIndex": 24535, - "startIndex": 24505, - "textRun": { - "content": " name: 'Sunshirt dress',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24505 - }, - { - "endIndex": 24552, - "paragraph": { - "elements": [ - { - "endIndex": 24552, - "startIndex": 24535, - "textRun": { - "content": " price: 58,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24535 - }, - { - "endIndex": 24559, - "paragraph": { - "elements": [ - { - "endIndex": 24559, - "startIndex": 24552, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24552 - }, - { - "endIndex": 24572, - "paragraph": { - "elements": [ - { - "endIndex": 24572, - "startIndex": 24559, - "textRun": { - "content": " Product(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24559 - }, - { - "endIndex": 24607, - "paragraph": { - "elements": [ - { - "endIndex": 24607, - "startIndex": 24572, - "textRun": { - "content": " category: Category.clothing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24572 - }, - { - "endIndex": 24621, - "paragraph": { - "elements": [ - { - "endIndex": 24621, - "startIndex": 24607, - "textRun": { - "content": " id: 37,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24607 - }, - { - "endIndex": 24645, - "paragraph": { - "elements": [ - { - "endIndex": 24645, - "startIndex": 24621, - "textRun": { - "content": " isFeatured: true,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24621 - }, - { - "endIndex": 24675, - "paragraph": { - "elements": [ - { - "endIndex": 24675, - "startIndex": 24645, - "textRun": { - "content": " name: 'Fine lines tee',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24645 - }, - { - "endIndex": 24692, - "paragraph": { - "elements": [ - { - "endIndex": 24692, - "startIndex": 24675, - "textRun": { - "content": " price: 58,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24675 - }, - { - "endIndex": 24699, - "paragraph": { - "elements": [ - { - "endIndex": 24699, - "startIndex": 24692, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24692 - }, - { - "endIndex": 24704, - "paragraph": { - "elements": [ - { - "endIndex": 24704, - "startIndex": 24699, - "textRun": { - "content": " ];\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24699 - }, - { - "endIndex": 24705, - "paragraph": { - "elements": [ - { - "endIndex": 24705, - "startIndex": 24704, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24704 - }, - { - "endIndex": 24783, - "paragraph": { - "elements": [ - { - "endIndex": 24783, - "startIndex": 24705, - "textRun": { - "content": " static List loadProducts(Category category) => switch (category) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24705 - }, - { - "endIndex": 24821, - "paragraph": { - "elements": [ - { - "endIndex": 24821, - "startIndex": 24783, - "textRun": { - "content": " Category.all => _allProducts,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24783 - }, - { - "endIndex": 24894, - "paragraph": { - "elements": [ - { - "endIndex": 24894, - "startIndex": 24821, - "textRun": { - "content": " _ => _allProducts.where((p) => p.category == category).toList(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24821 - }, - { - "endIndex": 24903, - "paragraph": { - "elements": [ - { - "endIndex": 24903, - "startIndex": 24894, - "textRun": { - "content": " };\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24894 - }, - { - "endIndex": 24905, - "paragraph": { - "elements": [ - { - "endIndex": 24905, - "startIndex": 24903, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24903 - } - ], - "endIndex": 24905, - "startIndex": 19255, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "width": { - "magnitude": 468.75, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - } - ] - } - } - }, - { - "endIndex": 24907, - "paragraph": { - "elements": [ - { - "endIndex": 24907, - "startIndex": 24906, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 24906 - }, - { - "endIndex": 24922, - "paragraph": { - "elements": [ - { - "endIndex": 24908, - "inlineObjectElement": { - "inlineObjectId": "kix.ipgkm0795660", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "startIndex": 24907 - }, - { - "endIndex": 24921, - "startIndex": 24908, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24922, - "startIndex": 24921, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 24907 - }, - { - "endIndex": 25157, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 25140, - "startIndex": 24922, - "textRun": { - "content": "In this case we are making a mock product database for ease of development, but this should be served to the app as an API. An easy way to do this that deals with the partially disconnected reality of mobile phones is ", - "textStyle": {} - } - }, - { - "endIndex": 25155, - "startIndex": 25140, - "textRun": { - "content": "Cloud Firestore", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://firebase.google.com/docs/firestore/" - }, - "underline": true - } - } - }, - { - "endIndex": 25157, - "startIndex": 25155, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 24922 - }, - { - "endIndex": 25481, - "paragraph": { - "elements": [ - { - "endIndex": 25205, - "startIndex": 25157, - "textRun": { - "content": "You are now ready to define the model. Create a ", - "textStyle": {} - } - }, - { - "endIndex": 25235, - "startIndex": 25205, - "textRun": { - "content": "lib/model/app_state_model.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25249, - "startIndex": 25235, - "textRun": { - "content": " file. In the ", - "textStyle": {} - } - }, - { - "endIndex": 25262, - "startIndex": 25249, - "textRun": { - "content": "AppStateModel", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25481, - "startIndex": 25262, - "textRun": { - "content": " class, provide methods for accessing data from the model. For example, add a method for accessing the shopping cart total, another for a list of selected products to purchase, another for the shipping cost, and so on.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 25157 - }, - { - "endIndex": 25592, - "paragraph": { - "elements": [ - { - "endIndex": 25482, - "inlineObjectElement": { - "inlineObjectId": "kix.tio0memkjwdt", - "textStyle": {} - }, - "startIndex": 25481 - }, - { - "endIndex": 25516, - "startIndex": 25482, - "textRun": { - "content": " Create the model class.\u000bCreate a ", - "textStyle": {} - } - }, - { - "endIndex": 25546, - "startIndex": 25516, - "textRun": { - "content": "lib/model/app_state_model.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25592, - "startIndex": 25546, - "textRun": { - "content": " file. Add the following content to the file.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 25481 - }, - { - "endIndex": 25623, - "paragraph": { - "elements": [ - { - "endIndex": 25622, - "startIndex": 25592, - "textRun": { - "content": "lib/model/app_state_model.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/model/app_state_model.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 25623, - "startIndex": 25622, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hckjl3k0jhqs", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 25592 - }, - { - "endIndex": 28991, - "startIndex": 25623, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 28990, - "startIndex": 25624, - "tableCells": [ - { - "content": [ - { - "endIndex": 25682, - "paragraph": { - "elements": [ - { - "endIndex": 25682, - "startIndex": 25626, - "textRun": { - "content": "import 'package:flutter/foundation.dart' as foundation;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25626 - }, - { - "endIndex": 25683, - "paragraph": { - "elements": [ - { - "endIndex": 25683, - "startIndex": 25682, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25682 - }, - { - "endIndex": 25706, - "paragraph": { - "elements": [ - { - "endIndex": 25706, - "startIndex": 25683, - "textRun": { - "content": "import 'product.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25683 - }, - { - "endIndex": 25741, - "paragraph": { - "elements": [ - { - "endIndex": 25741, - "startIndex": 25706, - "textRun": { - "content": "import 'products_repository.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25706 - }, - { - "endIndex": 25742, - "paragraph": { - "elements": [ - { - "endIndex": 25742, - "startIndex": 25741, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25741 - }, - { - "endIndex": 25771, - "paragraph": { - "elements": [ - { - "endIndex": 25771, - "startIndex": 25742, - "textRun": { - "content": "double _salesTaxRate = 0.06;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25742 - }, - { - "endIndex": 25804, - "paragraph": { - "elements": [ - { - "endIndex": 25804, - "startIndex": 25771, - "textRun": { - "content": "double _shippingCostPerItem = 7;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25771 - }, - { - "endIndex": 25805, - "paragraph": { - "elements": [ - { - "endIndex": 25805, - "startIndex": 25804, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25804 - }, - { - "endIndex": 25861, - "paragraph": { - "elements": [ - { - "endIndex": 25861, - "startIndex": 25805, - "textRun": { - "content": "class AppStateModel extends foundation.ChangeNotifier {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25805 - }, - { - "endIndex": 25894, - "paragraph": { - "elements": [ - { - "endIndex": 25894, - "startIndex": 25861, - "textRun": { - "content": " // All the available products.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25861 - }, - { - "endIndex": 25935, - "paragraph": { - "elements": [ - { - "endIndex": 25935, - "startIndex": 25894, - "textRun": { - "content": " List _availableProducts = [];\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25894 - }, - { - "endIndex": 25936, - "paragraph": { - "elements": [ - { - "endIndex": 25936, - "startIndex": 25935, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25935 - }, - { - "endIndex": 25986, - "paragraph": { - "elements": [ - { - "endIndex": 25986, - "startIndex": 25936, - "textRun": { - "content": " // The currently selected category of products.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25936 - }, - { - "endIndex": 26031, - "paragraph": { - "elements": [ - { - "endIndex": 26031, - "startIndex": 25986, - "textRun": { - "content": " Category _selectedCategory = Category.all;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25986 - }, - { - "endIndex": 26032, - "paragraph": { - "elements": [ - { - "endIndex": 26032, - "startIndex": 26031, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26031 - }, - { - "endIndex": 26095, - "paragraph": { - "elements": [ - { - "endIndex": 26095, - "startIndex": 26032, - "textRun": { - "content": " // The IDs and quantities of products currently in the cart.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26032 - }, - { - "endIndex": 26135, - "paragraph": { - "elements": [ - { - "endIndex": 26135, - "startIndex": 26095, - "textRun": { - "content": " final _productsInCart = {};\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26095 - }, - { - "endIndex": 26136, - "paragraph": { - "elements": [ - { - "endIndex": 26136, - "startIndex": 26135, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26135 - }, - { - "endIndex": 26173, - "paragraph": { - "elements": [ - { - "endIndex": 26173, - "startIndex": 26136, - "textRun": { - "content": " Map get productsInCart {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26136 - }, - { - "endIndex": 26211, - "paragraph": { - "elements": [ - { - "endIndex": 26211, - "startIndex": 26173, - "textRun": { - "content": " return Map.from(_productsInCart);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26173 - }, - { - "endIndex": 26215, - "paragraph": { - "elements": [ - { - "endIndex": 26215, - "startIndex": 26211, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26211 - }, - { - "endIndex": 26216, - "paragraph": { - "elements": [ - { - "endIndex": 26216, - "startIndex": 26215, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26215 - }, - { - "endIndex": 26256, - "paragraph": { - "elements": [ - { - "endIndex": 26256, - "startIndex": 26216, - "textRun": { - "content": " // Total number of items in the cart.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26216 - }, - { - "endIndex": 26286, - "paragraph": { - "elements": [ - { - "endIndex": 26286, - "startIndex": 26256, - "textRun": { - "content": " int get totalCartQuantity {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26256 - }, - { - "endIndex": 26351, - "paragraph": { - "elements": [ - { - "endIndex": 26351, - "startIndex": 26286, - "textRun": { - "content": " return _productsInCart.values.fold(0, (accumulator, value) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26286 - }, - { - "endIndex": 26385, - "paragraph": { - "elements": [ - { - "endIndex": 26385, - "startIndex": 26351, - "textRun": { - "content": " return accumulator + value;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26351 - }, - { - "endIndex": 26393, - "paragraph": { - "elements": [ - { - "endIndex": 26393, - "startIndex": 26385, - "textRun": { - "content": " });\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26385 - }, - { - "endIndex": 26397, - "paragraph": { - "elements": [ - { - "endIndex": 26397, - "startIndex": 26393, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26393 - }, - { - "endIndex": 26398, - "paragraph": { - "elements": [ - { - "endIndex": 26398, - "startIndex": 26397, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26397 - }, - { - "endIndex": 26432, - "paragraph": { - "elements": [ - { - "endIndex": 26432, - "startIndex": 26398, - "textRun": { - "content": " Category get selectedCategory {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26398 - }, - { - "endIndex": 26462, - "paragraph": { - "elements": [ - { - "endIndex": 26462, - "startIndex": 26432, - "textRun": { - "content": " return _selectedCategory;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26432 - }, - { - "endIndex": 26466, - "paragraph": { - "elements": [ - { - "endIndex": 26466, - "startIndex": 26462, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26462 - }, - { - "endIndex": 26467, - "paragraph": { - "elements": [ - { - "endIndex": 26467, - "startIndex": 26466, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26466 - }, - { - "endIndex": 26513, - "paragraph": { - "elements": [ - { - "endIndex": 26513, - "startIndex": 26467, - "textRun": { - "content": " // Totaled prices of the items in the cart.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26467 - }, - { - "endIndex": 26541, - "paragraph": { - "elements": [ - { - "endIndex": 26541, - "startIndex": 26513, - "textRun": { - "content": " double get subtotalCost {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26513 - }, - { - "endIndex": 26584, - "paragraph": { - "elements": [ - { - "endIndex": 26584, - "startIndex": 26541, - "textRun": { - "content": " return _productsInCart.keys.map((id) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26541 - }, - { - "endIndex": 26625, - "paragraph": { - "elements": [ - { - "endIndex": 26625, - "startIndex": 26584, - "textRun": { - "content": " // Extended price for product line\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26584 - }, - { - "endIndex": 26687, - "paragraph": { - "elements": [ - { - "endIndex": 26687, - "startIndex": 26625, - "textRun": { - "content": " return getProductById(id).price * _productsInCart[id]!;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26625 - }, - { - "endIndex": 26733, - "paragraph": { - "elements": [ - { - "endIndex": 26733, - "startIndex": 26687, - "textRun": { - "content": " }).fold(0, (accumulator, extendedPrice) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26687 - }, - { - "endIndex": 26775, - "paragraph": { - "elements": [ - { - "endIndex": 26775, - "startIndex": 26733, - "textRun": { - "content": " return accumulator + extendedPrice;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26733 - }, - { - "endIndex": 26783, - "paragraph": { - "elements": [ - { - "endIndex": 26783, - "startIndex": 26775, - "textRun": { - "content": " });\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26775 - }, - { - "endIndex": 26787, - "paragraph": { - "elements": [ - { - "endIndex": 26787, - "startIndex": 26783, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26783 - }, - { - "endIndex": 26788, - "paragraph": { - "elements": [ - { - "endIndex": 26788, - "startIndex": 26787, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26787 - }, - { - "endIndex": 26840, - "paragraph": { - "elements": [ - { - "endIndex": 26840, - "startIndex": 26788, - "textRun": { - "content": " // Total shipping cost for the items in the cart.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26788 - }, - { - "endIndex": 26868, - "paragraph": { - "elements": [ - { - "endIndex": 26868, - "startIndex": 26840, - "textRun": { - "content": " double get shippingCost {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26840 - }, - { - "endIndex": 26902, - "paragraph": { - "elements": [ - { - "endIndex": 26902, - "startIndex": 26868, - "textRun": { - "content": " return _shippingCostPerItem *\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26868 - }, - { - "endIndex": 26970, - "paragraph": { - "elements": [ - { - "endIndex": 26970, - "startIndex": 26902, - "textRun": { - "content": " _productsInCart.values.fold(0.0, (accumulator, itemCount) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26902 - }, - { - "endIndex": 27012, - "paragraph": { - "elements": [ - { - "endIndex": 27012, - "startIndex": 26970, - "textRun": { - "content": " return accumulator + itemCount;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26970 - }, - { - "endIndex": 27024, - "paragraph": { - "elements": [ - { - "endIndex": 27024, - "startIndex": 27012, - "textRun": { - "content": " });\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27012 - }, - { - "endIndex": 27028, - "paragraph": { - "elements": [ - { - "endIndex": 27028, - "startIndex": 27024, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27024 - }, - { - "endIndex": 27029, - "paragraph": { - "elements": [ - { - "endIndex": 27029, - "startIndex": 27028, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27028 - }, - { - "endIndex": 27070, - "paragraph": { - "elements": [ - { - "endIndex": 27070, - "startIndex": 27029, - "textRun": { - "content": " // Sales tax for the items in the cart\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27029 - }, - { - "endIndex": 27089, - "paragraph": { - "elements": [ - { - "endIndex": 27089, - "startIndex": 27070, - "textRun": { - "content": " double get tax {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27070 - }, - { - "endIndex": 27130, - "paragraph": { - "elements": [ - { - "endIndex": 27130, - "startIndex": 27089, - "textRun": { - "content": " return subtotalCost * _salesTaxRate;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27089 - }, - { - "endIndex": 27134, - "paragraph": { - "elements": [ - { - "endIndex": 27134, - "startIndex": 27130, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27130 - }, - { - "endIndex": 27135, - "paragraph": { - "elements": [ - { - "endIndex": 27135, - "startIndex": 27134, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27134 - }, - { - "endIndex": 27184, - "paragraph": { - "elements": [ - { - "endIndex": 27184, - "startIndex": 27135, - "textRun": { - "content": " // Total cost to order everything in the cart.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27135 - }, - { - "endIndex": 27209, - "paragraph": { - "elements": [ - { - "endIndex": 27209, - "startIndex": 27184, - "textRun": { - "content": " double get totalCost {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27184 - }, - { - "endIndex": 27255, - "paragraph": { - "elements": [ - { - "endIndex": 27255, - "startIndex": 27209, - "textRun": { - "content": " return subtotalCost + shippingCost + tax;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27209 - }, - { - "endIndex": 27259, - "paragraph": { - "elements": [ - { - "endIndex": 27259, - "startIndex": 27255, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27255 - }, - { - "endIndex": 27260, - "paragraph": { - "elements": [ - { - "endIndex": 27260, - "startIndex": 27259, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27259 - }, - { - "endIndex": 27337, - "paragraph": { - "elements": [ - { - "endIndex": 27337, - "startIndex": 27260, - "textRun": { - "content": " // Returns a copy of the list of available products, filtered by category.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27260 - }, - { - "endIndex": 27399, - "paragraph": { - "elements": [ - { - "endIndex": 27399, - "startIndex": 27337, - "textRun": { - "content": " List getProducts() => switch (_selectedCategory) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27337 - }, - { - "endIndex": 27454, - "paragraph": { - "elements": [ - { - "endIndex": 27454, - "startIndex": 27399, - "textRun": { - "content": " Category.all => List.from(_availableProducts),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27399 - }, - { - "endIndex": 27486, - "paragraph": { - "elements": [ - { - "endIndex": 27486, - "startIndex": 27454, - "textRun": { - "content": " _ => _availableProducts\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27454 - }, - { - "endIndex": 27545, - "paragraph": { - "elements": [ - { - "endIndex": 27545, - "startIndex": 27486, - "textRun": { - "content": " .where((p) => p.category == _selectedCategory)\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27486 - }, - { - "endIndex": 27568, - "paragraph": { - "elements": [ - { - "endIndex": 27568, - "startIndex": 27545, - "textRun": { - "content": " .toList(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27545 - }, - { - "endIndex": 27577, - "paragraph": { - "elements": [ - { - "endIndex": 27577, - "startIndex": 27568, - "textRun": { - "content": " };\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27568 - }, - { - "endIndex": 27578, - "paragraph": { - "elements": [ - { - "endIndex": 27578, - "startIndex": 27577, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27577 - }, - { - "endIndex": 27610, - "paragraph": { - "elements": [ - { - "endIndex": 27610, - "startIndex": 27578, - "textRun": { - "content": " // Search the product catalog\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27578 - }, - { - "endIndex": 27655, - "paragraph": { - "elements": [ - { - "endIndex": 27655, - "startIndex": 27610, - "textRun": { - "content": " List search(String searchTerms) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27610 - }, - { - "endIndex": 27698, - "paragraph": { - "elements": [ - { - "endIndex": 27698, - "startIndex": 27655, - "textRun": { - "content": " return getProducts().where((product) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27655 - }, - { - "endIndex": 27775, - "paragraph": { - "elements": [ - { - "endIndex": 27775, - "startIndex": 27698, - "textRun": { - "content": " return product.name.toLowerCase().contains(searchTerms.toLowerCase());\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27698 - }, - { - "endIndex": 27792, - "paragraph": { - "elements": [ - { - "endIndex": 27792, - "startIndex": 27775, - "textRun": { - "content": " }).toList();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27775 - }, - { - "endIndex": 27796, - "paragraph": { - "elements": [ - { - "endIndex": 27796, - "startIndex": 27792, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27792 - }, - { - "endIndex": 27797, - "paragraph": { - "elements": [ - { - "endIndex": 27797, - "startIndex": 27796, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27796 - }, - { - "endIndex": 27830, - "paragraph": { - "elements": [ - { - "endIndex": 27830, - "startIndex": 27797, - "textRun": { - "content": " // Adds a product to the cart.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27797 - }, - { - "endIndex": 27871, - "paragraph": { - "elements": [ - { - "endIndex": 27871, - "startIndex": 27830, - "textRun": { - "content": " void addProductToCart(int productId) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27830 - }, - { - "endIndex": 27922, - "paragraph": { - "elements": [ - { - "endIndex": 27922, - "startIndex": 27871, - "textRun": { - "content": " if (!_productsInCart.containsKey(productId)) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27871 - }, - { - "endIndex": 27960, - "paragraph": { - "elements": [ - { - "endIndex": 27960, - "startIndex": 27922, - "textRun": { - "content": " _productsInCart[productId] = 1;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27922 - }, - { - "endIndex": 27973, - "paragraph": { - "elements": [ - { - "endIndex": 27973, - "startIndex": 27960, - "textRun": { - "content": " } else {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27960 - }, - { - "endIndex": 28041, - "paragraph": { - "elements": [ - { - "endIndex": 28041, - "startIndex": 27973, - "textRun": { - "content": " _productsInCart[productId] = _productsInCart[productId]! + 1;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27973 - }, - { - "endIndex": 28047, - "paragraph": { - "elements": [ - { - "endIndex": 28047, - "startIndex": 28041, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28041 - }, - { - "endIndex": 28048, - "paragraph": { - "elements": [ - { - "endIndex": 28048, - "startIndex": 28047, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28047 - }, - { - "endIndex": 28071, - "paragraph": { - "elements": [ - { - "endIndex": 28071, - "startIndex": 28048, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28048 - }, - { - "endIndex": 28075, - "paragraph": { - "elements": [ - { - "endIndex": 28075, - "startIndex": 28071, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28071 - }, - { - "endIndex": 28076, - "paragraph": { - "elements": [ - { - "endIndex": 28076, - "startIndex": 28075, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28075 - }, - { - "endIndex": 28112, - "paragraph": { - "elements": [ - { - "endIndex": 28112, - "startIndex": 28076, - "textRun": { - "content": " // Removes an item from the cart.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28076 - }, - { - "endIndex": 28155, - "paragraph": { - "elements": [ - { - "endIndex": 28155, - "startIndex": 28112, - "textRun": { - "content": " void removeItemFromCart(int productId) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28112 - }, - { - "endIndex": 28205, - "paragraph": { - "elements": [ - { - "endIndex": 28205, - "startIndex": 28155, - "textRun": { - "content": " if (_productsInCart.containsKey(productId)) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28155 - }, - { - "endIndex": 28250, - "paragraph": { - "elements": [ - { - "endIndex": 28250, - "startIndex": 28205, - "textRun": { - "content": " if (_productsInCart[productId] == 1) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28205 - }, - { - "endIndex": 28293, - "paragraph": { - "elements": [ - { - "endIndex": 28293, - "startIndex": 28250, - "textRun": { - "content": " _productsInCart.remove(productId);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28250 - }, - { - "endIndex": 28308, - "paragraph": { - "elements": [ - { - "endIndex": 28308, - "startIndex": 28293, - "textRun": { - "content": " } else {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28293 - }, - { - "endIndex": 28378, - "paragraph": { - "elements": [ - { - "endIndex": 28378, - "startIndex": 28308, - "textRun": { - "content": " _productsInCart[productId] = _productsInCart[productId]! - 1;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28308 - }, - { - "endIndex": 28386, - "paragraph": { - "elements": [ - { - "endIndex": 28386, - "startIndex": 28378, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28378 - }, - { - "endIndex": 28392, - "paragraph": { - "elements": [ - { - "endIndex": 28392, - "startIndex": 28386, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28386 - }, - { - "endIndex": 28393, - "paragraph": { - "elements": [ - { - "endIndex": 28393, - "startIndex": 28392, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28392 - }, - { - "endIndex": 28416, - "paragraph": { - "elements": [ - { - "endIndex": 28416, - "startIndex": 28393, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28393 - }, - { - "endIndex": 28420, - "paragraph": { - "elements": [ - { - "endIndex": 28420, - "startIndex": 28416, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28416 - }, - { - "endIndex": 28421, - "paragraph": { - "elements": [ - { - "endIndex": 28421, - "startIndex": 28420, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28420 - }, - { - "endIndex": 28481, - "paragraph": { - "elements": [ - { - "endIndex": 28481, - "startIndex": 28421, - "textRun": { - "content": " // Returns the Product instance matching the provided id.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28421 - }, - { - "endIndex": 28516, - "paragraph": { - "elements": [ - { - "endIndex": 28516, - "startIndex": 28481, - "textRun": { - "content": " Product getProductById(int id) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28481 - }, - { - "endIndex": 28577, - "paragraph": { - "elements": [ - { - "endIndex": 28577, - "startIndex": 28516, - "textRun": { - "content": " return _availableProducts.firstWhere((p) => p.id == id);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28516 - }, - { - "endIndex": 28581, - "paragraph": { - "elements": [ - { - "endIndex": 28581, - "startIndex": 28577, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28577 - }, - { - "endIndex": 28582, - "paragraph": { - "elements": [ - { - "endIndex": 28582, - "startIndex": 28581, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28581 - }, - { - "endIndex": 28621, - "paragraph": { - "elements": [ - { - "endIndex": 28621, - "startIndex": 28582, - "textRun": { - "content": " // Removes everything from the cart.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28582 - }, - { - "endIndex": 28642, - "paragraph": { - "elements": [ - { - "endIndex": 28642, - "startIndex": 28621, - "textRun": { - "content": " void clearCart() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28621 - }, - { - "endIndex": 28671, - "paragraph": { - "elements": [ - { - "endIndex": 28671, - "startIndex": 28642, - "textRun": { - "content": " _productsInCart.clear();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28642 - }, - { - "endIndex": 28694, - "paragraph": { - "elements": [ - { - "endIndex": 28694, - "startIndex": 28671, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28671 - }, - { - "endIndex": 28698, - "paragraph": { - "elements": [ - { - "endIndex": 28698, - "startIndex": 28694, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28694 - }, - { - "endIndex": 28699, - "paragraph": { - "elements": [ - { - "endIndex": 28699, - "startIndex": 28698, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28698 - }, - { - "endIndex": 28756, - "paragraph": { - "elements": [ - { - "endIndex": 28756, - "startIndex": 28699, - "textRun": { - "content": " // Loads the list of available products from the repo.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28699 - }, - { - "endIndex": 28780, - "paragraph": { - "elements": [ - { - "endIndex": 28780, - "startIndex": 28756, - "textRun": { - "content": " void loadProducts() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28756 - }, - { - "endIndex": 28852, - "paragraph": { - "elements": [ - { - "endIndex": 28852, - "startIndex": 28780, - "textRun": { - "content": " _availableProducts = ProductsRepository.loadProducts(Category.all);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28780 - }, - { - "endIndex": 28875, - "paragraph": { - "elements": [ - { - "endIndex": 28875, - "startIndex": 28852, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28852 - }, - { - "endIndex": 28879, - "paragraph": { - "elements": [ - { - "endIndex": 28879, - "startIndex": 28875, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28875 - }, - { - "endIndex": 28880, - "paragraph": { - "elements": [ - { - "endIndex": 28880, - "startIndex": 28879, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28879 - }, - { - "endIndex": 28923, - "paragraph": { - "elements": [ - { - "endIndex": 28923, - "startIndex": 28880, - "textRun": { - "content": " void setCategory(Category newCategory) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28880 - }, - { - "endIndex": 28960, - "paragraph": { - "elements": [ - { - "endIndex": 28960, - "startIndex": 28923, - "textRun": { - "content": " _selectedCategory = newCategory;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28923 - }, - { - "endIndex": 28983, - "paragraph": { - "elements": [ - { - "endIndex": 28983, - "startIndex": 28960, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28960 - }, - { - "endIndex": 28987, - "paragraph": { - "elements": [ - { - "endIndex": 28987, - "startIndex": 28983, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28983 - }, - { - "endIndex": 28989, - "paragraph": { - "elements": [ - { - "endIndex": 28989, - "startIndex": 28987, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28987 - }, - { - "endIndex": 28990, - "paragraph": { - "elements": [ - { - "endIndex": 28990, - "startIndex": 28989, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28989 - } - ], - "endIndex": 28990, - "startIndex": 25625, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 28992, - "paragraph": { - "elements": [ - { - "endIndex": 28992, - "startIndex": 28991, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 28991 - }, - { - "endIndex": 29007, - "paragraph": { - "elements": [ - { - "endIndex": 28993, - "inlineObjectElement": { - "inlineObjectId": "kix.domc5se7jmx1", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "startIndex": 28992 - }, - { - "endIndex": 29006, - "startIndex": 28993, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29007, - "startIndex": 29006, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 28992 - }, - { - "endIndex": 29239, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 29011, - "startIndex": 29007, - "textRun": { - "content": "Our ", - "textStyle": {} - } - }, - { - "endIndex": 29024, - "startIndex": 29011, - "textRun": { - "content": "AppStateModel", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29238, - "startIndex": 29024, - "textRun": { - "content": " shows a way of centralizing the state of the application, and making the state available throughout the whole application. In later steps we will use this state to drive our Search and Shopping Cart functionality.", - "textStyle": {} - } - }, - { - "endIndex": 29239, - "startIndex": 29238, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 29007 - }, - { - "endIndex": 29337, - "paragraph": { - "elements": [ - { - "endIndex": 29240, - "inlineObjectElement": { - "inlineObjectId": "kix.3jrsx5vd3efm", - "textStyle": {} - }, - "startIndex": 29239 - }, - { - "endIndex": 29248, - "startIndex": 29240, - "textRun": { - "content": " Update ", - "textStyle": {} - } - }, - { - "endIndex": 29261, - "startIndex": 29248, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29270, - "startIndex": 29261, - "textRun": { - "content": ".\u000bIn the ", - "textStyle": {} - } - }, - { - "endIndex": 29276, - "startIndex": 29270, - "textRun": { - "content": "main()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29282, - "startIndex": 29276, - "textRun": { - "content": "method", - "textStyle": {} - } - }, - { - "endIndex": 29337, - "startIndex": 29282, - "textRun": { - "content": ", initialize the model. Add the lines marked with NEW.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 29239 - }, - { - "endIndex": 29351, - "paragraph": { - "elements": [ - { - "endIndex": 29350, - "startIndex": 29337, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/main.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 29351, - "startIndex": 29350, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hei6sqe0eql6", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 29337 - }, - { - "endIndex": 29759, - "startIndex": 29351, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 29758, - "startIndex": 29352, - "tableCells": [ - { - "content": [ - { - "endIndex": 29395, - "paragraph": { - "elements": [ - { - "endIndex": 29395, - "startIndex": 29354, - "textRun": { - "content": "import 'package:flutter/cupertino.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29354 - }, - { - "endIndex": 29455, - "paragraph": { - "elements": [ - { - "endIndex": 29455, - "startIndex": 29395, - "textRun": { - "content": "import 'package:provider/provider.dart'; // NEW\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29395 - }, - { - "endIndex": 29456, - "paragraph": { - "elements": [ - { - "endIndex": 29456, - "startIndex": 29455, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29455 - }, - { - "endIndex": 29475, - "paragraph": { - "elements": [ - { - "endIndex": 29475, - "startIndex": 29456, - "textRun": { - "content": "import 'app.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29456 - }, - { - "endIndex": 29535, - "paragraph": { - "elements": [ - { - "endIndex": 29535, - "startIndex": 29475, - "textRun": { - "content": "import 'model/app_state_model.dart'; // NEW\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29475 - }, - { - "endIndex": 29536, - "paragraph": { - "elements": [ - { - "endIndex": 29536, - "startIndex": 29535, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29535 - }, - { - "endIndex": 29550, - "paragraph": { - "elements": [ - { - "endIndex": 29550, - "startIndex": 29536, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29536 - }, - { - "endIndex": 29566, - "paragraph": { - "elements": [ - { - "endIndex": 29566, - "startIndex": 29550, - "textRun": { - "content": " return runApp(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29550 - }, - { - "endIndex": 29626, - "paragraph": { - "elements": [ - { - "endIndex": 29626, - "startIndex": 29566, - "textRun": { - "content": " ChangeNotifierProvider( // NEW\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29566 - }, - { - "endIndex": 29686, - "paragraph": { - "elements": [ - { - "endIndex": 29686, - "startIndex": 29626, - "textRun": { - "content": " create: (_) => AppStateModel()..loadProducts(), // NEW\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29626 - }, - { - "endIndex": 29746, - "paragraph": { - "elements": [ - { - "endIndex": 29746, - "startIndex": 29686, - "textRun": { - "content": " child: const CupertinoStoreApp(), // NEW\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29686 - }, - { - "endIndex": 29752, - "paragraph": { - "elements": [ - { - "endIndex": 29752, - "startIndex": 29746, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29746 - }, - { - "endIndex": 29756, - "paragraph": { - "elements": [ - { - "endIndex": 29756, - "startIndex": 29752, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29752 - }, - { - "endIndex": 29758, - "paragraph": { - "elements": [ - { - "endIndex": 29758, - "startIndex": 29756, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29756 - } - ], - "endIndex": 29758, - "startIndex": 29353, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 29760, - "paragraph": { - "elements": [ - { - "endIndex": 29760, - "startIndex": 29759, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 29759 - }, - { - "endIndex": 29775, - "paragraph": { - "elements": [ - { - "endIndex": 29761, - "inlineObjectElement": { - "inlineObjectId": "kix.mfrwmgozkn04", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "startIndex": 29760 - }, - { - "endIndex": 29774, - "startIndex": 29761, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29775, - "startIndex": 29774, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 29760 - }, - { - "endIndex": 29885, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 29793, - "startIndex": 29775, - "textRun": { - "content": "We are wiring the ", - "textStyle": {} - } - }, - { - "endIndex": 29806, - "startIndex": 29793, - "textRun": { - "content": "AppStateModel", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29885, - "startIndex": 29806, - "textRun": { - "content": " at the top of the widget tree to make it available throughout the entire app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 29775 - }, - { - "endIndex": 30003, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 29898, - "startIndex": 29885, - "textRun": { - "content": "We are using ", - "textStyle": {} - } - }, - { - "endIndex": 29920, - "startIndex": 29898, - "textRun": { - "content": "ChangeNotifierProvider", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/documentation/provider/latest/provider/ChangeNotifierProvider-class.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29930, - "startIndex": 29920, - "textRun": { - "content": " from the ", - "textStyle": {} - } - }, - { - "endIndex": 29938, - "startIndex": 29930, - "textRun": { - "content": "provider", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/provider" - }, - "underline": true - } - } - }, - { - "endIndex": 30002, - "startIndex": 29938, - "textRun": { - "content": " package, which monitors AppStateModel for change notifications.", - "textStyle": {} - } - }, - { - "endIndex": 30003, - "startIndex": 30002, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 29885 - }, - { - "endIndex": 30240, - "paragraph": { - "elements": [ - { - "endIndex": 30004, - "inlineObjectElement": { - "inlineObjectId": "kix.e0iyccqx9njq", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 30003 - }, - { - "endIndex": 30005, - "startIndex": 30004, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 30016, - "startIndex": 30005, - "textRun": { - "content": "Run the app", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/test-drive" - }, - "underline": true - } - } - }, - { - "endIndex": 30240, - "startIndex": 30016, - "textRun": { - "content": ". You should see the following white screen containing the Cupertino navbar, a title, and a drawer with 3 labeled icons representing the three tabs. You can switch between the tabs, but all three pages are currently blank.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30003 - }, - { - "endIndex": 30241, - "paragraph": { - "elements": [ - { - "endIndex": 30241, - "startIndex": 30240, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30240 - }, - { - "endIndex": 30243, - "paragraph": { - "elements": [ - { - "endIndex": 30242, - "inlineObjectElement": { - "inlineObjectId": "kix.67wpmz98lv4d", - "textStyle": {} - }, - "startIndex": 30241 - }, - { - "endIndex": 30243, - "startIndex": 30242, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30241 - }, - { - "endIndex": 30244, - "paragraph": { - "elements": [ - { - "endIndex": 30244, - "startIndex": 30243, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30243 - }, - { - "endIndex": 30254, - "paragraph": { - "elements": [ - { - "endIndex": 30254, - "startIndex": 30244, - "textRun": { - "content": "Problems?\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30244 - }, - { - "endIndex": 30377, - "paragraph": { - "elements": [ - { - "endIndex": 30377, - "startIndex": 30254, - "textRun": { - "content": "If your app is not running correctly, look for typos. If needed, use the code at the following links to get back on track.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30254 - }, - { - "endIndex": 30378, - "paragraph": { - "elements": [ - { - "endIndex": 30378, - "startIndex": 30377, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30377 - }, - { - "endIndex": 30391, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 30390, - "startIndex": 30378, - "textRun": { - "content": "lib/app.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/app.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30391, - "startIndex": 30390, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30378 - }, - { - "endIndex": 30405, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 30404, - "startIndex": 30391, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/main.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30405, - "startIndex": 30404, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30391 - }, - { - "endIndex": 30431, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 30430, - "startIndex": 30405, - "textRun": { - "content": "lib/product_list_tab.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/product_list_tab.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30431, - "startIndex": 30430, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30405 - }, - { - "endIndex": 30451, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 30450, - "startIndex": 30431, - "textRun": { - "content": "lib/search_tab.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/search_tab.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30451, - "startIndex": 30450, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30431 - }, - { - "endIndex": 30478, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 30477, - "startIndex": 30451, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/shopping_cart_tab.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30478, - "startIndex": 30477, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30451 - }, - { - "endIndex": 30509, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 30508, - "startIndex": 30478, - "textRun": { - "content": "lib/model/app_state_model.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/model/app_state_model.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30509, - "startIndex": 30508, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30478 - }, - { - "endIndex": 30532, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 30531, - "startIndex": 30509, - "textRun": { - "content": "lib/model/product.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/model/product.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30532, - "startIndex": 30531, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30509 - }, - { - "endIndex": 30567, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 30566, - "startIndex": 30532, - "textRun": { - "content": "lib/model/products_repository.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_01/lib/model/products_repository.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30567, - "startIndex": 30566, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30532 - }, - { - "endIndex": 30568, - "paragraph": { - "elements": [ - { - "endIndex": 30568, - "startIndex": 30567, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30567 - }, - { - "endIndex": 30570, - "paragraph": { - "elements": [ - { - "endIndex": 30569, - "horizontalRule": { - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 30568 - }, - { - "endIndex": 30570, - "startIndex": 30569, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30568 - }, - { - "endIndex": 30593, - "paragraph": { - "elements": [ - { - "endIndex": 30592, - "startIndex": 30570, - "textRun": { - "content": "List products for sale", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 30593, - "startIndex": 30592, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.oypkea3o1dqe", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30570 - }, - { - "endIndex": 30608, - "paragraph": { - "elements": [ - { - "endIndex": 30607, - "startIndex": 30593, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - }, - { - "endIndex": 30608, - "startIndex": 30607, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30593 - }, - { - "endIndex": 30609, - "paragraph": { - "elements": [ - { - "endIndex": 30609, - "startIndex": 30608, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30608 - }, - { - "endIndex": 30678, - "paragraph": { - "elements": [ - { - "endIndex": 30678, - "startIndex": 30609, - "textRun": { - "content": "In this step, display the products for sale in the product list tab.\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30609 - }, - { - "endIndex": 30806, - "paragraph": { - "elements": [ - { - "endIndex": 30679, - "inlineObjectElement": { - "inlineObjectId": "kix.haeq1i15f6yw", - "textStyle": {} - }, - "startIndex": 30678 - }, - { - "endIndex": 30684, - "startIndex": 30679, - "textRun": { - "content": " Add ", - "textStyle": {} - } - }, - { - "endIndex": 30709, - "startIndex": 30684, - "textRun": { - "content": "lib/product_row_item.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30734, - "startIndex": 30709, - "textRun": { - "content": " to display the products.", - "textStyle": {} - } - }, - { - "endIndex": 30746, - "startIndex": 30734, - "textRun": { - "content": "\u000bCreate the ", - "textStyle": {} - } - }, - { - "endIndex": 30776, - "startIndex": 30746, - "textRun": { - "content": "lib/product_row_item.dart file", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30806, - "startIndex": 30776, - "textRun": { - "content": ", with the following content:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30678 - }, - { - "endIndex": 30832, - "paragraph": { - "elements": [ - { - "endIndex": 30831, - "startIndex": 30806, - "textRun": { - "content": "lib/product_row_item.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_02/lib/product_row_item.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 30832, - "startIndex": 30831, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.witwcysqo1ag", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 30806 - }, - { - "endIndex": 32322, - "startIndex": 30832, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 32321, - "startIndex": 30833, - "tableCells": [ - { - "content": [ - { - "endIndex": 30876, - "paragraph": { - "elements": [ - { - "endIndex": 30876, - "startIndex": 30835, - "textRun": { - "content": "import 'package:flutter/cupertino.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30835 - }, - { - "endIndex": 30917, - "paragraph": { - "elements": [ - { - "endIndex": 30917, - "startIndex": 30876, - "textRun": { - "content": "import 'package:provider/provider.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30876 - }, - { - "endIndex": 30918, - "paragraph": { - "elements": [ - { - "endIndex": 30918, - "startIndex": 30917, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30917 - }, - { - "endIndex": 30955, - "paragraph": { - "elements": [ - { - "endIndex": 30955, - "startIndex": 30918, - "textRun": { - "content": "import 'model/app_state_model.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30918 - }, - { - "endIndex": 30984, - "paragraph": { - "elements": [ - { - "endIndex": 30984, - "startIndex": 30955, - "textRun": { - "content": "import 'model/product.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30955 - }, - { - "endIndex": 31006, - "paragraph": { - "elements": [ - { - "endIndex": 31006, - "startIndex": 30984, - "textRun": { - "content": "import 'styles.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30984 - }, - { - "endIndex": 31007, - "paragraph": { - "elements": [ - { - "endIndex": 31007, - "startIndex": 31006, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31006 - }, - { - "endIndex": 31054, - "paragraph": { - "elements": [ - { - "endIndex": 31054, - "startIndex": 31007, - "textRun": { - "content": "class ProductRowItem extends StatelessWidget {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31007 - }, - { - "endIndex": 31079, - "paragraph": { - "elements": [ - { - "endIndex": 31079, - "startIndex": 31054, - "textRun": { - "content": " const ProductRowItem({\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31054 - }, - { - "endIndex": 31106, - "paragraph": { - "elements": [ - { - "endIndex": 31106, - "startIndex": 31079, - "textRun": { - "content": " required this.product,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31079 - }, - { - "endIndex": 31121, - "paragraph": { - "elements": [ - { - "endIndex": 31121, - "startIndex": 31106, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31106 - }, - { - "endIndex": 31127, - "paragraph": { - "elements": [ - { - "endIndex": 31127, - "startIndex": 31121, - "textRun": { - "content": " });\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31121 - }, - { - "endIndex": 31128, - "paragraph": { - "elements": [ - { - "endIndex": 31128, - "startIndex": 31127, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31127 - }, - { - "endIndex": 31153, - "paragraph": { - "elements": [ - { - "endIndex": 31153, - "startIndex": 31128, - "textRun": { - "content": " final Product product;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31128 - }, - { - "endIndex": 31154, - "paragraph": { - "elements": [ - { - "endIndex": 31154, - "startIndex": 31153, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31153 - }, - { - "endIndex": 31166, - "paragraph": { - "elements": [ - { - "endIndex": 31166, - "startIndex": 31154, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31154 - }, - { - "endIndex": 31205, - "paragraph": { - "elements": [ - { - "endIndex": 31205, - "startIndex": 31166, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31166 - }, - { - "endIndex": 31226, - "paragraph": { - "elements": [ - { - "endIndex": 31226, - "startIndex": 31205, - "textRun": { - "content": " return SafeArea(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31205 - }, - { - "endIndex": 31244, - "paragraph": { - "elements": [ - { - "endIndex": 31244, - "startIndex": 31226, - "textRun": { - "content": " top: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31226 - }, - { - "endIndex": 31265, - "paragraph": { - "elements": [ - { - "endIndex": 31265, - "startIndex": 31244, - "textRun": { - "content": " bottom: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31244 - }, - { - "endIndex": 31303, - "paragraph": { - "elements": [ - { - "endIndex": 31303, - "startIndex": 31265, - "textRun": { - "content": " minimum: const EdgeInsets.only(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31265 - }, - { - "endIndex": 31320, - "paragraph": { - "elements": [ - { - "endIndex": 31320, - "startIndex": 31303, - "textRun": { - "content": " left: 0,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31303 - }, - { - "endIndex": 31336, - "paragraph": { - "elements": [ - { - "endIndex": 31336, - "startIndex": 31320, - "textRun": { - "content": " top: 8,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31320 - }, - { - "endIndex": 31355, - "paragraph": { - "elements": [ - { - "endIndex": 31355, - "startIndex": 31336, - "textRun": { - "content": " bottom: 8,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31336 - }, - { - "endIndex": 31373, - "paragraph": { - "elements": [ - { - "endIndex": 31373, - "startIndex": 31355, - "textRun": { - "content": " right: 8,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31355 - }, - { - "endIndex": 31382, - "paragraph": { - "elements": [ - { - "endIndex": 31382, - "startIndex": 31373, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31373 - }, - { - "endIndex": 31414, - "paragraph": { - "elements": [ - { - "endIndex": 31414, - "startIndex": 31382, - "textRun": { - "content": " child: CupertinoListTile(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31382 - }, - { - "endIndex": 31442, - "paragraph": { - "elements": [ - { - "endIndex": 31442, - "startIndex": 31414, - "textRun": { - "content": " leading: ClipRRect(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31414 - }, - { - "endIndex": 31492, - "paragraph": { - "elements": [ - { - "endIndex": 31492, - "startIndex": 31442, - "textRun": { - "content": " borderRadius: BorderRadius.circular(4),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31442 - }, - { - "endIndex": 31522, - "paragraph": { - "elements": [ - { - "endIndex": 31522, - "startIndex": 31492, - "textRun": { - "content": " child: Image.asset(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31492 - }, - { - "endIndex": 31553, - "paragraph": { - "elements": [ - { - "endIndex": 31553, - "startIndex": 31522, - "textRun": { - "content": " product.assetName,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31522 - }, - { - "endIndex": 31596, - "paragraph": { - "elements": [ - { - "endIndex": 31596, - "startIndex": 31553, - "textRun": { - "content": " package: product.assetPackage,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31553 - }, - { - "endIndex": 31627, - "paragraph": { - "elements": [ - { - "endIndex": 31627, - "startIndex": 31596, - "textRun": { - "content": " fit: BoxFit.cover,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31596 - }, - { - "endIndex": 31650, - "paragraph": { - "elements": [ - { - "endIndex": 31650, - "startIndex": 31627, - "textRun": { - "content": " width: 68,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31627 - }, - { - "endIndex": 31674, - "paragraph": { - "elements": [ - { - "endIndex": 31674, - "startIndex": 31650, - "textRun": { - "content": " height: 68,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31650 - }, - { - "endIndex": 31687, - "paragraph": { - "elements": [ - { - "endIndex": 31687, - "startIndex": 31674, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31674 - }, - { - "endIndex": 31698, - "paragraph": { - "elements": [ - { - "endIndex": 31698, - "startIndex": 31687, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31687 - }, - { - "endIndex": 31723, - "paragraph": { - "elements": [ - { - "endIndex": 31723, - "startIndex": 31698, - "textRun": { - "content": " leadingSize: 68,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31698 - }, - { - "endIndex": 31744, - "paragraph": { - "elements": [ - { - "endIndex": 31744, - "startIndex": 31723, - "textRun": { - "content": " title: Text(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31723 - }, - { - "endIndex": 31768, - "paragraph": { - "elements": [ - { - "endIndex": 31768, - "startIndex": 31744, - "textRun": { - "content": " product.name,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31744 - }, - { - "endIndex": 31812, - "paragraph": { - "elements": [ - { - "endIndex": 31812, - "startIndex": 31768, - "textRun": { - "content": " style: Styles.productRowItemName,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31768 - }, - { - "endIndex": 31823, - "paragraph": { - "elements": [ - { - "endIndex": 31823, - "startIndex": 31812, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31812 - }, - { - "endIndex": 31847, - "paragraph": { - "elements": [ - { - "endIndex": 31847, - "startIndex": 31823, - "textRun": { - "content": " subtitle: Text(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31823 - }, - { - "endIndex": 31879, - "paragraph": { - "elements": [ - { - "endIndex": 31879, - "startIndex": 31847, - "textRun": { - "content": " '\\$${product.price}',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31847 - }, - { - "endIndex": 31924, - "paragraph": { - "elements": [ - { - "endIndex": 31924, - "startIndex": 31879, - "textRun": { - "content": " style: Styles.productRowItemPrice,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31879 - }, - { - "endIndex": 31935, - "paragraph": { - "elements": [ - { - "endIndex": 31935, - "startIndex": 31924, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31924 - }, - { - "endIndex": 31970, - "paragraph": { - "elements": [ - { - "endIndex": 31970, - "startIndex": 31935, - "textRun": { - "content": " trailing: CupertinoButton(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31935 - }, - { - "endIndex": 32006, - "paragraph": { - "elements": [ - { - "endIndex": 32006, - "startIndex": 31970, - "textRun": { - "content": " padding: EdgeInsets.zero,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31970 - }, - { - "endIndex": 32032, - "paragraph": { - "elements": [ - { - "endIndex": 32032, - "startIndex": 32006, - "textRun": { - "content": " onPressed: () {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32006 - }, - { - "endIndex": 32110, - "paragraph": { - "elements": [ - { - "endIndex": 32110, - "startIndex": 32032, - "textRun": { - "content": " final model = Provider.of(context, listen: false);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32032 - }, - { - "endIndex": 32158, - "paragraph": { - "elements": [ - { - "endIndex": 32158, - "startIndex": 32110, - "textRun": { - "content": " model.addProductToCart(product.id);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32110 - }, - { - "endIndex": 32171, - "paragraph": { - "elements": [ - { - "endIndex": 32171, - "startIndex": 32158, - "textRun": { - "content": " },\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32158 - }, - { - "endIndex": 32200, - "paragraph": { - "elements": [ - { - "endIndex": 32200, - "startIndex": 32171, - "textRun": { - "content": " child: const Icon(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32171 - }, - { - "endIndex": 32241, - "paragraph": { - "elements": [ - { - "endIndex": 32241, - "startIndex": 32200, - "textRun": { - "content": " CupertinoIcons.plus_circled,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32200 - }, - { - "endIndex": 32275, - "paragraph": { - "elements": [ - { - "endIndex": 32275, - "startIndex": 32241, - "textRun": { - "content": " semanticLabel: 'Add',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32241 - }, - { - "endIndex": 32288, - "paragraph": { - "elements": [ - { - "endIndex": 32288, - "startIndex": 32275, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32275 - }, - { - "endIndex": 32299, - "paragraph": { - "elements": [ - { - "endIndex": 32299, - "startIndex": 32288, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32288 - }, - { - "endIndex": 32308, - "paragraph": { - "elements": [ - { - "endIndex": 32308, - "startIndex": 32299, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32299 - }, - { - "endIndex": 32315, - "paragraph": { - "elements": [ - { - "endIndex": 32315, - "startIndex": 32308, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32308 - }, - { - "endIndex": 32319, - "paragraph": { - "elements": [ - { - "endIndex": 32319, - "startIndex": 32315, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32315 - }, - { - "endIndex": 32321, - "paragraph": { - "elements": [ - { - "endIndex": 32320, - "startIndex": 32319, - "textRun": { - "content": "}", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32321, - "startIndex": 32320, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32319 - } - ], - "endIndex": 32321, - "startIndex": 30834, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 32323, - "paragraph": { - "elements": [ - { - "endIndex": 32323, - "startIndex": 32322, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 32322 - }, - { - "endIndex": 32338, - "paragraph": { - "elements": [ - { - "endIndex": 32324, - "inlineObjectElement": { - "inlineObjectId": "kix.35x18swc1rlb", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "startIndex": 32323 - }, - { - "endIndex": 32337, - "startIndex": 32324, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32338, - "startIndex": 32337, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 32323 - }, - { - "endIndex": 32497, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 32366, - "startIndex": 32338, - "textRun": { - "content": "CupertinoSliverNavigationBar", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.flutter.dev/flutter/cupertino/CupertinoSliverNavigationBar-class.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32497, - "startIndex": 32366, - "textRun": { - "content": " is how we get iOS 11 style expanding titles in the navigation bar. This is important to make an iOS user feel at home in the app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 32338 - }, - { - "endIndex": 32743, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 32742, - "startIndex": 32497, - "textRun": { - "content": "There is a lot of complexity in this file, as we emulate the highly refined look and feel of iOS applications. Flutter’s strength is that we can make these changes in an editor and see them change in near real time thanks to Stateful Hot Reload.", - "textStyle": {} - } - }, - { - "endIndex": 32743, - "startIndex": 32742, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 32497 - }, - { - "endIndex": 32814, - "paragraph": { - "elements": [ - { - "endIndex": 32744, - "inlineObjectElement": { - "inlineObjectId": "kix.u4201tafqyd", - "textStyle": {} - }, - "startIndex": 32743 - }, - { - "endIndex": 32748, - "startIndex": 32744, - "textRun": { - "content": " In ", - "textStyle": {} - } - }, - { - "endIndex": 32773, - "startIndex": 32748, - "textRun": { - "content": "lib/product_list_tab.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32786, - "startIndex": 32773, - "textRun": { - "content": ", import the ", - "textStyle": {} - } - }, - { - "endIndex": 32807, - "startIndex": 32786, - "textRun": { - "content": "product_row_item.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32814, - "startIndex": 32807, - "textRun": { - "content": " file.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 32743 - }, - { - "endIndex": 32840, - "paragraph": { - "elements": [ - { - "endIndex": 32839, - "startIndex": 32814, - "textRun": { - "content": "lib/product_list_tab.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_02/lib/product_list_tab.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 32840, - "startIndex": 32839, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.51vwfsqul47s", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 32814 - }, - { - "endIndex": 33008, - "startIndex": 32840, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 33007, - "startIndex": 32841, - "tableCells": [ - { - "content": [ - { - "endIndex": 32884, - "paragraph": { - "elements": [ - { - "endIndex": 32850, - "startIndex": 32843, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32882, - "startIndex": 32850, - "textRun": { - "content": "'package:flutter/cupertino.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32884, - "startIndex": 32882, - "textRun": { - "content": ";\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32843 - }, - { - "endIndex": 32925, - "paragraph": { - "elements": [ - { - "endIndex": 32891, - "startIndex": 32884, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32923, - "startIndex": 32891, - "textRun": { - "content": "'package:provider/provider.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32925, - "startIndex": 32923, - "textRun": { - "content": ";\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32884 - }, - { - "endIndex": 32926, - "paragraph": { - "elements": [ - { - "endIndex": 32926, - "startIndex": 32925, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32925 - }, - { - "endIndex": 32963, - "paragraph": { - "elements": [ - { - "endIndex": 32933, - "startIndex": 32926, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32961, - "startIndex": 32933, - "textRun": { - "content": "'model/app_state_model.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32963, - "startIndex": 32961, - "textRun": { - "content": ";\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32926 - }, - { - "endIndex": 33007, - "paragraph": { - "elements": [ - { - "endIndex": 32970, - "startIndex": 32963, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32993, - "startIndex": 32970, - "textRun": { - "content": "'product_row_item.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33006, - "startIndex": 32993, - "textRun": { - "content": "; // NEW", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33007, - "startIndex": 33006, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32963 - } - ], - "endIndex": 33007, - "startIndex": 32842, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 33009, - "paragraph": { - "elements": [ - { - "endIndex": 33009, - "startIndex": 33008, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 33008 - }, - { - "endIndex": 33137, - "paragraph": { - "elements": [ - { - "endIndex": 33010, - "inlineObjectElement": { - "inlineObjectId": "kix.sc3yfwq1efx0", - "textStyle": {} - }, - "startIndex": 33009 - }, - { - "endIndex": 33018, - "startIndex": 33010, - "textRun": { - "content": " In the ", - "textStyle": {} - } - }, - { - "endIndex": 33025, - "startIndex": 33018, - "textRun": { - "content": "build()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33037, - "startIndex": 33025, - "textRun": { - "content": " method for ", - "textStyle": {} - } - }, - { - "endIndex": 33051, - "startIndex": 33037, - "textRun": { - "content": "ProductListTab", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33137, - "startIndex": 33051, - "textRun": { - "content": ", get the product list and the number of products. Add the new lines indicated below:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 33009 - }, - { - "endIndex": 33725, - "startIndex": 33137, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 33724, - "startIndex": 33138, - "tableCells": [ - { - "content": [ - { - "endIndex": 33187, - "paragraph": { - "elements": [ - { - "endIndex": 33187, - "startIndex": 33140, - "textRun": { - "content": "class ProductListTab extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33140 - }, - { - "endIndex": 33224, - "paragraph": { - "elements": [ - { - "endIndex": 33224, - "startIndex": 33187, - "textRun": { - "content": " const ProductListTab({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33187 - }, - { - "endIndex": 33225, - "paragraph": { - "elements": [ - { - "endIndex": 33225, - "startIndex": 33224, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33224 - }, - { - "endIndex": 33237, - "paragraph": { - "elements": [ - { - "endIndex": 33237, - "startIndex": 33225, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33225 - }, - { - "endIndex": 33276, - "paragraph": { - "elements": [ - { - "endIndex": 33276, - "startIndex": 33237, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33237 - }, - { - "endIndex": 33312, - "paragraph": { - "elements": [ - { - "endIndex": 33312, - "startIndex": 33276, - "textRun": { - "content": " return Consumer(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33276 - }, - { - "endIndex": 33353, - "paragraph": { - "elements": [ - { - "endIndex": 33353, - "startIndex": 33312, - "textRun": { - "content": " builder: (context, model, child) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33312 - }, - { - "endIndex": 33409, - "paragraph": { - "elements": [ - { - "endIndex": 33409, - "startIndex": 33353, - "textRun": { - "content": " final products = model.getProducts(); // NEW\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33353 - }, - { - "endIndex": 33468, - "paragraph": { - "elements": [ - { - "endIndex": 33468, - "startIndex": 33409, - "textRun": { - "content": " return CustomScrollView( // MODIFY\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33409 - }, - { - "endIndex": 33524, - "paragraph": { - "elements": [ - { - "endIndex": 33524, - "startIndex": 33468, - "textRun": { - "content": " semanticChildCount: products.length, // NEW\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33468 - }, - { - "endIndex": 33553, - "paragraph": { - "elements": [ - { - "endIndex": 33553, - "startIndex": 33524, - "textRun": { - "content": " slivers: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33524 - }, - { - "endIndex": 33612, - "paragraph": { - "elements": [ - { - "endIndex": 33612, - "startIndex": 33553, - "textRun": { - "content": " const CupertinoSliverNavigationBar( // MODIFY\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33553 - }, - { - "endIndex": 33663, - "paragraph": { - "elements": [ - { - "endIndex": 33663, - "startIndex": 33612, - "textRun": { - "content": " largeTitle: Text('Cupertino Store'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33612 - }, - { - "endIndex": 33678, - "paragraph": { - "elements": [ - { - "endIndex": 33678, - "startIndex": 33663, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33663 - }, - { - "endIndex": 33691, - "paragraph": { - "elements": [ - { - "endIndex": 33691, - "startIndex": 33678, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33678 - }, - { - "endIndex": 33702, - "paragraph": { - "elements": [ - { - "endIndex": 33702, - "startIndex": 33691, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33691 - }, - { - "endIndex": 33711, - "paragraph": { - "elements": [ - { - "endIndex": 33711, - "startIndex": 33702, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33702 - }, - { - "endIndex": 33718, - "paragraph": { - "elements": [ - { - "endIndex": 33718, - "startIndex": 33711, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33711 - }, - { - "endIndex": 33722, - "paragraph": { - "elements": [ - { - "endIndex": 33722, - "startIndex": 33718, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33718 - }, - { - "endIndex": 33724, - "paragraph": { - "elements": [ - { - "endIndex": 33723, - "startIndex": 33722, - "textRun": { - "content": "}", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33724, - "startIndex": 33723, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33722 - } - ], - "endIndex": 33724, - "startIndex": 33139, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 33726, - "paragraph": { - "elements": [ - { - "endIndex": 33726, - "startIndex": 33725, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 33725 - }, - { - "endIndex": 33861, - "paragraph": { - "elements": [ - { - "endIndex": 33727, - "inlineObjectElement": { - "inlineObjectId": "kix.wa35hl984azj", - "textStyle": {} - }, - "startIndex": 33726 - }, - { - "endIndex": 33740, - "startIndex": 33727, - "textRun": { - "content": " Also in the ", - "textStyle": {} - } - }, - { - "endIndex": 33747, - "startIndex": 33740, - "textRun": { - "content": "build()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33861, - "startIndex": 33747, - "textRun": { - "content": " method, add a new sliver to the sliver widgets list to hold the product list. Add the new lines indicated below:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 33726 - }, - { - "endIndex": 34948, - "startIndex": 33861, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 34947, - "startIndex": 33862, - "tableCells": [ - { - "content": [ - { - "endIndex": 33911, - "paragraph": { - "elements": [ - { - "endIndex": 33911, - "startIndex": 33864, - "textRun": { - "content": "class ProductListTab extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33864 - }, - { - "endIndex": 33948, - "paragraph": { - "elements": [ - { - "endIndex": 33948, - "startIndex": 33911, - "textRun": { - "content": " const ProductListTab({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33911 - }, - { - "endIndex": 33949, - "paragraph": { - "elements": [ - { - "endIndex": 33949, - "startIndex": 33948, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33948 - }, - { - "endIndex": 33961, - "paragraph": { - "elements": [ - { - "endIndex": 33961, - "startIndex": 33949, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33949 - }, - { - "endIndex": 34000, - "paragraph": { - "elements": [ - { - "endIndex": 34000, - "startIndex": 33961, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33961 - }, - { - "endIndex": 34036, - "paragraph": { - "elements": [ - { - "endIndex": 34036, - "startIndex": 34000, - "textRun": { - "content": " return Consumer(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34000 - }, - { - "endIndex": 34077, - "paragraph": { - "elements": [ - { - "endIndex": 34077, - "startIndex": 34036, - "textRun": { - "content": " builder: (context, model, child) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34036 - }, - { - "endIndex": 34123, - "paragraph": { - "elements": [ - { - "endIndex": 34123, - "startIndex": 34077, - "textRun": { - "content": " final products = model.getProducts();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34077 - }, - { - "endIndex": 34156, - "paragraph": { - "elements": [ - { - "endIndex": 34156, - "startIndex": 34123, - "textRun": { - "content": " return CustomScrollView(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34123 - }, - { - "endIndex": 34203, - "paragraph": { - "elements": [ - { - "endIndex": 34203, - "startIndex": 34156, - "textRun": { - "content": " semanticChildCount: products.length,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34156 - }, - { - "endIndex": 34232, - "paragraph": { - "elements": [ - { - "endIndex": 34232, - "startIndex": 34203, - "textRun": { - "content": " slivers: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34203 - }, - { - "endIndex": 34280, - "paragraph": { - "elements": [ - { - "endIndex": 34280, - "startIndex": 34232, - "textRun": { - "content": " const CupertinoSliverNavigationBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34232 - }, - { - "endIndex": 34331, - "paragraph": { - "elements": [ - { - "endIndex": 34331, - "startIndex": 34280, - "textRun": { - "content": " largeTitle: Text('Cupertino Store'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34280 - }, - { - "endIndex": 34346, - "paragraph": { - "elements": [ - { - "endIndex": 34346, - "startIndex": 34331, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34331 - }, - { - "endIndex": 34406, - "paragraph": { - "elements": [ - { - "endIndex": 34406, - "startIndex": 34346, - "textRun": { - "content": " SliverSafeArea( // ADD from here…\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34346 - }, - { - "endIndex": 34432, - "paragraph": { - "elements": [ - { - "endIndex": 34432, - "startIndex": 34406, - "textRun": { - "content": " top: false,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34406 - }, - { - "endIndex": 34486, - "paragraph": { - "elements": [ - { - "endIndex": 34486, - "startIndex": 34432, - "textRun": { - "content": " minimum: const EdgeInsets.only(top: 0),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34432 - }, - { - "endIndex": 34528, - "paragraph": { - "elements": [ - { - "endIndex": 34528, - "startIndex": 34486, - "textRun": { - "content": " sliver: SliverToBoxAdapter(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34486 - }, - { - "endIndex": 34573, - "paragraph": { - "elements": [ - { - "endIndex": 34573, - "startIndex": 34528, - "textRun": { - "content": " child: CupertinoListSection(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34528 - }, - { - "endIndex": 34605, - "paragraph": { - "elements": [ - { - "endIndex": 34605, - "startIndex": 34573, - "textRun": { - "content": " topMargin: 0,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34573 - }, - { - "endIndex": 34635, - "paragraph": { - "elements": [ - { - "endIndex": 34635, - "startIndex": 34605, - "textRun": { - "content": " children: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34605 - }, - { - "endIndex": 34685, - "paragraph": { - "elements": [ - { - "endIndex": 34685, - "startIndex": 34635, - "textRun": { - "content": " for (var product in products)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34635 - }, - { - "endIndex": 34723, - "paragraph": { - "elements": [ - { - "endIndex": 34723, - "startIndex": 34685, - "textRun": { - "content": " ProductRowItem(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34685 - }, - { - "endIndex": 34765, - "paragraph": { - "elements": [ - { - "endIndex": 34765, - "startIndex": 34723, - "textRun": { - "content": " product: product,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34723 - }, - { - "endIndex": 34789, - "paragraph": { - "elements": [ - { - "endIndex": 34789, - "startIndex": 34765, - "textRun": { - "content": " )\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34765 - }, - { - "endIndex": 34810, - "paragraph": { - "elements": [ - { - "endIndex": 34810, - "startIndex": 34789, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34789 - }, - { - "endIndex": 34829, - "paragraph": { - "elements": [ - { - "endIndex": 34829, - "startIndex": 34810, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34810 - }, - { - "endIndex": 34846, - "paragraph": { - "elements": [ - { - "endIndex": 34846, - "startIndex": 34829, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34829 - }, - { - "endIndex": 34901, - "paragraph": { - "elements": [ - { - "endIndex": 34901, - "startIndex": 34846, - "textRun": { - "content": " ), // …to here.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34846 - }, - { - "endIndex": 34914, - "paragraph": { - "elements": [ - { - "endIndex": 34914, - "startIndex": 34901, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34901 - }, - { - "endIndex": 34925, - "paragraph": { - "elements": [ - { - "endIndex": 34925, - "startIndex": 34914, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34914 - }, - { - "endIndex": 34934, - "paragraph": { - "elements": [ - { - "endIndex": 34934, - "startIndex": 34925, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34925 - }, - { - "endIndex": 34941, - "paragraph": { - "elements": [ - { - "endIndex": 34941, - "startIndex": 34934, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34934 - }, - { - "endIndex": 34945, - "paragraph": { - "elements": [ - { - "endIndex": 34945, - "startIndex": 34941, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34941 - }, - { - "endIndex": 34947, - "paragraph": { - "elements": [ - { - "endIndex": 34947, - "startIndex": 34945, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 34945 - } - ], - "endIndex": 34947, - "startIndex": 33863, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 34949, - "paragraph": { - "elements": [ - { - "endIndex": 34949, - "startIndex": 34948, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 34948 - }, - { - "endIndex": 34964, - "paragraph": { - "elements": [ - { - "endIndex": 34950, - "inlineObjectElement": { - "inlineObjectId": "kix.yy1pnk54xwq2", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "startIndex": 34949 - }, - { - "endIndex": 34963, - "startIndex": 34950, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34964, - "startIndex": 34963, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 34949 - }, - { - "endIndex": 35047, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 35016, - "startIndex": 34964, - "textRun": { - "content": "The notch is accounted for by the first sliver (the ", - "textStyle": {} - } - }, - { - "endIndex": 35044, - "startIndex": 35016, - "textRun": { - "content": "CupertinoSliverNavigationBar", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35047, - "startIndex": 35044, - "textRun": { - "content": ").\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 34964 - }, - { - "endIndex": 35304, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 35235, - "startIndex": 35047, - "textRun": { - "content": "The new sliver and the first sliver are siblings (not parent-child), so the first sliver has no way to communicate that it has already consumed the notch. Therefore the second sliver sets ", - "textStyle": {} - } - }, - { - "endIndex": 35249, - "startIndex": 35235, - "textRun": { - "content": "SliverSafeArea", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35252, - "startIndex": 35249, - "textRun": { - "content": "’s ", - "textStyle": {} - } - }, - { - "endIndex": 35255, - "startIndex": 35252, - "textRun": { - "content": "top", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35268, - "startIndex": 35255, - "textRun": { - "content": " property to ", - "textStyle": {} - } - }, - { - "endIndex": 35273, - "startIndex": 35268, - "textRun": { - "content": "false", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35304, - "startIndex": 35273, - "textRun": { - "content": " so that it ignores the notch.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 35047 - }, - { - "endIndex": 35547, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 35308, - "startIndex": 35304, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 35322, - "startIndex": 35308, - "textRun": { - "content": "SliverSafeArea", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35325, - "startIndex": 35322, - "textRun": { - "content": "’s ", - "textStyle": {} - } - }, - { - "endIndex": 35329, - "startIndex": 35325, - "textRun": { - "content": "left", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35334, - "startIndex": 35329, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 35339, - "startIndex": 35334, - "textRun": { - "content": "right", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35368, - "startIndex": 35339, - "textRun": { - "content": " properties still default to ", - "textStyle": {} - } - }, - { - "endIndex": 35372, - "startIndex": 35368, - "textRun": { - "content": "true", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35433, - "startIndex": 35372, - "textRun": { - "content": " in case the phone is rotated, and it still accounts for the ", - "textStyle": {} - } - }, - { - "endIndex": 35439, - "startIndex": 35433, - "textRun": { - "content": "bottom", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35547, - "startIndex": 35439, - "textRun": { - "content": " so that the sliver can scroll past the bottom home bar to avoid obstruction when it's scrolled to the end.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 35304 - }, - { - "endIndex": 35739, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 35739, - "startIndex": 35547, - "textRun": { - "content": "This logic is not specifically required here due to the app being restricted to portrait only, but including it means this code is safe to re-use in apps that handle horizontal presentation. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 35547 - }, - { - "endIndex": 35995, - "paragraph": { - "elements": [ - { - "endIndex": 35740, - "inlineObjectElement": { - "inlineObjectId": "kix.74khzmyqjy1f", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 35739 - }, - { - "endIndex": 35741, - "startIndex": 35740, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 35752, - "startIndex": 35741, - "textRun": { - "content": "Run the app", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/test-drive" - }, - "underline": true - } - } - }, - { - "endIndex": 35995, - "startIndex": 35752, - "textRun": { - "content": ". In the product tab, you should see a list of products with images, prices, and a button with a plus sign that adds the product to the shopping cart. The button will be implemented later, in the step where you’ll build out the shopping cart.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 35739 - }, - { - "endIndex": 35996, - "paragraph": { - "elements": [ - { - "endIndex": 35996, - "startIndex": 35995, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 35995 - }, - { - "endIndex": 35998, - "paragraph": { - "elements": [ - { - "endIndex": 35997, - "inlineObjectElement": { - "inlineObjectId": "kix.xv0jovubjkin", - "textStyle": {} - }, - "startIndex": 35996 - }, - { - "endIndex": 35998, - "startIndex": 35997, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 35996 - }, - { - "endIndex": 35999, - "paragraph": { - "elements": [ - { - "endIndex": 35999, - "startIndex": 35998, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 35998 - }, - { - "endIndex": 36009, - "paragraph": { - "elements": [ - { - "endIndex": 36009, - "startIndex": 35999, - "textRun": { - "content": "Problems?\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 35999 - }, - { - "endIndex": 36132, - "paragraph": { - "elements": [ - { - "endIndex": 36132, - "startIndex": 36009, - "textRun": { - "content": "If your app is not running correctly, look for typos. If needed, use the code at the following links to get back on track.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36009 - }, - { - "endIndex": 36133, - "paragraph": { - "elements": [ - { - "endIndex": 36133, - "startIndex": 36132, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36132 - }, - { - "endIndex": 36159, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 36158, - "startIndex": 36133, - "textRun": { - "content": "lib/product_list_tab.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_02/lib/product_list_tab.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36159, - "startIndex": 36158, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36133 - }, - { - "endIndex": 36185, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 36184, - "startIndex": 36159, - "textRun": { - "content": "lib/product_row_item.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_02/lib/product_row_item.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36185, - "startIndex": 36184, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36159 - }, - { - "endIndex": 36186, - "paragraph": { - "elements": [ - { - "endIndex": 36186, - "startIndex": 36185, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36185 - }, - { - "endIndex": 36188, - "paragraph": { - "elements": [ - { - "endIndex": 36187, - "horizontalRule": { - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 36186 - }, - { - "endIndex": 36188, - "startIndex": 36187, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36186 - }, - { - "endIndex": 36207, - "paragraph": { - "elements": [ - { - "endIndex": 36207, - "startIndex": 36188, - "textRun": { - "content": "Add product search\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.tr262bz9ptry", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36188 - }, - { - "endIndex": 36222, - "paragraph": { - "elements": [ - { - "endIndex": 36221, - "startIndex": 36207, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - }, - { - "endIndex": 36222, - "startIndex": 36221, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36207 - }, - { - "endIndex": 36223, - "paragraph": { - "elements": [ - { - "endIndex": 36223, - "startIndex": 36222, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36222 - }, - { - "endIndex": 36321, - "paragraph": { - "elements": [ - { - "endIndex": 36321, - "startIndex": 36223, - "textRun": { - "content": "In this step, you’ll build out the search tab and add the ability to search through the products.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36223 - }, - { - "endIndex": 36322, - "paragraph": { - "elements": [ - { - "endIndex": 36322, - "startIndex": 36321, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36321 - }, - { - "endIndex": 36367, - "paragraph": { - "elements": [ - { - "endIndex": 36323, - "inlineObjectElement": { - "inlineObjectId": "kix.s3xddl8pv2t6", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 36322 - }, - { - "endIndex": 36324, - "startIndex": 36323, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 36346, - "startIndex": 36324, - "textRun": { - "content": "Update the imports in ", - "textStyle": {} - } - }, - { - "endIndex": 36365, - "startIndex": 36346, - "textRun": { - "content": "lib/search_tab.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36367, - "startIndex": 36365, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36322 - }, - { - "endIndex": 36425, - "paragraph": { - "elements": [ - { - "endIndex": 36424, - "startIndex": 36367, - "textRun": { - "content": "Add imports for the classes that the search tab will use:", - "textStyle": {} - } - }, - { - "endIndex": 36425, - "startIndex": 36424, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36367 - }, - { - "endIndex": 36445, - "paragraph": { - "elements": [ - { - "endIndex": 36444, - "startIndex": 36425, - "textRun": { - "content": "lib/search_tab.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_03/lib/search_tab.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 36445, - "startIndex": 36444, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.43owoidtk7t6", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36425 - }, - { - "endIndex": 36771, - "startIndex": 36445, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 36770, - "startIndex": 36446, - "tableCells": [ - { - "content": [ - { - "endIndex": 36489, - "paragraph": { - "elements": [ - { - "endIndex": 36489, - "startIndex": 36448, - "textRun": { - "content": "import 'package:flutter/cupertino.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 36448 - }, - { - "endIndex": 36545, - "paragraph": { - "elements": [ - { - "endIndex": 36545, - "startIndex": 36489, - "textRun": { - "content": "import 'package:provider/provider.dart'; // NEW\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 36489 - }, - { - "endIndex": 36546, - "paragraph": { - "elements": [ - { - "endIndex": 36546, - "startIndex": 36545, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 36545 - }, - { - "endIndex": 36602, - "paragraph": { - "elements": [ - { - "endIndex": 36602, - "startIndex": 36546, - "textRun": { - "content": "import 'model/app_state_model.dart'; // NEW\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 36546 - }, - { - "endIndex": 36658, - "paragraph": { - "elements": [ - { - "endIndex": 36658, - "startIndex": 36602, - "textRun": { - "content": "import 'product_row_item.dart'; // NEW\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 36602 - }, - { - "endIndex": 36714, - "paragraph": { - "elements": [ - { - "endIndex": 36714, - "startIndex": 36658, - "textRun": { - "content": "import 'search_bar.dart'; // NEW\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 36658 - }, - { - "endIndex": 36770, - "paragraph": { - "elements": [ - { - "endIndex": 36769, - "startIndex": 36714, - "textRun": { - "content": "import 'styles.dart'; // NEW", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36770, - "startIndex": 36769, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 36714 - } - ], - "endIndex": 36770, - "startIndex": 36447, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 36772, - "paragraph": { - "elements": [ - { - "endIndex": 36772, - "startIndex": 36771, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36771 - }, - { - "endIndex": 36820, - "paragraph": { - "elements": [ - { - "endIndex": 36773, - "inlineObjectElement": { - "inlineObjectId": "kix.qi44ua9jrpnu", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 36772 - }, - { - "endIndex": 36774, - "startIndex": 36773, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 36785, - "startIndex": 36774, - "textRun": { - "content": "Update the ", - "textStyle": {} - } - }, - { - "endIndex": 36792, - "startIndex": 36785, - "textRun": { - "content": "build()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36803, - "startIndex": 36792, - "textRun": { - "content": " method in ", - "textStyle": {} - } - }, - { - "endIndex": 36818, - "startIndex": 36803, - "textRun": { - "content": "_SearchTabState", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36820, - "startIndex": 36818, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36772 - }, - { - "endIndex": 36928, - "paragraph": { - "elements": [ - { - "endIndex": 36857, - "startIndex": 36820, - "textRun": { - "content": "Initialize the model and replace the ", - "textStyle": {} - } - }, - { - "endIndex": 36873, - "startIndex": 36857, - "textRun": { - "content": "CustomScrollView", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36928, - "startIndex": 36873, - "textRun": { - "content": " with individual components for searching and listing.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36820 - }, - { - "endIndex": 36929, - "paragraph": { - "elements": [ - { - "endIndex": 36929, - "startIndex": 36928, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 36928 - }, - { - "endIndex": 37795, - "startIndex": 36929, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 37794, - "startIndex": 36930, - "tableCells": [ - { - "content": [ - { - "endIndex": 36981, - "paragraph": { - "elements": [ - { - "endIndex": 36981, - "startIndex": 36932, - "textRun": { - "content": "class _SearchTabState extends State {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608, - "red": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36932 - }, - { - "endIndex": 36986, - "paragraph": { - "elements": [ - { - "endIndex": 36986, - "startIndex": 36981, - "textRun": { - "content": "// …\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608, - "red": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36981 - }, - { - "endIndex": 36987, - "paragraph": { - "elements": [ - { - "endIndex": 36987, - "startIndex": 36986, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608, - "red": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36986 - }, - { - "endIndex": 36999, - "paragraph": { - "elements": [ - { - "endIndex": 36999, - "startIndex": 36987, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36987 - }, - { - "endIndex": 37038, - "paragraph": { - "elements": [ - { - "endIndex": 37038, - "startIndex": 36999, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36999 - }, - { - "endIndex": 37093, - "paragraph": { - "elements": [ - { - "endIndex": 37093, - "startIndex": 37038, - "textRun": { - "content": " final model = Provider.of(context);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37038 - }, - { - "endIndex": 37135, - "paragraph": { - "elements": [ - { - "endIndex": 37135, - "startIndex": 37093, - "textRun": { - "content": " final results = model.search(_terms);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37093 - }, - { - "endIndex": 37136, - "paragraph": { - "elements": [ - { - "endIndex": 37136, - "startIndex": 37135, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37135 - }, - { - "endIndex": 37161, - "paragraph": { - "elements": [ - { - "endIndex": 37161, - "startIndex": 37136, - "textRun": { - "content": " return DecoratedBox(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37136 - }, - { - "endIndex": 37200, - "paragraph": { - "elements": [ - { - "endIndex": 37200, - "startIndex": 37161, - "textRun": { - "content": " decoration: const BoxDecoration(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37161 - }, - { - "endIndex": 37242, - "paragraph": { - "elements": [ - { - "endIndex": 37242, - "startIndex": 37200, - "textRun": { - "content": " color: Styles.scaffoldBackground,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37200 - }, - { - "endIndex": 37251, - "paragraph": { - "elements": [ - { - "endIndex": 37251, - "startIndex": 37242, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37242 - }, - { - "endIndex": 37274, - "paragraph": { - "elements": [ - { - "endIndex": 37274, - "startIndex": 37251, - "textRun": { - "content": " child: SafeArea(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37251 - }, - { - "endIndex": 37297, - "paragraph": { - "elements": [ - { - "endIndex": 37297, - "startIndex": 37274, - "textRun": { - "content": " child: Column(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37274 - }, - { - "endIndex": 37319, - "paragraph": { - "elements": [ - { - "endIndex": 37319, - "startIndex": 37297, - "textRun": { - "content": " children: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37297 - }, - { - "endIndex": 37350, - "paragraph": { - "elements": [ - { - "endIndex": 37350, - "startIndex": 37319, - "textRun": { - "content": " _buildSearchBox(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37319 - }, - { - "endIndex": 37372, - "paragraph": { - "elements": [ - { - "endIndex": 37372, - "startIndex": 37350, - "textRun": { - "content": " Expanded(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37350 - }, - { - "endIndex": 37416, - "paragraph": { - "elements": [ - { - "endIndex": 37416, - "startIndex": 37372, - "textRun": { - "content": " child: SingleChildScrollView(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37372 - }, - { - "endIndex": 37461, - "paragraph": { - "elements": [ - { - "endIndex": 37461, - "startIndex": 37416, - "textRun": { - "content": " child: CupertinoListSection(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37416 - }, - { - "endIndex": 37493, - "paragraph": { - "elements": [ - { - "endIndex": 37493, - "startIndex": 37461, - "textRun": { - "content": " topMargin: 0,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37461 - }, - { - "endIndex": 37523, - "paragraph": { - "elements": [ - { - "endIndex": 37523, - "startIndex": 37493, - "textRun": { - "content": " children: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37493 - }, - { - "endIndex": 37572, - "paragraph": { - "elements": [ - { - "endIndex": 37572, - "startIndex": 37523, - "textRun": { - "content": " for (var product in results)\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37523 - }, - { - "endIndex": 37610, - "paragraph": { - "elements": [ - { - "endIndex": 37610, - "startIndex": 37572, - "textRun": { - "content": " ProductRowItem(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37572 - }, - { - "endIndex": 37652, - "paragraph": { - "elements": [ - { - "endIndex": 37652, - "startIndex": 37610, - "textRun": { - "content": " product: product,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37610 - }, - { - "endIndex": 37676, - "paragraph": { - "elements": [ - { - "endIndex": 37676, - "startIndex": 37652, - "textRun": { - "content": " )\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37652 - }, - { - "endIndex": 37697, - "paragraph": { - "elements": [ - { - "endIndex": 37697, - "startIndex": 37676, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37676 - }, - { - "endIndex": 37716, - "paragraph": { - "elements": [ - { - "endIndex": 37716, - "startIndex": 37697, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37697 - }, - { - "endIndex": 37733, - "paragraph": { - "elements": [ - { - "endIndex": 37733, - "startIndex": 37716, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37716 - }, - { - "endIndex": 37748, - "paragraph": { - "elements": [ - { - "endIndex": 37748, - "startIndex": 37733, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37733 - }, - { - "endIndex": 37761, - "paragraph": { - "elements": [ - { - "endIndex": 37761, - "startIndex": 37748, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37748 - }, - { - "endIndex": 37772, - "paragraph": { - "elements": [ - { - "endIndex": 37772, - "startIndex": 37761, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37761 - }, - { - "endIndex": 37781, - "paragraph": { - "elements": [ - { - "endIndex": 37781, - "startIndex": 37772, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37772 - }, - { - "endIndex": 37788, - "paragraph": { - "elements": [ - { - "endIndex": 37788, - "startIndex": 37781, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37781 - }, - { - "endIndex": 37792, - "paragraph": { - "elements": [ - { - "endIndex": 37792, - "startIndex": 37788, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37788 - }, - { - "endIndex": 37794, - "paragraph": { - "elements": [ - { - "endIndex": 37793, - "startIndex": 37792, - "textRun": { - "content": "}", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 37794, - "startIndex": 37793, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608, - "red": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37792 - } - ], - "endIndex": 37794, - "startIndex": 36931, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 37796, - "paragraph": { - "elements": [ - { - "endIndex": 37796, - "startIndex": 37795, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 37795 - }, - { - "endIndex": 37811, - "paragraph": { - "elements": [ - { - "endIndex": 37797, - "inlineObjectElement": { - "inlineObjectId": "kix.lhkox4puce01", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "startIndex": 37796 - }, - { - "endIndex": 37810, - "startIndex": 37797, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 37811, - "startIndex": 37810, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 37796 - }, - { - "endIndex": 37926, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 37926, - "startIndex": 37811, - "textRun": { - "content": "We are re-creating an iOS style search experience, but we have a lot of latitude to customize the user experience.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 37811 - }, - { - "endIndex": 38007, - "paragraph": { - "elements": [ - { - "endIndex": 37927, - "inlineObjectElement": { - "inlineObjectId": "kix.ftgpapune40x", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 37926 - }, - { - "endIndex": 37928, - "startIndex": 37927, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 37984, - "startIndex": 37928, - "textRun": { - "content": "Add supporting variables, functions, and methods to the ", - "textStyle": {} - } - }, - { - "endIndex": 37999, - "startIndex": 37984, - "textRun": { - "content": "_SearchTabState", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38007, - "startIndex": 37999, - "textRun": { - "content": " class.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 37926 - }, - { - "endIndex": 38102, - "paragraph": { - "elements": [ - { - "endIndex": 38021, - "startIndex": 38007, - "textRun": { - "content": "These include ", - "textStyle": {} - } - }, - { - "endIndex": 38032, - "startIndex": 38021, - "textRun": { - "content": "initState()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38034, - "startIndex": 38032, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 38043, - "startIndex": 38034, - "textRun": { - "content": "dispose()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38045, - "startIndex": 38043, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 38061, - "startIndex": 38045, - "textRun": { - "content": "_onTextChanged()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38067, - "startIndex": 38061, - "textRun": { - "content": ", and ", - "textStyle": {} - } - }, - { - "endIndex": 38084, - "startIndex": 38067, - "textRun": { - "content": "_buildSearchBox()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38101, - "startIndex": 38084, - "textRun": { - "content": ", as shown below:", - "textStyle": {} - } - }, - { - "endIndex": 38102, - "startIndex": 38101, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 38007 - }, - { - "endIndex": 38103, - "paragraph": { - "elements": [ - { - "endIndex": 38103, - "startIndex": 38102, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 38102 - }, - { - "endIndex": 38886, - "startIndex": 38103, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 38885, - "startIndex": 38104, - "tableCells": [ - { - "content": [ - { - "endIndex": 38155, - "paragraph": { - "elements": [ - { - "endIndex": 38155, - "startIndex": 38106, - "textRun": { - "content": "class _SearchTabState extends State {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38106 - }, - { - "endIndex": 38203, - "paragraph": { - "elements": [ - { - "endIndex": 38203, - "startIndex": 38155, - "textRun": { - "content": " late final TextEditingController _controller;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38155 - }, - { - "endIndex": 38238, - "paragraph": { - "elements": [ - { - "endIndex": 38238, - "startIndex": 38203, - "textRun": { - "content": " late final FocusNode _focusNode;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38203 - }, - { - "endIndex": 38260, - "paragraph": { - "elements": [ - { - "endIndex": 38260, - "startIndex": 38238, - "textRun": { - "content": " String _terms = '';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38238 - }, - { - "endIndex": 38261, - "paragraph": { - "elements": [ - { - "endIndex": 38261, - "startIndex": 38260, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38260 - }, - { - "endIndex": 38273, - "paragraph": { - "elements": [ - { - "endIndex": 38273, - "startIndex": 38261, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38261 - }, - { - "endIndex": 38294, - "paragraph": { - "elements": [ - { - "endIndex": 38294, - "startIndex": 38273, - "textRun": { - "content": " void initState() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38273 - }, - { - "endIndex": 38317, - "paragraph": { - "elements": [ - { - "endIndex": 38317, - "startIndex": 38294, - "textRun": { - "content": " super.initState();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38294 - }, - { - "endIndex": 38389, - "paragraph": { - "elements": [ - { - "endIndex": 38389, - "startIndex": 38317, - "textRun": { - "content": " _controller = TextEditingController()..addListener(_onTextChanged);\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38317 - }, - { - "endIndex": 38419, - "paragraph": { - "elements": [ - { - "endIndex": 38419, - "startIndex": 38389, - "textRun": { - "content": " _focusNode = FocusNode();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38389 - }, - { - "endIndex": 38423, - "paragraph": { - "elements": [ - { - "endIndex": 38423, - "startIndex": 38419, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38419 - }, - { - "endIndex": 38424, - "paragraph": { - "elements": [ - { - "endIndex": 38424, - "startIndex": 38423, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38423 - }, - { - "endIndex": 38436, - "paragraph": { - "elements": [ - { - "endIndex": 38436, - "startIndex": 38424, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38424 - }, - { - "endIndex": 38455, - "paragraph": { - "elements": [ - { - "endIndex": 38455, - "startIndex": 38436, - "textRun": { - "content": " void dispose() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38436 - }, - { - "endIndex": 38481, - "paragraph": { - "elements": [ - { - "endIndex": 38481, - "startIndex": 38455, - "textRun": { - "content": " _focusNode.dispose();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38455 - }, - { - "endIndex": 38508, - "paragraph": { - "elements": [ - { - "endIndex": 38508, - "startIndex": 38481, - "textRun": { - "content": " _controller.dispose();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38481 - }, - { - "endIndex": 38529, - "paragraph": { - "elements": [ - { - "endIndex": 38529, - "startIndex": 38508, - "textRun": { - "content": " super.dispose();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38508 - }, - { - "endIndex": 38533, - "paragraph": { - "elements": [ - { - "endIndex": 38533, - "startIndex": 38529, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38529 - }, - { - "endIndex": 38534, - "paragraph": { - "elements": [ - { - "endIndex": 38534, - "startIndex": 38533, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38533 - }, - { - "endIndex": 38560, - "paragraph": { - "elements": [ - { - "endIndex": 38560, - "startIndex": 38534, - "textRun": { - "content": " void _onTextChanged() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38534 - }, - { - "endIndex": 38578, - "paragraph": { - "elements": [ - { - "endIndex": 38578, - "startIndex": 38560, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38560 - }, - { - "endIndex": 38611, - "paragraph": { - "elements": [ - { - "endIndex": 38611, - "startIndex": 38578, - "textRun": { - "content": " _terms = _controller.text;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38578 - }, - { - "endIndex": 38619, - "paragraph": { - "elements": [ - { - "endIndex": 38619, - "startIndex": 38611, - "textRun": { - "content": " });\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38611 - }, - { - "endIndex": 38623, - "paragraph": { - "elements": [ - { - "endIndex": 38623, - "startIndex": 38619, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38619 - }, - { - "endIndex": 38624, - "paragraph": { - "elements": [ - { - "endIndex": 38624, - "startIndex": 38623, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38623 - }, - { - "endIndex": 38653, - "paragraph": { - "elements": [ - { - "endIndex": 38653, - "startIndex": 38624, - "textRun": { - "content": " Widget _buildSearchBox() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38624 - }, - { - "endIndex": 38673, - "paragraph": { - "elements": [ - { - "endIndex": 38673, - "startIndex": 38653, - "textRun": { - "content": " return Padding(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38653 - }, - { - "endIndex": 38713, - "paragraph": { - "elements": [ - { - "endIndex": 38713, - "startIndex": 38673, - "textRun": { - "content": " padding: const EdgeInsets.all(8),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38673 - }, - { - "endIndex": 38737, - "paragraph": { - "elements": [ - { - "endIndex": 38737, - "startIndex": 38713, - "textRun": { - "content": " child: SearchBar(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38713 - }, - { - "endIndex": 38770, - "paragraph": { - "elements": [ - { - "endIndex": 38770, - "startIndex": 38737, - "textRun": { - "content": " controller: _controller,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38737 - }, - { - "endIndex": 38801, - "paragraph": { - "elements": [ - { - "endIndex": 38801, - "startIndex": 38770, - "textRun": { - "content": " focusNode: _focusNode,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38770 - }, - { - "endIndex": 38810, - "paragraph": { - "elements": [ - { - "endIndex": 38810, - "startIndex": 38801, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38801 - }, - { - "endIndex": 38817, - "paragraph": { - "elements": [ - { - "endIndex": 38817, - "startIndex": 38810, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38810 - }, - { - "endIndex": 38835, - "paragraph": { - "elements": [ - { - "endIndex": 38820, - "startIndex": 38817, - "textRun": { - "content": " }", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38835, - "startIndex": 38820, - "textRun": { - "content": " // TO HERE\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38817 - }, - { - "endIndex": 38836, - "paragraph": { - "elements": [ - { - "endIndex": 38836, - "startIndex": 38835, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38835 - }, - { - "endIndex": 38847, - "paragraph": { - "elements": [ - { - "endIndex": 38837, - "startIndex": 38836, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38847, - "startIndex": 38837, - "textRun": { - "content": "@override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608, - "red": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38836 - }, - { - "endIndex": 38885, - "paragraph": { - "elements": [ - { - "endIndex": 38848, - "startIndex": 38847, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608, - "red": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38884, - "startIndex": 38848, - "textRun": { - "content": "Widget build(BuildContext context) {", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38885, - "startIndex": 38884, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38847 - } - ], - "endIndex": 38885, - "startIndex": 38105, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 38887, - "paragraph": { - "elements": [ - { - "endIndex": 38887, - "startIndex": 38886, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 38886 - }, - { - "endIndex": 38902, - "paragraph": { - "elements": [ - { - "endIndex": 38888, - "inlineObjectElement": { - "inlineObjectId": "kix.9684vj7h3vx5", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "startIndex": 38887 - }, - { - "endIndex": 38901, - "startIndex": 38888, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38902, - "startIndex": 38901, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 38887 - }, - { - "endIndex": 39194, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 38917, - "startIndex": 38902, - "textRun": { - "content": "_SearchTabState", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 39044, - "startIndex": 38917, - "textRun": { - "content": " is where we keep state specific to searching. In this implementation we store what the search terms are, and we hook into the ", - "textStyle": {} - } - }, - { - "endIndex": 39057, - "startIndex": 39044, - "textRun": { - "content": "AppStateModel", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 39193, - "startIndex": 39057, - "textRun": { - "content": " to fulfill the search capability. In the case where we implement an API back end, here is a good place to do network access for Search.", - "textStyle": {} - } - }, - { - "endIndex": 39194, - "startIndex": 39193, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 38902 - }, - { - "endIndex": 39219, - "paragraph": { - "elements": [ - { - "endIndex": 39195, - "inlineObjectElement": { - "inlineObjectId": "kix.cw6wh6moa590", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 39194 - }, - { - "endIndex": 39196, - "startIndex": 39195, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 39202, - "startIndex": 39196, - "textRun": { - "content": "Add a ", - "textStyle": {} - } - }, - { - "endIndex": 39211, - "startIndex": 39202, - "textRun": { - "content": "SearchBar", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 39219, - "startIndex": 39211, - "textRun": { - "content": " class.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 39194 - }, - { - "endIndex": 39368, - "paragraph": { - "elements": [ - { - "endIndex": 39238, - "startIndex": 39219, - "textRun": { - "content": "Create a new file, ", - "textStyle": {} - } - }, - { - "endIndex": 39257, - "startIndex": 39238, - "textRun": { - "content": "lib/search_bar.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 39263, - "startIndex": 39257, - "textRun": { - "content": ". The ", - "textStyle": {} - } - }, - { - "endIndex": 39272, - "startIndex": 39263, - "textRun": { - "content": "SearchBar", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 39368, - "startIndex": 39272, - "textRun": { - "content": " class handles the actual search in the product list. Seed the file with the following content:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 39219 - }, - { - "endIndex": 39388, - "paragraph": { - "elements": [ - { - "endIndex": 39387, - "startIndex": 39368, - "textRun": { - "content": "lib/search_bar.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_03/lib/search_bar.dart#L5" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 39388, - "startIndex": 39387, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7y7bmd1dcf0u", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 39368 - }, - { - "endIndex": 40749, - "startIndex": 39388, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 40748, - "startIndex": 39389, - "tableCells": [ - { - "content": [ - { - "endIndex": 39432, - "paragraph": { - "elements": [ - { - "endIndex": 39432, - "startIndex": 39391, - "textRun": { - "content": "import 'package:flutter/cupertino.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39391 - }, - { - "endIndex": 39454, - "paragraph": { - "elements": [ - { - "endIndex": 39454, - "startIndex": 39432, - "textRun": { - "content": "import 'styles.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39432 - }, - { - "endIndex": 39455, - "paragraph": { - "elements": [ - { - "endIndex": 39455, - "startIndex": 39454, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39454 - }, - { - "endIndex": 39497, - "paragraph": { - "elements": [ - { - "endIndex": 39497, - "startIndex": 39455, - "textRun": { - "content": "class SearchBar extends StatelessWidget {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39455 - }, - { - "endIndex": 39517, - "paragraph": { - "elements": [ - { - "endIndex": 39517, - "startIndex": 39497, - "textRun": { - "content": " const SearchBar({\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39497 - }, - { - "endIndex": 39547, - "paragraph": { - "elements": [ - { - "endIndex": 39547, - "startIndex": 39517, - "textRun": { - "content": " required this.controller,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39517 - }, - { - "endIndex": 39576, - "paragraph": { - "elements": [ - { - "endIndex": 39576, - "startIndex": 39547, - "textRun": { - "content": " required this.focusNode,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39547 - }, - { - "endIndex": 39591, - "paragraph": { - "elements": [ - { - "endIndex": 39591, - "startIndex": 39576, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39576 - }, - { - "endIndex": 39597, - "paragraph": { - "elements": [ - { - "endIndex": 39597, - "startIndex": 39591, - "textRun": { - "content": " });\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39591 - }, - { - "endIndex": 39598, - "paragraph": { - "elements": [ - { - "endIndex": 39598, - "startIndex": 39597, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39597 - }, - { - "endIndex": 39640, - "paragraph": { - "elements": [ - { - "endIndex": 39640, - "startIndex": 39598, - "textRun": { - "content": " final TextEditingController controller;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39598 - }, - { - "endIndex": 39669, - "paragraph": { - "elements": [ - { - "endIndex": 39669, - "startIndex": 39640, - "textRun": { - "content": " final FocusNode focusNode;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39640 - }, - { - "endIndex": 39670, - "paragraph": { - "elements": [ - { - "endIndex": 39670, - "startIndex": 39669, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39669 - }, - { - "endIndex": 39682, - "paragraph": { - "elements": [ - { - "endIndex": 39682, - "startIndex": 39670, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39670 - }, - { - "endIndex": 39721, - "paragraph": { - "elements": [ - { - "endIndex": 39721, - "startIndex": 39682, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39682 - }, - { - "endIndex": 39746, - "paragraph": { - "elements": [ - { - "endIndex": 39746, - "startIndex": 39721, - "textRun": { - "content": " return DecoratedBox(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39721 - }, - { - "endIndex": 39779, - "paragraph": { - "elements": [ - { - "endIndex": 39779, - "startIndex": 39746, - "textRun": { - "content": " decoration: BoxDecoration(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39746 - }, - { - "endIndex": 39819, - "paragraph": { - "elements": [ - { - "endIndex": 39819, - "startIndex": 39779, - "textRun": { - "content": " color: Styles.searchBackground,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39779 - }, - { - "endIndex": 39868, - "paragraph": { - "elements": [ - { - "endIndex": 39868, - "startIndex": 39819, - "textRun": { - "content": " borderRadius: BorderRadius.circular(10),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39819 - }, - { - "endIndex": 39877, - "paragraph": { - "elements": [ - { - "endIndex": 39877, - "startIndex": 39868, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39868 - }, - { - "endIndex": 39899, - "paragraph": { - "elements": [ - { - "endIndex": 39899, - "startIndex": 39877, - "textRun": { - "content": " child: Padding(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39877 - }, - { - "endIndex": 39944, - "paragraph": { - "elements": [ - { - "endIndex": 39944, - "startIndex": 39899, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39899 - }, - { - "endIndex": 39969, - "paragraph": { - "elements": [ - { - "endIndex": 39969, - "startIndex": 39944, - "textRun": { - "content": " horizontal: 4,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39944 - }, - { - "endIndex": 39992, - "paragraph": { - "elements": [ - { - "endIndex": 39992, - "startIndex": 39969, - "textRun": { - "content": " vertical: 8,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39969 - }, - { - "endIndex": 40003, - "paragraph": { - "elements": [ - { - "endIndex": 40003, - "startIndex": 39992, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39992 - }, - { - "endIndex": 40023, - "paragraph": { - "elements": [ - { - "endIndex": 40023, - "startIndex": 40003, - "textRun": { - "content": " child: Row(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40003 - }, - { - "endIndex": 40045, - "paragraph": { - "elements": [ - { - "endIndex": 40045, - "startIndex": 40023, - "textRun": { - "content": " children: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40023 - }, - { - "endIndex": 40069, - "paragraph": { - "elements": [ - { - "endIndex": 40069, - "startIndex": 40045, - "textRun": { - "content": " const Icon(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40045 - }, - { - "endIndex": 40106, - "paragraph": { - "elements": [ - { - "endIndex": 40106, - "startIndex": 40069, - "textRun": { - "content": " CupertinoIcons.search,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40069 - }, - { - "endIndex": 40151, - "paragraph": { - "elements": [ - { - "endIndex": 40151, - "startIndex": 40106, - "textRun": { - "content": " color: Styles.searchIconColor,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40106 - }, - { - "endIndex": 40166, - "paragraph": { - "elements": [ - { - "endIndex": 40166, - "startIndex": 40151, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40151 - }, - { - "endIndex": 40188, - "paragraph": { - "elements": [ - { - "endIndex": 40188, - "startIndex": 40166, - "textRun": { - "content": " Expanded(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40166 - }, - { - "endIndex": 40229, - "paragraph": { - "elements": [ - { - "endIndex": 40229, - "startIndex": 40188, - "textRun": { - "content": " child: CupertinoTextField(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40188 - }, - { - "endIndex": 40269, - "paragraph": { - "elements": [ - { - "endIndex": 40269, - "startIndex": 40229, - "textRun": { - "content": " controller: controller,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40229 - }, - { - "endIndex": 40307, - "paragraph": { - "elements": [ - { - "endIndex": 40307, - "startIndex": 40269, - "textRun": { - "content": " focusNode: focusNode,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40269 - }, - { - "endIndex": 40349, - "paragraph": { - "elements": [ - { - "endIndex": 40349, - "startIndex": 40307, - "textRun": { - "content": " style: Styles.searchText,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40307 - }, - { - "endIndex": 40404, - "paragraph": { - "elements": [ - { - "endIndex": 40404, - "startIndex": 40349, - "textRun": { - "content": " cursorColor: Styles.searchCursorColor,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40349 - }, - { - "endIndex": 40438, - "paragraph": { - "elements": [ - { - "endIndex": 40438, - "startIndex": 40404, - "textRun": { - "content": " decoration: null,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40404 - }, - { - "endIndex": 40455, - "paragraph": { - "elements": [ - { - "endIndex": 40455, - "startIndex": 40438, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40438 - }, - { - "endIndex": 40470, - "paragraph": { - "elements": [ - { - "endIndex": 40470, - "startIndex": 40455, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40455 - }, - { - "endIndex": 40499, - "paragraph": { - "elements": [ - { - "endIndex": 40499, - "startIndex": 40470, - "textRun": { - "content": " GestureDetector(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40470 - }, - { - "endIndex": 40538, - "paragraph": { - "elements": [ - { - "endIndex": 40538, - "startIndex": 40499, - "textRun": { - "content": " onTap: controller.clear,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40499 - }, - { - "endIndex": 40571, - "paragraph": { - "elements": [ - { - "endIndex": 40571, - "startIndex": 40538, - "textRun": { - "content": " child: const Icon(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40538 - }, - { - "endIndex": 40623, - "paragraph": { - "elements": [ - { - "endIndex": 40623, - "startIndex": 40571, - "textRun": { - "content": " CupertinoIcons.clear_thick_circled,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40571 - }, - { - "endIndex": 40670, - "paragraph": { - "elements": [ - { - "endIndex": 40670, - "startIndex": 40623, - "textRun": { - "content": " color: Styles.searchIconColor,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40623 - }, - { - "endIndex": 40687, - "paragraph": { - "elements": [ - { - "endIndex": 40687, - "startIndex": 40670, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40670 - }, - { - "endIndex": 40702, - "paragraph": { - "elements": [ - { - "endIndex": 40702, - "startIndex": 40687, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40687 - }, - { - "endIndex": 40715, - "paragraph": { - "elements": [ - { - "endIndex": 40715, - "startIndex": 40702, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40702 - }, - { - "endIndex": 40726, - "paragraph": { - "elements": [ - { - "endIndex": 40726, - "startIndex": 40715, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40715 - }, - { - "endIndex": 40735, - "paragraph": { - "elements": [ - { - "endIndex": 40735, - "startIndex": 40726, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40726 - }, - { - "endIndex": 40742, - "paragraph": { - "elements": [ - { - "endIndex": 40742, - "startIndex": 40735, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40735 - }, - { - "endIndex": 40746, - "paragraph": { - "elements": [ - { - "endIndex": 40746, - "startIndex": 40742, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40742 - }, - { - "endIndex": 40748, - "paragraph": { - "elements": [ - { - "endIndex": 40747, - "startIndex": 40746, - "textRun": { - "content": "}", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 40748, - "startIndex": 40747, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40746 - } - ], - "endIndex": 40748, - "startIndex": 39390, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 40750, - "paragraph": { - "elements": [ - { - "endIndex": 40750, - "startIndex": 40749, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 40749 - }, - { - "endIndex": 40765, - "paragraph": { - "elements": [ - { - "endIndex": 40751, - "inlineObjectElement": { - "inlineObjectId": "kix.6wob3a6aount", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "startIndex": 40750 - }, - { - "endIndex": 40764, - "startIndex": 40751, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 40765, - "startIndex": 40764, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 40750 - }, - { - "endIndex": 40971, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 40970, - "startIndex": 40765, - "textRun": { - "content": "Search interfaces on iOS are interesting in that there is reasonably wide variation in implementations. Flutter gives you the ability to tune the layout and color of the implementation quickly and easily. ", - "textStyle": {} - } - }, - { - "endIndex": 40971, - "startIndex": 40970, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 40765 - }, - { - "endIndex": 41117, - "paragraph": { - "elements": [ - { - "endIndex": 40972, - "inlineObjectElement": { - "inlineObjectId": "kix.dsb8234cu6ty", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 40971 - }, - { - "endIndex": 40973, - "startIndex": 40972, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 40984, - "startIndex": 40973, - "textRun": { - "content": "Run the app", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/test-drive" - }, - "underline": true - } - } - }, - { - "endIndex": 40997, - "startIndex": 40984, - "textRun": { - "content": ". Select the ", - "textStyle": {} - } - }, - { - "endIndex": 41003, - "startIndex": 40997, - "textRun": { - "content": "search", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 41117, - "startIndex": 41003, - "textRun": { - "content": " tab and enter “shirt” into the text field. You should see a list of 5 products that contain “shirt” in the name.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 40971 - }, - { - "endIndex": 41118, - "paragraph": { - "elements": [ - { - "endIndex": 41118, - "startIndex": 41117, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41117 - }, - { - "endIndex": 41120, - "paragraph": { - "elements": [ - { - "endIndex": 41119, - "inlineObjectElement": { - "inlineObjectId": "kix.ee0uc3z7q9e4", - "textStyle": {} - }, - "startIndex": 41118 - }, - { - "endIndex": 41120, - "startIndex": 41119, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41118 - }, - { - "endIndex": 41121, - "paragraph": { - "elements": [ - { - "endIndex": 41121, - "startIndex": 41120, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41120 - }, - { - "endIndex": 41131, - "paragraph": { - "elements": [ - { - "endIndex": 41131, - "startIndex": 41121, - "textRun": { - "content": "Problems?\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41121 - }, - { - "endIndex": 41254, - "paragraph": { - "elements": [ - { - "endIndex": 41254, - "startIndex": 41131, - "textRun": { - "content": "If your app is not running correctly, look for typos. If needed, use the code at the following links to get back on track.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41131 - }, - { - "endIndex": 41255, - "paragraph": { - "elements": [ - { - "endIndex": 41255, - "startIndex": 41254, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41254 - }, - { - "endIndex": 41275, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 41274, - "startIndex": 41255, - "textRun": { - "content": "lib/search_bar.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_03/lib/search_bar.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 41275, - "startIndex": 41274, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41255 - }, - { - "endIndex": 41295, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 41294, - "startIndex": 41275, - "textRun": { - "content": "lib/search_tab.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_03/lib/search_tab.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 41295, - "startIndex": 41294, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41275 - }, - { - "endIndex": 41296, - "paragraph": { - "elements": [ - { - "endIndex": 41296, - "startIndex": 41295, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41295 - }, - { - "endIndex": 41298, - "paragraph": { - "elements": [ - { - "endIndex": 41297, - "horizontalRule": { - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - }, - "startIndex": 41296 - }, - { - "endIndex": 41298, - "startIndex": 41297, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41296 - }, - { - "endIndex": 41316, - "paragraph": { - "elements": [ - { - "endIndex": 41315, - "startIndex": 41298, - "textRun": { - "content": "Add customer info", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 41316, - "startIndex": 41315, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.pupriqx4g35l", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41298 - }, - { - "endIndex": 41331, - "paragraph": { - "elements": [ - { - "endIndex": 41330, - "startIndex": 41316, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - }, - { - "endIndex": 41331, - "startIndex": 41330, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41316 - }, - { - "endIndex": 41332, - "paragraph": { - "elements": [ - { - "endIndex": 41332, - "startIndex": 41331, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41331 - }, - { - "endIndex": 41464, - "paragraph": { - "elements": [ - { - "endIndex": 41464, - "startIndex": 41332, - "textRun": { - "content": "In the next three steps, you’ll build out the shopping cart tab. In this first step, you’ll add fields for capturing customer info.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41332 - }, - { - "endIndex": 41465, - "paragraph": { - "elements": [ - { - "endIndex": 41465, - "startIndex": 41464, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41464 - }, - { - "endIndex": 41511, - "paragraph": { - "elements": [ - { - "endIndex": 41466, - "inlineObjectElement": { - "inlineObjectId": "kix.60vc4iv1jbjr", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 41465 - }, - { - "endIndex": 41467, - "startIndex": 41466, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 41478, - "startIndex": 41467, - "textRun": { - "content": "Update the ", - "textStyle": {} - } - }, - { - "endIndex": 41504, - "startIndex": 41478, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 41511, - "startIndex": 41504, - "textRun": { - "content": " file.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41465 - }, - { - "endIndex": 41678, - "paragraph": { - "elements": [ - { - "endIndex": 41593, - "startIndex": 41511, - "textRun": { - "content": "Add private methods for building the name, email, and location fields. Then add a ", - "textStyle": {} - } - }, - { - "endIndex": 41625, - "startIndex": 41593, - "textRun": { - "content": "_buildSliverChildBuildDelegate()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 41678, - "startIndex": 41625, - "textRun": { - "content": " method that builds out parts of the user interface.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41511 - }, - { - "endIndex": 41705, - "paragraph": { - "elements": [ - { - "endIndex": 41704, - "startIndex": 41678, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_04/lib/shopping_cart_tab.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 41705, - "startIndex": 41704, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.emjk1idkc237", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 41678 - }, - { - "endIndex": 44685, - "startIndex": 41705, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 44684, - "startIndex": 41706, - "tableCells": [ - { - "content": [ - { - "endIndex": 41769, - "paragraph": { - "elements": [ - { - "endIndex": 41714, - "startIndex": 41708, - "textRun": { - "content": "class ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 41736, - "startIndex": 41714, - "textRun": { - "content": "_ShoppingCartTabState ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 41744, - "startIndex": 41736, - "textRun": { - "content": "extends ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 41769, - "startIndex": 41744, - "textRun": { - "content": "State {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41708 - }, - { - "endIndex": 41805, - "paragraph": { - "elements": [ - { - "endIndex": 41805, - "startIndex": 41769, - "textRun": { - "content": " String? name; // ADD FROM HERE\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41769 - }, - { - "endIndex": 41822, - "paragraph": { - "elements": [ - { - "endIndex": 41822, - "startIndex": 41805, - "textRun": { - "content": " String? email;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41805 - }, - { - "endIndex": 41842, - "paragraph": { - "elements": [ - { - "endIndex": 41842, - "startIndex": 41822, - "textRun": { - "content": " String? location;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41822 - }, - { - "endIndex": 41857, - "paragraph": { - "elements": [ - { - "endIndex": 41857, - "startIndex": 41842, - "textRun": { - "content": " String? pin;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41842 - }, - { - "endIndex": 41895, - "paragraph": { - "elements": [ - { - "endIndex": 41895, - "startIndex": 41857, - "textRun": { - "content": " DateTime dateTime = DateTime.now();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41857 - }, - { - "endIndex": 41896, - "paragraph": { - "elements": [ - { - "endIndex": 41896, - "startIndex": 41895, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41895 - }, - { - "endIndex": 41925, - "paragraph": { - "elements": [ - { - "endIndex": 41925, - "startIndex": 41896, - "textRun": { - "content": " Widget _buildNameField() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41896 - }, - { - "endIndex": 41956, - "paragraph": { - "elements": [ - { - "endIndex": 41956, - "startIndex": 41925, - "textRun": { - "content": " return CupertinoTextField(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41925 - }, - { - "endIndex": 41982, - "paragraph": { - "elements": [ - { - "endIndex": 41982, - "startIndex": 41956, - "textRun": { - "content": " prefix: const Icon(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41956 - }, - { - "endIndex": 42019, - "paragraph": { - "elements": [ - { - "endIndex": 42019, - "startIndex": 41982, - "textRun": { - "content": " CupertinoIcons.person_solid,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41982 - }, - { - "endIndex": 42071, - "paragraph": { - "elements": [ - { - "endIndex": 42071, - "startIndex": 42019, - "textRun": { - "content": " color: CupertinoColors.lightBackgroundGray,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42019 - }, - { - "endIndex": 42089, - "paragraph": { - "elements": [ - { - "endIndex": 42089, - "startIndex": 42071, - "textRun": { - "content": " size: 28,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42071 - }, - { - "endIndex": 42098, - "paragraph": { - "elements": [ - { - "endIndex": 42098, - "startIndex": 42089, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42089 - }, - { - "endIndex": 42170, - "paragraph": { - "elements": [ - { - "endIndex": 42170, - "startIndex": 42098, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 12),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42098 - }, - { - "endIndex": 42224, - "paragraph": { - "elements": [ - { - "endIndex": 42224, - "startIndex": 42170, - "textRun": { - "content": " clearButtonMode: OverlayVisibilityMode.editing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42170 - }, - { - "endIndex": 42276, - "paragraph": { - "elements": [ - { - "endIndex": 42276, - "startIndex": 42224, - "textRun": { - "content": " textCapitalization: TextCapitalization.words,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42224 - }, - { - "endIndex": 42302, - "paragraph": { - "elements": [ - { - "endIndex": 42302, - "startIndex": 42276, - "textRun": { - "content": " autocorrect: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42276 - }, - { - "endIndex": 42341, - "paragraph": { - "elements": [ - { - "endIndex": 42341, - "startIndex": 42302, - "textRun": { - "content": " decoration: const BoxDecoration(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42302 - }, - { - "endIndex": 42365, - "paragraph": { - "elements": [ - { - "endIndex": 42365, - "startIndex": 42341, - "textRun": { - "content": " border: Border(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42341 - }, - { - "endIndex": 42395, - "paragraph": { - "elements": [ - { - "endIndex": 42395, - "startIndex": 42365, - "textRun": { - "content": " bottom: BorderSide(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42365 - }, - { - "endIndex": 42417, - "paragraph": { - "elements": [ - { - "endIndex": 42417, - "startIndex": 42395, - "textRun": { - "content": " width: 0,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42395 - }, - { - "endIndex": 42466, - "paragraph": { - "elements": [ - { - "endIndex": 42466, - "startIndex": 42417, - "textRun": { - "content": " color: CupertinoColors.inactiveGray,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42417 - }, - { - "endIndex": 42479, - "paragraph": { - "elements": [ - { - "endIndex": 42479, - "startIndex": 42466, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42466 - }, - { - "endIndex": 42490, - "paragraph": { - "elements": [ - { - "endIndex": 42490, - "startIndex": 42479, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42479 - }, - { - "endIndex": 42499, - "paragraph": { - "elements": [ - { - "endIndex": 42499, - "startIndex": 42490, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42490 - }, - { - "endIndex": 42526, - "paragraph": { - "elements": [ - { - "endIndex": 42526, - "startIndex": 42499, - "textRun": { - "content": " placeholder: 'Name',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42499 - }, - { - "endIndex": 42555, - "paragraph": { - "elements": [ - { - "endIndex": 42555, - "startIndex": 42526, - "textRun": { - "content": " onChanged: (newName) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42526 - }, - { - "endIndex": 42577, - "paragraph": { - "elements": [ - { - "endIndex": 42577, - "startIndex": 42555, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42555 - }, - { - "endIndex": 42603, - "paragraph": { - "elements": [ - { - "endIndex": 42603, - "startIndex": 42577, - "textRun": { - "content": " name = newName;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42577 - }, - { - "endIndex": 42615, - "paragraph": { - "elements": [ - { - "endIndex": 42615, - "startIndex": 42603, - "textRun": { - "content": " });\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42603 - }, - { - "endIndex": 42624, - "paragraph": { - "elements": [ - { - "endIndex": 42624, - "startIndex": 42615, - "textRun": { - "content": " },\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42615 - }, - { - "endIndex": 42631, - "paragraph": { - "elements": [ - { - "endIndex": 42631, - "startIndex": 42624, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42624 - }, - { - "endIndex": 42635, - "paragraph": { - "elements": [ - { - "endIndex": 42635, - "startIndex": 42631, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42631 - }, - { - "endIndex": 42636, - "paragraph": { - "elements": [ - { - "endIndex": 42636, - "startIndex": 42635, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42635 - }, - { - "endIndex": 42666, - "paragraph": { - "elements": [ - { - "endIndex": 42666, - "startIndex": 42636, - "textRun": { - "content": " Widget _buildEmailField() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42636 - }, - { - "endIndex": 42703, - "paragraph": { - "elements": [ - { - "endIndex": 42703, - "startIndex": 42666, - "textRun": { - "content": " return const CupertinoTextField(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42666 - }, - { - "endIndex": 42723, - "paragraph": { - "elements": [ - { - "endIndex": 42723, - "startIndex": 42703, - "textRun": { - "content": " prefix: Icon(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42703 - }, - { - "endIndex": 42758, - "paragraph": { - "elements": [ - { - "endIndex": 42758, - "startIndex": 42723, - "textRun": { - "content": " CupertinoIcons.mail_solid,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42723 - }, - { - "endIndex": 42810, - "paragraph": { - "elements": [ - { - "endIndex": 42810, - "startIndex": 42758, - "textRun": { - "content": " color: CupertinoColors.lightBackgroundGray,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42758 - }, - { - "endIndex": 42828, - "paragraph": { - "elements": [ - { - "endIndex": 42828, - "startIndex": 42810, - "textRun": { - "content": " size: 28,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42810 - }, - { - "endIndex": 42837, - "paragraph": { - "elements": [ - { - "endIndex": 42837, - "startIndex": 42828, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42828 - }, - { - "endIndex": 42903, - "paragraph": { - "elements": [ - { - "endIndex": 42903, - "startIndex": 42837, - "textRun": { - "content": " padding: EdgeInsets.symmetric(horizontal: 6, vertical: 12),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42837 - }, - { - "endIndex": 42957, - "paragraph": { - "elements": [ - { - "endIndex": 42957, - "startIndex": 42903, - "textRun": { - "content": " clearButtonMode: OverlayVisibilityMode.editing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42903 - }, - { - "endIndex": 43005, - "paragraph": { - "elements": [ - { - "endIndex": 43005, - "startIndex": 42957, - "textRun": { - "content": " keyboardType: TextInputType.emailAddress,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42957 - }, - { - "endIndex": 43031, - "paragraph": { - "elements": [ - { - "endIndex": 43031, - "startIndex": 43005, - "textRun": { - "content": " autocorrect: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43005 - }, - { - "endIndex": 43064, - "paragraph": { - "elements": [ - { - "endIndex": 43064, - "startIndex": 43031, - "textRun": { - "content": " decoration: BoxDecoration(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43031 - }, - { - "endIndex": 43088, - "paragraph": { - "elements": [ - { - "endIndex": 43088, - "startIndex": 43064, - "textRun": { - "content": " border: Border(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43064 - }, - { - "endIndex": 43118, - "paragraph": { - "elements": [ - { - "endIndex": 43118, - "startIndex": 43088, - "textRun": { - "content": " bottom: BorderSide(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43088 - }, - { - "endIndex": 43140, - "paragraph": { - "elements": [ - { - "endIndex": 43140, - "startIndex": 43118, - "textRun": { - "content": " width: 0,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43118 - }, - { - "endIndex": 43189, - "paragraph": { - "elements": [ - { - "endIndex": 43189, - "startIndex": 43140, - "textRun": { - "content": " color: CupertinoColors.inactiveGray,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43140 - }, - { - "endIndex": 43202, - "paragraph": { - "elements": [ - { - "endIndex": 43202, - "startIndex": 43189, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43189 - }, - { - "endIndex": 43213, - "paragraph": { - "elements": [ - { - "endIndex": 43213, - "startIndex": 43202, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43202 - }, - { - "endIndex": 43222, - "paragraph": { - "elements": [ - { - "endIndex": 43222, - "startIndex": 43213, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43213 - }, - { - "endIndex": 43250, - "paragraph": { - "elements": [ - { - "endIndex": 43250, - "startIndex": 43222, - "textRun": { - "content": " placeholder: 'Email',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43222 - }, - { - "endIndex": 43257, - "paragraph": { - "elements": [ - { - "endIndex": 43257, - "startIndex": 43250, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43250 - }, - { - "endIndex": 43261, - "paragraph": { - "elements": [ - { - "endIndex": 43261, - "startIndex": 43257, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43257 - }, - { - "endIndex": 43262, - "paragraph": { - "elements": [ - { - "endIndex": 43262, - "startIndex": 43261, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43261 - }, - { - "endIndex": 43295, - "paragraph": { - "elements": [ - { - "endIndex": 43295, - "startIndex": 43262, - "textRun": { - "content": " Widget _buildLocationField() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43262 - }, - { - "endIndex": 43332, - "paragraph": { - "elements": [ - { - "endIndex": 43332, - "startIndex": 43295, - "textRun": { - "content": " return const CupertinoTextField(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43295 - }, - { - "endIndex": 43352, - "paragraph": { - "elements": [ - { - "endIndex": 43352, - "startIndex": 43332, - "textRun": { - "content": " prefix: Icon(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43332 - }, - { - "endIndex": 43391, - "paragraph": { - "elements": [ - { - "endIndex": 43391, - "startIndex": 43352, - "textRun": { - "content": " CupertinoIcons.location_solid,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43352 - }, - { - "endIndex": 43443, - "paragraph": { - "elements": [ - { - "endIndex": 43443, - "startIndex": 43391, - "textRun": { - "content": " color: CupertinoColors.lightBackgroundGray,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43391 - }, - { - "endIndex": 43461, - "paragraph": { - "elements": [ - { - "endIndex": 43461, - "startIndex": 43443, - "textRun": { - "content": " size: 28,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43443 - }, - { - "endIndex": 43470, - "paragraph": { - "elements": [ - { - "endIndex": 43470, - "startIndex": 43461, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43461 - }, - { - "endIndex": 43536, - "paragraph": { - "elements": [ - { - "endIndex": 43536, - "startIndex": 43470, - "textRun": { - "content": " padding: EdgeInsets.symmetric(horizontal: 6, vertical: 12),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43470 - }, - { - "endIndex": 43590, - "paragraph": { - "elements": [ - { - "endIndex": 43590, - "startIndex": 43536, - "textRun": { - "content": " clearButtonMode: OverlayVisibilityMode.editing,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43536 - }, - { - "endIndex": 43642, - "paragraph": { - "elements": [ - { - "endIndex": 43642, - "startIndex": 43590, - "textRun": { - "content": " textCapitalization: TextCapitalization.words,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43590 - }, - { - "endIndex": 43675, - "paragraph": { - "elements": [ - { - "endIndex": 43675, - "startIndex": 43642, - "textRun": { - "content": " decoration: BoxDecoration(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43642 - }, - { - "endIndex": 43699, - "paragraph": { - "elements": [ - { - "endIndex": 43699, - "startIndex": 43675, - "textRun": { - "content": " border: Border(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43675 - }, - { - "endIndex": 43729, - "paragraph": { - "elements": [ - { - "endIndex": 43729, - "startIndex": 43699, - "textRun": { - "content": " bottom: BorderSide(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43699 - }, - { - "endIndex": 43751, - "paragraph": { - "elements": [ - { - "endIndex": 43751, - "startIndex": 43729, - "textRun": { - "content": " width: 0,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43729 - }, - { - "endIndex": 43800, - "paragraph": { - "elements": [ - { - "endIndex": 43800, - "startIndex": 43751, - "textRun": { - "content": " color: CupertinoColors.inactiveGray,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43751 - }, - { - "endIndex": 43813, - "paragraph": { - "elements": [ - { - "endIndex": 43813, - "startIndex": 43800, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43800 - }, - { - "endIndex": 43824, - "paragraph": { - "elements": [ - { - "endIndex": 43824, - "startIndex": 43813, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43813 - }, - { - "endIndex": 43833, - "paragraph": { - "elements": [ - { - "endIndex": 43833, - "startIndex": 43824, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43824 - }, - { - "endIndex": 43864, - "paragraph": { - "elements": [ - { - "endIndex": 43864, - "startIndex": 43833, - "textRun": { - "content": " placeholder: 'Location',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43833 - }, - { - "endIndex": 43871, - "paragraph": { - "elements": [ - { - "endIndex": 43871, - "startIndex": 43864, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43864 - }, - { - "endIndex": 43875, - "paragraph": { - "elements": [ - { - "endIndex": 43875, - "startIndex": 43871, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43871 - }, - { - "endIndex": 43876, - "paragraph": { - "elements": [ - { - "endIndex": 43876, - "startIndex": 43875, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43875 - }, - { - "endIndex": 43939, - "paragraph": { - "elements": [ - { - "endIndex": 43939, - "startIndex": 43876, - "textRun": { - "content": " SliverChildBuilderDelegate _buildSliverChildBuilderDelegate(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43876 - }, - { - "endIndex": 43968, - "paragraph": { - "elements": [ - { - "endIndex": 43968, - "startIndex": 43939, - "textRun": { - "content": " AppStateModel model) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43939 - }, - { - "endIndex": 44007, - "paragraph": { - "elements": [ - { - "endIndex": 44007, - "startIndex": 43968, - "textRun": { - "content": " return SliverChildBuilderDelegate(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43968 - }, - { - "endIndex": 44032, - "paragraph": { - "elements": [ - { - "endIndex": 44032, - "startIndex": 44007, - "textRun": { - "content": " (context, index) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44007 - }, - { - "endIndex": 44057, - "paragraph": { - "elements": [ - { - "endIndex": 44057, - "startIndex": 44032, - "textRun": { - "content": " switch (index) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44032 - }, - { - "endIndex": 44075, - "paragraph": { - "elements": [ - { - "endIndex": 44075, - "startIndex": 44057, - "textRun": { - "content": " case 0:\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44057 - }, - { - "endIndex": 44103, - "paragraph": { - "elements": [ - { - "endIndex": 44103, - "startIndex": 44075, - "textRun": { - "content": " return Padding(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44075 - }, - { - "endIndex": 44170, - "paragraph": { - "elements": [ - { - "endIndex": 44170, - "startIndex": 44103, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(horizontal: 16),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44103 - }, - { - "endIndex": 44210, - "paragraph": { - "elements": [ - { - "endIndex": 44210, - "startIndex": 44170, - "textRun": { - "content": " child: _buildNameField(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44170 - }, - { - "endIndex": 44225, - "paragraph": { - "elements": [ - { - "endIndex": 44225, - "startIndex": 44210, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44210 - }, - { - "endIndex": 44243, - "paragraph": { - "elements": [ - { - "endIndex": 44243, - "startIndex": 44225, - "textRun": { - "content": " case 1:\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44225 - }, - { - "endIndex": 44271, - "paragraph": { - "elements": [ - { - "endIndex": 44271, - "startIndex": 44243, - "textRun": { - "content": " return Padding(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44243 - }, - { - "endIndex": 44338, - "paragraph": { - "elements": [ - { - "endIndex": 44338, - "startIndex": 44271, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(horizontal: 16),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44271 - }, - { - "endIndex": 44379, - "paragraph": { - "elements": [ - { - "endIndex": 44379, - "startIndex": 44338, - "textRun": { - "content": " child: _buildEmailField(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44338 - }, - { - "endIndex": 44394, - "paragraph": { - "elements": [ - { - "endIndex": 44394, - "startIndex": 44379, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44379 - }, - { - "endIndex": 44412, - "paragraph": { - "elements": [ - { - "endIndex": 44412, - "startIndex": 44394, - "textRun": { - "content": " case 2:\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44394 - }, - { - "endIndex": 44440, - "paragraph": { - "elements": [ - { - "endIndex": 44440, - "startIndex": 44412, - "textRun": { - "content": " return Padding(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44412 - }, - { - "endIndex": 44507, - "paragraph": { - "elements": [ - { - "endIndex": 44507, - "startIndex": 44440, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(horizontal: 16),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44440 - }, - { - "endIndex": 44551, - "paragraph": { - "elements": [ - { - "endIndex": 44551, - "startIndex": 44507, - "textRun": { - "content": " child: _buildLocationField(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44507 - }, - { - "endIndex": 44566, - "paragraph": { - "elements": [ - { - "endIndex": 44566, - "startIndex": 44551, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44551 - }, - { - "endIndex": 44585, - "paragraph": { - "elements": [ - { - "endIndex": 44585, - "startIndex": 44566, - "textRun": { - "content": " default:\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44566 - }, - { - "endIndex": 44619, - "paragraph": { - "elements": [ - { - "endIndex": 44619, - "startIndex": 44585, - "textRun": { - "content": " // Do nothing. For now.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44585 - }, - { - "endIndex": 44629, - "paragraph": { - "elements": [ - { - "endIndex": 44629, - "startIndex": 44619, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44619 - }, - { - "endIndex": 44650, - "paragraph": { - "elements": [ - { - "endIndex": 44650, - "startIndex": 44629, - "textRun": { - "content": " return null;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44629 - }, - { - "endIndex": 44659, - "paragraph": { - "elements": [ - { - "endIndex": 44659, - "startIndex": 44650, - "textRun": { - "content": " },\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44650 - }, - { - "endIndex": 44666, - "paragraph": { - "elements": [ - { - "endIndex": 44666, - "startIndex": 44659, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44659 - }, - { - "endIndex": 44684, - "paragraph": { - "elements": [ - { - "endIndex": 44683, - "startIndex": 44666, - "textRun": { - "content": " } // TO HERE", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 44684, - "startIndex": 44683, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44666 - } - ], - "endIndex": 44684, - "startIndex": 41707, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 44686, - "paragraph": { - "elements": [ - { - "endIndex": 44686, - "startIndex": 44685, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 44685 - }, - { - "endIndex": 44701, - "paragraph": { - "elements": [ - { - "endIndex": 44687, - "inlineObjectElement": { - "inlineObjectId": "kix.duhiln6tt02p", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "startIndex": 44686 - }, - { - "endIndex": 44700, - "startIndex": 44687, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 44701, - "startIndex": 44700, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 44686 - }, - { - "endIndex": 45069, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 45068, - "startIndex": 44701, - "textRun": { - "content": "A key way that Flutter differs from more traditional User Interface design environments is that you have the full power of a proper programming language to introduce abstractions. You can add functions to group functionality, or turn it into a stand alone Widget if you want easy re-use. As the programmer, the choice in how to lay out functionality is yours to make.", - "textStyle": {} - } - }, - { - "endIndex": 45069, - "startIndex": 45068, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 44701 - }, - { - "endIndex": 45133, - "paragraph": { - "elements": [ - { - "endIndex": 45070, - "inlineObjectElement": { - "inlineObjectId": "kix.i5s7njpsipm", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 45069 - }, - { - "endIndex": 45071, - "startIndex": 45070, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 45082, - "startIndex": 45071, - "textRun": { - "content": "Update the ", - "textStyle": {} - } - }, - { - "endIndex": 45089, - "startIndex": 45082, - "textRun": { - "content": "build()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 45104, - "startIndex": 45089, - "textRun": { - "content": " method in the ", - "textStyle": {} - } - }, - { - "endIndex": 45125, - "startIndex": 45104, - "textRun": { - "content": "_ShoppingCartTabState", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 45133, - "startIndex": 45125, - "textRun": { - "content": " class.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 45069 - }, - { - "endIndex": 45210, - "paragraph": { - "elements": [ - { - "endIndex": 45139, - "startIndex": 45133, - "textRun": { - "content": "Add a ", - "textStyle": {} - } - }, - { - "endIndex": 45153, - "startIndex": 45139, - "textRun": { - "content": "SliverSafeArea", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 45169, - "startIndex": 45153, - "textRun": { - "content": " that calls the ", - "textStyle": {} - } - }, - { - "endIndex": 45201, - "startIndex": 45169, - "textRun": { - "content": "_buildSliverChildBuilderDelegate", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 45210, - "startIndex": 45201, - "textRun": { - "content": " method:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 45133 - }, - { - "endIndex": 45211, - "paragraph": { - "elements": [ - { - "endIndex": 45211, - "startIndex": 45210, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 45210 - }, - { - "endIndex": 45803, - "startIndex": 45211, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 45802, - "startIndex": 45212, - "tableCells": [ - { - "content": [ - { - "endIndex": 45226, - "paragraph": { - "elements": [ - { - "endIndex": 45226, - "startIndex": 45214, - "textRun": { - "content": " @override\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45214 - }, - { - "endIndex": 45265, - "paragraph": { - "elements": [ - { - "endIndex": 45265, - "startIndex": 45226, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45226 - }, - { - "endIndex": 45301, - "paragraph": { - "elements": [ - { - "endIndex": 45301, - "startIndex": 45265, - "textRun": { - "content": " return Consumer(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45265 - }, - { - "endIndex": 45342, - "paragraph": { - "elements": [ - { - "endIndex": 45342, - "startIndex": 45301, - "textRun": { - "content": " builder: (context, model, child) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45301 - }, - { - "endIndex": 45375, - "paragraph": { - "elements": [ - { - "endIndex": 45375, - "startIndex": 45342, - "textRun": { - "content": " return CustomScrollView(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45342 - }, - { - "endIndex": 45404, - "paragraph": { - "elements": [ - { - "endIndex": 45404, - "startIndex": 45375, - "textRun": { - "content": " slivers: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45375 - }, - { - "endIndex": 45452, - "paragraph": { - "elements": [ - { - "endIndex": 45452, - "startIndex": 45404, - "textRun": { - "content": " const CupertinoSliverNavigationBar(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45404 - }, - { - "endIndex": 45501, - "paragraph": { - "elements": [ - { - "endIndex": 45501, - "startIndex": 45452, - "textRun": { - "content": " largeTitle: Text('Shopping Cart'),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45452 - }, - { - "endIndex": 45516, - "paragraph": { - "elements": [ - { - "endIndex": 45516, - "startIndex": 45501, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45501 - }, - { - "endIndex": 45544, - "paragraph": { - "elements": [ - { - "endIndex": 45544, - "startIndex": 45516, - "textRun": { - "content": " SliverSafeArea(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45516 - }, - { - "endIndex": 45570, - "paragraph": { - "elements": [ - { - "endIndex": 45570, - "startIndex": 45544, - "textRun": { - "content": " top: false,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45544 - }, - { - "endIndex": 45624, - "paragraph": { - "elements": [ - { - "endIndex": 45624, - "startIndex": 45570, - "textRun": { - "content": " minimum: const EdgeInsets.only(top: 4),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45570 - }, - { - "endIndex": 45658, - "paragraph": { - "elements": [ - { - "endIndex": 45658, - "startIndex": 45624, - "textRun": { - "content": " sliver: SliverList(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45624 - }, - { - "endIndex": 45725, - "paragraph": { - "elements": [ - { - "endIndex": 45725, - "startIndex": 45658, - "textRun": { - "content": " delegate: _buildSliverChildBuilderDelegate(model),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45658 - }, - { - "endIndex": 45742, - "paragraph": { - "elements": [ - { - "endIndex": 45742, - "startIndex": 45725, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45725 - }, - { - "endIndex": 45756, - "paragraph": { - "elements": [ - { - "endIndex": 45756, - "startIndex": 45742, - "textRun": { - "content": " )\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45742 - }, - { - "endIndex": 45769, - "paragraph": { - "elements": [ - { - "endIndex": 45769, - "startIndex": 45756, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45756 - }, - { - "endIndex": 45780, - "paragraph": { - "elements": [ - { - "endIndex": 45780, - "startIndex": 45769, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45769 - }, - { - "endIndex": 45789, - "paragraph": { - "elements": [ - { - "endIndex": 45789, - "startIndex": 45780, - "textRun": { - "content": " },\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45780 - }, - { - "endIndex": 45796, - "paragraph": { - "elements": [ - { - "endIndex": 45796, - "startIndex": 45789, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45789 - }, - { - "endIndex": 45800, - "paragraph": { - "elements": [ - { - "endIndex": 45800, - "startIndex": 45796, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45796 - }, - { - "endIndex": 45802, - "paragraph": { - "elements": [ - { - "endIndex": 45802, - "startIndex": 45800, - "textRun": { - "content": "}\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45800 - } - ], - "endIndex": 45802, - "startIndex": 45213, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 45804, - "paragraph": { - "elements": [ - { - "endIndex": 45804, - "startIndex": 45803, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 45803 - }, - { - "endIndex": 45819, - "paragraph": { - "elements": [ - { - "endIndex": 45805, - "inlineObjectElement": { - "inlineObjectId": "kix.smfnrnfg4t13", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "startIndex": 45804 - }, - { - "endIndex": 45818, - "startIndex": 45805, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 45819, - "startIndex": 45818, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 45804 - }, - { - "endIndex": 45918, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 45917, - "startIndex": 45819, - "textRun": { - "content": "With all of the user interface defined in builder functions, the build method can be quite small. ", - "textStyle": {} - } - }, - { - "endIndex": 45918, - "startIndex": 45917, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 45819 - }, - { - "endIndex": 46032, - "paragraph": { - "elements": [ - { - "endIndex": 45919, - "inlineObjectElement": { - "inlineObjectId": "kix.rnnub6y4eqba", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 45918 - }, - { - "endIndex": 45920, - "startIndex": 45919, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 45931, - "startIndex": 45920, - "textRun": { - "content": "Run the app", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/test-drive" - }, - "underline": true - } - } - }, - { - "endIndex": 45944, - "startIndex": 45931, - "textRun": { - "content": ". Select the ", - "textStyle": {} - } - }, - { - "endIndex": 45957, - "startIndex": 45944, - "textRun": { - "content": "shopping cart", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 46032, - "startIndex": 45957, - "textRun": { - "content": " tab. You should see three text fields for gathering customer information:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 45918 - }, - { - "endIndex": 46033, - "paragraph": { - "elements": [ - { - "endIndex": 46033, - "startIndex": 46032, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46032 - }, - { - "endIndex": 46035, - "paragraph": { - "elements": [ - { - "endIndex": 46034, - "inlineObjectElement": { - "inlineObjectId": "kix.xlbv2cujsv5x", - "textStyle": {} - }, - "startIndex": 46033 - }, - { - "endIndex": 46035, - "startIndex": 46034, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46033 - }, - { - "endIndex": 46036, - "paragraph": { - "elements": [ - { - "endIndex": 46036, - "startIndex": 46035, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46035 - }, - { - "endIndex": 46046, - "paragraph": { - "elements": [ - { - "endIndex": 46046, - "startIndex": 46036, - "textRun": { - "content": "Problems?\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46036 - }, - { - "endIndex": 46168, - "paragraph": { - "elements": [ - { - "endIndex": 46168, - "startIndex": 46046, - "textRun": { - "content": "If your app is not running correctly, look for typos. If needed, use the code at the following link to get back on track.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46046 - }, - { - "endIndex": 46195, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 46194, - "startIndex": 46168, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_04/lib/shopping_cart_tab.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46195, - "startIndex": 46194, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 46168 - }, - { - "endIndex": 46197, - "paragraph": { - "elements": [ - { - "endIndex": 46196, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 46195 - }, - { - "endIndex": 46197, - "startIndex": 46196, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46195 - }, - { - "endIndex": 46213, - "paragraph": { - "elements": [ - { - "endIndex": 46212, - "startIndex": 46197, - "textRun": { - "content": "Add date picker", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 46213, - "startIndex": 46212, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.e5tzms3h5q5z", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46197 - }, - { - "endIndex": 46228, - "paragraph": { - "elements": [ - { - "endIndex": 46227, - "startIndex": 46213, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - }, - { - "endIndex": 46228, - "startIndex": 46227, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46213 - }, - { - "endIndex": 46229, - "paragraph": { - "elements": [ - { - "endIndex": 46229, - "startIndex": 46228, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46228 - }, - { - "endIndex": 46340, - "paragraph": { - "elements": [ - { - "endIndex": 46249, - "startIndex": 46229, - "textRun": { - "content": "In this step, add a ", - "textStyle": {} - } - }, - { - "endIndex": 46268, - "startIndex": 46249, - "textRun": { - "content": "CupertinoDatePicker", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46340, - "startIndex": 46268, - "textRun": { - "content": " to the shopping cart so the user can select a preferred shipping date.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46229 - }, - { - "endIndex": 46341, - "paragraph": { - "elements": [ - { - "endIndex": 46341, - "startIndex": 46340, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46340 - }, - { - "endIndex": 46398, - "paragraph": { - "elements": [ - { - "endIndex": 46342, - "inlineObjectElement": { - "inlineObjectId": "kix.xfdmbhvqthi7", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 46341 - }, - { - "endIndex": 46361, - "startIndex": 46342, - "textRun": { - "content": " Add imports and a ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 46366, - "startIndex": 46361, - "textRun": { - "content": "const", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46370, - "startIndex": 46366, - "textRun": { - "content": " to ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 46396, - "startIndex": 46370, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46398, - "startIndex": 46396, - "textRun": { - "content": ".\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46341 - }, - { - "endIndex": 46427, - "paragraph": { - "elements": [ - { - "endIndex": 46427, - "startIndex": 46398, - "textRun": { - "content": "Add the new lines, as shown:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46398 - }, - { - "endIndex": 46454, - "paragraph": { - "elements": [ - { - "endIndex": 46453, - "startIndex": 46427, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_05/lib/shopping_cart_tab.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 46454, - "startIndex": 46453, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.fz4gk3fom4pq", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46427 - }, - { - "endIndex": 46732, - "startIndex": 46454, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 46731, - "startIndex": 46455, - "tableCells": [ - { - "content": [ - { - "endIndex": 46498, - "paragraph": { - "elements": [ - { - "endIndex": 46464, - "startIndex": 46457, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46496, - "startIndex": 46464, - "textRun": { - "content": "'package:flutter/cupertino.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46498, - "startIndex": 46496, - "textRun": { - "content": ";\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46457 - }, - { - "endIndex": 46549, - "paragraph": { - "elements": [ - { - "endIndex": 46505, - "startIndex": 46498, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46529, - "startIndex": 46505, - "textRun": { - "content": "'package:intl/intl.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46549, - "startIndex": 46529, - "textRun": { - "content": "; // NEW\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46498 - }, - { - "endIndex": 46590, - "paragraph": { - "elements": [ - { - "endIndex": 46590, - "startIndex": 46549, - "textRun": { - "content": "import 'package:provider/provider.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46549 - }, - { - "endIndex": 46591, - "paragraph": { - "elements": [ - { - "endIndex": 46591, - "startIndex": 46590, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46590 - }, - { - "endIndex": 46628, - "paragraph": { - "elements": [ - { - "endIndex": 46598, - "startIndex": 46591, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46626, - "startIndex": 46598, - "textRun": { - "content": "'model/app_state_model.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46628, - "startIndex": 46626, - "textRun": { - "content": ";\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46591 - }, - { - "endIndex": 46679, - "paragraph": { - "elements": [ - { - "endIndex": 46635, - "startIndex": 46628, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46648, - "startIndex": 46635, - "textRun": { - "content": "'styles.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46679, - "startIndex": 46648, - "textRun": { - "content": "; // NEW\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46628 - }, - { - "endIndex": 46680, - "paragraph": { - "elements": [ - { - "endIndex": 46680, - "startIndex": 46679, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46679 - }, - { - "endIndex": 46731, - "paragraph": { - "elements": [ - { - "endIndex": 46686, - "startIndex": 46680, - "textRun": { - "content": "const ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46718, - "startIndex": 46686, - "textRun": { - "content": "double _kDateTimePickerHeight = ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46721, - "startIndex": 46718, - "textRun": { - "content": "216", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46730, - "startIndex": 46721, - "textRun": { - "content": "; // NEW", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46731, - "startIndex": 46730, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46680 - } - ], - "endIndex": 46731, - "startIndex": 46456, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 46733, - "paragraph": { - "elements": [ - { - "endIndex": 46733, - "startIndex": 46732, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46732 - }, - { - "endIndex": 46808, - "paragraph": { - "elements": [ - { - "endIndex": 46734, - "inlineObjectElement": { - "inlineObjectId": "kix.adsqpxfwyykw", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 46733 - }, - { - "endIndex": 46741, - "startIndex": 46734, - "textRun": { - "content": " Add a ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 46766, - "startIndex": 46741, - "textRun": { - "content": "_buildDateAndTimePicker()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46783, - "startIndex": 46766, - "textRun": { - "content": " function to the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 46799, - "startIndex": 46783, - "textRun": { - "content": "_ShoppingCartTab", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46808, - "startIndex": 46799, - "textRun": { - "content": " widget.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46733 - }, - { - "endIndex": 46838, - "paragraph": { - "elements": [ - { - "endIndex": 46838, - "startIndex": 46808, - "textRun": { - "content": "Add the function, as follows:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46808 - }, - { - "endIndex": 46839, - "paragraph": { - "elements": [ - { - "endIndex": 46839, - "startIndex": 46838, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 46838 - }, - { - "endIndex": 48273, - "startIndex": 46839, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 48272, - "startIndex": 46840, - "tableCells": [ - { - "content": [ - { - "endIndex": 46903, - "paragraph": { - "elements": [ - { - "endIndex": 46848, - "startIndex": 46842, - "textRun": { - "content": "class ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46870, - "startIndex": 46848, - "textRun": { - "content": "_ShoppingCartTabState ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46878, - "startIndex": 46870, - "textRun": { - "content": "extends ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46903, - "startIndex": 46878, - "textRun": { - "content": "State {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46842 - }, - { - "endIndex": 46910, - "paragraph": { - "elements": [ - { - "endIndex": 46910, - "startIndex": 46903, - "textRun": { - "content": " // …\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46903 - }, - { - "endIndex": 46911, - "paragraph": { - "elements": [ - { - "endIndex": 46911, - "startIndex": 46910, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46910 - }, - { - "endIndex": 46930, - "paragraph": { - "elements": [ - { - "endIndex": 46930, - "startIndex": 46911, - "textRun": { - "content": " // NEW FROM HERE\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 46911 - }, - { - "endIndex": 46988, - "paragraph": { - "elements": [ - { - "endIndex": 46988, - "startIndex": 46930, - "textRun": { - "content": " Widget _buildDateAndTimePicker(BuildContext context) { \n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46930 - }, - { - "endIndex": 47007, - "paragraph": { - "elements": [ - { - "endIndex": 47007, - "startIndex": 46988, - "textRun": { - "content": " return Column(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46988 - }, - { - "endIndex": 47033, - "paragraph": { - "elements": [ - { - "endIndex": 47033, - "startIndex": 47007, - "textRun": { - "content": " children: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47007 - }, - { - "endIndex": 47046, - "paragraph": { - "elements": [ - { - "endIndex": 47046, - "startIndex": 47033, - "textRun": { - "content": " Row(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47033 - }, - { - "endIndex": 47107, - "paragraph": { - "elements": [ - { - "endIndex": 47107, - "startIndex": 47046, - "textRun": { - "content": " mainAxisAlignment: MainAxisAlignment.spaceBetween,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47046 - }, - { - "endIndex": 47137, - "paragraph": { - "elements": [ - { - "endIndex": 47137, - "startIndex": 47107, - "textRun": { - "content": " children: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47107 - }, - { - "endIndex": 47154, - "paragraph": { - "elements": [ - { - "endIndex": 47154, - "startIndex": 47137, - "textRun": { - "content": " Row(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47137 - }, - { - "endIndex": 47212, - "paragraph": { - "elements": [ - { - "endIndex": 47212, - "startIndex": 47154, - "textRun": { - "content": " mainAxisAlignment: MainAxisAlignment.start,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47154 - }, - { - "endIndex": 47252, - "paragraph": { - "elements": [ - { - "endIndex": 47252, - "startIndex": 47212, - "textRun": { - "content": " children: const [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47212 - }, - { - "endIndex": 47274, - "paragraph": { - "elements": [ - { - "endIndex": 47274, - "startIndex": 47252, - "textRun": { - "content": " Icon(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47252 - }, - { - "endIndex": 47314, - "paragraph": { - "elements": [ - { - "endIndex": 47314, - "startIndex": 47274, - "textRun": { - "content": " CupertinoIcons.clock,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47274 - }, - { - "endIndex": 47376, - "paragraph": { - "elements": [ - { - "endIndex": 47376, - "startIndex": 47314, - "textRun": { - "content": " color: CupertinoColors.lightBackgroundGray,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47314 - }, - { - "endIndex": 47404, - "paragraph": { - "elements": [ - { - "endIndex": 47404, - "startIndex": 47376, - "textRun": { - "content": " size: 28,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47376 - }, - { - "endIndex": 47423, - "paragraph": { - "elements": [ - { - "endIndex": 47423, - "startIndex": 47404, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47404 - }, - { - "endIndex": 47459, - "paragraph": { - "elements": [ - { - "endIndex": 47459, - "startIndex": 47423, - "textRun": { - "content": " SizedBox(width: 6),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47423 - }, - { - "endIndex": 47481, - "paragraph": { - "elements": [ - { - "endIndex": 47481, - "startIndex": 47459, - "textRun": { - "content": " Text(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47459 - }, - { - "endIndex": 47516, - "paragraph": { - "elements": [ - { - "endIndex": 47516, - "startIndex": 47481, - "textRun": { - "content": " 'Delivery time',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47481 - }, - { - "endIndex": 47567, - "paragraph": { - "elements": [ - { - "endIndex": 47567, - "startIndex": 47516, - "textRun": { - "content": " style: Styles.deliveryTimeLabel,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47516 - }, - { - "endIndex": 47586, - "paragraph": { - "elements": [ - { - "endIndex": 47586, - "startIndex": 47567, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47567 - }, - { - "endIndex": 47603, - "paragraph": { - "elements": [ - { - "endIndex": 47603, - "startIndex": 47586, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47586 - }, - { - "endIndex": 47618, - "paragraph": { - "elements": [ - { - "endIndex": 47618, - "startIndex": 47603, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47603 - }, - { - "endIndex": 47636, - "paragraph": { - "elements": [ - { - "endIndex": 47636, - "startIndex": 47618, - "textRun": { - "content": " Text(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47618 - }, - { - "endIndex": 47696, - "paragraph": { - "elements": [ - { - "endIndex": 47696, - "startIndex": 47636, - "textRun": { - "content": " DateFormat.yMMMd().add_jm().format(dateTime),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47636 - }, - { - "endIndex": 47738, - "paragraph": { - "elements": [ - { - "endIndex": 47738, - "startIndex": 47696, - "textRun": { - "content": " style: Styles.deliveryTime,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47696 - }, - { - "endIndex": 47753, - "paragraph": { - "elements": [ - { - "endIndex": 47753, - "startIndex": 47738, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47738 - }, - { - "endIndex": 47766, - "paragraph": { - "elements": [ - { - "endIndex": 47766, - "startIndex": 47753, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47753 - }, - { - "endIndex": 47777, - "paragraph": { - "elements": [ - { - "endIndex": 47777, - "startIndex": 47766, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47766 - }, - { - "endIndex": 47795, - "paragraph": { - "elements": [ - { - "endIndex": 47795, - "startIndex": 47777, - "textRun": { - "content": " SizedBox(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47777 - }, - { - "endIndex": 47837, - "paragraph": { - "elements": [ - { - "endIndex": 47837, - "startIndex": 47795, - "textRun": { - "content": " height: _kDateTimePickerHeight,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47795 - }, - { - "endIndex": 47875, - "paragraph": { - "elements": [ - { - "endIndex": 47875, - "startIndex": 47837, - "textRun": { - "content": " child: CupertinoDatePicker(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47837 - }, - { - "endIndex": 47930, - "paragraph": { - "elements": [ - { - "endIndex": 47930, - "startIndex": 47875, - "textRun": { - "content": " mode: CupertinoDatePickerMode.dateAndTime,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47875 - }, - { - "endIndex": 47969, - "paragraph": { - "elements": [ - { - "endIndex": 47969, - "startIndex": 47930, - "textRun": { - "content": " initialDateTime: dateTime,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47930 - }, - { - "endIndex": 48016, - "paragraph": { - "elements": [ - { - "endIndex": 48016, - "startIndex": 47969, - "textRun": { - "content": " onDateTimeChanged: (newDateTime) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47969 - }, - { - "endIndex": 48044, - "paragraph": { - "elements": [ - { - "endIndex": 48044, - "startIndex": 48016, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48016 - }, - { - "endIndex": 48084, - "paragraph": { - "elements": [ - { - "endIndex": 48084, - "startIndex": 48044, - "textRun": { - "content": " dateTime = newDateTime;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48044 - }, - { - "endIndex": 48102, - "paragraph": { - "elements": [ - { - "endIndex": 48102, - "startIndex": 48084, - "textRun": { - "content": " });\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48084 - }, - { - "endIndex": 48117, - "paragraph": { - "elements": [ - { - "endIndex": 48117, - "startIndex": 48102, - "textRun": { - "content": " },\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48102 - }, - { - "endIndex": 48130, - "paragraph": { - "elements": [ - { - "endIndex": 48130, - "startIndex": 48117, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48117 - }, - { - "endIndex": 48141, - "paragraph": { - "elements": [ - { - "endIndex": 48141, - "startIndex": 48130, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48130 - }, - { - "endIndex": 48150, - "paragraph": { - "elements": [ - { - "endIndex": 48150, - "startIndex": 48141, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48141 - }, - { - "endIndex": 48157, - "paragraph": { - "elements": [ - { - "endIndex": 48157, - "startIndex": 48150, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48150 - }, - { - "endIndex": 48175, - "paragraph": { - "elements": [ - { - "endIndex": 48175, - "startIndex": 48157, - "textRun": { - "content": " } // TO HERE\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48157 - }, - { - "endIndex": 48176, - "paragraph": { - "elements": [ - { - "endIndex": 48176, - "startIndex": 48175, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48175 - }, - { - "endIndex": 48237, - "paragraph": { - "elements": [ - { - "endIndex": 48237, - "startIndex": 48176, - "textRun": { - "content": "SliverChildBuilderDelegate _buildSliverChildBuilderDelegate(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48176 - }, - { - "endIndex": 48263, - "paragraph": { - "elements": [ - { - "endIndex": 48263, - "startIndex": 48237, - "textRun": { - "content": " AppStateModel model) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48237 - }, - { - "endIndex": 48272, - "paragraph": { - "elements": [ - { - "endIndex": 48271, - "startIndex": 48263, - "textRun": { - "content": " // ...", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 48272, - "startIndex": 48271, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48263 - } - ], - "endIndex": 48272, - "startIndex": 46841, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 48274, - "paragraph": { - "elements": [ - { - "endIndex": 48274, - "startIndex": 48273, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 48273 - }, - { - "endIndex": 48289, - "paragraph": { - "elements": [ - { - "endIndex": 48275, - "inlineObjectElement": { - "inlineObjectId": "kix.gpbh9pdij9v", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - }, - "startIndex": 48274 - }, - { - "endIndex": 48288, - "startIndex": 48275, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 48289, - "startIndex": 48288, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 48274 - }, - { - "endIndex": 48397, - "paragraph": { - "bullet": { - "listId": "kix.59wj3jdmokdt", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 48298, - "startIndex": 48289, - "textRun": { - "content": "Adding a ", - "textStyle": {} - } - }, - { - "endIndex": 48317, - "startIndex": 48298, - "textRun": { - "content": "CupertinoDatePicker", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 48396, - "startIndex": 48317, - "textRun": { - "content": " is quick to do, and gives iOS users an intuitive way to enter dates and times.", - "textStyle": {} - } - }, - { - "endIndex": 48397, - "startIndex": 48396, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 48289 - }, - { - "endIndex": 48519, - "paragraph": { - "elements": [ - { - "endIndex": 48398, - "inlineObjectElement": { - "inlineObjectId": "kix.9hrohuzfso83", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 48397 - }, - { - "endIndex": 48448, - "startIndex": 48398, - "textRun": { - "content": " Add a call to build the date and time UI, to the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 48480, - "startIndex": 48448, - "textRun": { - "content": "_buildSliverChildBuilderDelegate", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 48519, - "startIndex": 48480, - "textRun": { - "content": " function. Add the new code, as shown:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 48397 - }, - { - "endIndex": 48520, - "paragraph": { - "elements": [ - { - "endIndex": 48520, - "startIndex": 48519, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 48519 - }, - { - "endIndex": 49560, - "startIndex": 48520, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 49559, - "startIndex": 48521, - "tableCells": [ - { - "content": [ - { - "endIndex": 48586, - "paragraph": { - "elements": [ - { - "endIndex": 48586, - "startIndex": 48523, - "textRun": { - "content": " SliverChildBuilderDelegate _buildSliverChildBuilderDelegate(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48523 - }, - { - "endIndex": 48615, - "paragraph": { - "elements": [ - { - "endIndex": 48615, - "startIndex": 48586, - "textRun": { - "content": " AppStateModel model) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48586 - }, - { - "endIndex": 48654, - "paragraph": { - "elements": [ - { - "endIndex": 48654, - "startIndex": 48615, - "textRun": { - "content": " return SliverChildBuilderDelegate(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48615 - }, - { - "endIndex": 48679, - "paragraph": { - "elements": [ - { - "endIndex": 48679, - "startIndex": 48654, - "textRun": { - "content": " (context, index) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48654 - }, - { - "endIndex": 48704, - "paragraph": { - "elements": [ - { - "endIndex": 48704, - "startIndex": 48679, - "textRun": { - "content": " switch (index) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48679 - }, - { - "endIndex": 48722, - "paragraph": { - "elements": [ - { - "endIndex": 48722, - "startIndex": 48704, - "textRun": { - "content": " case 0:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48704 - }, - { - "endIndex": 48750, - "paragraph": { - "elements": [ - { - "endIndex": 48750, - "startIndex": 48722, - "textRun": { - "content": " return Padding(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48722 - }, - { - "endIndex": 48817, - "paragraph": { - "elements": [ - { - "endIndex": 48817, - "startIndex": 48750, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(horizontal: 16),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48750 - }, - { - "endIndex": 48857, - "paragraph": { - "elements": [ - { - "endIndex": 48857, - "startIndex": 48817, - "textRun": { - "content": " child: _buildNameField(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48817 - }, - { - "endIndex": 48872, - "paragraph": { - "elements": [ - { - "endIndex": 48872, - "startIndex": 48857, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48857 - }, - { - "endIndex": 48890, - "paragraph": { - "elements": [ - { - "endIndex": 48890, - "startIndex": 48872, - "textRun": { - "content": " case 1:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48872 - }, - { - "endIndex": 48918, - "paragraph": { - "elements": [ - { - "endIndex": 48918, - "startIndex": 48890, - "textRun": { - "content": " return Padding(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48890 - }, - { - "endIndex": 48985, - "paragraph": { - "elements": [ - { - "endIndex": 48985, - "startIndex": 48918, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(horizontal: 16),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48918 - }, - { - "endIndex": 49026, - "paragraph": { - "elements": [ - { - "endIndex": 49026, - "startIndex": 48985, - "textRun": { - "content": " child: _buildEmailField(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48985 - }, - { - "endIndex": 49041, - "paragraph": { - "elements": [ - { - "endIndex": 49041, - "startIndex": 49026, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49026 - }, - { - "endIndex": 49059, - "paragraph": { - "elements": [ - { - "endIndex": 49059, - "startIndex": 49041, - "textRun": { - "content": " case 2:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49041 - }, - { - "endIndex": 49087, - "paragraph": { - "elements": [ - { - "endIndex": 49087, - "startIndex": 49059, - "textRun": { - "content": " return Padding(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49059 - }, - { - "endIndex": 49154, - "paragraph": { - "elements": [ - { - "endIndex": 49154, - "startIndex": 49087, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(horizontal: 16),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49087 - }, - { - "endIndex": 49198, - "paragraph": { - "elements": [ - { - "endIndex": 49198, - "startIndex": 49154, - "textRun": { - "content": " child: _buildLocationField(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49154 - }, - { - "endIndex": 49213, - "paragraph": { - "elements": [ - { - "endIndex": 49213, - "startIndex": 49198, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49198 - }, - { - "endIndex": 49263, - "paragraph": { - "elements": [ - { - "endIndex": 49263, - "startIndex": 49213, - "textRun": { - "content": " case 3: // ADD FROM HERE\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49213 - }, - { - "endIndex": 49291, - "paragraph": { - "elements": [ - { - "endIndex": 49291, - "startIndex": 49263, - "textRun": { - "content": " return Padding(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49263 - }, - { - "endIndex": 49356, - "paragraph": { - "elements": [ - { - "endIndex": 49356, - "startIndex": 49291, - "textRun": { - "content": " padding: const EdgeInsets.fromLTRB(16, 8, 16, 24),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49291 - }, - { - "endIndex": 49411, - "paragraph": { - "elements": [ - { - "endIndex": 49411, - "startIndex": 49356, - "textRun": { - "content": " child: _buildDateAndTimePicker(context),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49356 - }, - { - "endIndex": 49455, - "paragraph": { - "elements": [ - { - "endIndex": 49455, - "startIndex": 49411, - "textRun": { - "content": " ); // TO HERE\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49411 - }, - { - "endIndex": 49474, - "paragraph": { - "elements": [ - { - "endIndex": 49474, - "startIndex": 49455, - "textRun": { - "content": " default:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49455 - }, - { - "endIndex": 49508, - "paragraph": { - "elements": [ - { - "endIndex": 49508, - "startIndex": 49474, - "textRun": { - "content": " // Do nothing. For now.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49474 - }, - { - "endIndex": 49518, - "paragraph": { - "elements": [ - { - "endIndex": 49518, - "startIndex": 49508, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49508 - }, - { - "endIndex": 49539, - "paragraph": { - "elements": [ - { - "endIndex": 49539, - "startIndex": 49518, - "textRun": { - "content": " return null;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49518 - }, - { - "endIndex": 49548, - "paragraph": { - "elements": [ - { - "endIndex": 49548, - "startIndex": 49539, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49539 - }, - { - "endIndex": 49555, - "paragraph": { - "elements": [ - { - "endIndex": 49555, - "startIndex": 49548, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49548 - }, - { - "endIndex": 49559, - "paragraph": { - "elements": [ - { - "endIndex": 49559, - "startIndex": 49555, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49555 - } - ], - "endIndex": 49559, - "startIndex": 48522, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 49561, - "paragraph": { - "elements": [ - { - "endIndex": 49561, - "startIndex": 49560, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 49560 - }, - { - "endIndex": 49701, - "paragraph": { - "elements": [ - { - "endIndex": 49562, - "inlineObjectElement": { - "inlineObjectId": "kix.mdchhpwp6uh2", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 49561 - }, - { - "endIndex": 49563, - "startIndex": 49562, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 49574, - "startIndex": 49563, - "textRun": { - "content": "Run the app", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/test-drive" - }, - "underline": true - } - } - }, - { - "endIndex": 49587, - "startIndex": 49574, - "textRun": { - "content": ". Select the ", - "textStyle": {} - } - }, - { - "endIndex": 49600, - "startIndex": 49587, - "textRun": { - "content": "shopping cart", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 49701, - "startIndex": 49600, - "textRun": { - "content": " tab. You should see an iOS style date picker below the text fields for gathering the customer info:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49561 - }, - { - "endIndex": 49702, - "paragraph": { - "elements": [ - { - "endIndex": 49702, - "startIndex": 49701, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49701 - }, - { - "endIndex": 49704, - "paragraph": { - "elements": [ - { - "endIndex": 49703, - "inlineObjectElement": { - "inlineObjectId": "kix.opqxd4t4itsj", - "textStyle": {} - }, - "startIndex": 49702 - }, - { - "endIndex": 49704, - "startIndex": 49703, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49702 - }, - { - "endIndex": 49705, - "paragraph": { - "elements": [ - { - "endIndex": 49705, - "startIndex": 49704, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49704 - }, - { - "endIndex": 49715, - "paragraph": { - "elements": [ - { - "endIndex": 49715, - "startIndex": 49705, - "textRun": { - "content": "Problems?\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49705 - }, - { - "endIndex": 49837, - "paragraph": { - "elements": [ - { - "endIndex": 49837, - "startIndex": 49715, - "textRun": { - "content": "If your app is not running correctly, look for typos. If needed, use the code at the following link to get back on track.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49715 - }, - { - "endIndex": 49864, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 49863, - "startIndex": 49837, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_05/lib/shopping_cart_tab.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 49864, - "startIndex": 49863, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 49837 - }, - { - "endIndex": 49866, - "paragraph": { - "elements": [ - { - "endIndex": 49865, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 49864 - }, - { - "endIndex": 49866, - "startIndex": 49865, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49864 - }, - { - "endIndex": 49898, - "paragraph": { - "elements": [ - { - "endIndex": 49897, - "startIndex": 49866, - "textRun": { - "content": "Add selected items for purchase", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 49898, - "startIndex": 49897, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.v54t7y7qlce", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49866 - }, - { - "endIndex": 49913, - "paragraph": { - "elements": [ - { - "endIndex": 49912, - "startIndex": 49898, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - }, - { - "endIndex": 49913, - "startIndex": 49912, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49898 - }, - { - "endIndex": 49914, - "paragraph": { - "elements": [ - { - "endIndex": 49914, - "startIndex": 49913, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49913 - }, - { - "endIndex": 49993, - "paragraph": { - "elements": [ - { - "endIndex": 49993, - "startIndex": 49914, - "textRun": { - "content": "In this step, add the selected items to the shopping cart to complete the app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49914 - }, - { - "endIndex": 49994, - "paragraph": { - "elements": [ - { - "endIndex": 49994, - "startIndex": 49993, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49993 - }, - { - "endIndex": 50050, - "paragraph": { - "elements": [ - { - "endIndex": 49995, - "inlineObjectElement": { - "inlineObjectId": "kix.lz7oogd248bi", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 49994 - }, - { - "endIndex": 49996, - "startIndex": 49995, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 50026, - "startIndex": 49996, - "textRun": { - "content": "Import the product package in ", - "textStyle": {} - } - }, - { - "endIndex": 50048, - "startIndex": 50026, - "textRun": { - "content": "shopping_cart_tab.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50050, - "startIndex": 50048, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 49994 - }, - { - "endIndex": 50077, - "paragraph": { - "elements": [ - { - "endIndex": 50076, - "startIndex": 50050, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_06/lib/shopping_cart_tab.dart#L15" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 50077, - "startIndex": 50076, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.wisrz9cj45h6", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 50050 - }, - { - "endIndex": 50305, - "startIndex": 50077, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 50304, - "startIndex": 50078, - "tableCells": [ - { - "content": [ - { - "endIndex": 50121, - "paragraph": { - "elements": [ - { - "endIndex": 50087, - "startIndex": 50080, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50119, - "startIndex": 50087, - "textRun": { - "content": "'package:flutter/cupertino.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50121, - "startIndex": 50119, - "textRun": { - "content": ";\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50080 - }, - { - "endIndex": 50154, - "paragraph": { - "elements": [ - { - "endIndex": 50128, - "startIndex": 50121, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50152, - "startIndex": 50128, - "textRun": { - "content": "'package:intl/intl.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50154, - "startIndex": 50152, - "textRun": { - "content": ";\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50121 - }, - { - "endIndex": 50195, - "paragraph": { - "elements": [ - { - "endIndex": 50195, - "startIndex": 50154, - "textRun": { - "content": "import 'package:provider/provider.dart';\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50154 - }, - { - "endIndex": 50196, - "paragraph": { - "elements": [ - { - "endIndex": 50196, - "startIndex": 50195, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50195 - }, - { - "endIndex": 50233, - "paragraph": { - "elements": [ - { - "endIndex": 50203, - "startIndex": 50196, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50231, - "startIndex": 50203, - "textRun": { - "content": "'model/app_state_model.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50233, - "startIndex": 50231, - "textRun": { - "content": ";\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50196 - }, - { - "endIndex": 50282, - "paragraph": { - "elements": [ - { - "endIndex": 50240, - "startIndex": 50233, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50260, - "startIndex": 50240, - "textRun": { - "content": "'model/product.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50282, - "startIndex": 50260, - "textRun": { - "content": "; // NEW\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50233 - }, - { - "endIndex": 50304, - "paragraph": { - "elements": [ - { - "endIndex": 50289, - "startIndex": 50282, - "textRun": { - "content": "import ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50302, - "startIndex": 50289, - "textRun": { - "content": "'styles.dart'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50303, - "startIndex": 50302, - "textRun": { - "content": ";", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50304, - "startIndex": 50303, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50282 - } - ], - "endIndex": 50304, - "startIndex": 50079, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 50306, - "paragraph": { - "elements": [ - { - "endIndex": 50306, - "startIndex": 50305, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 50305 - }, - { - "endIndex": 50366, - "paragraph": { - "elements": [ - { - "endIndex": 50307, - "inlineObjectElement": { - "inlineObjectId": "kix.5z0rvk1zxtdb", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 50306 - }, - { - "endIndex": 50308, - "startIndex": 50307, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 50337, - "startIndex": 50308, - "textRun": { - "content": "Add a currency format to the ", - "textStyle": {} - } - }, - { - "endIndex": 50358, - "startIndex": 50337, - "textRun": { - "content": "_ShoppingCartTabState", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50366, - "startIndex": 50358, - "textRun": { - "content": " class.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 50306 - }, - { - "endIndex": 50391, - "paragraph": { - "elements": [ - { - "endIndex": 50391, - "startIndex": 50366, - "textRun": { - "content": "Add the line marked NEW:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 50366 - }, - { - "endIndex": 50392, - "paragraph": { - "elements": [ - { - "endIndex": 50392, - "startIndex": 50391, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 50391 - }, - { - "endIndex": 50633, - "startIndex": 50392, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 50632, - "startIndex": 50393, - "tableCells": [ - { - "content": [ - { - "endIndex": 50456, - "paragraph": { - "elements": [ - { - "endIndex": 50401, - "startIndex": 50395, - "textRun": { - "content": "class ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50423, - "startIndex": 50401, - "textRun": { - "content": "_ShoppingCartTabState ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50431, - "startIndex": 50423, - "textRun": { - "content": "extends ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50456, - "startIndex": 50431, - "textRun": { - "content": "State {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50395 - }, - { - "endIndex": 50472, - "paragraph": { - "elements": [ - { - "endIndex": 50472, - "startIndex": 50456, - "textRun": { - "content": " String? name;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50456 - }, - { - "endIndex": 50489, - "paragraph": { - "elements": [ - { - "endIndex": 50489, - "startIndex": 50472, - "textRun": { - "content": " String? email;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50472 - }, - { - "endIndex": 50509, - "paragraph": { - "elements": [ - { - "endIndex": 50509, - "startIndex": 50489, - "textRun": { - "content": " String? location;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50489 - }, - { - "endIndex": 50524, - "paragraph": { - "elements": [ - { - "endIndex": 50524, - "startIndex": 50509, - "textRun": { - "content": " String? pin;\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50509 - }, - { - "endIndex": 50562, - "paragraph": { - "elements": [ - { - "endIndex": 50535, - "startIndex": 50524, - "textRun": { - "content": " DateTime ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50544, - "startIndex": 50535, - "textRun": { - "content": "dateTime ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.47843137, - "green": 0.05490196, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50562, - "startIndex": 50544, - "textRun": { - "content": "= DateTime.now();\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50524 - }, - { - "endIndex": 50632, - "paragraph": { - "elements": [ - { - "endIndex": 50564, - "startIndex": 50562, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50570, - "startIndex": 50564, - "textRun": { - "content": "final ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50586, - "startIndex": 50570, - "textRun": { - "content": "_currencyFormat ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.47843137, - "green": 0.05490196, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50618, - "startIndex": 50586, - "textRun": { - "content": "= NumberFormat.currency(symbol: ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50619, - "startIndex": 50618, - "textRun": { - "content": "'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50621, - "startIndex": 50619, - "textRun": { - "content": "\\$", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50622, - "startIndex": 50621, - "textRun": { - "content": "'", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "green": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50631, - "startIndex": 50622, - "textRun": { - "content": "); // NEW", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50632, - "startIndex": 50631, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50562 - } - ], - "endIndex": 50632, - "startIndex": 50394, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 50634, - "paragraph": { - "elements": [ - { - "endIndex": 50634, - "startIndex": 50633, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 50633 - }, - { - "endIndex": 50706, - "paragraph": { - "elements": [ - { - "endIndex": 50635, - "inlineObjectElement": { - "inlineObjectId": "kix.a3vxdl4m4o11", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 50634 - }, - { - "endIndex": 50636, - "startIndex": 50635, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 50663, - "startIndex": 50636, - "textRun": { - "content": "Add a product index to the ", - "textStyle": {} - } - }, - { - "endIndex": 50695, - "startIndex": 50663, - "textRun": { - "content": "_buildSliverChildBuilderDelegate", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50706, - "startIndex": 50695, - "textRun": { - "content": " function.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 50634 - }, - { - "endIndex": 50731, - "paragraph": { - "elements": [ - { - "endIndex": 50731, - "startIndex": 50706, - "textRun": { - "content": "Add the line marked NEW:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 50706 - }, - { - "endIndex": 50732, - "paragraph": { - "elements": [ - { - "endIndex": 50732, - "startIndex": 50731, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 50731 - }, - { - "endIndex": 50959, - "startIndex": 50732, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 50958, - "startIndex": 50733, - "tableCells": [ - { - "content": [ - { - "endIndex": 50796, - "paragraph": { - "elements": [ - { - "endIndex": 50796, - "startIndex": 50735, - "textRun": { - "content": "SliverChildBuilderDelegate _buildSliverChildBuilderDelegate(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50735 - }, - { - "endIndex": 50822, - "paragraph": { - "elements": [ - { - "endIndex": 50822, - "startIndex": 50796, - "textRun": { - "content": " AppStateModel model) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50796 - }, - { - "endIndex": 50858, - "paragraph": { - "elements": [ - { - "endIndex": 50823, - "startIndex": 50822, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50830, - "startIndex": 50823, - "textRun": { - "content": "return ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50858, - "startIndex": 50830, - "textRun": { - "content": "SliverChildBuilderDelegate(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50822 - }, - { - "endIndex": 50880, - "paragraph": { - "elements": [ - { - "endIndex": 50880, - "startIndex": 50858, - "textRun": { - "content": " (context, index) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50858 - }, - { - "endIndex": 50927, - "paragraph": { - "elements": [ - { - "endIndex": 50885, - "startIndex": 50880, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50891, - "startIndex": 50885, - "textRun": { - "content": "final ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50914, - "startIndex": 50891, - "textRun": { - "content": "productIndex = index - ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50915, - "startIndex": 50914, - "textRun": { - "content": "4", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50927, - "startIndex": 50915, - "textRun": { - "content": "; // NEW\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50880 - }, - { - "endIndex": 50949, - "paragraph": { - "elements": [ - { - "endIndex": 50932, - "startIndex": 50927, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50939, - "startIndex": 50932, - "textRun": { - "content": "switch ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50949, - "startIndex": 50939, - "textRun": { - "content": "(index) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50927 - }, - { - "endIndex": 50958, - "paragraph": { - "elements": [ - { - "endIndex": 50958, - "startIndex": 50949, - "textRun": { - "content": " // ...\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50949 - } - ], - "endIndex": 50958, - "startIndex": 50734, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 50960, - "paragraph": { - "elements": [ - { - "endIndex": 50960, - "startIndex": 50959, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 50959 - }, - { - "endIndex": 51015, - "paragraph": { - "elements": [ - { - "endIndex": 50961, - "inlineObjectElement": { - "inlineObjectId": "kix.wipncbrb3i1r", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 50960 - }, - { - "endIndex": 50962, - "startIndex": 50961, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 50974, - "startIndex": 50962, - "textRun": { - "content": "In the same ", - "textStyle": {} - } - }, - { - "endIndex": 51015, - "startIndex": 50974, - "textRun": { - "content": "function, display the items to purchase.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 50960 - }, - { - "endIndex": 51089, - "paragraph": { - "elements": [ - { - "endIndex": 51035, - "startIndex": 51015, - "textRun": { - "content": "Add the code to the ", - "textStyle": {} - } - }, - { - "endIndex": 51043, - "startIndex": 51035, - "textRun": { - "content": "default:", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51089, - "startIndex": 51043, - "textRun": { - "content": " section of the switch statement, as follows:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 51015 - }, - { - "endIndex": 51090, - "paragraph": { - "elements": [ - { - "endIndex": 51090, - "startIndex": 51089, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 51089 - }, - { - "endIndex": 53138, - "startIndex": 51090, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 53137, - "startIndex": 51091, - "tableCells": [ - { - "content": [ - { - "endIndex": 51110, - "paragraph": { - "elements": [ - { - "endIndex": 51100, - "startIndex": 51093, - "textRun": { - "content": "switch ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51110, - "startIndex": 51100, - "textRun": { - "content": "(index) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51093 - }, - { - "endIndex": 51119, - "paragraph": { - "elements": [ - { - "endIndex": 51111, - "startIndex": 51110, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51116, - "startIndex": 51111, - "textRun": { - "content": "case ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51117, - "startIndex": 51116, - "textRun": { - "content": "0", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51119, - "startIndex": 51117, - "textRun": { - "content": ":\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51110 - }, - { - "endIndex": 51138, - "paragraph": { - "elements": [ - { - "endIndex": 51122, - "startIndex": 51119, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51129, - "startIndex": 51122, - "textRun": { - "content": "return ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51138, - "startIndex": 51129, - "textRun": { - "content": "Padding(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51119 - }, - { - "endIndex": 51196, - "paragraph": { - "elements": [ - { - "endIndex": 51152, - "startIndex": 51138, - "textRun": { - "content": " padding: ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51158, - "startIndex": 51152, - "textRun": { - "content": "const ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51191, - "startIndex": 51158, - "textRun": { - "content": "EdgeInsets.symmetric(horizontal: ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51193, - "startIndex": 51191, - "textRun": { - "content": "16", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51196, - "startIndex": 51193, - "textRun": { - "content": "),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51138 - }, - { - "endIndex": 51227, - "paragraph": { - "elements": [ - { - "endIndex": 51227, - "startIndex": 51196, - "textRun": { - "content": " child: _buildNameField(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51196 - }, - { - "endIndex": 51233, - "paragraph": { - "elements": [ - { - "endIndex": 51233, - "startIndex": 51227, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51227 - }, - { - "endIndex": 51242, - "paragraph": { - "elements": [ - { - "endIndex": 51234, - "startIndex": 51233, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51239, - "startIndex": 51234, - "textRun": { - "content": "case ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51240, - "startIndex": 51239, - "textRun": { - "content": "1", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51242, - "startIndex": 51240, - "textRun": { - "content": ":\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51233 - }, - { - "endIndex": 51261, - "paragraph": { - "elements": [ - { - "endIndex": 51245, - "startIndex": 51242, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51252, - "startIndex": 51245, - "textRun": { - "content": "return ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51261, - "startIndex": 51252, - "textRun": { - "content": "Padding(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51242 - }, - { - "endIndex": 51319, - "paragraph": { - "elements": [ - { - "endIndex": 51275, - "startIndex": 51261, - "textRun": { - "content": " padding: ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51281, - "startIndex": 51275, - "textRun": { - "content": "const ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51314, - "startIndex": 51281, - "textRun": { - "content": "EdgeInsets.symmetric(horizontal: ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51316, - "startIndex": 51314, - "textRun": { - "content": "16", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51319, - "startIndex": 51316, - "textRun": { - "content": "),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51261 - }, - { - "endIndex": 51351, - "paragraph": { - "elements": [ - { - "endIndex": 51351, - "startIndex": 51319, - "textRun": { - "content": " child: _buildEmailField(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51319 - }, - { - "endIndex": 51357, - "paragraph": { - "elements": [ - { - "endIndex": 51357, - "startIndex": 51351, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51351 - }, - { - "endIndex": 51366, - "paragraph": { - "elements": [ - { - "endIndex": 51358, - "startIndex": 51357, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51363, - "startIndex": 51358, - "textRun": { - "content": "case ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51364, - "startIndex": 51363, - "textRun": { - "content": "2", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51366, - "startIndex": 51364, - "textRun": { - "content": ":\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51357 - }, - { - "endIndex": 51385, - "paragraph": { - "elements": [ - { - "endIndex": 51369, - "startIndex": 51366, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51376, - "startIndex": 51369, - "textRun": { - "content": "return ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51385, - "startIndex": 51376, - "textRun": { - "content": "Padding(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51366 - }, - { - "endIndex": 51443, - "paragraph": { - "elements": [ - { - "endIndex": 51399, - "startIndex": 51385, - "textRun": { - "content": " padding: ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51405, - "startIndex": 51399, - "textRun": { - "content": "const ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51438, - "startIndex": 51405, - "textRun": { - "content": "EdgeInsets.symmetric(horizontal: ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51440, - "startIndex": 51438, - "textRun": { - "content": "16", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51443, - "startIndex": 51440, - "textRun": { - "content": "),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51385 - }, - { - "endIndex": 51478, - "paragraph": { - "elements": [ - { - "endIndex": 51478, - "startIndex": 51443, - "textRun": { - "content": " child: _buildLocationField(),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51443 - }, - { - "endIndex": 51484, - "paragraph": { - "elements": [ - { - "endIndex": 51484, - "startIndex": 51478, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51478 - }, - { - "endIndex": 51493, - "paragraph": { - "elements": [ - { - "endIndex": 51485, - "startIndex": 51484, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51490, - "startIndex": 51485, - "textRun": { - "content": "case ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51491, - "startIndex": 51490, - "textRun": { - "content": "3", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51493, - "startIndex": 51491, - "textRun": { - "content": ":\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51484 - }, - { - "endIndex": 51512, - "paragraph": { - "elements": [ - { - "endIndex": 51496, - "startIndex": 51493, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51503, - "startIndex": 51496, - "textRun": { - "content": "return ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51512, - "startIndex": 51503, - "textRun": { - "content": "Padding(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51493 - }, - { - "endIndex": 51568, - "paragraph": { - "elements": [ - { - "endIndex": 51526, - "startIndex": 51512, - "textRun": { - "content": " padding: ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51532, - "startIndex": 51526, - "textRun": { - "content": "const ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51552, - "startIndex": 51532, - "textRun": { - "content": "EdgeInsets.fromLTRB(", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51554, - "startIndex": 51552, - "textRun": { - "content": "16", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51556, - "startIndex": 51554, - "textRun": { - "content": ", ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51557, - "startIndex": 51556, - "textRun": { - "content": "8", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51559, - "startIndex": 51557, - "textRun": { - "content": ", ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51561, - "startIndex": 51559, - "textRun": { - "content": "16", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51563, - "startIndex": 51561, - "textRun": { - "content": ", ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51565, - "startIndex": 51563, - "textRun": { - "content": "24", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51568, - "startIndex": 51565, - "textRun": { - "content": "),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51512 - }, - { - "endIndex": 51614, - "paragraph": { - "elements": [ - { - "endIndex": 51614, - "startIndex": 51568, - "textRun": { - "content": " child: _buildDateAndTimePicker(context),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51568 - }, - { - "endIndex": 51620, - "paragraph": { - "elements": [ - { - "endIndex": 51620, - "startIndex": 51614, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51614 - }, - { - "endIndex": 51668, - "paragraph": { - "elements": [ - { - "endIndex": 51621, - "startIndex": 51620, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51628, - "startIndex": 51621, - "textRun": { - "content": "default", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.5019608 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51668, - "startIndex": 51628, - "textRun": { - "content": ": // NEW FROM HERE\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51620 - }, - { - "endIndex": 51721, - "paragraph": { - "elements": [ - { - "endIndex": 51721, - "startIndex": 51668, - "textRun": { - "content": " if (model.productsInCart.length > productIndex) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51668 - }, - { - "endIndex": 51751, - "paragraph": { - "elements": [ - { - "endIndex": 51751, - "startIndex": 51721, - "textRun": { - "content": " return ShoppingCartItem(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51721 - }, - { - "endIndex": 51772, - "paragraph": { - "elements": [ - { - "endIndex": 51772, - "startIndex": 51751, - "textRun": { - "content": " index: index,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51751 - }, - { - "endIndex": 51810, - "paragraph": { - "elements": [ - { - "endIndex": 51810, - "startIndex": 51772, - "textRun": { - "content": " product: model.getProductById(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51772 - }, - { - "endIndex": 51872, - "paragraph": { - "elements": [ - { - "endIndex": 51872, - "startIndex": 51810, - "textRun": { - "content": " model.productsInCart.keys.toList()[productIndex]),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51810 - }, - { - "endIndex": 51941, - "paragraph": { - "elements": [ - { - "endIndex": 51941, - "startIndex": 51872, - "textRun": { - "content": " quantity: model.productsInCart.values.toList()[productIndex],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51872 - }, - { - "endIndex": 52007, - "paragraph": { - "elements": [ - { - "endIndex": 52007, - "startIndex": 51941, - "textRun": { - "content": " lastItem: productIndex == model.productsInCart.length - 1,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51941 - }, - { - "endIndex": 52042, - "paragraph": { - "elements": [ - { - "endIndex": 52042, - "startIndex": 52007, - "textRun": { - "content": " formatter: _currencyFormat,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52007 - }, - { - "endIndex": 52050, - "paragraph": { - "elements": [ - { - "endIndex": 52050, - "startIndex": 52042, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52042 - }, - { - "endIndex": 52116, - "paragraph": { - "elements": [ - { - "endIndex": 52116, - "startIndex": 52050, - "textRun": { - "content": " } else if (model.productsInCart.keys.length == productIndex &&\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52050 - }, - { - "endIndex": 52158, - "paragraph": { - "elements": [ - { - "endIndex": 52158, - "startIndex": 52116, - "textRun": { - "content": " model.productsInCart.isNotEmpty) {\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52116 - }, - { - "endIndex": 52179, - "paragraph": { - "elements": [ - { - "endIndex": 52179, - "startIndex": 52158, - "textRun": { - "content": " return Padding(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52158 - }, - { - "endIndex": 52239, - "paragraph": { - "elements": [ - { - "endIndex": 52239, - "startIndex": 52179, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(horizontal: 20),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52179 - }, - { - "endIndex": 52258, - "paragraph": { - "elements": [ - { - "endIndex": 52258, - "startIndex": 52239, - "textRun": { - "content": " child: Row(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52239 - }, - { - "endIndex": 52309, - "paragraph": { - "elements": [ - { - "endIndex": 52309, - "startIndex": 52258, - "textRun": { - "content": " mainAxisAlignment: MainAxisAlignment.end,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52258 - }, - { - "endIndex": 52338, - "paragraph": { - "elements": [ - { - "endIndex": 52338, - "startIndex": 52309, - "textRun": { - "content": " children: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52309 - }, - { - "endIndex": 52357, - "paragraph": { - "elements": [ - { - "endIndex": 52357, - "startIndex": 52338, - "textRun": { - "content": " Column(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52338 - }, - { - "endIndex": 52414, - "paragraph": { - "elements": [ - { - "endIndex": 52414, - "startIndex": 52357, - "textRun": { - "content": " crossAxisAlignment: CrossAxisAlignment.end,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52357 - }, - { - "endIndex": 52447, - "paragraph": { - "elements": [ - { - "endIndex": 52447, - "startIndex": 52414, - "textRun": { - "content": " children: [\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52414 - }, - { - "endIndex": 52468, - "paragraph": { - "elements": [ - { - "endIndex": 52468, - "startIndex": 52447, - "textRun": { - "content": " Text(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52447 - }, - { - "endIndex": 52497, - "paragraph": { - "elements": [ - { - "endIndex": 52497, - "startIndex": 52468, - "textRun": { - "content": " 'Shipping '\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52468 - }, - { - "endIndex": 52563, - "paragraph": { - "elements": [ - { - "endIndex": 52563, - "startIndex": 52497, - "textRun": { - "content": " '${_currencyFormat.format(model.shippingCost)}',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52497 - }, - { - "endIndex": 52616, - "paragraph": { - "elements": [ - { - "endIndex": 52616, - "startIndex": 52563, - "textRun": { - "content": " style: Styles.productRowItemPrice,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52563 - }, - { - "endIndex": 52634, - "paragraph": { - "elements": [ - { - "endIndex": 52634, - "startIndex": 52616, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52616 - }, - { - "endIndex": 52676, - "paragraph": { - "elements": [ - { - "endIndex": 52676, - "startIndex": 52634, - "textRun": { - "content": " const SizedBox(height: 6),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52634 - }, - { - "endIndex": 52697, - "paragraph": { - "elements": [ - { - "endIndex": 52697, - "startIndex": 52676, - "textRun": { - "content": " Text(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52676 - }, - { - "endIndex": 52758, - "paragraph": { - "elements": [ - { - "endIndex": 52758, - "startIndex": 52697, - "textRun": { - "content": " 'Tax ${_currencyFormat.format(model.tax)}',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52697 - }, - { - "endIndex": 52810, - "paragraph": { - "elements": [ - { - "endIndex": 52810, - "startIndex": 52758, - "textRun": { - "content": " style: Styles.productRowItemPrice,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52758 - }, - { - "endIndex": 52829, - "paragraph": { - "elements": [ - { - "endIndex": 52829, - "startIndex": 52810, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52810 - }, - { - "endIndex": 52872, - "paragraph": { - "elements": [ - { - "endIndex": 52872, - "startIndex": 52829, - "textRun": { - "content": " const SizedBox(height: 6),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52829 - }, - { - "endIndex": 52894, - "paragraph": { - "elements": [ - { - "endIndex": 52894, - "startIndex": 52872, - "textRun": { - "content": " Text(\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52872 - }, - { - "endIndex": 52964, - "paragraph": { - "elements": [ - { - "endIndex": 52964, - "startIndex": 52894, - "textRun": { - "content": " 'Total ${_currencyFormat.format(model.totalCost)}',\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52894 - }, - { - "endIndex": 53013, - "paragraph": { - "elements": [ - { - "endIndex": 53013, - "startIndex": 52964, - "textRun": { - "content": " style: Styles.productRowTotal,\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52964 - }, - { - "endIndex": 53032, - "paragraph": { - "elements": [ - { - "endIndex": 53032, - "startIndex": 53013, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53013 - }, - { - "endIndex": 53049, - "paragraph": { - "elements": [ - { - "endIndex": 53049, - "startIndex": 53032, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53032 - }, - { - "endIndex": 53063, - "paragraph": { - "elements": [ - { - "endIndex": 53063, - "startIndex": 53049, - "textRun": { - "content": " )\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53049 - }, - { - "endIndex": 53076, - "paragraph": { - "elements": [ - { - "endIndex": 53076, - "startIndex": 53063, - "textRun": { - "content": " ],\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53063 - }, - { - "endIndex": 53087, - "paragraph": { - "elements": [ - { - "endIndex": 53087, - "startIndex": 53076, - "textRun": { - "content": " ),\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53076 - }, - { - "endIndex": 53096, - "paragraph": { - "elements": [ - { - "endIndex": 53096, - "startIndex": 53087, - "textRun": { - "content": " );\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53087 - }, - { - "endIndex": 53102, - "paragraph": { - "elements": [ - { - "endIndex": 53102, - "startIndex": 53096, - "textRun": { - "content": " }\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53096 - }, - { - "endIndex": 53137, - "paragraph": { - "elements": [ - { - "endIndex": 53136, - "startIndex": 53102, - "textRun": { - "content": "} // TO HERE", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 53137, - "startIndex": 53136, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53102 - } - ], - "endIndex": 53137, - "startIndex": 51092, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 53139, - "paragraph": { - "elements": [ - { - "endIndex": 53139, - "startIndex": 53138, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 53138 - }, - { - "endIndex": 53202, - "paragraph": { - "elements": [ - { - "endIndex": 53140, - "inlineObjectElement": { - "inlineObjectId": "kix.qy0qfmcoxacm", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 53139 - }, - { - "endIndex": 53141, - "startIndex": 53140, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 53178, - "startIndex": 53141, - "textRun": { - "content": "At the bottom of the file, add a new ", - "textStyle": {} - } - }, - { - "endIndex": 53194, - "startIndex": 53178, - "textRun": { - "content": "ShoppingCartItem", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 53202, - "startIndex": 53194, - "textRun": { - "content": " class:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 53139 - }, - { - "endIndex": 53203, - "paragraph": { - "elements": [ - { - "endIndex": 53203, - "startIndex": 53202, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 53202 - }, - { - "endIndex": 54471, - "startIndex": 53203, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 54470, - "startIndex": 53204, - "tableCells": [ - { - "content": [ - { - "endIndex": 53255, - "paragraph": { - "elements": [ - { - "endIndex": 53255, - "startIndex": 53206, - "textRun": { - "content": "class ShoppingCartItem extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53206 - }, - { - "endIndex": 53282, - "paragraph": { - "elements": [ - { - "endIndex": 53282, - "startIndex": 53255, - "textRun": { - "content": " const ShoppingCartItem({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53255 - }, - { - "endIndex": 53307, - "paragraph": { - "elements": [ - { - "endIndex": 53307, - "startIndex": 53282, - "textRun": { - "content": " required this.index,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53282 - }, - { - "endIndex": 53334, - "paragraph": { - "elements": [ - { - "endIndex": 53334, - "startIndex": 53307, - "textRun": { - "content": " required this.product,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53307 - }, - { - "endIndex": 53362, - "paragraph": { - "elements": [ - { - "endIndex": 53362, - "startIndex": 53334, - "textRun": { - "content": " required this.lastItem,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53334 - }, - { - "endIndex": 53390, - "paragraph": { - "elements": [ - { - "endIndex": 53390, - "startIndex": 53362, - "textRun": { - "content": " required this.quantity,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53362 - }, - { - "endIndex": 53419, - "paragraph": { - "elements": [ - { - "endIndex": 53419, - "startIndex": 53390, - "textRun": { - "content": " required this.formatter,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53390 - }, - { - "endIndex": 53434, - "paragraph": { - "elements": [ - { - "endIndex": 53434, - "startIndex": 53419, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53419 - }, - { - "endIndex": 53440, - "paragraph": { - "elements": [ - { - "endIndex": 53440, - "startIndex": 53434, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53434 - }, - { - "endIndex": 53441, - "paragraph": { - "elements": [ - { - "endIndex": 53441, - "startIndex": 53440, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53440 - }, - { - "endIndex": 53466, - "paragraph": { - "elements": [ - { - "endIndex": 53466, - "startIndex": 53441, - "textRun": { - "content": " final Product product;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53441 - }, - { - "endIndex": 53485, - "paragraph": { - "elements": [ - { - "endIndex": 53485, - "startIndex": 53466, - "textRun": { - "content": " final int index;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53466 - }, - { - "endIndex": 53508, - "paragraph": { - "elements": [ - { - "endIndex": 53508, - "startIndex": 53485, - "textRun": { - "content": " final bool lastItem;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53485 - }, - { - "endIndex": 53530, - "paragraph": { - "elements": [ - { - "endIndex": 53530, - "startIndex": 53508, - "textRun": { - "content": " final int quantity;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53508 - }, - { - "endIndex": 53562, - "paragraph": { - "elements": [ - { - "endIndex": 53562, - "startIndex": 53530, - "textRun": { - "content": " final NumberFormat formatter;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53530 - }, - { - "endIndex": 53563, - "paragraph": { - "elements": [ - { - "endIndex": 53563, - "startIndex": 53562, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53562 - }, - { - "endIndex": 53575, - "paragraph": { - "elements": [ - { - "endIndex": 53575, - "startIndex": 53563, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53563 - }, - { - "endIndex": 53614, - "paragraph": { - "elements": [ - { - "endIndex": 53614, - "startIndex": 53575, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53575 - }, - { - "endIndex": 53640, - "paragraph": { - "elements": [ - { - "endIndex": 53640, - "startIndex": 53614, - "textRun": { - "content": " final row = SafeArea(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53614 - }, - { - "endIndex": 53658, - "paragraph": { - "elements": [ - { - "endIndex": 53658, - "startIndex": 53640, - "textRun": { - "content": " top: false,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53640 - }, - { - "endIndex": 53679, - "paragraph": { - "elements": [ - { - "endIndex": 53679, - "startIndex": 53658, - "textRun": { - "content": " bottom: false,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53658 - }, - { - "endIndex": 53711, - "paragraph": { - "elements": [ - { - "endIndex": 53711, - "startIndex": 53679, - "textRun": { - "content": " child: CupertinoListTile(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53679 - }, - { - "endIndex": 53739, - "paragraph": { - "elements": [ - { - "endIndex": 53739, - "startIndex": 53711, - "textRun": { - "content": " leading: ClipRRect(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53711 - }, - { - "endIndex": 53789, - "paragraph": { - "elements": [ - { - "endIndex": 53789, - "startIndex": 53739, - "textRun": { - "content": " borderRadius: BorderRadius.circular(4),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53739 - }, - { - "endIndex": 53819, - "paragraph": { - "elements": [ - { - "endIndex": 53819, - "startIndex": 53789, - "textRun": { - "content": " child: Image.asset(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53789 - }, - { - "endIndex": 53850, - "paragraph": { - "elements": [ - { - "endIndex": 53850, - "startIndex": 53819, - "textRun": { - "content": " product.assetName,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53819 - }, - { - "endIndex": 53893, - "paragraph": { - "elements": [ - { - "endIndex": 53893, - "startIndex": 53850, - "textRun": { - "content": " package: product.assetPackage,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53850 - }, - { - "endIndex": 53924, - "paragraph": { - "elements": [ - { - "endIndex": 53924, - "startIndex": 53893, - "textRun": { - "content": " fit: BoxFit.cover,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53893 - }, - { - "endIndex": 53947, - "paragraph": { - "elements": [ - { - "endIndex": 53947, - "startIndex": 53924, - "textRun": { - "content": " width: 40,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53924 - }, - { - "endIndex": 53971, - "paragraph": { - "elements": [ - { - "endIndex": 53971, - "startIndex": 53947, - "textRun": { - "content": " height: 40,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53947 - }, - { - "endIndex": 53984, - "paragraph": { - "elements": [ - { - "endIndex": 53984, - "startIndex": 53971, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53971 - }, - { - "endIndex": 53995, - "paragraph": { - "elements": [ - { - "endIndex": 53995, - "startIndex": 53984, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53984 - }, - { - "endIndex": 54020, - "paragraph": { - "elements": [ - { - "endIndex": 54020, - "startIndex": 53995, - "textRun": { - "content": " leadingSize: 40,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53995 - }, - { - "endIndex": 54041, - "paragraph": { - "elements": [ - { - "endIndex": 54041, - "startIndex": 54020, - "textRun": { - "content": " title: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54020 - }, - { - "endIndex": 54065, - "paragraph": { - "elements": [ - { - "endIndex": 54065, - "startIndex": 54041, - "textRun": { - "content": " product.name,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54041 - }, - { - "endIndex": 54109, - "paragraph": { - "elements": [ - { - "endIndex": 54109, - "startIndex": 54065, - "textRun": { - "content": " style: Styles.productRowItemName,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54065 - }, - { - "endIndex": 54120, - "paragraph": { - "elements": [ - { - "endIndex": 54120, - "startIndex": 54109, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54109 - }, - { - "endIndex": 54144, - "paragraph": { - "elements": [ - { - "endIndex": 54144, - "startIndex": 54120, - "textRun": { - "content": " subtitle: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54120 - }, - { - "endIndex": 54194, - "paragraph": { - "elements": [ - { - "endIndex": 54194, - "startIndex": 54144, - "textRun": { - "content": " '${quantity > 1 ? '$quantity x ' : ''}'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54144 - }, - { - "endIndex": 54242, - "paragraph": { - "elements": [ - { - "endIndex": 54242, - "startIndex": 54194, - "textRun": { - "content": " '${formatter.format(product.price)}',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54194 - }, - { - "endIndex": 54287, - "paragraph": { - "elements": [ - { - "endIndex": 54287, - "startIndex": 54242, - "textRun": { - "content": " style: Styles.productRowItemPrice,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54242 - }, - { - "endIndex": 54298, - "paragraph": { - "elements": [ - { - "endIndex": 54298, - "startIndex": 54287, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54287 - }, - { - "endIndex": 54322, - "paragraph": { - "elements": [ - { - "endIndex": 54322, - "startIndex": 54298, - "textRun": { - "content": " trailing: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54298 - }, - { - "endIndex": 54376, - "paragraph": { - "elements": [ - { - "endIndex": 54376, - "startIndex": 54322, - "textRun": { - "content": " formatter.format(quantity * product.price),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54322 - }, - { - "endIndex": 54420, - "paragraph": { - "elements": [ - { - "endIndex": 54420, - "startIndex": 54376, - "textRun": { - "content": " style: Styles.productRowItemName,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54376 - }, - { - "endIndex": 54431, - "paragraph": { - "elements": [ - { - "endIndex": 54431, - "startIndex": 54420, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54420 - }, - { - "endIndex": 54440, - "paragraph": { - "elements": [ - { - "endIndex": 54440, - "startIndex": 54431, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54431 - }, - { - "endIndex": 54447, - "paragraph": { - "elements": [ - { - "endIndex": 54447, - "startIndex": 54440, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54440 - }, - { - "endIndex": 54448, - "paragraph": { - "elements": [ - { - "endIndex": 54448, - "startIndex": 54447, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54447 - }, - { - "endIndex": 54464, - "paragraph": { - "elements": [ - { - "endIndex": 54464, - "startIndex": 54448, - "textRun": { - "content": " return row;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54448 - }, - { - "endIndex": 54468, - "paragraph": { - "elements": [ - { - "endIndex": 54468, - "startIndex": 54464, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54464 - }, - { - "endIndex": 54470, - "paragraph": { - "elements": [ - { - "endIndex": 54470, - "startIndex": 54468, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 54468 - } - ], - "endIndex": 54470, - "startIndex": 53205, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 54472, - "paragraph": { - "elements": [ - { - "endIndex": 54472, - "startIndex": 54471, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 54471 - }, - { - "endIndex": 54701, - "paragraph": { - "elements": [ - { - "endIndex": 54473, - "inlineObjectElement": { - "inlineObjectId": "kix.ycqo2z8c5lo0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 54472 - }, - { - "endIndex": 54474, - "startIndex": 54473, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 54485, - "startIndex": 54474, - "textRun": { - "content": "Run the app", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/test-drive" - }, - "underline": true - } - } - }, - { - "endIndex": 54606, - "startIndex": 54485, - "textRun": { - "content": ". From the products tab, select a few items to purchase using the plus-sign button to the right of each item. Select the ", - "textStyle": {} - } - }, - { - "endIndex": 54619, - "startIndex": 54606, - "textRun": { - "content": "shopping cart", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 54701, - "startIndex": 54619, - "textRun": { - "content": " tab. You should see the items listed in the shopping cart below the date picker:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 54472 - }, - { - "endIndex": 54702, - "paragraph": { - "elements": [ - { - "endIndex": 54702, - "startIndex": 54701, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 54701 - }, - { - "endIndex": 54704, - "paragraph": { - "elements": [ - { - "endIndex": 54703, - "inlineObjectElement": { - "inlineObjectId": "kix.47it3lukrwyc", - "textStyle": {} - }, - "startIndex": 54702 - }, - { - "endIndex": 54704, - "startIndex": 54703, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 54702 - }, - { - "endIndex": 54705, - "paragraph": { - "elements": [ - { - "endIndex": 54705, - "startIndex": 54704, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 54704 - }, - { - "endIndex": 54715, - "paragraph": { - "elements": [ - { - "endIndex": 54715, - "startIndex": 54705, - "textRun": { - "content": "Problems?\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 54705 - }, - { - "endIndex": 54837, - "paragraph": { - "elements": [ - { - "endIndex": 54837, - "startIndex": 54715, - "textRun": { - "content": "If your app is not running correctly, look for typos. If needed, use the code at the following link to get back on track.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 54715 - }, - { - "endIndex": 54864, - "paragraph": { - "bullet": { - "listId": "kix.3brxguqwvfi0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 54863, - "startIndex": 54837, - "textRun": { - "content": "lib/shopping_cart_tab.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/cupertino_store/step_06/lib/shopping_cart_tab.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 54864, - "startIndex": 54863, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 54837 - }, - { - "endIndex": 54866, - "paragraph": { - "elements": [ - { - "endIndex": 54865, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 54864 - }, - { - "endIndex": 54866, - "startIndex": 54865, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 54864 - }, - { - "endIndex": 54877, - "paragraph": { - "elements": [ - { - "endIndex": 54876, - "startIndex": 54866, - "textRun": { - "content": "Next steps", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 54877, - "startIndex": 54876, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.wyjmgdlwi2kp", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 54866 - }, - { - "endIndex": 54892, - "paragraph": { - "elements": [ - { - "endIndex": 54891, - "startIndex": 54877, - "textRun": { - "content": "Duration: 0:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - }, - { - "endIndex": 54892, - "startIndex": 54891, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 54877 - }, - { - "endIndex": 54909, - "paragraph": { - "elements": [ - { - "endIndex": 54909, - "startIndex": 54892, - "textRun": { - "content": "Congratulations!\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.4w8rovwn8ql", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 54892 - }, - { - "endIndex": 55187, - "paragraph": { - "elements": [ - { - "endIndex": 55024, - "startIndex": 54909, - "textRun": { - "content": "You have completed the codelab and have built a Flutter app with the Cupertino look and feel! You’ve also used the ", - "textStyle": {} - } - }, - { - "endIndex": 55032, - "startIndex": 55024, - "textRun": { - "content": "provider", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 55154, - "startIndex": 55032, - "textRun": { - "content": " package to manage app state across screens. When you have time, you might want to learn more about managing state in our ", - "textStyle": {} - } - }, - { - "endIndex": 55184, - "startIndex": 55154, - "textRun": { - "content": "state management documentation", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/development/data-and-backend/state-mgmt/intro" - }, - "underline": true - } - } - }, - { - "endIndex": 55187, - "startIndex": 55184, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 54909 - }, - { - "endIndex": 55204, - "paragraph": { - "elements": [ - { - "endIndex": 55204, - "startIndex": 55187, - "textRun": { - "content": "Other next steps\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.8ahw5cvmt2v7", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 55187 - }, - { - "endIndex": 55445, - "paragraph": { - "elements": [ - { - "endIndex": 55445, - "startIndex": 55204, - "textRun": { - "content": "This codelab has built a front end for a shopping experience, but the next step in making it real is to create a back-end that handles user accounts, products, shopping carts and the like. There are multiple ways of accomplishing this goal:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 55204 - }, - { - "endIndex": 55581, - "paragraph": { - "bullet": { - "listId": "kix.dni6r0ezvy52", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 55484, - "startIndex": 55445, - "textRun": { - "content": "Host the product and shopping carts in ", - "textStyle": {} - } - }, - { - "endIndex": 55499, - "startIndex": 55484, - "textRun": { - "content": "Cloud Firestore", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://cloud.google.com/firestore/" - }, - "underline": true - } - } - }, - { - "endIndex": 55513, - "startIndex": 55499, - "textRun": { - "content": ", and use the ", - "textStyle": {} - } - }, - { - "endIndex": 55527, - "startIndex": 55513, - "textRun": { - "content": "Flutter plugin", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dartlang.org/packages/firebase_auth" - }, - "underline": true - } - } - }, - { - "endIndex": 55532, - "startIndex": 55527, - "textRun": { - "content": " for ", - "textStyle": {} - } - }, - { - "endIndex": 55555, - "startIndex": 55532, - "textRun": { - "content": "Firebase Authentication", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://firebase.google.com/products/auth/" - }, - "underline": true - } - } - }, - { - "endIndex": 55581, - "startIndex": 55555, - "textRun": { - "content": " for user authentication.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 55445 - }, - { - "endIndex": 55686, - "paragraph": { - "bullet": { - "listId": "kix.dni6r0ezvy52", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 55585, - "startIndex": 55581, - "textRun": { - "content": "Use ", - "textStyle": {} - } - }, - { - "endIndex": 55604, - "startIndex": 55585, - "textRun": { - "content": "Dart’s gRPC support", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://grpc.io/docs/quickstart/dart.html" - }, - "underline": true - } - } - }, - { - "endIndex": 55660, - "startIndex": 55604, - "textRun": { - "content": " to talk to a cloud hosted API server, for example with ", - "textStyle": {} - } - }, - { - "endIndex": 55684, - "startIndex": 55660, - "textRun": { - "content": "Cloud Endpoints for gRPC", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://cloud.google.com/endpoints/docs/grpc/about-grpc" - }, - "underline": true - } - } - }, - { - "endIndex": 55686, - "startIndex": 55684, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 55581 - }, - { - "endIndex": 55836, - "paragraph": { - "bullet": { - "listId": "kix.dni6r0ezvy52", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 55751, - "startIndex": 55686, - "textRun": { - "content": "If you have an API server that exports an API via JSON REST, see ", - "textStyle": {} - } - }, - { - "endIndex": 55779, - "startIndex": 55751, - "textRun": { - "content": "Andrew Brogdon’s Medium post", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://medium.com/flutter-io/some-options-for-deserializing-json-with-flutter-7481325a4450" - }, - "underline": true - } - } - }, - { - "endIndex": 55835, - "startIndex": 55779, - "textRun": { - "content": " for a range of options for working with JSON REST APIs.", - "textStyle": {} - } - }, - { - "endIndex": 55836, - "startIndex": 55835, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 55686 - }, - { - "endIndex": 55837, - "paragraph": { - "elements": [ - { - "endIndex": 55837, - "startIndex": 55836, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 55836 - }, - { - "endIndex": 55848, - "paragraph": { - "elements": [ - { - "endIndex": 55847, - "startIndex": 55837, - "textRun": { - "content": "Learn more", - "textStyle": {} - } - }, - { - "endIndex": 55848, - "startIndex": 55847, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.uddyhgetvtq1", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 55837 - }, - { - "endIndex": 55849, - "paragraph": { - "elements": [ - { - "endIndex": 55849, - "startIndex": 55848, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 55848 - }, - { - "endIndex": 55896, - "paragraph": { - "elements": [ - { - "endIndex": 55896, - "startIndex": 55849, - "textRun": { - "content": "You can find more info at the following links:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 55849 - }, - { - "endIndex": 55897, - "paragraph": { - "elements": [ - { - "endIndex": 55897, - "startIndex": 55896, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 55896 - }, - { - "endIndex": 55980, - "paragraph": { - "bullet": { - "listId": "kix.yt3oclqdbv8y", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 55936, - "startIndex": 55897, - "textRun": { - "content": "Flutters Cupertino package for iOS devs", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.youtube.com/watch?v=3PdUaidHc-E" - }, - "underline": true - } - } - }, - { - "endIndex": 55980, - "startIndex": 55936, - "textRun": { - "content": ". A video from the Flutter in Focus series.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 55897 - }, - { - "endIndex": 55999, - "paragraph": { - "bullet": { - "listId": "kix.yt3oclqdbv8y", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 55998, - "startIndex": 55980, - "textRun": { - "content": "Cupertino API docs", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/development/ui/widgets/cupertino" - }, - "underline": true - } - } - }, - { - "endIndex": 55999, - "startIndex": 55998, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 55980 - } - ] - }, - "documentId": "1CdlksSvxBE2XRBVZtOKpfMUO68OLJDLdQc7mxN_zABg", - "documentStyle": { - "background": { - "color": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "marginBottom": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72.0, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792.0, - "unit": "PT" - }, - "width": { - "magnitude": 612.0, - "unit": "PT" - } - }, - "useCustomHeaderFooterMargins": true - }, - "inlineObjects": { - "kix.12hzp12m6yl4": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.12hzp12m6yl4" - }, - "kix.1rebc5i17d3x": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/cY6uripbcPSnaUKvKdEetDGKveFq0o2az6PcJl8jMySu09iKks_7_M8ZK71q6Wo_ht-DUkgUbu3sX7BpPsJyEHxopMiuBWdkd08MtZI7i1SZAJt7PVnFuQAI0h0btwJHntEG4wu-32k92RNL2_s53RlluN0Qmjyxpu1KsBrn6hSHzRvWDtO_tdmP7MeM4xlH20-i0ws", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 435.375, - "unit": "PT" - }, - "width": { - "magnitude": 219.69692307692307, - "unit": "PT" - } - } - } - }, - "objectId": "kix.1rebc5i17d3x" - }, - "kix.35x18swc1rlb": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.35x18swc1rlb" - }, - "kix.3jrsx5vd3efm": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.3jrsx5vd3efm" - }, - "kix.429ia1fn9nhk": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.429ia1fn9nhk" - }, - "kix.47it3lukrwyc": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/ERcD6KxMVVYyf1fOFex_1vFsFeaG_3z8wsH248t7XTA9lsRlYOaOnDXgf9PJxxU4pTeqnUKFnHrL8jk9XUb7Q2fhA2xzHYGNRTA4Gwzcy3mqh3cH66m4En5cF2VXI3qrGPisETlfNeCqkdEWFukRJSEMw6CaHvAcaVYD_NdHR_vY6oClRXjl4UfdrGGwx9qSkxh09ks", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 499.125, - "unit": "PT" - }, - "width": { - "magnitude": 251.6025204359673, - "unit": "PT" - } - } - } - }, - "objectId": "kix.47it3lukrwyc" - }, - "kix.5z0rvk1zxtdb": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.5z0rvk1zxtdb" - }, - "kix.60vc4iv1jbjr": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.60vc4iv1jbjr" - }, - "kix.67wpmz98lv4d": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/HNG-bn1NZl-3GjUPVvLRLT83KnvDI-aB5Pfc5LormA6g6jIUFs3fA8tWXpY9YeRErPDXyWVrrSA0bkyVPkPqzWYs6t4GuG_K0u2qmKW1iTUkvmBw72rG4b3Y0V9vbbyFzuZr-YT7DDoWQovc8KbkeGy6mqtuzvqk2V0yr-NTd620Ns3GHh83jtCW3jxKT_6Fq2_yeGo", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 475.125, - "unit": "PT" - }, - "width": { - "magnitude": 239.50973360655738, - "unit": "PT" - } - } - } - }, - "objectId": "kix.67wpmz98lv4d" - }, - "kix.6wob3a6aount": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.6wob3a6aount" - }, - "kix.74khzmyqjy1f": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.74khzmyqjy1f" - }, - "kix.7debthccg8n1": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.7debthccg8n1" - }, - "kix.9684vj7h3vx5": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.9684vj7h3vx5" - }, - "kix.9hrohuzfso83": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.9hrohuzfso83" - }, - "kix.a33ljwd4qyfi": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.a33ljwd4qyfi" - }, - "kix.a3vxdl4m4o11": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.a3vxdl4m4o11" - }, - "kix.a5e98fcpxd64": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.a5e98fcpxd64" - }, - "kix.a6o0pcx9wx9l": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.a6o0pcx9wx9l" - }, - "kix.adsqpxfwyykw": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.adsqpxfwyykw" - }, - "kix.b6v16npcloiq": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.b6v16npcloiq" - }, - "kix.bi27oln27lsu": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.bi27oln27lsu" - }, - "kix.cd8xfhza25dp": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.cd8xfhza25dp" - }, - "kix.cw6wh6moa590": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.cw6wh6moa590" - }, - "kix.dn155uykb33a": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.dn155uykb33a" - }, - "kix.domc5se7jmx1": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.domc5se7jmx1" - }, - "kix.dpxhcsr6vso1": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.dpxhcsr6vso1" - }, - "kix.dsb8234cu6ty": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.dsb8234cu6ty" - }, - "kix.duhiln6tt02p": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.duhiln6tt02p" - }, - "kix.e0iyccqx9njq": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.e0iyccqx9njq" - }, - "kix.e5rxik9cxejk": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.e5rxik9cxejk" - }, - "kix.ee0uc3z7q9e4": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/lvZtHLI3pWyUQ_y6p2oKnYet5I65yuMTXeNZZoS706RmsbLX01JH_OOSGbmb_JQPil9m6XOHJA030QflYvii71XIjXU3hyD086FKhmibNf04eWdKEIRZTr9eVbMbLYu0UzQ4Dehy7ghOTKx9bFMWPVT6tiIxNVKw_oZQNS9sbkdDQtEz39FES7QdR2AxRpc3wKiA0Fg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 520.875, - "unit": "PT" - }, - "width": { - "magnitude": 262.43574168797954, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ee0uc3z7q9e4" - }, - "kix.ftgpapune40x": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ftgpapune40x" - }, - "kix.fwvmqdoszqx0": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/XzK3F3zfHPE0Y4d25or3Fpi6wwSOH7FKsL48Ou8G_04ODYYBrHxLCVNGY7KMHLuzhmTqZy6FlUx2WqMOp4efuJ9GvrQKSSvh8qvptPAfbeUdkIMzGKVOLRRcu3QAV-YvOoK495z3Lt8MvLTUIdt17AephPou2js4LdU5xFmkBzfluluV3-NVhzGkaZ9anFxzlvCExZM", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 445.57745901639345, - "unit": "PT" - }, - "width": { - "magnitude": 225.375, - "unit": "PT" - } - } - } - }, - "objectId": "kix.fwvmqdoszqx0" - }, - "kix.g4k3euxylmts": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.g4k3euxylmts" - }, - "kix.g4k6dalrj8z3": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.g4k6dalrj8z3" - }, - "kix.glg57m40ll5b": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.glg57m40ll5b" - }, - "kix.gmc5gg7me4x3": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.gmc5gg7me4x3" - }, - "kix.gpbh9pdij9v": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.gpbh9pdij9v" - }, - "kix.haeq1i15f6yw": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.haeq1i15f6yw" - }, - "kix.hnk1fonf71x5": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.hnk1fonf71x5" - }, - "kix.i5s7njpsipm": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.i5s7njpsipm" - }, - "kix.ipgkm0795660": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ipgkm0795660" - }, - "kix.j19zyb6jmntd": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.j19zyb6jmntd" - }, - "kix.j9pkj7tg0t9t": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.j9pkj7tg0t9t" - }, - "kix.kuchfeb0fq7s": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.kuchfeb0fq7s" - }, - "kix.lhkox4puce01": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.lhkox4puce01" - }, - "kix.lz7oogd248bi": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.lz7oogd248bi" - }, - "kix.m67ncn30m12r": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.m67ncn30m12r" - }, - "kix.mdchhpwp6uh2": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.mdchhpwp6uh2" - }, - "kix.mfrwmgozkn04": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.mfrwmgozkn04" - }, - "kix.opqxd4t4itsj": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/IOixOCXaJlZCsRncE7d4rB4yeJQiZyYdLg91s9fgeu5kbmmlMBqUbVb6AgpeU4b06xzWDRYfHFF2KvMGVHfa6_Q1apZ7daEf9671IugZKmGSdctf9RBt7Bj4A6BhBsfdrdiYfuV9_AhUoXxGJac-M2bHnvYdwqq_am3KD6SOSe5MHKGPLPHzA01IvdROE9S1F6GRvgQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 477.375, - "unit": "PT" - }, - "width": { - "magnitude": 240.82819506726457, - "unit": "PT" - } - } - } - }, - "objectId": "kix.opqxd4t4itsj" - }, - "kix.qi44ua9jrpnu": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qi44ua9jrpnu" - }, - "kix.qpb6hhjgmev": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qpb6hhjgmev" - }, - "kix.qy0qfmcoxacm": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qy0qfmcoxacm" - }, - "kix.rnnub6y4eqba": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.rnnub6y4eqba" - }, - "kix.s3xddl8pv2t6": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.s3xddl8pv2t6" - }, - "kix.s5061uxle1g5": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/JteLWJo083uqKkYxkxnUnPA9SX_ZMf176YElXchk1xHzFQfCrU0-i-kyUKRhY5JmD2o9Hiz_xLYsbSp-Dm6CDLZR3nQUU2QWdQdiWZ82Pu8NbA0m2WMTPq9CmwgqrHi6najZhdaLRuUwJ3hOX11K_admu_SpaT7xsi3RB8e00C9xz5sinLqS3Y0Q2I5xCyrkS2uCyDs", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 437.8609422492401, - "unit": "PT" - }, - "width": { - "magnitude": 221.625, - "unit": "PT" - } - } - } - }, - "objectId": "kix.s5061uxle1g5" - }, - "kix.sc3yfwq1efx0": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.375, - "unit": "PT" - } - } - } - }, - "objectId": "kix.sc3yfwq1efx0" - }, - "kix.smfnrnfg4t13": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.smfnrnfg4t13" - }, - "kix.soz9ovsim2t7": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/HsldjiSb4f499vYibgSeFqXbbrSlftmSyxfPenebGcCz6UzpapeTv5jNFBFOEer8gPf_BJUoMDqkTZ56qdvZ5GXQmVb9nuGkdU5apqaCnAhAnRRZKeDLFRAybYMQNZtN6sDMD1C38GhOJ9ljUfg134ft63Gwbksj2i4ALWlfqxbq6anoCffXEJz9QiIvm-MXt-akm6s", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 445.875, - "unit": "PT" - }, - "width": { - "magnitude": 225.2842105263158, - "unit": "PT" - } - } - } - }, - "objectId": "kix.soz9ovsim2t7" - }, - "kix.tio0memkjwdt": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.tio0memkjwdt" - }, - "kix.u4201tafqyd": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.861521124839783, - "unit": "PT" - } - } - } - }, - "objectId": "kix.u4201tafqyd" - }, - "kix.v9dvbqwvoncu": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.v9dvbqwvoncu" - }, - "kix.wa35hl984azj": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.wa35hl984azj" - }, - "kix.wipncbrb3i1r": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.wipncbrb3i1r" - }, - "kix.xfdmbhvqthi7": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.xfdmbhvqthi7" - }, - "kix.xlbv2cujsv5x": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/RzaHjX_Mi0dMMVUowvKCVTfjQke6veN9NSyyzJssBszNZizrgUck_GtWHQSbBZhir3QskKik0nMVeyL-APRdpq1OpDFVfu0IZYyHsNtkorDpZ9Bq89ge4Ylyv6A4Pt5B-8W0mHtiUrB0hSJpXHFUb-ISJNYHPQZ88I0gy4oOt6Arefnv6gtrYvRm25AqzQeVYjGrvlw", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 481.125, - "unit": "PT" - }, - "width": { - "magnitude": 242.51300675675677, - "unit": "PT" - } - } - } - }, - "objectId": "kix.xlbv2cujsv5x" - }, - "kix.xqiczfcx75xn": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.xqiczfcx75xn" - }, - "kix.xv0jovubjkin": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/F23pz7KzMaRT_9Cu2Uk5afa7p3ImsTZFXjWPHJmLdZt1dHx-u40fR_ZvWb5NoEEGGybNHe5xwVOL7Xy3w_OizS7_KVRWR9Fe7ON796SFfXulGl0TnveIMJlS4Xms2AxpEb6QaJiDmaQTVyavbeoRLWSO1IdgNhTIJb1FHqJ998KHH_HARK4lDBNq76mTIOauU7DVd04", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 487.0046296296296, - "unit": "PT" - }, - "width": { - "magnitude": 245.625, - "unit": "PT" - } - } - } - }, - "objectId": "kix.xv0jovubjkin" - }, - "kix.ycqo2z8c5lo0": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/xTbPUVuPdTUAhgE8_uQ2qD5Gb4Z_cnaIWU2H62O8mc_waIiH5cG20bvsUNCUqxFrAVJ_8I9oX42upUZVnH5IIQ_9mHZJicHs02HG6Vh_KhBrR9Z2HozK6k5XJcTQf5FtdSJOud845lFZxqJM2xeKKcJXMg9dSIFx5vwscFvCuDNZkSWAyzq9o5O2yjpjVCTdWukjbPA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ycqo2z8c5lo0" - }, - "kix.yy1pnk54xwq2": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/1PsIRYl6KSm45IZ6q6sj4TKb1oO6wk_l4LJi0Pe0FlV16qStBzbCCAwDSPM2fUeALMLTLMT9L8rKj4fdQtb6TGEz0uBatpNgiR41MiiaeSLwls1MCf38i5MAVQw9debJFJ_ksJ3lC9svjcvXpKWHg_bvb2T8vC1BNBzx8jOANy5GxD8ayj9_Lgc0my0GEz8L5ZYHtPI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.yy1pnk54xwq2" - } - }, - "lists": { - "kix.1co4ebb00z2t": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3brxguqwvfi0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.59wj3jdmokdt": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5ah5xu7h8s7d": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5gy96ltvl5jg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6gd81zfekbpn": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6luzkckg0z03": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7n4nsc8njjkh": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.az3nxiny7tbr": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.bu6c7uq7w19k": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.dni6r0ezvy52": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.i7c0of5i96cu": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.lc819r677eyc": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.o84bqm552cqm": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.os9i2e42g8ky": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.p5a920j5zspj": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.sixpu8qi20f": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vy7lz9wk80w9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "✓", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.49019608, - "green": 0.76862746, - "red": 0.5764706 - } - } - }, - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.y8n87jfixpux": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.yt3oclqdbv8y": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 20.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 20.0, - "unit": "PT" - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 18.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 14.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2627451, - "red": 0.2627451 - } - } - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 14.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 3.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 26.0, - "unit": "PT" - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 15.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - ] - }, - "revisionId": "ANeT5PTiajnLZg2NsJvduz1uFtYN0-NWdyZrBO_a6Hti7XkKsnDm3kG-E5QBtrjrIUHNrJvZ9qDK6xL9DcrShQ", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "title": "Building a Cupertino app with Flutter" -} \ No newline at end of file diff --git a/tooling/claat_export_images/test/data/exports/1EQtDsZv6vkvgreuOrF0KMo6kiKJ-534DShEFGankv20.json b/tooling/claat_export_images/test/data/exports/1EQtDsZv6vkvgreuOrF0KMo6kiKJ-534DShEFGankv20.json deleted file mode 100644 index 217a9e764e..0000000000 --- a/tooling/claat_export_images/test/data/exports/1EQtDsZv6vkvgreuOrF0KMo6kiKJ-534DShEFGankv20.json +++ /dev/null @@ -1,99037 +0,0 @@ -{ - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 2, - "paragraph": { - "elements": [ - { - "endIndex": 2, - "startIndex": 1, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "END", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1 - }, - { - "endIndex": 3, - "paragraph": { - "elements": [ - { - "endIndex": 3, - "startIndex": 2, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hha40vfkrqx", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 2 - }, - { - "endIndex": 47, - "paragraph": { - "elements": [ - { - "endIndex": 46, - "startIndex": 3, - "textRun": { - "content": "Adding in-app purchases to your Flutter app", - "textStyle": {} - } - }, - { - "endIndex": 47, - "startIndex": 46, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 14.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7sa4zxkhmsum", - "namedStyleType": "TITLE", - "pageBreakBefore": false, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3 - }, - { - "endIndex": 48, - "paragraph": { - "elements": [ - { - "endIndex": 48, - "startIndex": 47, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 47 - }, - { - "endIndex": 406, - "startIndex": 48, - "table": { - "columns": 2, - "rows": 7, - "tableRows": [ - { - "endIndex": 182, - "startIndex": 49, - "tableCells": [ - { - "content": [ - { - "endIndex": 59, - "paragraph": { - "elements": [ - { - "endIndex": 59, - "startIndex": 51, - "textRun": { - "content": "Summary\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 51 - } - ], - "endIndex": 59, - "startIndex": 50, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 182, - "paragraph": { - "elements": [ - { - "endIndex": 84, - "startIndex": 60, - "textRun": { - "content": "In this codelab, you’ll ", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 87, - "startIndex": 84, - "textRun": { - "content": "add", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 88, - "startIndex": 87, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 181, - "startIndex": 88, - "textRun": { - "content": "in-app purchases to a Flutter app that are verified and managed using a Dart backend service.", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 182, - "startIndex": 181, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 60 - } - ], - "endIndex": 182, - "startIndex": 59, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 223, - "startIndex": 182, - "tableCells": [ - { - "content": [ - { - "endIndex": 188, - "paragraph": { - "elements": [ - { - "endIndex": 188, - "startIndex": 184, - "textRun": { - "content": "URL\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 184 - } - ], - "endIndex": 188, - "startIndex": 183, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 223, - "paragraph": { - "elements": [ - { - "endIndex": 223, - "startIndex": 189, - "textRun": { - "content": "codelabs/flutter-in-app-purchases\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 189 - } - ], - "endIndex": 223, - "startIndex": 188, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 243, - "startIndex": 223, - "tableCells": [ - { - "content": [ - { - "endIndex": 234, - "paragraph": { - "elements": [ - { - "endIndex": 234, - "startIndex": 225, - "textRun": { - "content": "Category\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 225 - } - ], - "endIndex": 234, - "startIndex": 224, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 243, - "paragraph": { - "elements": [ - { - "endIndex": 243, - "startIndex": 235, - "textRun": { - "content": "Flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 235 - } - ], - "endIndex": 243, - "startIndex": 234, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 262, - "startIndex": 243, - "tableCells": [ - { - "content": [ - { - "endIndex": 257, - "paragraph": { - "elements": [ - { - "endIndex": 257, - "startIndex": 245, - "textRun": { - "content": "Environment\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 245 - } - ], - "endIndex": 257, - "startIndex": 244, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 262, - "paragraph": { - "elements": [ - { - "endIndex": 262, - "startIndex": 258, - "textRun": { - "content": "web\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 258 - } - ], - "endIndex": 262, - "startIndex": 257, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 278, - "startIndex": 262, - "tableCells": [ - { - "content": [ - { - "endIndex": 271, - "paragraph": { - "elements": [ - { - "endIndex": 271, - "startIndex": 264, - "textRun": { - "content": "Status\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 264 - } - ], - "endIndex": 271, - "startIndex": 263, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 278, - "paragraph": { - "elements": [ - { - "endIndex": 278, - "startIndex": 272, - "textRun": { - "content": "Draft\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 272 - } - ], - "endIndex": 278, - "startIndex": 271, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 337, - "startIndex": 278, - "tableCells": [ - { - "content": [ - { - "endIndex": 294, - "paragraph": { - "elements": [ - { - "endIndex": 294, - "startIndex": 280, - "textRun": { - "content": "Feedback Link\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 280 - } - ], - "endIndex": 294, - "startIndex": 279, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 337, - "paragraph": { - "elements": [ - { - "endIndex": 336, - "startIndex": 295, - "textRun": { - "content": "https://github.com/flutter/flutter/issues", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/flutter/issues" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 337, - "startIndex": 336, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 295 - } - ], - "endIndex": 337, - "startIndex": 294, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 405, - "startIndex": 337, - "tableCells": [ - { - "content": [ - { - "endIndex": 346, - "paragraph": { - "elements": [ - { - "endIndex": 346, - "startIndex": 339, - "textRun": { - "content": "Author\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 339 - } - ], - "endIndex": 346, - "startIndex": 338, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 405, - "paragraph": { - "elements": [ - { - "endIndex": 405, - "startIndex": 347, - "textRun": { - "content": "Rene Floor, Bodhi Mulders, Jop Middelkamp, Miguel Beltran\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 347 - } - ], - "endIndex": 405, - "startIndex": 346, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "width": { - "magnitude": 101.25, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - }, - { - "width": { - "magnitude": 366.75, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - } - ] - } - } - }, - { - "endIndex": 407, - "paragraph": { - "elements": [ - { - "endIndex": 407, - "startIndex": 406, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 406 - }, - { - "endIndex": 408, - "paragraph": { - "elements": [ - { - "endIndex": 408, - "startIndex": 407, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 407 - }, - { - "endIndex": 3504, - "startIndex": 408, - "tableOfContents": { - "content": [ - { - "endIndex": 422, - "paragraph": { - "elements": [ - { - "endIndex": 421, - "startIndex": 409, - "textRun": { - "content": "Introduction", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ait8gx84hw5v" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 422, - "startIndex": 421, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 409 - }, - { - "endIndex": 440, - "paragraph": { - "elements": [ - { - "endIndex": 439, - "startIndex": 422, - "textRun": { - "content": "What you'll build", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.psmbt23h0lx" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 440, - "startIndex": 439, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 422 - }, - { - "endIndex": 458, - "paragraph": { - "elements": [ - { - "endIndex": 457, - "startIndex": 440, - "textRun": { - "content": "What you’ll learn", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.d2tafm78btb1" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 458, - "startIndex": 457, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 440 - }, - { - "endIndex": 475, - "paragraph": { - "elements": [ - { - "endIndex": 474, - "startIndex": 458, - "textRun": { - "content": "What you'll need", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.fj42uleug9t6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 475, - "startIndex": 474, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 458 - }, - { - "endIndex": 510, - "paragraph": { - "elements": [ - { - "endIndex": 509, - "startIndex": 475, - "textRun": { - "content": "Set up the development environment", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.1c3bchpiqnrw" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 510, - "startIndex": 509, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 475 - }, - { - "endIndex": 528, - "paragraph": { - "elements": [ - { - "endIndex": 527, - "startIndex": 510, - "textRun": { - "content": "Download the code", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.i9dbh7csr0w" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 528, - "startIndex": 527, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 510 - }, - { - "endIndex": 555, - "paragraph": { - "elements": [ - { - "endIndex": 554, - "startIndex": 528, - "textRun": { - "content": "Set up the starter project", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.7fhkdxspeb3e" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 555, - "startIndex": 554, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 528 - }, - { - "endIndex": 577, - "paragraph": { - "elements": [ - { - "endIndex": 576, - "startIndex": 555, - "textRun": { - "content": "Initialize the plugin", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.23gzwqcjonei" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 577, - "startIndex": 576, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 555 - }, - { - "endIndex": 603, - "paragraph": { - "elements": [ - { - "endIndex": 602, - "startIndex": 577, - "textRun": { - "content": "Add dependency in pubspec", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.va9fr09ola34" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 603, - "startIndex": 602, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 577 - }, - { - "endIndex": 616, - "paragraph": { - "elements": [ - { - "endIndex": 615, - "startIndex": 603, - "textRun": { - "content": "pubspec.yaml", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.5k996sxdajot" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 616, - "startIndex": 615, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 603 - }, - { - "endIndex": 637, - "paragraph": { - "elements": [ - { - "endIndex": 636, - "startIndex": 616, - "textRun": { - "content": "Set up the App Store", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.qrnxh16sdve" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 637, - "startIndex": 636, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 616 - }, - { - "endIndex": 658, - "paragraph": { - "elements": [ - { - "endIndex": 657, - "startIndex": 637, - "textRun": { - "content": "Paid Apps Agreements", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ry9305h98tp" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 658, - "startIndex": 657, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 637 - }, - { - "endIndex": 674, - "paragraph": { - "elements": [ - { - "endIndex": 673, - "startIndex": 658, - "textRun": { - "content": "Register App ID", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.dzz6cf94qup9" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 674, - "startIndex": 673, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 658 - }, - { - "endIndex": 693, - "paragraph": { - "elements": [ - { - "endIndex": 692, - "startIndex": 674, - "textRun": { - "content": "Creating a new app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.vexv6ix15uw0" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 693, - "startIndex": 692, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 674 - }, - { - "endIndex": 727, - "paragraph": { - "elements": [ - { - "endIndex": 726, - "startIndex": 693, - "textRun": { - "content": "Configuring your in-app purchases", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.gb01agmg3h15" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 727, - "startIndex": 726, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 693 - }, - { - "endIndex": 749, - "paragraph": { - "elements": [ - { - "endIndex": 748, - "startIndex": 727, - "textRun": { - "content": "Set up the Play Store", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.jqrw9w6jbek" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 749, - "startIndex": 748, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 727 - }, - { - "endIndex": 766, - "paragraph": { - "elements": [ - { - "endIndex": 765, - "startIndex": 749, - "textRun": { - "content": "Create a new app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.o1u6soa0az1q" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 766, - "startIndex": 765, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 749 - }, - { - "endIndex": 787, - "paragraph": { - "elements": [ - { - "endIndex": 786, - "startIndex": 766, - "textRun": { - "content": "Sign the application", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.z8iwhe2sn61w" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 787, - "startIndex": 786, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 766 - }, - { - "endIndex": 805, - "paragraph": { - "elements": [ - { - "endIndex": 804, - "startIndex": 787, - "textRun": { - "content": "Create a keystore", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.rmmd9ixc2pz4" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 805, - "startIndex": 804, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 787 - }, - { - "endIndex": 841, - "paragraph": { - "elements": [ - { - "endIndex": 840, - "startIndex": 805, - "textRun": { - "content": "Reference the keystore from the app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.n6xp5o4jc4k9" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 841, - "startIndex": 840, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 805 - }, - { - "endIndex": 869, - "paragraph": { - "elements": [ - { - "endIndex": 868, - "startIndex": 841, - "textRun": { - "content": "Configure signing in Gradle", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.2vb42m8xb3no" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 869, - "startIndex": 868, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 841 - }, - { - "endIndex": 893, - "paragraph": { - "elements": [ - { - "endIndex": 892, - "startIndex": 869, - "textRun": { - "content": "Upload your first build", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ni22dsnb3wge" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 893, - "startIndex": 892, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 869 - }, - { - "endIndex": 911, - "paragraph": { - "elements": [ - { - "endIndex": 910, - "startIndex": 893, - "textRun": { - "content": "Set up test users", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.2u0491vkcfde" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 911, - "startIndex": 910, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 893 - }, - { - "endIndex": 945, - "paragraph": { - "elements": [ - { - "endIndex": 944, - "startIndex": 911, - "textRun": { - "content": "Configuring your in-app purchases", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.7kkxkz4gyhhc" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 945, - "startIndex": 944, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 911 - }, - { - "endIndex": 961, - "paragraph": { - "elements": [ - { - "endIndex": 960, - "startIndex": 945, - "textRun": { - "content": "Set up Firebase", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ejv8vgshgjc1" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 961, - "startIndex": 960, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 945 - }, - { - "endIndex": 987, - "paragraph": { - "elements": [ - { - "endIndex": 986, - "startIndex": 961, - "textRun": { - "content": "Create a Firebase project", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.whi67zwuhucz" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 987, - "startIndex": 986, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 961 - }, - { - "endIndex": 1015, - "paragraph": { - "elements": [ - { - "endIndex": 1014, - "startIndex": 987, - "textRun": { - "content": "Set up Firebase for Flutter", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.1ccdp4w5qlnf" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1015, - "startIndex": 1014, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 987 - }, - { - "endIndex": 1058, - "paragraph": { - "elements": [ - { - "endIndex": 1057, - "startIndex": 1015, - "textRun": { - "content": "Set up Firebase for Android: Further steps", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.rb9iczfwcj61" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1058, - "startIndex": 1057, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1015 - }, - { - "endIndex": 1098, - "paragraph": { - "elements": [ - { - "endIndex": 1097, - "startIndex": 1058, - "textRun": { - "content": "Get your debug signing certificate hash", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.hl575bgcxaxg" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1098, - "startIndex": 1097, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1058 - }, - { - "endIndex": 1137, - "paragraph": { - "elements": [ - { - "endIndex": 1136, - "startIndex": 1098, - "textRun": { - "content": "Set up Firebase for iOS: Further steps", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.p0owkml37qhm" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1137, - "startIndex": 1136, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1098 - }, - { - "endIndex": 1164, - "paragraph": { - "elements": [ - { - "endIndex": 1163, - "startIndex": 1137, - "textRun": { - "content": "Listen to purchase updates", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.mcahbl9vdrpn" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1164, - "startIndex": 1163, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1137 - }, - { - "endIndex": 1191, - "paragraph": { - "elements": [ - { - "endIndex": 1190, - "startIndex": 1164, - "textRun": { - "content": "Listen to purchase updates", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.fcw6hzds1nq" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1191, - "startIndex": 1190, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1164 - }, - { - "endIndex": 1205, - "paragraph": { - "elements": [ - { - "endIndex": 1204, - "startIndex": 1191, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.jk048wxvrjkx" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1205, - "startIndex": 1204, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1191 - }, - { - "endIndex": 1219, - "paragraph": { - "elements": [ - { - "endIndex": 1218, - "startIndex": 1205, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.o3vvyif9w0v" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1219, - "startIndex": 1218, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1205 - }, - { - "endIndex": 1241, - "paragraph": { - "elements": [ - { - "endIndex": 1240, - "startIndex": 1219, - "textRun": { - "content": "test/widget_test.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.iq06bszch0h4" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1241, - "startIndex": 1240, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1219 - }, - { - "endIndex": 1271, - "paragraph": { - "elements": [ - { - "endIndex": 1270, - "startIndex": 1241, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.80zn0qqce5ar" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1271, - "startIndex": 1270, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1241 - }, - { - "endIndex": 1301, - "paragraph": { - "elements": [ - { - "endIndex": 1300, - "startIndex": 1271, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.jo3s1whrc6q6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1301, - "startIndex": 1300, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1271 - }, - { - "endIndex": 1316, - "paragraph": { - "elements": [ - { - "endIndex": 1315, - "startIndex": 1301, - "textRun": { - "content": "Make purchases", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.sjju57tbpys9" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1316, - "startIndex": 1315, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1301 - }, - { - "endIndex": 1341, - "paragraph": { - "elements": [ - { - "endIndex": 1340, - "startIndex": 1316, - "textRun": { - "content": "Adapt PurchasableProduct", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.x906iqehvpr2" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1341, - "startIndex": 1340, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1316 - }, - { - "endIndex": 1376, - "paragraph": { - "elements": [ - { - "endIndex": 1375, - "startIndex": 1341, - "textRun": { - "content": "lib/model/purchasable_product.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.rglablhgfq77" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1376, - "startIndex": 1375, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1341 - }, - { - "endIndex": 1401, - "paragraph": { - "elements": [ - { - "endIndex": 1400, - "startIndex": 1376, - "textRun": { - "content": "Load available purchases", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.b00evudm79da" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1401, - "startIndex": 1400, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1376 - }, - { - "endIndex": 1431, - "paragraph": { - "elements": [ - { - "endIndex": 1430, - "startIndex": 1401, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.mgrbbglmvoez" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1431, - "startIndex": 1430, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1401 - }, - { - "endIndex": 1461, - "paragraph": { - "elements": [ - { - "endIndex": 1460, - "startIndex": 1431, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ucam5cd4fp6l" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1461, - "startIndex": 1460, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1431 - }, - { - "endIndex": 1491, - "paragraph": { - "elements": [ - { - "endIndex": 1490, - "startIndex": 1461, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.nfvpw72ufdo8" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1491, - "startIndex": 1490, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1461 - }, - { - "endIndex": 1521, - "paragraph": { - "elements": [ - { - "endIndex": 1520, - "startIndex": 1491, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.jwn50inqxl6w" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1521, - "startIndex": 1520, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1491 - }, - { - "endIndex": 1551, - "paragraph": { - "elements": [ - { - "endIndex": 1550, - "startIndex": 1521, - "textRun": { - "content": "Show the purchasable products", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.a9894r9iopct" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1551, - "startIndex": 1550, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1521 - }, - { - "endIndex": 1580, - "paragraph": { - "elements": [ - { - "endIndex": 1579, - "startIndex": 1551, - "textRun": { - "content": "lib/pages/purchase_page.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.o7gdmx3ulp1v" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1580, - "startIndex": 1579, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1551 - }, - { - "endIndex": 1610, - "paragraph": { - "elements": [ - { - "endIndex": 1609, - "startIndex": 1580, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.t2my6pr741wt" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1610, - "startIndex": 1609, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1580 - }, - { - "endIndex": 1640, - "paragraph": { - "elements": [ - { - "endIndex": 1639, - "startIndex": 1610, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.u1p10v9fz9mc" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1640, - "startIndex": 1639, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1610 - }, - { - "endIndex": 1659, - "paragraph": { - "elements": [ - { - "endIndex": 1658, - "startIndex": 1640, - "textRun": { - "content": "Set up the backend", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.8dbu8esps88" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1659, - "startIndex": 1658, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1640 - }, - { - "endIndex": 1681, - "paragraph": { - "elements": [ - { - "endIndex": 1680, - "startIndex": 1659, - "textRun": { - "content": "Base project overview", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.7obu2mgfnlz0" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1681, - "startIndex": 1680, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1659 - }, - { - "endIndex": 1704, - "paragraph": { - "elements": [ - { - "endIndex": 1703, - "startIndex": 1681, - "textRun": { - "content": "Set up Firebase access", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.dkookxd617q6" - }, - "underline": true - } - } - }, - { - "endIndex": 1704, - "startIndex": 1703, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1681 - }, - { - "endIndex": 1730, - "paragraph": { - "elements": [ - { - "endIndex": 1729, - "startIndex": 1704, - "textRun": { - "content": "Set up Google Play access", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.knv4xp21ktnt" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1730, - "startIndex": 1729, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1704 - }, - { - "endIndex": 1760, - "paragraph": { - "elements": [ - { - "endIndex": 1759, - "startIndex": 1730, - "textRun": { - "content": "Set up Apple App Store access", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.g72vs8nlqhfu" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1760, - "startIndex": 1759, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1730 - }, - { - "endIndex": 1789, - "paragraph": { - "elements": [ - { - "endIndex": 1788, - "startIndex": 1760, - "textRun": { - "content": "Constants configuration file", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.aqc59yhf20q" - }, - "underline": true - } - } - }, - { - "endIndex": 1789, - "startIndex": 1788, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1760 - }, - { - "endIndex": 1806, - "paragraph": { - "elements": [ - { - "endIndex": 1805, - "startIndex": 1789, - "textRun": { - "content": "Verify purchases", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.92eefa9xpwex" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1806, - "startIndex": 1805, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1789 - }, - { - "endIndex": 1830, - "paragraph": { - "elements": [ - { - "endIndex": 1829, - "startIndex": 1806, - "textRun": { - "content": "Set up the Flutter side", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.aoaadshh2reg" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1830, - "startIndex": 1829, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1806 - }, - { - "endIndex": 1852, - "paragraph": { - "elements": [ - { - "endIndex": 1851, - "startIndex": 1830, - "textRun": { - "content": "Set up authentication", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.134djrxwtck0" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1852, - "startIndex": 1851, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1830 - }, - { - "endIndex": 1881, - "paragraph": { - "elements": [ - { - "endIndex": 1880, - "startIndex": 1852, - "textRun": { - "content": "lib/pages/purchase_page.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.bqda879f77zo" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1881, - "startIndex": 1880, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1852 - }, - { - "endIndex": 1921, - "paragraph": { - "elements": [ - { - "endIndex": 1920, - "startIndex": 1881, - "textRun": { - "content": "Call verification endpoint from the app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.fpeghnmhyjw5" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1921, - "startIndex": 1920, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1881 - }, - { - "endIndex": 1951, - "paragraph": { - "elements": [ - { - "endIndex": 1950, - "startIndex": 1921, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ambb17bea5eu" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1951, - "startIndex": 1950, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1921 - }, - { - "endIndex": 1965, - "paragraph": { - "elements": [ - { - "endIndex": 1964, - "startIndex": 1951, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.h3a9vrs8wpa6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1965, - "startIndex": 1964, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1951 - }, - { - "endIndex": 1998, - "paragraph": { - "elements": [ - { - "endIndex": 1997, - "startIndex": 1965, - "textRun": { - "content": "lib/logic/firebase_notifier.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.w07tm7tj04kl" - }, - "underline": true - } - } - }, - { - "endIndex": 1998, - "startIndex": 1997, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1965 - }, - { - "endIndex": 2028, - "paragraph": { - "elements": [ - { - "endIndex": 2027, - "startIndex": 1998, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ikjulurznqpp" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2028, - "startIndex": 2027, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1998 - }, - { - "endIndex": 2058, - "paragraph": { - "elements": [ - { - "endIndex": 2057, - "startIndex": 2028, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ipyt35k9ps3s" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2058, - "startIndex": 2057, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2028 - }, - { - "endIndex": 2085, - "paragraph": { - "elements": [ - { - "endIndex": 2084, - "startIndex": 2058, - "textRun": { - "content": "Set up the backend service", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.w21b5bvfuwiw" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2085, - "startIndex": 2084, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2058 - }, - { - "endIndex": 2109, - "paragraph": { - "elements": [ - { - "endIndex": 2108, - "startIndex": 2085, - "textRun": { - "content": "Build purchase handlers", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.q27vh9nf8lin" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2109, - "startIndex": 2108, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2085 - }, - { - "endIndex": 2135, - "paragraph": { - "elements": [ - { - "endIndex": 2134, - "startIndex": 2109, - "textRun": { - "content": "lib/purchase_handler.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.lzo8w6ec9do" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2135, - "startIndex": 2134, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2109 - }, - { - "endIndex": 2161, - "paragraph": { - "elements": [ - { - "endIndex": 2160, - "startIndex": 2135, - "textRun": { - "content": "lib/purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.geakaektj298" - }, - "underline": true - } - } - }, - { - "endIndex": 2161, - "startIndex": 2160, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2135 - }, - { - "endIndex": 2187, - "paragraph": { - "elements": [ - { - "endIndex": 2186, - "startIndex": 2161, - "textRun": { - "content": "functions/src/products.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.b5dsy0h4nyqp" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2187, - "startIndex": 2186, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2161 - }, - { - "endIndex": 2221, - "paragraph": { - "elements": [ - { - "endIndex": 2220, - "startIndex": 2187, - "textRun": { - "content": "functions/src/purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.8s3sgzaprww5" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2221, - "startIndex": 2220, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2187 - }, - { - "endIndex": 2267, - "paragraph": { - "elements": [ - { - "endIndex": 2266, - "startIndex": 2221, - "textRun": { - "content": "functions/src/google-play.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.hit9xghmtn82" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2267, - "startIndex": 2266, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2221 - }, - { - "endIndex": 2311, - "paragraph": { - "elements": [ - { - "endIndex": 2310, - "startIndex": 2267, - "textRun": { - "content": "functions/src/app-store.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.iokzwmayvp6a" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2311, - "startIndex": 2310, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2267 - }, - { - "endIndex": 2333, - "paragraph": { - "elements": [ - { - "endIndex": 2332, - "startIndex": 2311, - "textRun": { - "content": "Use purchase handlers", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.xz19ykk8ox68" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2333, - "startIndex": 2332, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2311 - }, - { - "endIndex": 2356, - "paragraph": { - "elements": [ - { - "endIndex": 2355, - "startIndex": 2333, - "textRun": { - "content": "functions/src/index.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.829xiqlpodn" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2356, - "startIndex": 2355, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2333 - }, - { - "endIndex": 2379, - "paragraph": { - "elements": [ - { - "endIndex": 2378, - "startIndex": 2356, - "textRun": { - "content": "functions/src/index.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.g3r3y0bynpfd" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2379, - "startIndex": 2378, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2356 - }, - { - "endIndex": 2395, - "paragraph": { - "elements": [ - { - "endIndex": 2394, - "startIndex": 2379, - "textRun": { - "content": "Define products", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ffnftj7a0ds7" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2395, - "startIndex": 2394, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2379 - }, - { - "endIndex": 2421, - "paragraph": { - "elements": [ - { - "endIndex": 2420, - "startIndex": 2395, - "textRun": { - "content": "functions/src/products.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.eqcv4bw3wj9l" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2421, - "startIndex": 2420, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2395 - }, - { - "endIndex": 2444, - "paragraph": { - "elements": [ - { - "endIndex": 2443, - "startIndex": 2421, - "textRun": { - "content": "functions/src/index.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.h97fdl3sso4b" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2444, - "startIndex": 2443, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2421 - }, - { - "endIndex": 2500, - "paragraph": { - "elements": [ - { - "endIndex": 2499, - "startIndex": 2444, - "textRun": { - "content": "Verify Android purchases: Implement the purchase hander", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.kvvs4a2ab9qm" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2500, - "startIndex": 2499, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2444 - }, - { - "endIndex": 2546, - "paragraph": { - "elements": [ - { - "endIndex": 2545, - "startIndex": 2500, - "textRun": { - "content": "functions/src/google-play.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.3ckxdb9et3i1" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2546, - "startIndex": 2545, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2500 - }, - { - "endIndex": 2592, - "paragraph": { - "elements": [ - { - "endIndex": 2591, - "startIndex": 2546, - "textRun": { - "content": "functions/src/google-play.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.3zpwswhdy5qy" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2592, - "startIndex": 2591, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2546 - }, - { - "endIndex": 2638, - "paragraph": { - "elements": [ - { - "endIndex": 2637, - "startIndex": 2592, - "textRun": { - "content": "functions/src/google-play.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.u6r21uantosy" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2638, - "startIndex": 2637, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2592 - }, - { - "endIndex": 2684, - "paragraph": { - "elements": [ - { - "endIndex": 2683, - "startIndex": 2638, - "textRun": { - "content": "functions/src/google-play.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.n3xrqwopnn6v" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2684, - "startIndex": 2683, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2638 - }, - { - "endIndex": 2737, - "paragraph": { - "elements": [ - { - "endIndex": 2736, - "startIndex": 2684, - "textRun": { - "content": "Verify iOS purchases: Implement the purchase handler", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.msyta1i4r4lp" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2737, - "startIndex": 2736, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2684 - }, - { - "endIndex": 2781, - "paragraph": { - "elements": [ - { - "endIndex": 2780, - "startIndex": 2737, - "textRun": { - "content": "functions/src/app-store.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.8h3fipl5g797" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2781, - "startIndex": 2780, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2737 - }, - { - "endIndex": 2825, - "paragraph": { - "elements": [ - { - "endIndex": 2824, - "startIndex": 2781, - "textRun": { - "content": "functions/src/app-store.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.nwkw0tn4yar8" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2825, - "startIndex": 2824, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2781 - }, - { - "endIndex": 2869, - "paragraph": { - "elements": [ - { - "endIndex": 2868, - "startIndex": 2825, - "textRun": { - "content": "functions/src/app-store.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.uhe18ngppe1q" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2869, - "startIndex": 2868, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2825 - }, - { - "endIndex": 2913, - "paragraph": { - "elements": [ - { - "endIndex": 2912, - "startIndex": 2869, - "textRun": { - "content": "functions/src/app-store.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.pc665bdlompt" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2913, - "startIndex": 2912, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2869 - }, - { - "endIndex": 2957, - "paragraph": { - "elements": [ - { - "endIndex": 2956, - "startIndex": 2913, - "textRun": { - "content": "functions/src/app-store.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.wgkogjxbkihg" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2957, - "startIndex": 2956, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2913 - }, - { - "endIndex": 2976, - "paragraph": { - "elements": [ - { - "endIndex": 2975, - "startIndex": 2957, - "textRun": { - "content": "Deploy the backend", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.jb3eo77qkroq" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 2976, - "startIndex": 2975, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2957 - }, - { - "endIndex": 3000, - "paragraph": { - "elements": [ - { - "endIndex": 2999, - "startIndex": 2976, - "textRun": { - "content": "Keep track of purchases", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.dd0rjca1enw0" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3000, - "startIndex": 2999, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 2976 - }, - { - "endIndex": 3036, - "paragraph": { - "elements": [ - { - "endIndex": 3035, - "startIndex": 3000, - "textRun": { - "content": "Process store events on the backend", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ti7vyj5prcjk" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3036, - "startIndex": 3035, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3000 - }, - { - "endIndex": 3071, - "paragraph": { - "elements": [ - { - "endIndex": 3070, - "startIndex": 3036, - "textRun": { - "content": "Process Google Play billing events", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.sxk3tsy39sxr" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3071, - "startIndex": 3070, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3036 - }, - { - "endIndex": 3117, - "paragraph": { - "elements": [ - { - "endIndex": 3116, - "startIndex": 3071, - "textRun": { - "content": "functions/src/google-play.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.aecu2q40uqsk" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3117, - "startIndex": 3116, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3071 - }, - { - "endIndex": 3163, - "paragraph": { - "elements": [ - { - "endIndex": 3162, - "startIndex": 3117, - "textRun": { - "content": "functions/src/google-play.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.p9ua81tts3te" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3163, - "startIndex": 3162, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3117 - }, - { - "endIndex": 3186, - "paragraph": { - "elements": [ - { - "endIndex": 3185, - "startIndex": 3163, - "textRun": { - "content": "functions/src/index.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.nbdit1uenoaw" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3186, - "startIndex": 3185, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3163 - }, - { - "endIndex": 3219, - "paragraph": { - "elements": [ - { - "endIndex": 3218, - "startIndex": 3186, - "textRun": { - "content": "Process App Store billing events", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.cbs9z18fhfqs" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3219, - "startIndex": 3218, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3186 - }, - { - "endIndex": 3263, - "paragraph": { - "elements": [ - { - "endIndex": 3262, - "startIndex": 3219, - "textRun": { - "content": "functions/src/app-store.purchase-handler.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.orjo6vlyqfge" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3263, - "startIndex": 3262, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3219 - }, - { - "endIndex": 3286, - "paragraph": { - "elements": [ - { - "endIndex": 3285, - "startIndex": 3263, - "textRun": { - "content": "functions/src/index.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ebi2444nkxx7" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3286, - "startIndex": 3285, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3263 - }, - { - "endIndex": 3309, - "paragraph": { - "elements": [ - { - "endIndex": 3308, - "startIndex": 3286, - "textRun": { - "content": "Expiring Subscriptions", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.v4v1eioy8yhj" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3309, - "startIndex": 3308, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3286 - }, - { - "endIndex": 3332, - "paragraph": { - "elements": [ - { - "endIndex": 3331, - "startIndex": 3309, - "textRun": { - "content": "functions/src/index.ts", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.uqid257a8v3" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3332, - "startIndex": 3331, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3309 - }, - { - "endIndex": 3350, - "paragraph": { - "elements": [ - { - "endIndex": 3349, - "startIndex": 3332, - "textRun": { - "content": "Google Play setup", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.nkijb68mlhu2" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3350, - "startIndex": 3349, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3332 - }, - { - "endIndex": 3366, - "paragraph": { - "elements": [ - { - "endIndex": 3365, - "startIndex": 3350, - "textRun": { - "content": "App Store setup", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.easdahjt03hd" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3366, - "startIndex": 3365, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3350 - }, - { - "endIndex": 3396, - "paragraph": { - "elements": [ - { - "endIndex": 3395, - "startIndex": 3366, - "textRun": { - "content": "Track purchases on the device", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.iuugivjoy0l3" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3396, - "startIndex": 3395, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3366 - }, - { - "endIndex": 3419, - "paragraph": { - "elements": [ - { - "endIndex": 3418, - "startIndex": 3396, - "textRun": { - "content": "lib/repo/iap_repo.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.xgm7m0la00z6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3419, - "startIndex": 3418, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3396 - }, - { - "endIndex": 3449, - "paragraph": { - "elements": [ - { - "endIndex": 3448, - "startIndex": 3419, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.2jm5f1b6gkhx" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3449, - "startIndex": 3448, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3419 - }, - { - "endIndex": 3463, - "paragraph": { - "elements": [ - { - "endIndex": 3462, - "startIndex": 3449, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.6ifsfvloq7cr" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3463, - "startIndex": 3462, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3449 - }, - { - "endIndex": 3493, - "paragraph": { - "elements": [ - { - "endIndex": 3492, - "startIndex": 3463, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.br9j03ile7e3" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3493, - "startIndex": 3492, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3463 - }, - { - "endIndex": 3503, - "paragraph": { - "elements": [ - { - "endIndex": 3502, - "startIndex": 3493, - "textRun": { - "content": "All done!", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.b777ki4f2xms" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3503, - "startIndex": 3502, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 3493 - } - ] - } - }, - { - "endIndex": 3505, - "paragraph": { - "elements": [ - { - "endIndex": 3505, - "startIndex": 3504, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3504 - }, - { - "endIndex": 3506, - "paragraph": { - "elements": [ - { - "endIndex": 3506, - "startIndex": 3505, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3505 - }, - { - "endIndex": 3508, - "paragraph": { - "elements": [ - { - "endIndex": 3507, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 3506 - }, - { - "endIndex": 3508, - "startIndex": 3507, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.y3a2k1u3c8fs", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 3506 - }, - { - "endIndex": 3521, - "paragraph": { - "elements": [ - { - "endIndex": 3512, - "startIndex": 3508, - "textRun": { - "content": "Intr", - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3516, - "startIndex": 3512, - "textRun": { - "content": "oduc", - "textStyle": {} - } - }, - { - "endIndex": 3521, - "startIndex": 3516, - "textRun": { - "content": "tion\n", - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ait8gx84hw5v", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 3508 - }, - { - "endIndex": 3522, - "paragraph": { - "elements": [ - { - "endIndex": 3522, - "startIndex": 3521, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3521 - }, - { - "endIndex": 3547, - "paragraph": { - "elements": [ - { - "endIndex": 3535, - "startIndex": 3522, - "textRun": { - "content": "Last Updated:", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3536, - "startIndex": 3535, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3540, - "startIndex": 3536, - "textRun": { - "content": "2023", - "textStyle": {} - } - }, - { - "endIndex": 3542, - "startIndex": 3540, - "textRun": { - "content": "-0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3543, - "startIndex": 3542, - "textRun": { - "content": "3", - "textStyle": {} - } - }, - { - "endIndex": 3544, - "startIndex": 3543, - "textRun": { - "content": "-", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 3546, - "startIndex": 3544, - "textRun": { - "content": "27", - "textStyle": {} - } - }, - { - "endIndex": 3547, - "startIndex": 3546, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3522 - }, - { - "endIndex": 3548, - "paragraph": { - "elements": [ - { - "endIndex": 3548, - "startIndex": 3547, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3547 - }, - { - "endIndex": 3736, - "paragraph": { - "elements": [ - { - "endIndex": 3735, - "startIndex": 3548, - "textRun": { - "content": "Adding in-app purchases to a Flutter app requires correctly setting up the App and Play stores, verifying the purchase, and granting the necessary permissions, such as subscription perks.", - "textStyle": {} - } - }, - { - "endIndex": 3736, - "startIndex": 3735, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3548 - }, - { - "endIndex": 3737, - "paragraph": { - "elements": [ - { - "endIndex": 3737, - "startIndex": 3736, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3736 - }, - { - "endIndex": 4022, - "paragraph": { - "elements": [ - { - "endIndex": 4022, - "startIndex": 3737, - "textRun": { - "content": "In this codelab you’ll add three types of in-app purchases to an app (provided for you), and verify these purchases using a Dart backend with Firebase. The provided app, Dash Clicker, contains a game that uses the Dash mascot as currency. You will add the following purchase options: \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3737 - }, - { - "endIndex": 4023, - "paragraph": { - "elements": [ - { - "endIndex": 4023, - "startIndex": 4022, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4022 - }, - { - "endIndex": 4077, - "paragraph": { - "bullet": { - "listId": "kix.ueq2r24kq7ie", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 4077, - "startIndex": 4023, - "textRun": { - "content": "A repeatable purchase option for 2000 Dashes at once.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4023 - }, - { - "endIndex": 4158, - "paragraph": { - "bullet": { - "listId": "kix.ueq2r24kq7ie", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 4158, - "startIndex": 4077, - "textRun": { - "content": "A one-time upgrade purchase to make the old style Dash into a modern style Dash.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4077 - }, - { - "endIndex": 4222, - "paragraph": { - "bullet": { - "listId": "kix.ueq2r24kq7ie", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 4222, - "startIndex": 4158, - "textRun": { - "content": "A subscription that doubles the automatically generated clicks.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4158 - }, - { - "endIndex": 4223, - "paragraph": { - "elements": [ - { - "endIndex": 4223, - "startIndex": 4222, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4222 - }, - { - "endIndex": 4459, - "paragraph": { - "elements": [ - { - "endIndex": 4459, - "startIndex": 4223, - "textRun": { - "content": "The first purchase option gives the user a direct benefit of 2000 Dashes. These are directly available to the user and can be bought many times. This is called a consumable as it is directly consumed and can be consumed multiple times.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4223 - }, - { - "endIndex": 4460, - "paragraph": { - "elements": [ - { - "endIndex": 4460, - "startIndex": 4459, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4459 - }, - { - "endIndex": 4687, - "paragraph": { - "elements": [ - { - "endIndex": 4687, - "startIndex": 4460, - "textRun": { - "content": "The second option upgrades the Dash to a more beautiful Dash. This only has to be purchased once and is available forever. Such a purchase is called non-consumable because it cannot be consumed by the app but is valid forever.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4460 - }, - { - "endIndex": 4688, - "paragraph": { - "elements": [ - { - "endIndex": 4688, - "startIndex": 4687, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4687 - }, - { - "endIndex": 4887, - "paragraph": { - "elements": [ - { - "endIndex": 4887, - "startIndex": 4688, - "textRun": { - "content": "The third and last purchase option is a subscription. While the subscription is active the user will get Dashes more quickly, but when he stops paying for the subscription the benefits also go away.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4688 - }, - { - "endIndex": 4888, - "paragraph": { - "elements": [ - { - "endIndex": 4888, - "startIndex": 4887, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4887 - }, - { - "endIndex": 5138, - "paragraph": { - "elements": [ - { - "endIndex": 5138, - "startIndex": 4888, - "textRun": { - "content": "The backend service (also provided for you) runs as a Dart app, verifies that the purchases are made, and stores them using Firestore. Firestore is used to make the process easier, but in your production app, you can use any type of backend service.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4888 - }, - { - "endIndex": 5150, - "paragraph": { - "elements": [ - { - "endIndex": 5139, - "inlineObjectElement": { - "inlineObjectId": "kix.oob851rr5dpx", - "textStyle": {} - }, - "startIndex": 5138 - }, - { - "endIndex": 5143, - "startIndex": 5139, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 5144, - "inlineObjectElement": { - "inlineObjectId": "kix.y56zhtc6tete", - "textStyle": {} - }, - "startIndex": 5143 - }, - { - "endIndex": 5148, - "startIndex": 5144, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 5149, - "inlineObjectElement": { - "inlineObjectId": "kix.u8d6iv97bzy1", - "textStyle": {} - }, - "startIndex": 5148 - }, - { - "endIndex": 5150, - "startIndex": 5149, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 5138 - }, - { - "endIndex": 5151, - "paragraph": { - "elements": [ - { - "endIndex": 5151, - "startIndex": 5150, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 5150 - }, - { - "endIndex": 5152, - "paragraph": { - "elements": [ - { - "endIndex": 5152, - "startIndex": 5151, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 5151 - }, - { - "endIndex": 5170, - "paragraph": { - "elements": [ - { - "endIndex": 5170, - "startIndex": 5152, - "textRun": { - "content": "What you'll build\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.psmbt23h0lx", - "lineSpacing": 100.0, - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 15.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - } - }, - "startIndex": 5152 - }, - { - "endIndex": 5171, - "paragraph": { - "elements": [ - { - "endIndex": 5171, - "startIndex": 5170, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5170 - }, - { - "endIndex": 5245, - "paragraph": { - "bullet": { - "listId": "kix.fhl8uuuumoyx", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 5196, - "startIndex": 5171, - "textRun": { - "content": "You will extend an app to", - "textStyle": {} - } - }, - { - "endIndex": 5245, - "startIndex": 5196, - "textRun": { - "content": " support consumable purchases and subscriptions.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5171 - }, - { - "endIndex": 5326, - "paragraph": { - "bullet": { - "listId": "kix.fhl8uuuumoyx", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 5325, - "startIndex": 5245, - "textRun": { - "content": "You will also extend a Dart backend app to verify and store the purchased items.", - "textStyle": {} - } - }, - { - "endIndex": 5326, - "startIndex": 5325, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5245 - }, - { - "endIndex": 5344, - "paragraph": { - "elements": [ - { - "endIndex": 5338, - "startIndex": 5326, - "textRun": { - "content": "What you’ll ", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 5344, - "startIndex": 5338, - "textRun": { - "content": "learn\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.d2tafm78btb1", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 5326 - }, - { - "endIndex": 5345, - "paragraph": { - "elements": [ - { - "endIndex": 5345, - "startIndex": 5344, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5344 - }, - { - "endIndex": 5418, - "paragraph": { - "bullet": { - "listId": "kix.kic1o5ute4a9", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 5418, - "startIndex": 5345, - "textRun": { - "content": "How to configure the App Store and Play Store with purchasable products.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5345 - }, - { - "endIndex": 5502, - "paragraph": { - "bullet": { - "listId": "kix.kic1o5ute4a9", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 5502, - "startIndex": 5418, - "textRun": { - "content": "How to communicate with the stores to verify purchases and store them in Firestore.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5418 - }, - { - "endIndex": 5539, - "paragraph": { - "bullet": { - "listId": "kix.kic1o5ute4a9", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 5538, - "startIndex": 5502, - "textRun": { - "content": "How to manage purchases in your app.", - "textStyle": {} - } - }, - { - "endIndex": 5539, - "startIndex": 5538, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5502 - }, - { - "endIndex": 5556, - "paragraph": { - "elements": [ - { - "endIndex": 5556, - "startIndex": 5539, - "textRun": { - "content": "What you'll need\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.fj42uleug9t6", - "lineSpacing": 100.0, - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 15.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - } - }, - "startIndex": 5539 - }, - { - "endIndex": 5557, - "paragraph": { - "elements": [ - { - "endIndex": 5557, - "startIndex": 5556, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5556 - }, - { - "endIndex": 5585, - "paragraph": { - "bullet": { - "listId": "kix.y1tmgniuwb75", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 5585, - "startIndex": 5557, - "textRun": { - "content": "Android Studio 4.1 or later\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 5.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 5.0, - "unit": "PT" - } - } - }, - "startIndex": 5557 - }, - { - "endIndex": 5625, - "paragraph": { - "bullet": { - "listId": "kix.y1tmgniuwb75", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 5625, - "startIndex": 5585, - "textRun": { - "content": "Xcode 12 or later (for iOS development)\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 5.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 5.0, - "unit": "PT" - } - } - }, - "startIndex": 5585 - }, - { - "endIndex": 5637, - "paragraph": { - "bullet": { - "listId": "kix.y1tmgniuwb75", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 5636, - "startIndex": 5625, - "textRun": { - "content": "Flutter SDK", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/get-started/install" - }, - "underline": true - } - } - }, - { - "endIndex": 5637, - "startIndex": 5636, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 5.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 5.0, - "unit": "PT" - } - } - }, - "startIndex": 5625 - }, - { - "endIndex": 5638, - "paragraph": { - "elements": [ - { - "endIndex": 5638, - "startIndex": 5637, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5637 - }, - { - "endIndex": 5640, - "paragraph": { - "elements": [ - { - "endIndex": 5639, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 5638 - }, - { - "endIndex": 5640, - "startIndex": 5639, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.pcavc7c2y62c", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 5638 - }, - { - "endIndex": 5675, - "paragraph": { - "elements": [ - { - "endIndex": 5675, - "startIndex": 5640, - "textRun": { - "content": "Set up the development environment\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.1c3bchpiqnrw", - "lineSpacing": 100.0, - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 15.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - } - }, - "startIndex": 5640 - }, - { - "endIndex": 5676, - "paragraph": { - "elements": [ - { - "endIndex": 5676, - "startIndex": 5675, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5675 - }, - { - "endIndex": 5793, - "paragraph": { - "elements": [ - { - "endIndex": 5793, - "startIndex": 5676, - "textRun": { - "content": "To start this codelab, download the code and change the bundle identifier for iOS and the package name for Android.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5676 - }, - { - "endIndex": 5811, - "paragraph": { - "elements": [ - { - "endIndex": 5810, - "startIndex": 5793, - "textRun": { - "content": "Download the code", - "textStyle": {} - } - }, - { - "endIndex": 5811, - "startIndex": 5810, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.i9dbh7csr0w", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 5793 - }, - { - "endIndex": 5892, - "paragraph": { - "elements": [ - { - "endIndex": 5815, - "startIndex": 5811, - "textRun": { - "content": "To c", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 5824, - "startIndex": 5815, - "textRun": { - "content": "lone the ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 5841, - "startIndex": 5824, - "textRun": { - "content": "GitHub repository", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.9098039, - "green": 0.4509804, - "red": 0.101960786 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs" - }, - "underline": true - } - } - }, - { - "endIndex": 5891, - "startIndex": 5841, - "textRun": { - "content": " from the command line, use the following command:", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 5892, - "startIndex": 5891, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 5811 - }, - { - "endIndex": 5963, - "startIndex": 5892, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 5962, - "startIndex": 5893, - "tableCells": [ - { - "content": [ - { - "endIndex": 5962, - "paragraph": { - "elements": [ - { - "endIndex": 5962, - "startIndex": 5895, - "textRun": { - "content": "git clone https://github.com/flutter/codelabs.git flutter-codelabs\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5895 - } - ], - "endIndex": 5962, - "startIndex": 5894, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 26.061865234375, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6035, - "paragraph": { - "elements": [ - { - "endIndex": 5979, - "startIndex": 5963, - "textRun": { - "content": "Or, if you have ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 5991, - "startIndex": 5979, - "textRun": { - "content": "GitHub's cli", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.9098039, - "green": 0.4509804, - "red": 0.101960786 - } - } - }, - "link": { - "url": "https://github.com/cli/cli" - }, - "underline": true - } - } - }, - { - "endIndex": 6034, - "startIndex": 5991, - "textRun": { - "content": " tool installed, use the following command:", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 6035, - "startIndex": 6034, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 5963 - }, - { - "endIndex": 6087, - "startIndex": 6035, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 6086, - "startIndex": 6036, - "tableCells": [ - { - "content": [ - { - "endIndex": 6086, - "paragraph": { - "elements": [ - { - "endIndex": 6086, - "startIndex": 6038, - "textRun": { - "content": "gh repo clone flutter/codelabs flutter-codelabs\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6038 - } - ], - "endIndex": 6086, - "startIndex": 6037, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6267, - "paragraph": { - "elements": [ - { - "endIndex": 6120, - "startIndex": 6087, - "textRun": { - "content": "The sample code is cloned into a ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 6136, - "startIndex": 6120, - "textRun": { - "content": "flutter-codelabs", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6232, - "startIndex": 6136, - "textRun": { - "content": " directory that contains the code for a collection of codelabs. The code for this codelab is in ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 6265, - "startIndex": 6232, - "textRun": { - "content": "flutter-codelabs/in_app_purchases", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6266, - "startIndex": 6265, - "textRun": { - "content": ".", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 6267, - "startIndex": 6266, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 6087 - }, - { - "endIndex": 6493, - "paragraph": { - "elements": [ - { - "endIndex": 6297, - "startIndex": 6267, - "textRun": { - "content": "The directory structure under ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 6330, - "startIndex": 6297, - "textRun": { - "content": "flutter-codelabs/in_app_purchases", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6492, - "startIndex": 6330, - "textRun": { - "content": " contains a series of snapshots of where you should be at the end of each named step. The starter code is in step 0, so locating the matching files is as easy as:", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 6493, - "startIndex": 6492, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 6267 - }, - { - "endIndex": 6542, - "startIndex": 6493, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 6541, - "startIndex": 6494, - "tableCells": [ - { - "content": [ - { - "endIndex": 6541, - "paragraph": { - "elements": [ - { - "endIndex": 6516, - "startIndex": 6496, - "textRun": { - "content": "cd flutter-codelabs/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 6532, - "startIndex": 6516, - "textRun": { - "content": "in_app_purchases", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 6541, - "startIndex": 6532, - "textRun": { - "content": "/step_00\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6496 - } - ], - "endIndex": 6541, - "startIndex": 6495, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6745, - "paragraph": { - "elements": [ - { - "endIndex": 6735, - "startIndex": 6542, - "textRun": { - "content": "If you want to skip forward or see what something should look like after a step, look in the directory named after the step you are interested in. The code of the last step is under the folder ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 6743, - "startIndex": 6735, - "textRun": { - "content": "complete", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6744, - "startIndex": 6743, - "textRun": { - "content": ".", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 6745, - "startIndex": 6744, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 6542 - }, - { - "endIndex": 6772, - "paragraph": { - "elements": [ - { - "endIndex": 6772, - "startIndex": 6745, - "textRun": { - "content": "Set up the starter project\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7fhkdxspeb3e", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 6745 - }, - { - "endIndex": 6773, - "paragraph": { - "elements": [ - { - "endIndex": 6773, - "startIndex": 6772, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6772 - }, - { - "endIndex": 7007, - "paragraph": { - "elements": [ - { - "endIndex": 6803, - "startIndex": 6773, - "textRun": { - "content": "Open the starter project from ", - "textStyle": {} - } - }, - { - "endIndex": 6810, - "startIndex": 6803, - "textRun": { - "content": "step_00", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7007, - "startIndex": 6810, - "textRun": { - "content": " in your favorite IDE. We used Android Studio for the screenshots, but Visual Studio Code is also a great option. With either editor, ensure that the latest Dart and Flutter plugins are installed.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6773 - }, - { - "endIndex": 7008, - "paragraph": { - "elements": [ - { - "endIndex": 7008, - "startIndex": 7007, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7007 - }, - { - "endIndex": 7576, - "paragraph": { - "elements": [ - { - "endIndex": 7457, - "startIndex": 7008, - "textRun": { - "content": "The apps you are going to make need to communicate with the App Store and Play Store to know which products are available and for what price. Every app is identified by a unique ID. For the iOS App Store this is called the bundle identifier and for the Android Play Store this is the application ID. These identifiers are usually made using a reverse domain name notation. For example when making an in app purchase app for flutter.dev we would use ", - "textStyle": {} - } - }, - { - "endIndex": 7482, - "startIndex": 7457, - "textRun": { - "content": "dev.flutter.inapppurchase", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7576, - "startIndex": 7482, - "textRun": { - "content": ". Think of an identifier for your app, you are now going to set that in the project settings.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7008 - }, - { - "endIndex": 7577, - "paragraph": { - "elements": [ - { - "endIndex": 7577, - "startIndex": 7576, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7576 - }, - { - "endIndex": 7622, - "paragraph": { - "elements": [ - { - "endIndex": 7622, - "startIndex": 7577, - "textRun": { - "content": "First, set up the bundle identifier for iOS.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7577 - }, - { - "endIndex": 7623, - "paragraph": { - "elements": [ - { - "endIndex": 7623, - "startIndex": 7622, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7622 - }, - { - "endIndex": 7745, - "paragraph": { - "elements": [ - { - "endIndex": 7698, - "startIndex": 7623, - "textRun": { - "content": "With the project open in Android Studio, right-click the iOS folder, click ", - "textStyle": {} - } - }, - { - "endIndex": 7705, - "startIndex": 7698, - "textRun": { - "content": "Flutter", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 7745, - "startIndex": 7705, - "textRun": { - "content": ", and open the module in the Xcode app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7623 - }, - { - "endIndex": 7746, - "paragraph": { - "elements": [ - { - "endIndex": 7746, - "startIndex": 7745, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7745 - }, - { - "endIndex": 7749, - "paragraph": { - "elements": [ - { - "endIndex": 7747, - "inlineObjectElement": { - "inlineObjectId": "kix.q6qr0div57d4", - "textStyle": {} - }, - "startIndex": 7746 - }, - { - "endIndex": 7749, - "startIndex": 7747, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7746 - }, - { - "endIndex": 7750, - "paragraph": { - "elements": [ - { - "endIndex": 7750, - "startIndex": 7749, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7749 - }, - { - "endIndex": 8063, - "paragraph": { - "elements": [ - { - "endIndex": 7783, - "startIndex": 7750, - "textRun": { - "content": "In Xcode’s folder structure, the ", - "textStyle": {} - } - }, - { - "endIndex": 7797, - "startIndex": 7783, - "textRun": { - "content": "Runner project", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 7821, - "startIndex": 7797, - "textRun": { - "content": " is at the top, and the ", - "textStyle": {} - } - }, - { - "endIndex": 7828, - "startIndex": 7821, - "textRun": { - "content": "Flutter", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 7830, - "startIndex": 7828, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 7836, - "startIndex": 7830, - "textRun": { - "content": "Runner", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 7842, - "startIndex": 7836, - "textRun": { - "content": ", and ", - "textStyle": {} - } - }, - { - "endIndex": 7850, - "startIndex": 7842, - "textRun": { - "content": "Products", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 7904, - "startIndex": 7850, - "textRun": { - "content": " targets are beneath the Runner project. Double-click ", - "textStyle": {} - } - }, - { - "endIndex": 7910, - "startIndex": 7904, - "textRun": { - "content": "Runner", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 7952, - "startIndex": 7910, - "textRun": { - "content": " to edit your project settings, and click ", - "textStyle": {} - } - }, - { - "endIndex": 7974, - "startIndex": 7952, - "textRun": { - "content": "Signing & Capabilities", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 8022, - "startIndex": 7974, - "textRun": { - "content": ". Enter the bundle identifier you’ve just chosen", - "textStyle": {} - } - }, - { - "endIndex": 8033, - "startIndex": 8022, - "textRun": { - "content": " under the ", - "textStyle": {} - } - }, - { - "endIndex": 8037, - "startIndex": 8033, - "textRun": { - "content": "Team", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 8046, - "startIndex": 8037, - "textRun": { - "content": " field to", - "textStyle": {} - } - }, - { - "endIndex": 8063, - "startIndex": 8046, - "textRun": { - "content": " set your team. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7750 - }, - { - "endIndex": 8064, - "paragraph": { - "elements": [ - { - "endIndex": 8064, - "startIndex": 8063, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8063 - }, - { - "endIndex": 8066, - "paragraph": { - "elements": [ - { - "endIndex": 8065, - "inlineObjectElement": { - "inlineObjectId": "kix.8o06if5zrj4p", - "textStyle": {} - }, - "startIndex": 8064 - }, - { - "endIndex": 8066, - "startIndex": 8065, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8064 - }, - { - "endIndex": 8067, - "paragraph": { - "elements": [ - { - "endIndex": 8067, - "startIndex": 8066, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8066 - }, - { - "endIndex": 8545, - "paragraph": { - "elements": [ - { - "endIndex": 8180, - "startIndex": 8067, - "textRun": { - "content": "You can now close Xcode and go back to Android Studio to finish the configuration for Android. To do so open the ", - "textStyle": {} - } - }, - { - "endIndex": 8192, - "startIndex": 8180, - "textRun": { - "content": "build.gradle", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8204, - "startIndex": 8192, - "textRun": { - "content": " file under ", - "textStyle": {} - } - }, - { - "endIndex": 8215, - "startIndex": 8204, - "textRun": { - "content": "android/app", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8216, - "startIndex": 8215, - "textRun": { - "content": ",", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 8233, - "startIndex": 8216, - "textRun": { - "content": " and change your ", - "textStyle": {} - } - }, - { - "endIndex": 8246, - "startIndex": 8233, - "textRun": { - "content": "applicationId", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8346, - "startIndex": 8246, - "textRun": { - "content": " (on line 37 in the screenshot below) to the application ID, the same as the iOS bundle identifier.", - "textStyle": {} - } - }, - { - "endIndex": 8545, - "startIndex": 8346, - "textRun": { - "content": " Note that the IDs for the iOS and Android stores don’t have to be identical, however keeping them identical is less error prone and therefore in this codelab we will also use identical identifiers.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8067 - }, - { - "endIndex": 8546, - "paragraph": { - "elements": [ - { - "endIndex": 8546, - "startIndex": 8545, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8545 - }, - { - "endIndex": 8548, - "paragraph": { - "elements": [ - { - "endIndex": 8547, - "inlineObjectElement": { - "inlineObjectId": "kix.mz7oj06j8ynp", - "textStyle": {} - }, - "startIndex": 8546 - }, - { - "endIndex": 8548, - "startIndex": 8547, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8546 - }, - { - "endIndex": 8549, - "paragraph": { - "elements": [ - { - "endIndex": 8549, - "startIndex": 8548, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8548 - }, - { - "endIndex": 8550, - "paragraph": { - "elements": [ - { - "endIndex": 8550, - "startIndex": 8549, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8549 - }, - { - "endIndex": 8551, - "paragraph": { - "elements": [ - { - "endIndex": 8551, - "startIndex": 8550, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8550 - }, - { - "endIndex": 8552, - "paragraph": { - "elements": [ - { - "endIndex": 8552, - "startIndex": 8551, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8551 - }, - { - "endIndex": 8553, - "paragraph": { - "elements": [ - { - "endIndex": 8553, - "startIndex": 8552, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8552 - }, - { - "endIndex": 8554, - "paragraph": { - "elements": [ - { - "endIndex": 8554, - "startIndex": 8553, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8553 - }, - { - "endIndex": 8556, - "paragraph": { - "elements": [ - { - "endIndex": 8555, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 8554 - }, - { - "endIndex": 8556, - "startIndex": 8555, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ldu04snwnjcy", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 8554 - }, - { - "endIndex": 8575, - "paragraph": { - "elements": [ - { - "endIndex": 8575, - "startIndex": 8556, - "textRun": { - "content": "Install the plugin\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.23gzwqcjonei", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 8556 - }, - { - "endIndex": 8576, - "paragraph": { - "elements": [ - { - "endIndex": 8576, - "startIndex": 8575, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8575 - }, - { - "endIndex": 8647, - "paragraph": { - "elements": [ - { - "endIndex": 8647, - "startIndex": 8576, - "textRun": { - "content": "In this part of the codelab you’ll install the in_app_purchase plugin.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8576 - }, - { - "endIndex": 8673, - "paragraph": { - "elements": [ - { - "endIndex": 8673, - "startIndex": 8647, - "textRun": { - "content": "Add dependency in pubspec\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.va9fr09ola34", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 8647 - }, - { - "endIndex": 8674, - "paragraph": { - "elements": [ - { - "endIndex": 8674, - "startIndex": 8673, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8673 - }, - { - "endIndex": 8773, - "paragraph": { - "elements": [ - { - "endIndex": 8678, - "startIndex": 8674, - "textRun": { - "content": "Add ", - "textStyle": {} - } - }, - { - "endIndex": 8693, - "startIndex": 8678, - "textRun": { - "content": "in_app_purchase", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8719, - "startIndex": 8693, - "textRun": { - "content": " to the pubspec by adding ", - "textStyle": {} - } - }, - { - "endIndex": 8734, - "startIndex": 8719, - "textRun": { - "content": "in_app_purchase", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8773, - "startIndex": 8734, - "textRun": { - "content": " to the dependencies in your pubspec: \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8674 - }, - { - "endIndex": 8774, - "paragraph": { - "elements": [ - { - "endIndex": 8774, - "startIndex": 8773, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8773 - }, - { - "endIndex": 8821, - "startIndex": 8774, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 8820, - "startIndex": 8775, - "tableCells": [ - { - "content": [ - { - "endIndex": 8786, - "paragraph": { - "elements": [ - { - "endIndex": 8786, - "startIndex": 8777, - "textRun": { - "content": "$ cd app\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8777 - }, - { - "endIndex": 8820, - "paragraph": { - "elements": [ - { - "endIndex": 8820, - "startIndex": 8786, - "textRun": { - "content": "$ flutter pub add in_app_purchase\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8786 - } - ], - "endIndex": 8820, - "startIndex": 8776, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 8822, - "paragraph": { - "elements": [ - { - "endIndex": 8822, - "startIndex": 8821, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8821 - }, - { - "endIndex": 8835, - "paragraph": { - "elements": [ - { - "endIndex": 8834, - "startIndex": 8822, - "textRun": { - "content": "pubspec.yaml", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_07/app/pubspec.yaml#L23-L29" - }, - "underline": true - } - } - }, - { - "endIndex": 8835, - "startIndex": 8834, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.5k996sxdajot", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 8822 - }, - { - "endIndex": 9039, - "startIndex": 8835, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 9038, - "startIndex": 8836, - "tableCells": [ - { - "content": [ - { - "endIndex": 8852, - "paragraph": { - "elements": [ - { - "endIndex": 8852, - "startIndex": 8838, - "textRun": { - "content": "dependencies:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8838 - }, - { - "endIndex": 8857, - "paragraph": { - "elements": [ - { - "endIndex": 8857, - "startIndex": 8852, - "textRun": { - "content": " ..\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8852 - }, - { - "endIndex": 8883, - "paragraph": { - "elements": [ - { - "endIndex": 8883, - "startIndex": 8857, - "textRun": { - "content": " cloud_firestore: ^4.0.3\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8857 - }, - { - "endIndex": 8907, - "paragraph": { - "elements": [ - { - "endIndex": 8907, - "startIndex": 8883, - "textRun": { - "content": " firebase_auth: ^4.2.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8883 - }, - { - "endIndex": 8931, - "paragraph": { - "elements": [ - { - "endIndex": 8931, - "startIndex": 8907, - "textRun": { - "content": " firebase_core: ^2.5.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8907 - }, - { - "endIndex": 8956, - "paragraph": { - "elements": [ - { - "endIndex": 8956, - "startIndex": 8931, - "textRun": { - "content": " google_sign_in: ^6.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8931 - }, - { - "endIndex": 8972, - "paragraph": { - "elements": [ - { - "endIndex": 8972, - "startIndex": 8956, - "textRun": { - "content": " http: ^0.13.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8956 - }, - { - "endIndex": 8998, - "paragraph": { - "elements": [ - { - "endIndex": 8998, - "startIndex": 8972, - "textRun": { - "content": " in_app_purchase: ^3.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8972 - }, - { - "endIndex": 9014, - "paragraph": { - "elements": [ - { - "endIndex": 9014, - "startIndex": 8998, - "textRun": { - "content": " intl: ^0.18.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8998 - }, - { - "endIndex": 9033, - "paragraph": { - "elements": [ - { - "endIndex": 9033, - "startIndex": 9014, - "textRun": { - "content": " provider: ^6.0.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9014 - }, - { - "endIndex": 9038, - "paragraph": { - "elements": [ - { - "endIndex": 9038, - "startIndex": 9033, - "textRun": { - "content": " ..\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9033 - } - ], - "endIndex": 9038, - "startIndex": 8837, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 9040, - "paragraph": { - "elements": [ - { - "endIndex": 9040, - "startIndex": 9039, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9039 - }, - { - "endIndex": 9123, - "paragraph": { - "elements": [ - { - "endIndex": 9046, - "startIndex": 9040, - "textRun": { - "content": "Click ", - "textStyle": {} - } - }, - { - "endIndex": 9053, - "startIndex": 9046, - "textRun": { - "content": "pub get", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 9085, - "startIndex": 9053, - "textRun": { - "content": " to download the package or run ", - "textStyle": {} - } - }, - { - "endIndex": 9100, - "startIndex": 9085, - "textRun": { - "content": "flutter pub get", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9121, - "startIndex": 9100, - "textRun": { - "content": " in the command line.", - "textStyle": {} - } - }, - { - "endIndex": 9122, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 9121 - }, - { - "endIndex": 9123, - "startIndex": 9122, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9040 - }, - { - "endIndex": 9144, - "paragraph": { - "elements": [ - { - "endIndex": 9144, - "startIndex": 9123, - "textRun": { - "content": "Set up the App Store\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.qrnxh16sdve", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 9123 - }, - { - "endIndex": 9145, - "paragraph": { - "elements": [ - { - "endIndex": 9145, - "startIndex": 9144, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9144 - }, - { - "endIndex": 9454, - "paragraph": { - "elements": [ - { - "endIndex": 9415, - "startIndex": 9145, - "textRun": { - "content": "To set up in-app purchases and test them on iOS, you need to create a new app in the App Store and create purchasable products there. You don’t have to publish anything or send the app to Apple for review. You need a developer account to do this. If you don’t have one, ", - "textStyle": {} - } - }, - { - "endIndex": 9452, - "startIndex": 9415, - "textRun": { - "content": "enroll in the Apple developer program", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://developer.apple.com/programs/enroll/" - }, - "underline": true - } - } - }, - { - "endIndex": 9454, - "startIndex": 9452, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9145 - }, - { - "endIndex": 9475, - "paragraph": { - "elements": [ - { - "endIndex": 9475, - "startIndex": 9454, - "textRun": { - "content": "Paid Apps Agreements\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ry9305h98tp", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 9454 - }, - { - "endIndex": 9476, - "paragraph": { - "elements": [ - { - "endIndex": 9476, - "startIndex": 9475, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9475 - }, - { - "endIndex": 9661, - "paragraph": { - "elements": [ - { - "endIndex": 9585, - "startIndex": 9476, - "textRun": { - "content": "To use in-app purchases, you also need to have an active agreement for paid apps in App Store Connect. Go to ", - "textStyle": {} - } - }, - { - "endIndex": 9619, - "startIndex": 9585, - "textRun": { - "content": "https://appstoreconnect.apple.com/", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://appstoreconnect.apple.com/" - }, - "underline": true - } - } - }, - { - "endIndex": 9620, - "startIndex": 9619, - "textRun": { - "content": ",", - "textStyle": {} - } - }, - { - "endIndex": 9631, - "startIndex": 9620, - "textRun": { - "content": " and click ", - "textStyle": {} - } - }, - { - "endIndex": 9659, - "startIndex": 9631, - "textRun": { - "content": "Agreements, Tax, and Banking", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 9660, - "startIndex": 9659, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 9661, - "startIndex": 9660, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9476 - }, - { - "endIndex": 9662, - "paragraph": { - "elements": [ - { - "endIndex": 9662, - "startIndex": 9661, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9661 - }, - { - "endIndex": 9664, - "paragraph": { - "elements": [ - { - "endIndex": 9663, - "inlineObjectElement": { - "inlineObjectId": "kix.bezjpjdxf6ua", - "textStyle": {} - }, - "startIndex": 9662 - }, - { - "endIndex": 9664, - "startIndex": 9663, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9662 - }, - { - "endIndex": 9665, - "paragraph": { - "elements": [ - { - "endIndex": 9665, - "startIndex": 9664, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9664 - }, - { - "endIndex": 9881, - "paragraph": { - "elements": [ - { - "endIndex": 9881, - "startIndex": 9665, - "textRun": { - "content": "You will see agreements here for free and paid apps. The status of free apps should be active, and the status for paid apps is new. Make sure that you view the terms, accept them, and enter all required information.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9665 - }, - { - "endIndex": 9882, - "paragraph": { - "elements": [ - { - "endIndex": 9882, - "startIndex": 9881, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9881 - }, - { - "endIndex": 9884, - "paragraph": { - "elements": [ - { - "endIndex": 9883, - "inlineObjectElement": { - "inlineObjectId": "kix.x8fkh4sa1hxv", - "textStyle": {} - }, - "startIndex": 9882 - }, - { - "endIndex": 9884, - "startIndex": 9883, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9882 - }, - { - "endIndex": 10061, - "paragraph": { - "elements": [ - { - "endIndex": 10061, - "startIndex": 9884, - "textRun": { - "content": "When everything is set correctly, the status for paid apps will be active. This is very important because you won’t be able to try in-app purchases without an active agreement.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9884 - }, - { - "endIndex": 10062, - "paragraph": { - "elements": [ - { - "endIndex": 10062, - "startIndex": 10061, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10061 - }, - { - "endIndex": 10064, - "paragraph": { - "elements": [ - { - "endIndex": 10063, - "inlineObjectElement": { - "inlineObjectId": "kix.gc7gqme3obux", - "textStyle": {} - }, - "startIndex": 10062 - }, - { - "endIndex": 10064, - "startIndex": 10063, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10062 - }, - { - "endIndex": 10065, - "paragraph": { - "elements": [ - { - "endIndex": 10065, - "startIndex": 10064, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10064 - }, - { - "endIndex": 10082, - "paragraph": { - "elements": [ - { - "endIndex": 10082, - "startIndex": 10065, - "textRun": { - "content": " Register App ID\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.dzz6cf94qup9", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 10065 - }, - { - "endIndex": 10137, - "paragraph": { - "elements": [ - { - "endIndex": 10137, - "startIndex": 10082, - "textRun": { - "content": "Create a new identifier in the Apple developer portal.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10082 - }, - { - "endIndex": 10139, - "paragraph": { - "elements": [ - { - "endIndex": 10138, - "inlineObjectElement": { - "inlineObjectId": "kix.9einmm88jss2", - "textStyle": {} - }, - "startIndex": 10137 - }, - { - "endIndex": 10139, - "startIndex": 10138, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10137 - }, - { - "endIndex": 10140, - "paragraph": { - "elements": [ - { - "endIndex": 10140, - "startIndex": 10139, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10139 - }, - { - "endIndex": 10155, - "paragraph": { - "elements": [ - { - "endIndex": 10155, - "startIndex": 10140, - "textRun": { - "content": "Choose App IDs\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10140 - }, - { - "endIndex": 10157, - "paragraph": { - "elements": [ - { - "endIndex": 10156, - "inlineObjectElement": { - "inlineObjectId": "kix.m510bdgwtm2c", - "textStyle": {} - }, - "startIndex": 10155 - }, - { - "endIndex": 10157, - "startIndex": 10156, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10155 - }, - { - "endIndex": 10158, - "paragraph": { - "elements": [ - { - "endIndex": 10158, - "startIndex": 10157, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10157 - }, - { - "endIndex": 10169, - "paragraph": { - "elements": [ - { - "endIndex": 10169, - "startIndex": 10158, - "textRun": { - "content": "Choose App\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10158 - }, - { - "endIndex": 10171, - "paragraph": { - "elements": [ - { - "endIndex": 10170, - "inlineObjectElement": { - "inlineObjectId": "kix.71g2qymec6v9", - "textStyle": {} - }, - "startIndex": 10169 - }, - { - "endIndex": 10171, - "startIndex": 10170, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10169 - }, - { - "endIndex": 10172, - "paragraph": { - "elements": [ - { - "endIndex": 10172, - "startIndex": 10171, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10171 - }, - { - "endIndex": 10289, - "paragraph": { - "elements": [ - { - "endIndex": 10289, - "startIndex": 10172, - "textRun": { - "content": "Provide some description and set the bundle ID to match the bundle ID to the same value as previously set in XCode. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10172 - }, - { - "endIndex": 10291, - "paragraph": { - "elements": [ - { - "endIndex": 10290, - "inlineObjectElement": { - "inlineObjectId": "kix.ed6mdmveygi3", - "textStyle": {} - }, - "startIndex": 10289 - }, - { - "endIndex": 10291, - "startIndex": 10290, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10289 - }, - { - "endIndex": 10292, - "paragraph": { - "elements": [ - { - "endIndex": 10292, - "startIndex": 10291, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10291 - }, - { - "endIndex": 10377, - "paragraph": { - "elements": [ - { - "endIndex": 10352, - "startIndex": 10292, - "textRun": { - "content": "For more guidance about how to create a new app ID, see the ", - "textStyle": {} - } - }, - { - "endIndex": 10374, - "startIndex": 10352, - "textRun": { - "content": "Developer Account Help", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://help.apple.com/developer-account/#/dev1b35d6f83" - }, - "underline": true - } - } - }, - { - "endIndex": 10377, - "startIndex": 10374, - "textRun": { - "content": " .\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10292 - }, - { - "endIndex": 10378, - "paragraph": { - "elements": [ - { - "endIndex": 10378, - "startIndex": 10377, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10377 - }, - { - "endIndex": 10397, - "paragraph": { - "elements": [ - { - "endIndex": 10397, - "startIndex": 10378, - "textRun": { - "content": "Creating a new app\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.vexv6ix15uw0", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 10378 - }, - { - "endIndex": 10398, - "paragraph": { - "elements": [ - { - "endIndex": 10398, - "startIndex": 10397, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10397 - }, - { - "endIndex": 10473, - "paragraph": { - "elements": [ - { - "endIndex": 10473, - "startIndex": 10398, - "textRun": { - "content": "Create a new app in App Store Connect with your unique bundle identifier. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10398 - }, - { - "endIndex": 10475, - "paragraph": { - "elements": [ - { - "endIndex": 10474, - "inlineObjectElement": { - "inlineObjectId": "kix.qmpm4klwgkv8", - "textStyle": {} - }, - "startIndex": 10473 - }, - { - "endIndex": 10475, - "startIndex": 10474, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10473 - }, - { - "endIndex": 10477, - "paragraph": { - "elements": [ - { - "endIndex": 10476, - "inlineObjectElement": { - "inlineObjectId": "kix.wz46ijx4irp7", - "textStyle": {} - }, - "startIndex": 10475 - }, - { - "endIndex": 10477, - "startIndex": 10476, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10475 - }, - { - "endIndex": 10478, - "paragraph": { - "elements": [ - { - "endIndex": 10478, - "startIndex": 10477, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10477 - }, - { - "endIndex": 10479, - "paragraph": { - "elements": [ - { - "endIndex": 10479, - "startIndex": 10478, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10478 - }, - { - "endIndex": 10582, - "paragraph": { - "elements": [ - { - "endIndex": 10558, - "startIndex": 10479, - "textRun": { - "content": "For more guidance about how to create a new app and manage agreements, see the ", - "textStyle": {} - } - }, - { - "endIndex": 10580, - "startIndex": 10558, - "textRun": { - "content": "App Store Connect help", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://help.apple.com/app-store-connect/" - }, - "underline": true - } - } - }, - { - "endIndex": 10582, - "startIndex": 10580, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10479 - }, - { - "endIndex": 10583, - "paragraph": { - "elements": [ - { - "endIndex": 10583, - "startIndex": 10582, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10582 - }, - { - "endIndex": 10936, - "paragraph": { - "elements": [ - { - "endIndex": 10813, - "startIndex": 10583, - "textRun": { - "content": "To test the in-app purchases, you need a sandbox test user. This test user shouldn’t be connected to iTunes—it’s only used for testing in-app purchases. You can’t use an email address that is already used for an Apple account. In ", - "textStyle": {} - } - }, - { - "endIndex": 10829, - "startIndex": 10813, - "textRun": { - "content": "Users and Access", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 10837, - "startIndex": 10829, - "textRun": { - "content": ", go to ", - "textStyle": {} - } - }, - { - "endIndex": 10844, - "startIndex": 10837, - "textRun": { - "content": "Testers", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 10851, - "startIndex": 10844, - "textRun": { - "content": " under ", - "textStyle": {} - } - }, - { - "endIndex": 10858, - "startIndex": 10851, - "textRun": { - "content": "Sandbox", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 10936, - "startIndex": 10858, - "textRun": { - "content": " to create a new sandbox account or to manage the existing sandbox Apple IDs.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10583 - }, - { - "endIndex": 10937, - "paragraph": { - "elements": [ - { - "endIndex": 10937, - "startIndex": 10936, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10936 - }, - { - "endIndex": 11283, - "startIndex": 10937, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 11282, - "startIndex": 10938, - "tableCells": [ - { - "content": [ - { - "endIndex": 11282, - "paragraph": { - "elements": [ - { - "endIndex": 10946, - "startIndex": 10940, - "textRun": { - "content": "Note: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 11049, - "startIndex": 10946, - "textRun": { - "content": "If you are using a Gmail account you can create a task-specific email address. For example, if you own ", - "textStyle": {} - } - }, - { - "endIndex": 11062, - "startIndex": 11049, - "textRun": { - "content": "foo@gmail.com", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "mailto:foo@gmail.com" - }, - "underline": true - } - } - }, - { - "endIndex": 11115, - "startIndex": 11062, - "textRun": { - "content": " you can create an account with the following e-mail ", - "textStyle": {} - } - }, - { - "endIndex": 11136, - "startIndex": 11115, - "textRun": { - "content": "foo+sandbox@gmail.com", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "mailto:foo+sandbox@gmail.com" - }, - "underline": true - } - } - }, - { - "endIndex": 11191, - "startIndex": 11136, - "textRun": { - "content": ". The email for this account will still be received in ", - "textStyle": {} - } - }, - { - "endIndex": 11204, - "startIndex": 11191, - "textRun": { - "content": "foo@gmail.com", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "mailto:foo@gmail.com" - }, - "underline": true - } - } - }, - { - "endIndex": 11248, - "startIndex": 11204, - "textRun": { - "content": " inbox. You can read more about this in the ", - "textStyle": {} - } - }, - { - "endIndex": 11280, - "startIndex": 11248, - "textRun": { - "content": "Google Workspace Learning Center", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://support.google.com/a/users/answer/9308648" - }, - "underline": true - } - } - }, - { - "endIndex": 11282, - "startIndex": 11280, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10940 - } - ], - "endIndex": 11282, - "startIndex": 10939, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 68.25, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 11284, - "paragraph": { - "elements": [ - { - "endIndex": 11284, - "startIndex": 11283, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11283 - }, - { - "endIndex": 11286, - "paragraph": { - "elements": [ - { - "endIndex": 11285, - "inlineObjectElement": { - "inlineObjectId": "kix.qu1stbpqly5r", - "textStyle": {} - }, - "startIndex": 11284 - }, - { - "endIndex": 11286, - "startIndex": 11285, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11284 - }, - { - "endIndex": 11390, - "paragraph": { - "elements": [ - { - "endIndex": 11350, - "startIndex": 11286, - "textRun": { - "content": "Now you can set up your sandbox user on your iPhone by going to ", - "textStyle": {} - } - }, - { - "endIndex": 11390, - "startIndex": 11350, - "textRun": { - "content": "Settings > App Store > Sandbox-account.\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11286 - }, - { - "endIndex": 11391, - "paragraph": { - "elements": [ - { - "endIndex": 11391, - "startIndex": 11390, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11390 - }, - { - "endIndex": 11398, - "paragraph": { - "elements": [ - { - "endIndex": 11392, - "inlineObjectElement": { - "inlineObjectId": "kix.qu7litrheizj", - "textStyle": { - "bold": true - } - }, - "startIndex": 11391 - }, - { - "endIndex": 11396, - "startIndex": 11392, - "textRun": { - "content": " ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 11397, - "inlineObjectElement": { - "inlineObjectId": "kix.qp719ylpm6v9", - "textStyle": { - "bold": true - } - }, - "startIndex": 11396 - }, - { - "endIndex": 11398, - "startIndex": 11397, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11391 - }, - { - "endIndex": 11432, - "paragraph": { - "elements": [ - { - "endIndex": 11432, - "startIndex": 11398, - "textRun": { - "content": "Configuring your in-app purchases\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.gb01agmg3h15", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 11398 - }, - { - "endIndex": 11433, - "paragraph": { - "elements": [ - { - "endIndex": 11433, - "startIndex": 11432, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11432 - }, - { - "endIndex": 11483, - "paragraph": { - "elements": [ - { - "endIndex": 11483, - "startIndex": 11433, - "textRun": { - "content": "Now you’ll configure the three purchasable items:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11433 - }, - { - "endIndex": 11484, - "paragraph": { - "elements": [ - { - "endIndex": 11484, - "startIndex": 11483, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11483 - }, - { - "endIndex": 11635, - "paragraph": { - "bullet": { - "listId": "kix.y1airoxi6fpx", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 11502, - "startIndex": 11484, - "textRun": { - "content": "dash_consumable_2k", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11635, - "startIndex": 11502, - "textRun": { - "content": ": A consumable purchase that can be purchased many times over, which grants the user 2000 Dashes (the in-app currency) per purchase.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11484 - }, - { - "endIndex": 11780, - "paragraph": { - "bullet": { - "listId": "kix.y1airoxi6fpx", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 11650, - "startIndex": 11635, - "textRun": { - "content": "dash_upgrade_3d", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11780, - "startIndex": 11650, - "textRun": { - "content": ": A non-consumable “upgrade” purchase that can only be purchased once, and gives the user a cosmetically different Dash to click.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11635 - }, - { - "endIndex": 11912, - "paragraph": { - "bullet": { - "listId": "kix.y1airoxi6fpx", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 11805, - "startIndex": 11780, - "textRun": { - "content": "dash_subscription_doubler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11912, - "startIndex": 11805, - "textRun": { - "content": ": A subscription that grants the user twice as many Dashes per click for the duration of the subscription.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11780 - }, - { - "endIndex": 11914, - "paragraph": { - "elements": [ - { - "endIndex": 11913, - "inlineObjectElement": { - "inlineObjectId": "kix.yg4ec5m6jurg", - "textStyle": {} - }, - "startIndex": 11912 - }, - { - "endIndex": 11914, - "startIndex": 11913, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11912 - }, - { - "endIndex": 11915, - "paragraph": { - "elements": [ - { - "endIndex": 11915, - "startIndex": 11914, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11914 - }, - { - "endIndex": 11948, - "paragraph": { - "elements": [ - { - "endIndex": 11921, - "startIndex": 11915, - "textRun": { - "content": "Go to ", - "textStyle": {} - } - }, - { - "endIndex": 11946, - "startIndex": 11921, - "textRun": { - "content": "In-App Purchases > Manage", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 11948, - "startIndex": 11946, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11915 - }, - { - "endIndex": 12001, - "paragraph": { - "elements": [ - { - "endIndex": 12001, - "startIndex": 11948, - "textRun": { - "content": "Create your in-app purchases with the specified IDs:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11948 - }, - { - "endIndex": 12044, - "paragraph": { - "bullet": { - "listId": "kix.a0afkqdhia6w", - "nestingLevel": 1, - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 12008, - "startIndex": 12001, - "textRun": { - "content": "Set up ", - "textStyle": {} - } - }, - { - "endIndex": 12026, - "startIndex": 12008, - "textRun": { - "content": "dash_consumable_2k", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12032, - "startIndex": 12026, - "textRun": { - "content": " as a ", - "textStyle": {} - } - }, - { - "endIndex": 12042, - "startIndex": 12032, - "textRun": { - "content": "Consumable", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 12044, - "startIndex": 12042, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12001 - }, - { - "endIndex": 12303, - "paragraph": { - "elements": [ - { - "endIndex": 12048, - "startIndex": 12044, - "textRun": { - "content": "Use ", - "textStyle": {} - } - }, - { - "endIndex": 12066, - "startIndex": 12048, - "textRun": { - "content": "dash_consumable_2k", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12067, - "startIndex": 12066, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 12155, - "startIndex": 12067, - "textRun": { - "content": "as the Product ID. The reference name is only used in app store connect, just set it to ", - "textStyle": {} - } - }, - { - "endIndex": 12173, - "startIndex": 12155, - "textRun": { - "content": "dash consumable 2k", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12237, - "startIndex": 12173, - "textRun": { - "content": " and add your localizations for the purchase. Call the purchase ", - "textStyle": {} - } - }, - { - "endIndex": 12257, - "startIndex": 12237, - "textRun": { - "content": "Spring is in the air", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12263, - "startIndex": 12257, - "textRun": { - "content": " with ", - "textStyle": {} - } - }, - { - "endIndex": 12282, - "startIndex": 12263, - "textRun": { - "content": "2000 dashes fly out", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12301, - "startIndex": 12282, - "textRun": { - "content": " as the description", - "textStyle": {} - } - }, - { - "endIndex": 12303, - "startIndex": 12301, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 72.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12044 - }, - { - "endIndex": 12305, - "paragraph": { - "elements": [ - { - "endIndex": 12304, - "inlineObjectElement": { - "inlineObjectId": "kix.5vhpoytm1398", - "textStyle": {} - }, - "startIndex": 12303 - }, - { - "endIndex": 12305, - "startIndex": 12304, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 72.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12303 - }, - { - "endIndex": 12349, - "paragraph": { - "bullet": { - "listId": "kix.a0afkqdhia6w", - "nestingLevel": 1, - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 12312, - "startIndex": 12305, - "textRun": { - "content": "Set up ", - "textStyle": {} - } - }, - { - "endIndex": 12327, - "startIndex": 12312, - "textRun": { - "content": "dash_upgrade_3d", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12333, - "startIndex": 12327, - "textRun": { - "content": " as a ", - "textStyle": {} - } - }, - { - "endIndex": 12347, - "startIndex": 12333, - "textRun": { - "content": "Non-consumable", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 12349, - "startIndex": 12347, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12305 - }, - { - "endIndex": 12562, - "paragraph": { - "elements": [ - { - "endIndex": 12353, - "startIndex": 12349, - "textRun": { - "content": "Use ", - "textStyle": {} - } - }, - { - "endIndex": 12368, - "startIndex": 12353, - "textRun": { - "content": "dash_upgrade_3d", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12414, - "startIndex": 12368, - "textRun": { - "content": " as the Product ID. Set the reference name to ", - "textStyle": {} - } - }, - { - "endIndex": 12429, - "startIndex": 12414, - "textRun": { - "content": "dash upgrade 3d", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12493, - "startIndex": 12429, - "textRun": { - "content": " and add your localizations for the purchase. Call the purchase ", - "textStyle": {} - } - }, - { - "endIndex": 12500, - "startIndex": 12493, - "textRun": { - "content": "3D Dash", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12506, - "startIndex": 12500, - "textRun": { - "content": " with ", - "textStyle": {} - } - }, - { - "endIndex": 12541, - "startIndex": 12506, - "textRun": { - "content": "Brings your dash back to the future", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12561, - "startIndex": 12541, - "textRun": { - "content": " as the description.", - "textStyle": {} - } - }, - { - "endIndex": 12562, - "startIndex": 12561, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 72.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12349 - }, - { - "endIndex": 12564, - "paragraph": { - "elements": [ - { - "endIndex": 12563, - "inlineObjectElement": { - "inlineObjectId": "kix.6pb13kk3wfit", - "textStyle": {} - }, - "startIndex": 12562 - }, - { - "endIndex": 12564, - "startIndex": 12563, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 72.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12562 - }, - { - "endIndex": 12631, - "paragraph": { - "bullet": { - "listId": "kix.a0afkqdhia6w", - "nestingLevel": 1, - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 12571, - "startIndex": 12564, - "textRun": { - "content": "Set up ", - "textStyle": {} - } - }, - { - "endIndex": 12596, - "startIndex": 12571, - "textRun": { - "content": "dash_subscription_doubler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12603, - "startIndex": 12596, - "textRun": { - "content": " as an ", - "textStyle": {} - } - }, - { - "endIndex": 12629, - "startIndex": 12603, - "textRun": { - "content": "Auto-renewing subscription", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 12631, - "startIndex": 12629, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12564 - }, - { - "endIndex": 12738, - "paragraph": { - "elements": [ - { - "endIndex": 12738, - "startIndex": 12631, - "textRun": { - "content": "The flow for subscriptions is a bit different. First you’ll have to set the Reference Name and Product ID:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 72.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12631 - }, - { - "endIndex": 12740, - "paragraph": { - "elements": [ - { - "endIndex": 12739, - "inlineObjectElement": { - "inlineObjectId": "kix.1ewb15mdsw1y", - "textStyle": {} - }, - "startIndex": 12738 - }, - { - "endIndex": 12740, - "startIndex": 12739, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 72.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12738 - }, - { - "endIndex": 13004, - "paragraph": { - "elements": [ - { - "endIndex": 12989, - "startIndex": 12740, - "textRun": { - "content": "Next, you have to create a subscription group. When multiple subscriptions are part of the same group, a user can only subscribe to one of these at the same time, but can easily upgrade or downgrade between these subscriptions. Just call this group ", - "textStyle": {} - } - }, - { - "endIndex": 13002, - "startIndex": 12989, - "textRun": { - "content": "subscriptions", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13004, - "startIndex": 13002, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 72.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12740 - }, - { - "endIndex": 13006, - "paragraph": { - "elements": [ - { - "endIndex": 13005, - "inlineObjectElement": { - "inlineObjectId": "kix.chh2m1xhxh1i", - "textStyle": {} - }, - "startIndex": 13004 - }, - { - "endIndex": 13006, - "startIndex": 13005, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 72.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13004 - }, - { - "endIndex": 13156, - "paragraph": { - "elements": [ - { - "endIndex": 13090, - "startIndex": 13006, - "textRun": { - "content": "Next, enter the subscription duration and the localizations. Name this subscription ", - "textStyle": {} - } - }, - { - "endIndex": 13100, - "startIndex": 13090, - "textRun": { - "content": "Jet Engine", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13122, - "startIndex": 13100, - "textRun": { - "content": " with the description ", - "textStyle": {} - } - }, - { - "endIndex": 13141, - "startIndex": 13122, - "textRun": { - "content": "Doubles your clicks", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13150, - "startIndex": 13141, - "textRun": { - "content": ". Click ", - "textStyle": {} - } - }, - { - "endIndex": 13154, - "startIndex": 13150, - "textRun": { - "content": "Save", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 13156, - "startIndex": 13154, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 72.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13006 - }, - { - "endIndex": 13158, - "paragraph": { - "elements": [ - { - "endIndex": 13157, - "inlineObjectElement": { - "inlineObjectId": "kix.fqpy0mh0yer0", - "textStyle": {} - }, - "startIndex": 13156 - }, - { - "endIndex": 13158, - "startIndex": 13157, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 72.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13156 - }, - { - "endIndex": 13249, - "paragraph": { - "elements": [ - { - "endIndex": 13183, - "startIndex": 13158, - "textRun": { - "content": "After you’ve clicked the ", - "textStyle": {} - } - }, - { - "endIndex": 13187, - "startIndex": 13183, - "textRun": { - "content": "Save", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 13249, - "startIndex": 13187, - "textRun": { - "content": " button, add a subscription price. Pick any price you desire.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 72.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13158 - }, - { - "endIndex": 13251, - "paragraph": { - "elements": [ - { - "endIndex": 13250, - "inlineObjectElement": { - "inlineObjectId": "kix.v4watl264rvd", - "textStyle": {} - }, - "startIndex": 13249 - }, - { - "endIndex": 13251, - "startIndex": 13250, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 72.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13249 - }, - { - "endIndex": 13316, - "paragraph": { - "elements": [ - { - "endIndex": 13316, - "startIndex": 13251, - "textRun": { - "content": "You should now see the three purchases in the list of purchases:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13251 - }, - { - "endIndex": 13318, - "paragraph": { - "elements": [ - { - "endIndex": 13317, - "inlineObjectElement": { - "inlineObjectId": "kix.ln0fxrlkwddc", - "textStyle": {} - }, - "startIndex": 13316 - }, - { - "endIndex": 13318, - "startIndex": 13317, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13316 - }, - { - "endIndex": 13319, - "paragraph": { - "elements": [ - { - "endIndex": 13319, - "startIndex": 13318, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13318 - }, - { - "endIndex": 13613, - "startIndex": 13319, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 13612, - "startIndex": 13320, - "tableCells": [ - { - "content": [ - { - "endIndex": 13612, - "paragraph": { - "elements": [ - { - "endIndex": 13328, - "startIndex": 13322, - "textRun": { - "content": "Note: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 13408, - "startIndex": 13328, - "textRun": { - "content": "During testing, you’ll use the sandbox environment so no real payments are made.", - "textStyle": {} - } - }, - { - "endIndex": 13409, - "startIndex": 13408, - "textRun": { - "content": " ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 13587, - "startIndex": 13409, - "textRun": { - "content": "The subscription period in the sandbox environment is shorter than in production. For example, 7 days will be 3 minutes, and 1 year will be 60 minutes. You can see all values in ", - "textStyle": {} - } - }, - { - "endIndex": 13610, - "startIndex": 13587, - "textRun": { - "content": "the Apple documentation", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://help.apple.com/app-store-connect/#/dev7e89e149d" - }, - "underline": true - } - } - }, - { - "endIndex": 13611, - "startIndex": 13610, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 13612, - "startIndex": 13611, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13322 - } - ], - "endIndex": 13612, - "startIndex": 13321, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 85.5, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 13614, - "paragraph": { - "elements": [ - { - "endIndex": 13614, - "startIndex": 13613, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.vwqbvj2toquh", - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 120.00001, - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 14.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - } - }, - "startIndex": 13613 - }, - { - "endIndex": 13615, - "paragraph": { - "elements": [ - { - "endIndex": 13615, - "startIndex": 13614, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13614 - }, - { - "endIndex": 13617, - "paragraph": { - "elements": [ - { - "endIndex": 13616, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 13615 - }, - { - "endIndex": 13617, - "startIndex": 13616, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.gy2vrltmxc7b", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 13615 - }, - { - "endIndex": 13639, - "paragraph": { - "elements": [ - { - "endIndex": 13639, - "startIndex": 13617, - "textRun": { - "content": "Set up the Play Store\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.jqrw9w6jbek", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 13617 - }, - { - "endIndex": 13640, - "paragraph": { - "elements": [ - { - "endIndex": 13640, - "startIndex": 13639, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13639 - }, - { - "endIndex": 13768, - "paragraph": { - "elements": [ - { - "endIndex": 13747, - "startIndex": 13640, - "textRun": { - "content": "As with the App Store, you’ll also need a developer account for the Play Store. If you don’t have one yet, ", - "textStyle": {} - } - }, - { - "endIndex": 13766, - "startIndex": 13747, - "textRun": { - "content": "register an account", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://support.google.com/googleplay/android-developer/answer/6112435#zippy=%2Cstep-sign-up-for-a-google-play-developer-account" - }, - "underline": true - } - } - }, - { - "endIndex": 13768, - "startIndex": 13766, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13640 - }, - { - "endIndex": 13769, - "paragraph": { - "elements": [ - { - "endIndex": 13769, - "startIndex": 13768, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13768 - }, - { - "endIndex": 13786, - "paragraph": { - "elements": [ - { - "endIndex": 13786, - "startIndex": 13769, - "textRun": { - "content": "Create a new app\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.o1u6soa0az1q", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 13769 - }, - { - "endIndex": 13787, - "paragraph": { - "elements": [ - { - "endIndex": 13787, - "startIndex": 13786, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13786 - }, - { - "endIndex": 13832, - "paragraph": { - "elements": [ - { - "endIndex": 13832, - "startIndex": 13787, - "textRun": { - "content": "Create a new app in the Google Play Console:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13787 - }, - { - "endIndex": 13833, - "paragraph": { - "elements": [ - { - "endIndex": 13833, - "startIndex": 13832, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13832 - }, - { - "endIndex": 13856, - "paragraph": { - "bullet": { - "listId": "kix.l6dfwvhprcyp", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 13842, - "startIndex": 13833, - "textRun": { - "content": "Open the ", - "textStyle": {} - } - }, - { - "endIndex": 13854, - "startIndex": 13842, - "textRun": { - "content": "Play Console", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://play.google.com/console" - }, - "underline": true - } - } - }, - { - "endIndex": 13856, - "startIndex": 13854, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13833 - }, - { - "endIndex": 13886, - "paragraph": { - "bullet": { - "listId": "kix.l6dfwvhprcyp", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 13863, - "startIndex": 13856, - "textRun": { - "content": "Select ", - "textStyle": {} - } - }, - { - "endIndex": 13886, - "startIndex": 13863, - "textRun": { - "content": "All apps > Create app.\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13856 - }, - { - "endIndex": 14040, - "paragraph": { - "bullet": { - "listId": "kix.l6dfwvhprcyp", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 14040, - "startIndex": 13886, - "textRun": { - "content": "Select a default language and add a title for your app. Type the name of your app as you want it to appear on Google Play. You can change the name later.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13886 - }, - { - "endIndex": 14108, - "paragraph": { - "bullet": { - "listId": "kix.l6dfwvhprcyp", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 14108, - "startIndex": 14040, - "textRun": { - "content": "Specify that your application is a game. You can change this later.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14040 - }, - { - "endIndex": 14158, - "paragraph": { - "bullet": { - "listId": "kix.l6dfwvhprcyp", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 14158, - "startIndex": 14108, - "textRun": { - "content": "Specify whether your application is free or paid.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14108 - }, - { - "endIndex": 14248, - "paragraph": { - "bullet": { - "listId": "kix.l6dfwvhprcyp", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 14248, - "startIndex": 14158, - "textRun": { - "content": "Add an email address that Play Store users can use to contact you about this application.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14158 - }, - { - "endIndex": 14313, - "paragraph": { - "bullet": { - "listId": "kix.l6dfwvhprcyp", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 14313, - "startIndex": 14248, - "textRun": { - "content": "Complete the Content guidelines and US export laws declarations.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14248 - }, - { - "endIndex": 14332, - "paragraph": { - "bullet": { - "listId": "kix.l6dfwvhprcyp", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 14320, - "startIndex": 14313, - "textRun": { - "content": "Select ", - "textStyle": {} - } - }, - { - "endIndex": 14330, - "startIndex": 14320, - "textRun": { - "content": "Create app", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 14332, - "startIndex": 14330, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14313 - }, - { - "endIndex": 14333, - "paragraph": { - "elements": [ - { - "endIndex": 14333, - "startIndex": 14332, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14332 - }, - { - "endIndex": 14533, - "paragraph": { - "elements": [ - { - "endIndex": 14415, - "startIndex": 14333, - "textRun": { - "content": "After your app is created, go to the dashboard, and complete all the tasks in the ", - "textStyle": {} - } - }, - { - "endIndex": 14430, - "startIndex": 14415, - "textRun": { - "content": "Set up your app", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 14531, - "startIndex": 14430, - "textRun": { - "content": " section. Here, you provide some information about your app, such as content ratings and screenshots.", - "textStyle": {} - } - }, - { - "endIndex": 14532, - "inlineObjectElement": { - "inlineObjectId": "kix.lkvls8vsrau2", - "textStyle": {} - }, - "startIndex": 14531 - }, - { - "endIndex": 14533, - "startIndex": 14532, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14333 - }, - { - "endIndex": 14554, - "paragraph": { - "elements": [ - { - "endIndex": 14554, - "startIndex": 14533, - "textRun": { - "content": "Sign the application\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.z8iwhe2sn61w", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 14533 - }, - { - "endIndex": 14555, - "paragraph": { - "elements": [ - { - "endIndex": 14555, - "startIndex": 14554, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14554 - }, - { - "endIndex": 14645, - "paragraph": { - "elements": [ - { - "endIndex": 14645, - "startIndex": 14555, - "textRun": { - "content": "To be able to test in-app purchases, you need at least one build uploaded to Google Play.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14555 - }, - { - "endIndex": 14738, - "paragraph": { - "elements": [ - { - "endIndex": 14738, - "startIndex": 14645, - "textRun": { - "content": "For this, you need your release build to be signed with something other than the debug keys.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14645 - }, - { - "endIndex": 14756, - "paragraph": { - "elements": [ - { - "endIndex": 14756, - "startIndex": 14738, - "textRun": { - "content": "Create a keystore\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.rmmd9ixc2pz4", - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 120.00001, - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 14.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - } - }, - "startIndex": 14738 - }, - { - "endIndex": 14878, - "paragraph": { - "elements": [ - { - "endIndex": 14878, - "startIndex": 14756, - "textRun": { - "content": "If you have an existing keystore, skip to the next step. If not, create one by running the following at the command line.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14756 - }, - { - "endIndex": 14879, - "paragraph": { - "elements": [ - { - "endIndex": 14879, - "startIndex": 14878, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14878 - }, - { - "endIndex": 14920, - "paragraph": { - "elements": [ - { - "endIndex": 14920, - "startIndex": 14879, - "textRun": { - "content": "On Mac/Linux, use the following command:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14879 - }, - { - "endIndex": 15016, - "startIndex": 14920, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 15015, - "startIndex": 14921, - "tableCells": [ - { - "content": [ - { - "endIndex": 15015, - "paragraph": { - "elements": [ - { - "endIndex": 15015, - "startIndex": 14923, - "textRun": { - "content": "keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14923 - } - ], - "endIndex": 15015, - "startIndex": 14922, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 15056, - "paragraph": { - "elements": [ - { - "endIndex": 15056, - "startIndex": 15016, - "textRun": { - "content": "\u000bOn Windows, use the following command:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15016 - }, - { - "endIndex": 15184, - "startIndex": 15056, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 15183, - "startIndex": 15057, - "tableCells": [ - { - "content": [ - { - "endIndex": 15183, - "paragraph": { - "elements": [ - { - "endIndex": 15183, - "startIndex": 15059, - "textRun": { - "content": "keytool -genkey -v -keystore c:\\Users\\USER_NAME\\key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15059 - } - ], - "endIndex": 15183, - "startIndex": 15058, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 15185, - "paragraph": { - "elements": [ - { - "endIndex": 15185, - "startIndex": 15184, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15184 - }, - { - "endIndex": 15424, - "paragraph": { - "elements": [ - { - "endIndex": 15209, - "startIndex": 15185, - "textRun": { - "content": "This command stores the ", - "textStyle": {} - } - }, - { - "endIndex": 15216, - "startIndex": 15209, - "textRun": { - "content": "key.jks", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15328, - "startIndex": 15216, - "textRun": { - "content": " file in your home directory. If you want to store the file elsewhere, then change the argument you pass to the ", - "textStyle": {} - } - }, - { - "endIndex": 15337, - "startIndex": 15328, - "textRun": { - "content": "-keystore", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15349, - "startIndex": 15337, - "textRun": { - "content": " parameter. ", - "textStyle": {} - } - }, - { - "endIndex": 15358, - "startIndex": 15349, - "textRun": { - "content": "Keep the ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 15366, - "startIndex": 15358, - "textRun": { - "content": "keystore", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15424, - "startIndex": 15366, - "textRun": { - "content": " file private; don’t check it into public source control!\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15185 - }, - { - "endIndex": 15425, - "paragraph": { - "elements": [ - { - "endIndex": 15425, - "startIndex": 15424, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15424 - }, - { - "endIndex": 16050, - "startIndex": 15425, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16049, - "startIndex": 15426, - "tableCells": [ - { - "content": [ - { - "endIndex": 15434, - "paragraph": { - "elements": [ - { - "endIndex": 15434, - "startIndex": 15428, - "textRun": { - "content": "Note:\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - } - }, - "startIndex": 15428 - }, - { - "endIndex": 15924, - "paragraph": { - "bullet": { - "listId": "kix.ai6cqz99fg9d", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 15438, - "startIndex": 15434, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 15445, - "startIndex": 15438, - "textRun": { - "content": "keytool", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15572, - "startIndex": 15445, - "textRun": { - "content": " command might not be in your path—it’s part of Java, which is installed as part of Android Studio. For the concrete path, run ", - "textStyle": {} - } - }, - { - "endIndex": 15590, - "startIndex": 15572, - "textRun": { - "content": "flutter doctor -v,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15691, - "startIndex": 15590, - "textRun": { - "content": " and locate the path printed after ‘Java binary at:’. Then, use that fully qualified path, replacing ", - "textStyle": {} - } - }, - { - "endIndex": 15695, - "startIndex": 15691, - "textRun": { - "content": "java", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15714, - "startIndex": 15695, - "textRun": { - "content": " (at the end) with ", - "textStyle": {} - } - }, - { - "endIndex": 15721, - "startIndex": 15714, - "textRun": { - "content": "keytool", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15776, - "startIndex": 15721, - "textRun": { - "content": ". If your path includes space-separated names, such as ", - "textStyle": {} - } - }, - { - "endIndex": 15789, - "startIndex": 15776, - "textRun": { - "content": "Program Files", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15871, - "startIndex": 15789, - "textRun": { - "content": ", use platform-appropriate notation for the names. For example, on Mac/Linux, use ", - "textStyle": {} - } - }, - { - "endIndex": 15885, - "startIndex": 15871, - "textRun": { - "content": "Program\\ Files", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15906, - "startIndex": 15885, - "textRun": { - "content": ", and on Windows use ", - "textStyle": {} - } - }, - { - "endIndex": 15921, - "startIndex": 15906, - "textRun": { - "content": "\"Program Files\"", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15924, - "startIndex": 15921, - "textRun": { - "content": ".\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15434 - }, - { - "endIndex": 16049, - "paragraph": { - "bullet": { - "listId": "kix.3knqjs5j3c0a", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 15928, - "startIndex": 15924, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 15942, - "startIndex": 15928, - "textRun": { - "content": "-storetype JKS", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16049, - "startIndex": 15942, - "textRun": { - "content": " tag is only required for Java 9 or later. As of the Java 9 release, the keystore type defaults to PKCS12.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15924 - } - ], - "endIndex": 16049, - "startIndex": 15427, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 143.59082031249997, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16086, - "paragraph": { - "elements": [ - { - "endIndex": 16086, - "startIndex": 16050, - "textRun": { - "content": "Reference the keystore from the app\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.n6xp5o4jc4k9", - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 120.00001, - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 14.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - } - }, - "startIndex": 16050 - }, - { - "endIndex": 16188, - "paragraph": { - "elements": [ - { - "endIndex": 16106, - "startIndex": 16086, - "textRun": { - "content": "Create a file named ", - "textStyle": {} - } - }, - { - "endIndex": 16143, - "startIndex": 16106, - "textRun": { - "content": "/android/key.properties", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16188, - "startIndex": 16143, - "textRun": { - "content": " that contains a reference to your keystore:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16086 - }, - { - "endIndex": 16370, - "startIndex": 16188, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16369, - "startIndex": 16189, - "tableCells": [ - { - "content": [ - { - "endIndex": 16235, - "paragraph": { - "elements": [ - { - "endIndex": 16235, - "startIndex": 16191, - "textRun": { - "content": "storePassword=\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16191 - }, - { - "endIndex": 16277, - "paragraph": { - "elements": [ - { - "endIndex": 16277, - "startIndex": 16235, - "textRun": { - "content": "keyPassword=\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16235 - }, - { - "endIndex": 16290, - "paragraph": { - "elements": [ - { - "endIndex": 16290, - "startIndex": 16277, - "textRun": { - "content": "keyAlias=key\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16277 - }, - { - "endIndex": 16369, - "paragraph": { - "elements": [ - { - "endIndex": 16369, - "startIndex": 16290, - "textRun": { - "content": "storeFile=/key.jks>\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16290 - } - ], - "endIndex": 16369, - "startIndex": 16190, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16371, - "paragraph": { - "elements": [ - { - "endIndex": 16371, - "startIndex": 16370, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16370 - }, - { - "endIndex": 16466, - "startIndex": 16371, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16465, - "startIndex": 16372, - "tableCells": [ - { - "content": [ - { - "endIndex": 16465, - "paragraph": { - "elements": [ - { - "endIndex": 16382, - "startIndex": 16374, - "textRun": { - "content": " Warning", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 16393, - "startIndex": 16382, - "textRun": { - "content": ": Keep the ", - "textStyle": {} - } - }, - { - "endIndex": 16407, - "startIndex": 16393, - "textRun": { - "content": "key.properties", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16465, - "startIndex": 16407, - "textRun": { - "content": " file private; don’t check it into public source control.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16374 - } - ], - "endIndex": 16465, - "startIndex": 16373, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8039216, - "green": 0.8980392, - "red": 0.9882353 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16494, - "paragraph": { - "elements": [ - { - "endIndex": 16494, - "startIndex": 16466, - "textRun": { - "content": "Configure signing in Gradle\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.2vb42m8xb3no", - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 120.00001, - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 14.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - } - }, - "startIndex": 16466 - }, - { - "endIndex": 16586, - "paragraph": { - "elements": [ - { - "endIndex": 16540, - "startIndex": 16494, - "textRun": { - "content": "Configure signing for your app by editing the ", - "textStyle": {} - } - }, - { - "endIndex": 16579, - "startIndex": 16540, - "textRun": { - "content": "/android/app/build.gradle", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16586, - "startIndex": 16579, - "textRun": { - "content": " file.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16494 - }, - { - "endIndex": 16587, - "paragraph": { - "elements": [ - { - "endIndex": 16587, - "startIndex": 16586, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16586 - }, - { - "endIndex": 16668, - "paragraph": { - "elements": [ - { - "endIndex": 16653, - "startIndex": 16587, - "textRun": { - "content": "Add the keystore information from your properties file before the ", - "textStyle": {} - } - }, - { - "endIndex": 16660, - "startIndex": 16653, - "textRun": { - "content": "android", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16668, - "startIndex": 16660, - "textRun": { - "content": " block:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16587 - }, - { - "endIndex": 16669, - "paragraph": { - "elements": [ - { - "endIndex": 16669, - "startIndex": 16668, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16668 - }, - { - "endIndex": 16947, - "startIndex": 16669, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16946, - "startIndex": 16670, - "tableCells": [ - { - "content": [ - { - "endIndex": 16717, - "paragraph": { - "elements": [ - { - "endIndex": 16717, - "startIndex": 16672, - "textRun": { - "content": " def keystoreProperties = new Properties()\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16672 - }, - { - "endIndex": 16784, - "paragraph": { - "elements": [ - { - "endIndex": 16784, - "startIndex": 16717, - "textRun": { - "content": " def keystorePropertiesFile = rootProject.file('key.properties')\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16717 - }, - { - "endIndex": 16826, - "paragraph": { - "elements": [ - { - "endIndex": 16826, - "startIndex": 16784, - "textRun": { - "content": " if (keystorePropertiesFile.exists()) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16784 - }, - { - "endIndex": 16902, - "paragraph": { - "elements": [ - { - "endIndex": 16902, - "startIndex": 16826, - "textRun": { - "content": " keystoreProperties.load(new FileInputStream(keystorePropertiesFile))\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16826 - }, - { - "endIndex": 16907, - "paragraph": { - "elements": [ - { - "endIndex": 16907, - "startIndex": 16902, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16902 - }, - { - "endIndex": 16908, - "paragraph": { - "elements": [ - { - "endIndex": 16908, - "startIndex": 16907, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16907 - }, - { - "endIndex": 16921, - "paragraph": { - "elements": [ - { - "endIndex": 16921, - "startIndex": 16908, - "textRun": { - "content": " android {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16908 - }, - { - "endIndex": 16941, - "paragraph": { - "elements": [ - { - "endIndex": 16941, - "startIndex": 16921, - "textRun": { - "content": " // omitted\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16921 - }, - { - "endIndex": 16946, - "paragraph": { - "elements": [ - { - "endIndex": 16945, - "startIndex": 16941, - "textRun": { - "content": " }", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16946, - "startIndex": 16945, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16941 - } - ], - "endIndex": 16946, - "startIndex": 16671, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16948, - "paragraph": { - "elements": [ - { - "endIndex": 16948, - "startIndex": 16947, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16947 - }, - { - "endIndex": 17013, - "paragraph": { - "elements": [ - { - "endIndex": 16957, - "startIndex": 16948, - "textRun": { - "content": "Load the ", - "textStyle": {} - } - }, - { - "endIndex": 16971, - "startIndex": 16957, - "textRun": { - "content": "key.properties", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16986, - "startIndex": 16971, - "textRun": { - "content": " file into the ", - "textStyle": {} - } - }, - { - "endIndex": 17004, - "startIndex": 16986, - "textRun": { - "content": "keystoreProperties", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17013, - "startIndex": 17004, - "textRun": { - "content": " object.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16948 - }, - { - "endIndex": 17014, - "paragraph": { - "elements": [ - { - "endIndex": 17014, - "startIndex": 17013, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17013 - }, - { - "endIndex": 17067, - "paragraph": { - "elements": [ - { - "endIndex": 17049, - "startIndex": 17014, - "textRun": { - "content": "Add the following code before the ", - "textStyle": {} - } - }, - { - "endIndex": 17059, - "startIndex": 17049, - "textRun": { - "content": "buildTypes", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17067, - "startIndex": 17059, - "textRun": { - "content": " block:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17014 - }, - { - "endIndex": 17068, - "paragraph": { - "elements": [ - { - "endIndex": 17068, - "startIndex": 17067, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17067 - }, - { - "endIndex": 17335, - "startIndex": 17068, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 17334, - "startIndex": 17069, - "tableCells": [ - { - "content": [ - { - "endIndex": 17087, - "paragraph": { - "elements": [ - { - "endIndex": 17087, - "startIndex": 17071, - "textRun": { - "content": " buildTypes {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17071 - }, - { - "endIndex": 17104, - "paragraph": { - "elements": [ - { - "endIndex": 17104, - "startIndex": 17087, - "textRun": { - "content": " release {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17087 - }, - { - "endIndex": 17175, - "paragraph": { - "elements": [ - { - "endIndex": 17175, - "startIndex": 17104, - "textRun": { - "content": " // TODO: Add your own signing config for the release build.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17104 - }, - { - "endIndex": 17226, - "paragraph": { - "elements": [ - { - "endIndex": 17226, - "startIndex": 17175, - "textRun": { - "content": " // Signing with the debug keys for now,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17175 - }, - { - "endIndex": 17274, - "paragraph": { - "elements": [ - { - "endIndex": 17274, - "startIndex": 17226, - "textRun": { - "content": " // so `flutter run --release` works.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17226 - }, - { - "endIndex": 17320, - "paragraph": { - "elements": [ - { - "endIndex": 17320, - "startIndex": 17274, - "textRun": { - "content": " signingConfig signingConfigs.debug\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17274 - }, - { - "endIndex": 17329, - "paragraph": { - "elements": [ - { - "endIndex": 17329, - "startIndex": 17320, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17320 - }, - { - "endIndex": 17334, - "paragraph": { - "elements": [ - { - "endIndex": 17333, - "startIndex": 17329, - "textRun": { - "content": " }", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17334, - "startIndex": 17333, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17329 - } - ], - "endIndex": 17334, - "startIndex": 17070, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 17336, - "paragraph": { - "elements": [ - { - "endIndex": 17336, - "startIndex": 17335, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17335 - }, - { - "endIndex": 17450, - "paragraph": { - "elements": [ - { - "endIndex": 17350, - "startIndex": 17336, - "textRun": { - "content": "Configure the ", - "textStyle": {} - } - }, - { - "endIndex": 17364, - "startIndex": 17350, - "textRun": { - "content": "signingConfigs", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17388, - "startIndex": 17364, - "textRun": { - "content": " block in your module’s ", - "textStyle": {} - } - }, - { - "endIndex": 17400, - "startIndex": 17388, - "textRun": { - "content": "build.gradle", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17450, - "startIndex": 17400, - "textRun": { - "content": " file with the signing configuration information:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17336 - }, - { - "endIndex": 17451, - "paragraph": { - "elements": [ - { - "endIndex": 17451, - "startIndex": 17450, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17450 - }, - { - "endIndex": 17870, - "startIndex": 17451, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 17869, - "startIndex": 17452, - "tableCells": [ - { - "content": [ - { - "endIndex": 17474, - "paragraph": { - "elements": [ - { - "endIndex": 17474, - "startIndex": 17454, - "textRun": { - "content": " signingConfigs {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17454 - }, - { - "endIndex": 17491, - "paragraph": { - "elements": [ - { - "endIndex": 17491, - "startIndex": 17474, - "textRun": { - "content": " release {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17474 - }, - { - "endIndex": 17542, - "paragraph": { - "elements": [ - { - "endIndex": 17542, - "startIndex": 17491, - "textRun": { - "content": " keyAlias keystoreProperties['keyAlias']\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17491 - }, - { - "endIndex": 17599, - "paragraph": { - "elements": [ - { - "endIndex": 17599, - "startIndex": 17542, - "textRun": { - "content": " keyPassword keystoreProperties['keyPassword']\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17542 - }, - { - "endIndex": 17699, - "paragraph": { - "elements": [ - { - "endIndex": 17699, - "startIndex": 17599, - "textRun": { - "content": " storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17599 - }, - { - "endIndex": 17760, - "paragraph": { - "elements": [ - { - "endIndex": 17760, - "startIndex": 17699, - "textRun": { - "content": " storePassword keystoreProperties['storePassword']\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17699 - }, - { - "endIndex": 17769, - "paragraph": { - "elements": [ - { - "endIndex": 17769, - "startIndex": 17760, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17760 - }, - { - "endIndex": 17774, - "paragraph": { - "elements": [ - { - "endIndex": 17774, - "startIndex": 17769, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17769 - }, - { - "endIndex": 17790, - "paragraph": { - "elements": [ - { - "endIndex": 17790, - "startIndex": 17774, - "textRun": { - "content": " buildTypes {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17774 - }, - { - "endIndex": 17807, - "paragraph": { - "elements": [ - { - "endIndex": 17807, - "startIndex": 17790, - "textRun": { - "content": " release {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17790 - }, - { - "endIndex": 17855, - "paragraph": { - "elements": [ - { - "endIndex": 17855, - "startIndex": 17807, - "textRun": { - "content": " signingConfig signingConfigs.release\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17807 - }, - { - "endIndex": 17864, - "paragraph": { - "elements": [ - { - "endIndex": 17864, - "startIndex": 17855, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17855 - }, - { - "endIndex": 17869, - "paragraph": { - "elements": [ - { - "endIndex": 17868, - "startIndex": 17864, - "textRun": { - "content": " }", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17869, - "startIndex": 17868, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17864 - } - ], - "endIndex": 17869, - "startIndex": 17453, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 17871, - "paragraph": { - "elements": [ - { - "endIndex": 17871, - "startIndex": 17870, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17870 - }, - { - "endIndex": 17932, - "paragraph": { - "elements": [ - { - "endIndex": 17932, - "startIndex": 17871, - "textRun": { - "content": "Release builds of your app will now be signed automatically.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17871 - }, - { - "endIndex": 18074, - "startIndex": 17932, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 18073, - "startIndex": 17933, - "tableCells": [ - { - "content": [ - { - "endIndex": 18073, - "paragraph": { - "elements": [ - { - "endIndex": 17940, - "startIndex": 17935, - "textRun": { - "content": "Note:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 17963, - "startIndex": 17940, - "textRun": { - "content": " You might need to run ", - "textStyle": {} - } - }, - { - "endIndex": 17976, - "startIndex": 17963, - "textRun": { - "content": "flutter clean", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18073, - "startIndex": 17976, - "textRun": { - "content": " after changing the Gradle file. This prevents cached builds from affecting the signing process.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17935 - } - ], - "endIndex": 18073, - "startIndex": 17934, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 18163, - "paragraph": { - "elements": [ - { - "endIndex": 18123, - "startIndex": 18074, - "textRun": { - "content": "For more information about signing your app, see ", - "textStyle": {} - } - }, - { - "endIndex": 18136, - "startIndex": 18123, - "textRun": { - "content": "Sign your app", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://developer.android.com/studio/publish/app-signing.html#generate-key" - }, - "underline": true - } - } - }, - { - "endIndex": 18140, - "startIndex": 18136, - "textRun": { - "content": " on ", - "textStyle": {} - } - }, - { - "endIndex": 18161, - "startIndex": 18140, - "textRun": { - "content": "developer.android.com", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "http://developer.android.com" - }, - "underline": true - } - } - }, - { - "endIndex": 18163, - "startIndex": 18161, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18074 - }, - { - "endIndex": 18187, - "paragraph": { - "elements": [ - { - "endIndex": 18187, - "startIndex": 18163, - "textRun": { - "content": "Upload your first build\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ni22dsnb3wge", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 18163 - }, - { - "endIndex": 18286, - "paragraph": { - "elements": [ - { - "endIndex": 18286, - "startIndex": 18187, - "textRun": { - "content": "After your app is configured for signing, you should be able to build your application by running:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18187 - }, - { - "endIndex": 18314, - "startIndex": 18286, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 18313, - "startIndex": 18287, - "tableCells": [ - { - "content": [ - { - "endIndex": 18313, - "paragraph": { - "elements": [ - { - "endIndex": 18313, - "startIndex": 18289, - "textRun": { - "content": "flutter build appbundle\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18289 - } - ], - "endIndex": 18313, - "startIndex": 18288, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 18315, - "paragraph": { - "elements": [ - { - "endIndex": 18315, - "startIndex": 18314, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18314 - }, - { - "endIndex": 18446, - "paragraph": { - "elements": [ - { - "endIndex": 18396, - "startIndex": 18315, - "textRun": { - "content": "This command generates a release build by default and the output can be found at ", - "textStyle": {} - } - }, - { - "endIndex": 18444, - "startIndex": 18396, - "textRun": { - "content": "/build/app/outputs/bundle/release/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18446, - "startIndex": 18444, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18315 - }, - { - "endIndex": 18447, - "paragraph": { - "elements": [ - { - "endIndex": 18447, - "startIndex": 18446, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18446 - }, - { - "endIndex": 18579, - "paragraph": { - "elements": [ - { - "endIndex": 18500, - "startIndex": 18447, - "textRun": { - "content": "From the dashboard in the Google Play Console, go to ", - "textStyle": {} - } - }, - { - "endIndex": 18535, - "startIndex": 18500, - "textRun": { - "content": "Release > Testing > Closed testing,", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 18579, - "startIndex": 18535, - "textRun": { - "content": " and create a new, closed testing release. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18447 - }, - { - "endIndex": 18580, - "paragraph": { - "elements": [ - { - "endIndex": 18580, - "startIndex": 18579, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18579 - }, - { - "endIndex": 18758, - "startIndex": 18580, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 18757, - "startIndex": 18581, - "tableCells": [ - { - "content": [ - { - "endIndex": 18757, - "paragraph": { - "elements": [ - { - "endIndex": 18588, - "startIndex": 18583, - "textRun": { - "content": "Note:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 18757, - "startIndex": 18588, - "textRun": { - "content": " You first need to release on the closed testing track as this results in a code review from Google. This is a requirement to be able to access any play store products.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18583 - } - ], - "endIndex": 18757, - "startIndex": 18582, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 18759, - "paragraph": { - "elements": [ - { - "endIndex": 18759, - "startIndex": 18758, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18758 - }, - { - "endIndex": 18882, - "paragraph": { - "elements": [ - { - "endIndex": 18839, - "startIndex": 18759, - "textRun": { - "content": "For this codelab, you’ll stick to Google signing the app, so go ahead and press ", - "textStyle": {} - } - }, - { - "endIndex": 18847, - "startIndex": 18839, - "textRun": { - "content": "Continue", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 18854, - "startIndex": 18847, - "textRun": { - "content": " under ", - "textStyle": {} - } - }, - { - "endIndex": 18870, - "startIndex": 18854, - "textRun": { - "content": "Play App Signing", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 18882, - "startIndex": 18870, - "textRun": { - "content": " to opt in.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18759 - }, - { - "endIndex": 18883, - "paragraph": { - "elements": [ - { - "endIndex": 18883, - "startIndex": 18882, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18882 - }, - { - "endIndex": 18884, - "paragraph": { - "elements": [ - { - "endIndex": 18884, - "startIndex": 18883, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18883 - }, - { - "endIndex": 18886, - "paragraph": { - "elements": [ - { - "endIndex": 18885, - "inlineObjectElement": { - "inlineObjectId": "kix.gmjri93sum2k", - "textStyle": {} - }, - "startIndex": 18884 - }, - { - "endIndex": 18886, - "startIndex": 18885, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18884 - }, - { - "endIndex": 18971, - "paragraph": { - "elements": [ - { - "endIndex": 18903, - "startIndex": 18886, - "textRun": { - "content": "Next, upload the ", - "textStyle": {} - } - }, - { - "endIndex": 18918, - "startIndex": 18903, - "textRun": { - "content": "app-release.aab", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18971, - "startIndex": 18918, - "textRun": { - "content": " app bundle that was generated by the build command.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18886 - }, - { - "endIndex": 18972, - "paragraph": { - "elements": [ - { - "endIndex": 18972, - "startIndex": 18971, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18971 - }, - { - "endIndex": 19106, - "paragraph": { - "elements": [ - { - "endIndex": 18978, - "startIndex": 18972, - "textRun": { - "content": "Click ", - "textStyle": {} - } - }, - { - "endIndex": 18983, - "startIndex": 18978, - "textRun": { - "content": "Save ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 18997, - "startIndex": 18983, - "textRun": { - "content": "and then click", - "textStyle": {} - } - }, - { - "endIndex": 18998, - "startIndex": 18997, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 19015, - "startIndex": 18998, - "textRun": { - "content": "Review release.\u000b\u000b", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19030, - "startIndex": 19015, - "textRun": { - "content": "Finally, click ", - "textStyle": {} - } - }, - { - "endIndex": 19063, - "startIndex": 19030, - "textRun": { - "content": "Start rollout to Internal testing", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19106, - "startIndex": 19063, - "textRun": { - "content": " to activate the internal testing release.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18972 - }, - { - "endIndex": 19124, - "paragraph": { - "elements": [ - { - "endIndex": 19124, - "startIndex": 19106, - "textRun": { - "content": "Set up test users\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.2u0491vkcfde", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 19106 - }, - { - "endIndex": 19125, - "paragraph": { - "elements": [ - { - "endIndex": 19125, - "startIndex": 19124, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19124 - }, - { - "endIndex": 19253, - "paragraph": { - "elements": [ - { - "endIndex": 19253, - "startIndex": 19125, - "textRun": { - "content": "To be able to test in-app purchases, Google accounts of your testers must be added in the Google Play console in two locations:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19125 - }, - { - "endIndex": 19254, - "paragraph": { - "elements": [ - { - "endIndex": 19254, - "startIndex": 19253, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19253 - }, - { - "endIndex": 19300, - "paragraph": { - "bullet": { - "listId": "kix.7lxk6cj2wia5", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 19300, - "startIndex": 19254, - "textRun": { - "content": "To the specific test track (Internal testing)\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19254 - }, - { - "endIndex": 19320, - "paragraph": { - "bullet": { - "listId": "kix.7lxk6cj2wia5", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 19320, - "startIndex": 19300, - "textRun": { - "content": "As a license tester\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19300 - }, - { - "endIndex": 19321, - "paragraph": { - "elements": [ - { - "endIndex": 19321, - "startIndex": 19320, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19320 - }, - { - "endIndex": 19463, - "paragraph": { - "elements": [ - { - "endIndex": 19399, - "startIndex": 19321, - "textRun": { - "content": "First, start with adding the tester to the internal testing track. Go back to ", - "textStyle": {} - } - }, - { - "endIndex": 19435, - "startIndex": 19399, - "textRun": { - "content": "Release > Testing > Internal testing", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19450, - "startIndex": 19435, - "textRun": { - "content": " and click the ", - "textStyle": {} - } - }, - { - "endIndex": 19457, - "startIndex": 19450, - "textRun": { - "content": "Testers", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19463, - "startIndex": 19457, - "textRun": { - "content": " tab.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19321 - }, - { - "endIndex": 19465, - "paragraph": { - "elements": [ - { - "endIndex": 19464, - "inlineObjectElement": { - "inlineObjectId": "kix.icspy8xsx7cc", - "textStyle": {} - }, - "startIndex": 19463 - }, - { - "endIndex": 19465, - "startIndex": 19464, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19463 - }, - { - "endIndex": 19639, - "paragraph": { - "elements": [ - { - "endIndex": 19501, - "startIndex": 19465, - "textRun": { - "content": "Create a new email list by clicking ", - "textStyle": {} - } - }, - { - "endIndex": 19518, - "startIndex": 19501, - "textRun": { - "content": "Create email list", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19639, - "startIndex": 19518, - "textRun": { - "content": ". Give the list a name, and add the email addresses of the Google accounts that need access to testing in-app purchases.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19465 - }, - { - "endIndex": 19640, - "paragraph": { - "elements": [ - { - "endIndex": 19640, - "startIndex": 19639, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19639 - }, - { - "endIndex": 19704, - "paragraph": { - "elements": [ - { - "endIndex": 19690, - "startIndex": 19640, - "textRun": { - "content": "Next, select the checkbox for the list, and click ", - "textStyle": {} - } - }, - { - "endIndex": 19702, - "startIndex": 19690, - "textRun": { - "content": "Save changes", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19704, - "startIndex": 19702, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19640 - }, - { - "endIndex": 19705, - "paragraph": { - "elements": [ - { - "endIndex": 19705, - "startIndex": 19704, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19704 - }, - { - "endIndex": 19737, - "paragraph": { - "elements": [ - { - "endIndex": 19737, - "startIndex": 19705, - "textRun": { - "content": "Then, add the license testers: \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19705 - }, - { - "endIndex": 19794, - "paragraph": { - "bullet": { - "listId": "kix.x6zo8jl3cnpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 19752, - "startIndex": 19737, - "textRun": { - "content": "Go back to the ", - "textStyle": {} - } - }, - { - "endIndex": 19760, - "startIndex": 19752, - "textRun": { - "content": "All apps", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19794, - "startIndex": 19760, - "textRun": { - "content": " view of the Google Play Console.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19737 - }, - { - "endIndex": 19829, - "paragraph": { - "bullet": { - "listId": "kix.x6zo8jl3cnpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 19800, - "startIndex": 19794, - "textRun": { - "content": "Go to ", - "textStyle": {} - } - }, - { - "endIndex": 19826, - "startIndex": 19800, - "textRun": { - "content": "Settings > License testing", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19829, - "startIndex": 19826, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19794 - }, - { - "endIndex": 19920, - "paragraph": { - "bullet": { - "listId": "kix.x6zo8jl3cnpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 19920, - "startIndex": 19829, - "textRun": { - "content": "Add the same email addresses of the testers who need to be able to test in-app purchases. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19829 - }, - { - "endIndex": 19962, - "paragraph": { - "bullet": { - "listId": "kix.x6zo8jl3cnpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 19924, - "startIndex": 19920, - "textRun": { - "content": "Set ", - "textStyle": {} - } - }, - { - "endIndex": 19940, - "startIndex": 19924, - "textRun": { - "content": "License response", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19944, - "startIndex": 19940, - "textRun": { - "content": " to ", - "textStyle": {} - } - }, - { - "endIndex": 19960, - "startIndex": 19944, - "textRun": { - "content": "RESPOND_NORMALLY", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19962, - "startIndex": 19960, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19920 - }, - { - "endIndex": 19982, - "paragraph": { - "bullet": { - "listId": "kix.x6zo8jl3cnpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 19968, - "startIndex": 19962, - "textRun": { - "content": "Click ", - "textStyle": {} - } - }, - { - "endIndex": 19981, - "startIndex": 19968, - "textRun": { - "content": "Save changes.", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19982, - "startIndex": 19981, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19962 - }, - { - "endIndex": 19985, - "paragraph": { - "elements": [ - { - "endIndex": 19983, - "startIndex": 19982, - "textRun": { - "content": "\u000b", - "textStyle": {} - } - }, - { - "endIndex": 19984, - "inlineObjectElement": { - "inlineObjectId": "kix.4nqtsh4zysec", - "textStyle": {} - }, - "startIndex": 19983 - }, - { - "endIndex": 19985, - "startIndex": 19984, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19982 - }, - { - "endIndex": 20019, - "paragraph": { - "elements": [ - { - "endIndex": 20019, - "startIndex": 19985, - "textRun": { - "content": "Configuring your in-app purchases\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7kkxkz4gyhhc", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 19985 - }, - { - "endIndex": 20088, - "paragraph": { - "elements": [ - { - "endIndex": 20088, - "startIndex": 20019, - "textRun": { - "content": "Now you’ll configure the items that are purchasable within the app. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20019 - }, - { - "endIndex": 20162, - "paragraph": { - "elements": [ - { - "endIndex": 20162, - "startIndex": 20088, - "textRun": { - "content": "Just like in the App Store, you have to define three different purchases:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20088 - }, - { - "endIndex": 20163, - "paragraph": { - "elements": [ - { - "endIndex": 20163, - "startIndex": 20162, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20162 - }, - { - "endIndex": 20314, - "paragraph": { - "bullet": { - "listId": "kix.y1airoxi6fpx", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20181, - "startIndex": 20163, - "textRun": { - "content": "dash_consumable_2k", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20314, - "startIndex": 20181, - "textRun": { - "content": ": A consumable purchase that can be purchased many times over, which grants the user 2000 Dashes (the in-app currency) per purchase.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20163 - }, - { - "endIndex": 20461, - "paragraph": { - "bullet": { - "listId": "kix.y1airoxi6fpx", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20329, - "startIndex": 20314, - "textRun": { - "content": "dash_upgrade_3d", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20461, - "startIndex": 20329, - "textRun": { - "content": ": A non-consumable “upgrade” purchase that can only be purchased once, which gives the user a cosmetically different Dash to click.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20314 - }, - { - "endIndex": 20593, - "paragraph": { - "bullet": { - "listId": "kix.y1airoxi6fpx", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20486, - "startIndex": 20461, - "textRun": { - "content": "dash_subscription_doubler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20593, - "startIndex": 20486, - "textRun": { - "content": ": A subscription that grants the user twice as many Dashes per click for the duration of the subscription.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20461 - }, - { - "endIndex": 20594, - "paragraph": { - "elements": [ - { - "endIndex": 20594, - "startIndex": 20593, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20593 - }, - { - "endIndex": 20640, - "paragraph": { - "elements": [ - { - "endIndex": 20640, - "startIndex": 20594, - "textRun": { - "content": "First, add the consumable and non-consumable.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20594 - }, - { - "endIndex": 20700, - "paragraph": { - "bullet": { - "listId": "kix.8ez3h4yz39jw", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 20700, - "startIndex": 20640, - "textRun": { - "content": "Go to the Google Play Console, and select your application.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20640 - }, - { - "endIndex": 20745, - "paragraph": { - "bullet": { - "listId": "kix.8ez3h4yz39jw", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 20706, - "startIndex": 20700, - "textRun": { - "content": "Go to ", - "textStyle": {} - } - }, - { - "endIndex": 20743, - "startIndex": 20706, - "textRun": { - "content": "Monetize > Products > In-app products", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 20745, - "startIndex": 20743, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20700 - }, - { - "endIndex": 20768, - "paragraph": { - "bullet": { - "listId": "kix.8ez3h4yz39jw", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20751, - "startIndex": 20745, - "textRun": { - "content": "Click ", - "textStyle": {} - } - }, - { - "endIndex": 20765, - "startIndex": 20751, - "textRun": { - "content": "Create product", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 20766, - "startIndex": 20765, - "textRun": { - "content": "\u000b", - "textStyle": {} - } - }, - { - "endIndex": 20767, - "inlineObjectElement": { - "inlineObjectId": "kix.ybkauijvqfm", - "textStyle": {} - }, - "startIndex": 20766 - }, - { - "endIndex": 20768, - "startIndex": 20767, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20745 - }, - { - "endIndex": 20893, - "paragraph": { - "bullet": { - "listId": "kix.8ez3h4yz39jw", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20893, - "startIndex": 20768, - "textRun": { - "content": "Enter all the required information for your product. Make sure the product ID matches the ID that you intend to use exactly.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20768 - }, - { - "endIndex": 20905, - "paragraph": { - "bullet": { - "listId": "kix.8ez3h4yz39jw", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20899, - "startIndex": 20893, - "textRun": { - "content": "Click ", - "textStyle": {} - } - }, - { - "endIndex": 20905, - "startIndex": 20899, - "textRun": { - "content": "Save.\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20893 - }, - { - "endIndex": 20921, - "paragraph": { - "bullet": { - "listId": "kix.8ez3h4yz39jw", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 20911, - "startIndex": 20905, - "textRun": { - "content": "Click ", - "textStyle": {} - } - }, - { - "endIndex": 20919, - "startIndex": 20911, - "textRun": { - "content": "Activate", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 20920, - "startIndex": 20919, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 20921, - "startIndex": 20920, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20905 - }, - { - "endIndex": 20983, - "paragraph": { - "bullet": { - "listId": "kix.8ez3h4yz39jw", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 20983, - "startIndex": 20921, - "textRun": { - "content": "Repeat the process for the non-consumable “upgrade” purchase.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20921 - }, - { - "endIndex": 20984, - "paragraph": { - "elements": [ - { - "endIndex": 20984, - "startIndex": 20983, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20983 - }, - { - "endIndex": 21012, - "paragraph": { - "elements": [ - { - "endIndex": 21012, - "startIndex": 20984, - "textRun": { - "content": "Next, add the subscription:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20984 - }, - { - "endIndex": 21072, - "paragraph": { - "bullet": { - "listId": "kix.m6p9bvttqrj7", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 21072, - "startIndex": 21012, - "textRun": { - "content": "Go to the Google Play Console, and select your application.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21012 - }, - { - "endIndex": 21115, - "paragraph": { - "bullet": { - "listId": "kix.m6p9bvttqrj7", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 21078, - "startIndex": 21072, - "textRun": { - "content": "Go to ", - "textStyle": {} - } - }, - { - "endIndex": 21113, - "startIndex": 21078, - "textRun": { - "content": "Monetize > Products > Subscriptions", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 21115, - "startIndex": 21113, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21072 - }, - { - "endIndex": 21143, - "paragraph": { - "bullet": { - "listId": "kix.m6p9bvttqrj7", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 21121, - "startIndex": 21115, - "textRun": { - "content": "Click ", - "textStyle": {} - } - }, - { - "endIndex": 21141, - "startIndex": 21121, - "textRun": { - "content": "Create subscription\u000b", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 21142, - "inlineObjectElement": { - "inlineObjectId": "kix.5fekoxtber2j", - "textStyle": {} - }, - "startIndex": 21141 - }, - { - "endIndex": 21143, - "startIndex": 21142, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21115 - }, - { - "endIndex": 21268, - "paragraph": { - "bullet": { - "listId": "kix.m6p9bvttqrj7", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 21268, - "startIndex": 21143, - "textRun": { - "content": "Enter all the required information for your subscription. Make sure the product ID matches the ID you intend to use exactly.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21143 - }, - { - "endIndex": 21279, - "paragraph": { - "bullet": { - "listId": "kix.m6p9bvttqrj7", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 21274, - "startIndex": 21268, - "textRun": { - "content": "Click ", - "textStyle": {} - } - }, - { - "endIndex": 21278, - "startIndex": 21274, - "textRun": { - "content": "Save", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 21279, - "startIndex": 21278, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21268 - }, - { - "endIndex": 21280, - "paragraph": { - "elements": [ - { - "endIndex": 21280, - "startIndex": 21279, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21279 - }, - { - "endIndex": 21337, - "paragraph": { - "elements": [ - { - "endIndex": 21337, - "startIndex": 21280, - "textRun": { - "content": "Your purchases should now be set up in the Play Console.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21280 - }, - { - "endIndex": 21339, - "paragraph": { - "elements": [ - { - "endIndex": 21338, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 21337 - }, - { - "endIndex": 21339, - "startIndex": 21338, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.soqnhmiu1i0d", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 21337 - }, - { - "endIndex": 21355, - "paragraph": { - "elements": [ - { - "endIndex": 21355, - "startIndex": 21339, - "textRun": { - "content": "Set up Firebase\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ejv8vgshgjc1", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 21339 - }, - { - "endIndex": 21440, - "paragraph": { - "elements": [ - { - "endIndex": 21440, - "startIndex": 21355, - "textRun": { - "content": "In this codelab, you’ll use a backend service to verify and track users’ purchases. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21355 - }, - { - "endIndex": 21486, - "paragraph": { - "elements": [ - { - "endIndex": 21486, - "startIndex": 21440, - "textRun": { - "content": "Using a backend service has several benefits:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21440 - }, - { - "endIndex": 21487, - "paragraph": { - "elements": [ - { - "endIndex": 21487, - "startIndex": 21486, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21486 - }, - { - "endIndex": 21525, - "paragraph": { - "bullet": { - "listId": "kix.6o706gv3wzlk", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 21525, - "startIndex": 21487, - "textRun": { - "content": "You can securely verify transactions.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21487 - }, - { - "endIndex": 21578, - "paragraph": { - "bullet": { - "listId": "kix.6o706gv3wzlk", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 21578, - "startIndex": 21525, - "textRun": { - "content": "You can react to billing events from the app stores.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21525 - }, - { - "endIndex": 21629, - "paragraph": { - "bullet": { - "listId": "kix.6o706gv3wzlk", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 21629, - "startIndex": 21578, - "textRun": { - "content": "You can keep track of the purchases in a database.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21578 - }, - { - "endIndex": 21731, - "paragraph": { - "bullet": { - "listId": "kix.6o706gv3wzlk", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 21731, - "startIndex": 21629, - "textRun": { - "content": "Users won’t be able to fool your app into providing premium features by rewinding their system clock.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21629 - }, - { - "endIndex": 21732, - "paragraph": { - "elements": [ - { - "endIndex": 21732, - "startIndex": 21731, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21731 - }, - { - "endIndex": 22247, - "paragraph": { - "elements": [ - { - "endIndex": 22247, - "startIndex": 21732, - "textRun": { - "content": "While there are many ways to set up a backend service, you’ll do this using cloud functions and Firestore, using Google’s own Firebase. \u000b\u000bWriting the backend is considered out of scope for this codelab, so the starter code already includes a Firebase project that handles basic purchases to get you started. \u000b\u000bFirebase plugins are also included with the starter app.\u000b\u000bWhat’s left for you to do is to create your own Firebase project, configure both the app and backend for Firebase, and finally deploy the backend.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21732 - }, - { - "endIndex": 22273, - "paragraph": { - "elements": [ - { - "endIndex": 22273, - "startIndex": 22247, - "textRun": { - "content": "Create a Firebase project\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.whi67zwuhucz", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 22247 - }, - { - "endIndex": 22274, - "paragraph": { - "elements": [ - { - "endIndex": 22274, - "startIndex": 22273, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22273 - }, - { - "endIndex": 22387, - "paragraph": { - "elements": [ - { - "endIndex": 22284, - "startIndex": 22274, - "textRun": { - "content": "Go to the ", - "textStyle": {} - } - }, - { - "endIndex": 22300, - "startIndex": 22284, - "textRun": { - "content": "Firebase console", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://firebase.google.com/" - }, - "underline": true - } - } - }, - { - "endIndex": 22387, - "startIndex": 22300, - "textRun": { - "content": ", and create a new Firebase project. For this example, call the project Dash Clicker. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22274 - }, - { - "endIndex": 22388, - "paragraph": { - "elements": [ - { - "endIndex": 22388, - "startIndex": 22387, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22387 - }, - { - "endIndex": 22556, - "paragraph": { - "elements": [ - { - "endIndex": 22556, - "startIndex": 22388, - "textRun": { - "content": "In the backend app, you tie purchases to a specific user, therefore, you need authentication. For this, leverage Firebase’s authentication module with Google sign-in. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22388 - }, - { - "endIndex": 22557, - "paragraph": { - "elements": [ - { - "endIndex": 22557, - "startIndex": 22556, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22556 - }, - { - "endIndex": 22633, - "paragraph": { - "bullet": { - "listId": "kix.48iczhtzcs3b", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 22592, - "startIndex": 22557, - "textRun": { - "content": "From the Firebase dashboard, go to ", - "textStyle": {} - } - }, - { - "endIndex": 22606, - "startIndex": 22592, - "textRun": { - "content": "Authentication", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 22633, - "startIndex": 22606, - "textRun": { - "content": " and enable it, if needed.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22557 - }, - { - "endIndex": 22703, - "paragraph": { - "bullet": { - "listId": "kix.48iczhtzcs3b", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 22643, - "startIndex": 22633, - "textRun": { - "content": "Go to the ", - "textStyle": {} - } - }, - { - "endIndex": 22657, - "startIndex": 22643, - "textRun": { - "content": "Sign-in method", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 22678, - "startIndex": 22657, - "textRun": { - "content": " tab, and enable the ", - "textStyle": {} - } - }, - { - "endIndex": 22684, - "startIndex": 22678, - "textRun": { - "content": "Google", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 22703, - "startIndex": 22684, - "textRun": { - "content": " sign-in provider.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22633 - }, - { - "endIndex": 22705, - "paragraph": { - "elements": [ - { - "endIndex": 22704, - "inlineObjectElement": { - "inlineObjectId": "kix.qdwextc6ysh", - "textStyle": {} - }, - "startIndex": 22703 - }, - { - "endIndex": 22705, - "startIndex": 22704, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22703 - }, - { - "endIndex": 22706, - "paragraph": { - "elements": [ - { - "endIndex": 22706, - "startIndex": 22705, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22705 - }, - { - "endIndex": 22779, - "paragraph": { - "elements": [ - { - "endIndex": 22779, - "startIndex": 22706, - "textRun": { - "content": "Because you’ll also use Firebases’s Firestore database, enable this too.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22706 - }, - { - "endIndex": 22780, - "paragraph": { - "elements": [ - { - "endIndex": 22780, - "startIndex": 22779, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22779 - }, - { - "endIndex": 22782, - "paragraph": { - "elements": [ - { - "endIndex": 22781, - "inlineObjectElement": { - "inlineObjectId": "kix.pji8h4xda4e1", - "textStyle": {} - }, - "startIndex": 22780 - }, - { - "endIndex": 22782, - "startIndex": 22781, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22780 - }, - { - "endIndex": 22783, - "paragraph": { - "elements": [ - { - "endIndex": 22783, - "startIndex": 22782, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22782 - }, - { - "endIndex": 22820, - "paragraph": { - "elements": [ - { - "endIndex": 22820, - "startIndex": 22783, - "textRun": { - "content": "Set Cloud Firestore rules like this:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22783 - }, - { - "endIndex": 22821, - "paragraph": { - "elements": [ - { - "endIndex": 22821, - "startIndex": 22820, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22820 - }, - { - "endIndex": 23048, - "startIndex": 22821, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 23047, - "startIndex": 22822, - "tableCells": [ - { - "content": [ - { - "endIndex": 22845, - "paragraph": { - "elements": [ - { - "endIndex": 22845, - "startIndex": 22824, - "textRun": { - "content": "rules_version = '2';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22824 - }, - { - "endIndex": 22871, - "paragraph": { - "elements": [ - { - "endIndex": 22871, - "startIndex": 22845, - "textRun": { - "content": "service cloud.firestore {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22845 - }, - { - "endIndex": 22913, - "paragraph": { - "elements": [ - { - "endIndex": 22913, - "startIndex": 22871, - "textRun": { - "content": " match /databases/{database}/documents {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22871 - }, - { - "endIndex": 22949, - "paragraph": { - "elements": [ - { - "endIndex": 22949, - "startIndex": 22913, - "textRun": { - "content": " match /purchases/{purchaseId} {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22913 - }, - { - "endIndex": 23035, - "paragraph": { - "elements": [ - { - "endIndex": 23035, - "startIndex": 22949, - "textRun": { - "content": " allow read: if request.auth != null && request.auth.uid == resource.data.userId\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22949 - }, - { - "endIndex": 23041, - "paragraph": { - "elements": [ - { - "endIndex": 23041, - "startIndex": 23035, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23035 - }, - { - "endIndex": 23045, - "paragraph": { - "elements": [ - { - "endIndex": 23045, - "startIndex": 23041, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23041 - }, - { - "endIndex": 23047, - "paragraph": { - "elements": [ - { - "endIndex": 23047, - "startIndex": 23045, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23045 - } - ], - "endIndex": 23047, - "startIndex": 22823, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 23049, - "paragraph": { - "elements": [ - { - "endIndex": 23049, - "startIndex": 23048, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23048 - }, - { - "endIndex": 23078, - "paragraph": { - "elements": [ - { - "endIndex": 23078, - "startIndex": 23049, - "textRun": { - "content": "Set up Firebase for Flutter\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.1ccdp4w5qlnf", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 23049 - }, - { - "endIndex": 23224, - "paragraph": { - "elements": [ - { - "endIndex": 23212, - "startIndex": 23078, - "textRun": { - "content": "The recommended way to install Firebase on the Flutter app is to use the FlutterFire CLI. Follow the instructions as explained in the ", - "textStyle": {} - } - }, - { - "endIndex": 23222, - "startIndex": 23212, - "textRun": { - "content": "setup page", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://firebase.google.com/docs/flutter/setup" - }, - "underline": true - } - } - }, - { - "endIndex": 23224, - "startIndex": 23222, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23078 - }, - { - "endIndex": 23225, - "paragraph": { - "elements": [ - { - "endIndex": 23225, - "startIndex": 23224, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23224 - }, - { - "endIndex": 23319, - "paragraph": { - "elements": [ - { - "endIndex": 23319, - "startIndex": 23225, - "textRun": { - "content": "When running flutterfire configure, select the project you just created in the previous step.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23225 - }, - { - "endIndex": 23320, - "paragraph": { - "elements": [ - { - "endIndex": 23320, - "startIndex": 23319, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23319 - }, - { - "endIndex": 24338, - "startIndex": 23320, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 24337, - "startIndex": 23321, - "tableCells": [ - { - "content": [ - { - "endIndex": 23347, - "paragraph": { - "elements": [ - { - "endIndex": 23347, - "startIndex": 23323, - "textRun": { - "content": "$ flutterfire configure\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23323 - }, - { - "endIndex": 23348, - "paragraph": { - "elements": [ - { - "endIndex": 23348, - "startIndex": 23347, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23347 - }, - { - "endIndex": 23475, - "paragraph": { - "elements": [ - { - "endIndex": 23475, - "startIndex": 23348, - "textRun": { - "content": "i Found 5 Firebase projects. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23348 - }, - { - "endIndex": 23602, - "paragraph": { - "elements": [ - { - "endIndex": 23602, - "startIndex": 23475, - "textRun": { - "content": "? Select a Firebase project to configure your Flutter application with › \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23475 - }, - { - "endIndex": 23723, - "paragraph": { - "elements": [ - { - "endIndex": 23723, - "startIndex": 23602, - "textRun": { - "content": "❯ in-app-purchases-1234 (in-app-purchases-1234) \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23602 - }, - { - "endIndex": 23850, - "paragraph": { - "elements": [ - { - "endIndex": 23850, - "startIndex": 23723, - "textRun": { - "content": " other-flutter-codelab-1 (other-flutter-codelab-1) \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23723 - }, - { - "endIndex": 23972, - "paragraph": { - "elements": [ - { - "endIndex": 23972, - "startIndex": 23850, - "textRun": { - "content": " other-flutter-codelab-2 (other-flutter-codelab-2) \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23850 - }, - { - "endIndex": 24099, - "paragraph": { - "elements": [ - { - "endIndex": 24099, - "startIndex": 23972, - "textRun": { - "content": " other-flutter-codelab-3 (other-flutter-codelab-3) \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23972 - }, - { - "endIndex": 24310, - "paragraph": { - "elements": [ - { - "endIndex": 24310, - "startIndex": 24099, - "textRun": { - "content": " other-flutter-codelab-4 (other-flutter-codelab-4) \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24099 - }, - { - "endIndex": 24337, - "paragraph": { - "elements": [ - { - "endIndex": 24337, - "startIndex": 24310, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24310 - } - ], - "endIndex": 24337, - "startIndex": 23322, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 24339, - "paragraph": { - "elements": [ - { - "endIndex": 24339, - "startIndex": 24338, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24338 - }, - { - "endIndex": 24400, - "paragraph": { - "elements": [ - { - "endIndex": 24352, - "startIndex": 24339, - "textRun": { - "content": "Next, enable ", - "textStyle": {} - } - }, - { - "endIndex": 24355, - "startIndex": 24352, - "textRun": { - "content": "iOS", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 24360, - "startIndex": 24355, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 24367, - "startIndex": 24360, - "textRun": { - "content": "Android", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 24400, - "startIndex": 24367, - "textRun": { - "content": " by selecting the two platforms.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24339 - }, - { - "endIndex": 24401, - "paragraph": { - "elements": [ - { - "endIndex": 24401, - "startIndex": 24400, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24400 - }, - { - "endIndex": 25041, - "startIndex": 24401, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 25040, - "startIndex": 24402, - "tableCells": [ - { - "content": [ - { - "endIndex": 24531, - "paragraph": { - "elements": [ - { - "endIndex": 24531, - "startIndex": 24404, - "textRun": { - "content": "? Which platforms should your configuration support (use arrow keys & space to select)? › \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24404 - }, - { - "endIndex": 24658, - "paragraph": { - "elements": [ - { - "endIndex": 24658, - "startIndex": 24531, - "textRun": { - "content": "✔ android \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24531 - }, - { - "endIndex": 24785, - "paragraph": { - "elements": [ - { - "endIndex": 24785, - "startIndex": 24658, - "textRun": { - "content": "✔ ios \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24658 - }, - { - "endIndex": 24912, - "paragraph": { - "elements": [ - { - "endIndex": 24912, - "startIndex": 24785, - "textRun": { - "content": " macos \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24785 - }, - { - "endIndex": 25040, - "paragraph": { - "elements": [ - { - "endIndex": 25040, - "startIndex": 24912, - "textRun": { - "content": " web \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24912 - } - ], - "endIndex": 25040, - "startIndex": 24403, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 25042, - "paragraph": { - "elements": [ - { - "endIndex": 25042, - "startIndex": 25041, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25041 - }, - { - "endIndex": 25108, - "paragraph": { - "elements": [ - { - "endIndex": 25108, - "startIndex": 25042, - "textRun": { - "content": "When prompted about overriding firebase_options.dart, select yes.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25042 - }, - { - "endIndex": 25109, - "paragraph": { - "elements": [ - { - "endIndex": 25109, - "startIndex": 25108, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25108 - }, - { - "endIndex": 25349, - "startIndex": 25109, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 25348, - "startIndex": 25110, - "tableCells": [ - { - "content": [ - { - "endIndex": 25348, - "paragraph": { - "elements": [ - { - "endIndex": 25348, - "startIndex": 25112, - "textRun": { - "content": "? Generated FirebaseOptions file lib/firebase_options.dart already exists, do you want to override it? (y/n) › yes \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25112 - } - ], - "endIndex": 25348, - "startIndex": 25111, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 25350, - "paragraph": { - "elements": [ - { - "endIndex": 25350, - "startIndex": 25349, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25349 - }, - { - "endIndex": 25351, - "paragraph": { - "elements": [ - { - "endIndex": 25351, - "startIndex": 25350, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25350 - }, - { - "endIndex": 25394, - "paragraph": { - "elements": [ - { - "endIndex": 25394, - "startIndex": 25351, - "textRun": { - "content": "Set up Firebase for Android: Further steps\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.rb9iczfwcj61", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 25351 - }, - { - "endIndex": 25395, - "paragraph": { - "elements": [ - { - "endIndex": 25395, - "startIndex": 25394, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25394 - }, - { - "endIndex": 25492, - "paragraph": { - "elements": [ - { - "endIndex": 25430, - "startIndex": 25395, - "textRun": { - "content": "From the Firebase dashboard, go to ", - "textStyle": {} - } - }, - { - "endIndex": 25447, - "startIndex": 25430, - "textRun": { - "content": "Project Overview,", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 25455, - "startIndex": 25447, - "textRun": { - "content": " choose ", - "textStyle": {} - } - }, - { - "endIndex": 25463, - "startIndex": 25455, - "textRun": { - "content": "Settings", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 25479, - "startIndex": 25463, - "textRun": { - "content": " and select the ", - "textStyle": {} - } - }, - { - "endIndex": 25486, - "startIndex": 25479, - "textRun": { - "content": "General", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 25492, - "startIndex": 25486, - "textRun": { - "content": " tab.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25395 - }, - { - "endIndex": 25493, - "paragraph": { - "elements": [ - { - "endIndex": 25493, - "startIndex": 25492, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25492 - }, - { - "endIndex": 25561, - "paragraph": { - "elements": [ - { - "endIndex": 25508, - "startIndex": 25493, - "textRun": { - "content": "Scroll down to ", - "textStyle": {} - } - }, - { - "endIndex": 25517, - "startIndex": 25508, - "textRun": { - "content": "Your apps", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 25534, - "startIndex": 25517, - "textRun": { - "content": ", and select the ", - "textStyle": {} - } - }, - { - "endIndex": 25555, - "startIndex": 25534, - "textRun": { - "content": "dashclicker (android)", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 25561, - "startIndex": 25555, - "textRun": { - "content": " app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25493 - }, - { - "endIndex": 25562, - "paragraph": { - "elements": [ - { - "endIndex": 25562, - "startIndex": 25561, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25561 - }, - { - "endIndex": 25565, - "paragraph": { - "elements": [ - { - "endIndex": 25563, - "inlineObjectElement": { - "inlineObjectId": "kix.xhbjqrseo000", - "textStyle": {} - }, - "startIndex": 25562 - }, - { - "endIndex": 25565, - "startIndex": 25563, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25562 - }, - { - "endIndex": 25675, - "paragraph": { - "elements": [ - { - "endIndex": 25675, - "startIndex": 25565, - "textRun": { - "content": "To allow Google sign-in in debug mode, you must provide the SHA-1 hash fingerprint of your debug certificate.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25565 - }, - { - "endIndex": 25715, - "paragraph": { - "elements": [ - { - "endIndex": 25715, - "startIndex": 25675, - "textRun": { - "content": "Get your debug signing certificate hash\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hl575bgcxaxg", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 25675 - }, - { - "endIndex": 25716, - "paragraph": { - "elements": [ - { - "endIndex": 25716, - "startIndex": 25715, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25715 - }, - { - "endIndex": 25830, - "paragraph": { - "elements": [ - { - "endIndex": 25781, - "startIndex": 25716, - "textRun": { - "content": "In the root of your Flutter app project, change directory to the ", - "textStyle": {} - } - }, - { - "endIndex": 25789, - "startIndex": 25781, - "textRun": { - "content": "android/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25830, - "startIndex": 25789, - "textRun": { - "content": " folder then generate a signing report.\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25716 - }, - { - "endIndex": 25965, - "startIndex": 25830, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 25964, - "startIndex": 25831, - "tableCells": [ - { - "content": [ - { - "endIndex": 25964, - "paragraph": { - "elements": [ - { - "endIndex": 25837, - "startIndex": 25833, - "textRun": { - "content": "Note", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 25865, - "startIndex": 25837, - "textRun": { - "content": ": changing the directory to ", - "textStyle": {} - } - }, - { - "endIndex": 25873, - "startIndex": 25865, - "textRun": { - "content": "android/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25898, - "startIndex": 25873, - "textRun": { - "content": " is crucial as otherwise ", - "textStyle": {} - } - }, - { - "endIndex": 25902, - "startIndex": 25898, - "textRun": { - "content": "java", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25933, - "startIndex": 25902, - "textRun": { - "content": " will not be able to find your ", - "textStyle": {} - } - }, - { - "endIndex": 25937, - "startIndex": 25933, - "textRun": { - "content": ":app", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25964, - "startIndex": 25937, - "textRun": { - "content": " project in the next step.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25833 - } - ], - "endIndex": 25964, - "startIndex": 25832, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8039216, - "green": 0.8980392, - "red": 0.9882353 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 25966, - "paragraph": { - "elements": [ - { - "endIndex": 25966, - "startIndex": 25965, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25965 - }, - { - "endIndex": 26010, - "startIndex": 25966, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 26009, - "startIndex": 25967, - "tableCells": [ - { - "content": [ - { - "endIndex": 25980, - "paragraph": { - "elements": [ - { - "endIndex": 25980, - "startIndex": 25969, - "textRun": { - "content": "cd android\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25969 - }, - { - "endIndex": 26009, - "paragraph": { - "elements": [ - { - "endIndex": 26008, - "startIndex": 25980, - "textRun": { - "content": "./gradlew :app:signingReport", - "textStyle": { - "italic": true, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 26009, - "startIndex": 26008, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25980 - } - ], - "endIndex": 26009, - "startIndex": 25968, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 26011, - "paragraph": { - "elements": [ - { - "endIndex": 26011, - "startIndex": 26010, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26010 - }, - { - "endIndex": 26171, - "startIndex": 26011, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 26170, - "startIndex": 26012, - "tableCells": [ - { - "content": [ - { - "endIndex": 26170, - "paragraph": { - "elements": [ - { - "endIndex": 26018, - "startIndex": 26014, - "textRun": { - "content": "Note", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 26145, - "startIndex": 26018, - "textRun": { - "content": ": In case the gradle wrapper file is not present, you can generate it by building your application for Android once by running ", - "textStyle": {} - } - }, - { - "endIndex": 26168, - "startIndex": 26145, - "textRun": { - "content": "flutter build appbundle", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 26170, - "startIndex": 26168, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26014 - } - ], - "endIndex": 26170, - "startIndex": 26013, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8039216, - "green": 0.8980392, - "red": 0.9882353 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 26172, - "paragraph": { - "elements": [ - { - "endIndex": 26172, - "startIndex": 26171, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.rf4eo4kaj85s", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 26171 - }, - { - "endIndex": 26454, - "paragraph": { - "elements": [ - { - "endIndex": 26324, - "startIndex": 26172, - "textRun": { - "content": "You’ll be presented with a large list of signing keys. Because you’re looking for the hash for the debug certificate, look for the certificate with the ", - "textStyle": {} - } - }, - { - "endIndex": 26331, - "startIndex": 26324, - "textRun": { - "content": "Variant", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 26336, - "startIndex": 26331, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 26342, - "startIndex": 26336, - "textRun": { - "content": "Config", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 26361, - "startIndex": 26342, - "textRun": { - "content": " properties set to ", - "textStyle": {} - } - }, - { - "endIndex": 26366, - "startIndex": 26361, - "textRun": { - "content": "debug", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 26429, - "startIndex": 26366, - "textRun": { - "content": ". It’s likely for the keystore to be in your home folder under ", - "textStyle": {} - } - }, - { - "endIndex": 26452, - "startIndex": 26429, - "textRun": { - "content": ".android/debug.keystore", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 26454, - "startIndex": 26452, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26172 - }, - { - "endIndex": 26455, - "paragraph": { - "elements": [ - { - "endIndex": 26455, - "startIndex": 26454, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26454 - }, - { - "endIndex": 26851, - "startIndex": 26455, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 26850, - "startIndex": 26456, - "tableCells": [ - { - "content": [ - { - "endIndex": 26484, - "paragraph": { - "elements": [ - { - "endIndex": 26484, - "startIndex": 26458, - "textRun": { - "content": "> Task :app:signingReport\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26458 - }, - { - "endIndex": 26499, - "paragraph": { - "elements": [ - { - "endIndex": 26499, - "startIndex": 26484, - "textRun": { - "content": "Variant: debug\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26484 - }, - { - "endIndex": 26513, - "paragraph": { - "elements": [ - { - "endIndex": 26513, - "startIndex": 26499, - "textRun": { - "content": "Config: debug\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26499 - }, - { - "endIndex": 26564, - "paragraph": { - "elements": [ - { - "endIndex": 26564, - "startIndex": 26513, - "textRun": { - "content": "Store: //.android/debug.keystore\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26513 - }, - { - "endIndex": 26587, - "paragraph": { - "elements": [ - { - "endIndex": 26587, - "startIndex": 26564, - "textRun": { - "content": "Alias: AndroidDebugKey\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26564 - }, - { - "endIndex": 26640, - "paragraph": { - "elements": [ - { - "endIndex": 26640, - "startIndex": 26587, - "textRun": { - "content": "MD5: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26587 - }, - { - "endIndex": 26706, - "paragraph": { - "elements": [ - { - "endIndex": 26706, - "startIndex": 26640, - "textRun": { - "content": "SHA1: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26640 - }, - { - "endIndex": 26811, - "paragraph": { - "elements": [ - { - "endIndex": 26811, - "startIndex": 26706, - "textRun": { - "content": "SHA-256: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26706 - }, - { - "endIndex": 26850, - "paragraph": { - "elements": [ - { - "endIndex": 26850, - "startIndex": 26811, - "textRun": { - "content": "Valid until: Tuesday, January 19, 2038\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26811 - } - ], - "endIndex": 26850, - "startIndex": 26457, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 26852, - "paragraph": { - "elements": [ - { - "endIndex": 26852, - "startIndex": 26851, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26851 - }, - { - "endIndex": 26936, - "paragraph": { - "elements": [ - { - "endIndex": 26936, - "startIndex": 26852, - "textRun": { - "content": "Copy the SHA-1 hash, and fill in the last field in the app submission modal dialog.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26852 - }, - { - "endIndex": 26975, - "paragraph": { - "elements": [ - { - "endIndex": 26975, - "startIndex": 26936, - "textRun": { - "content": "Set up Firebase for iOS: Further steps\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.p0owkml37qhm", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 26936 - }, - { - "endIndex": 26976, - "paragraph": { - "elements": [ - { - "endIndex": 26976, - "startIndex": 26975, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26975 - }, - { - "endIndex": 27050, - "paragraph": { - "elements": [ - { - "endIndex": 26977, - "startIndex": 26976, - "textRun": { - "content": "O", - "textStyle": {} - } - }, - { - "endIndex": 26985, - "startIndex": 26977, - "textRun": { - "content": "pen the ", - "textStyle": {} - } - }, - { - "endIndex": 27008, - "startIndex": 26985, - "textRun": { - "content": "ios/Runnder.xcworkspace", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27014, - "startIndex": 27008, - "textRun": { - "content": " with ", - "textStyle": {} - } - }, - { - "endIndex": 27019, - "startIndex": 27014, - "textRun": { - "content": "Xcode", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27050, - "startIndex": 27019, - "textRun": { - "content": ". Or with your IDE of choice. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26976 - }, - { - "endIndex": 27051, - "paragraph": { - "elements": [ - { - "endIndex": 27051, - "startIndex": 27050, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 27050 - }, - { - "endIndex": 27116, - "paragraph": { - "elements": [ - { - "endIndex": 27080, - "startIndex": 27051, - "textRun": { - "content": "On VSCode right click on the ", - "textStyle": {} - } - }, - { - "endIndex": 27084, - "startIndex": 27080, - "textRun": { - "content": "ios/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27101, - "startIndex": 27084, - "textRun": { - "content": " folder and then ", - "textStyle": {} - } - }, - { - "endIndex": 27114, - "startIndex": 27101, - "textRun": { - "content": "open in xcode", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27115, - "startIndex": 27114, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 27116, - "startIndex": 27115, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 27051 - }, - { - "endIndex": 27117, - "paragraph": { - "elements": [ - { - "endIndex": 27117, - "startIndex": 27116, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 27116 - }, - { - "endIndex": 27237, - "paragraph": { - "elements": [ - { - "endIndex": 27154, - "startIndex": 27117, - "textRun": { - "content": "On Android Studio right click on the ", - "textStyle": {} - } - }, - { - "endIndex": 27158, - "startIndex": 27154, - "textRun": { - "content": "ios/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27180, - "startIndex": 27158, - "textRun": { - "content": " folder then click on ", - "textStyle": {} - } - }, - { - "endIndex": 27187, - "startIndex": 27180, - "textRun": { - "content": "flutter", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27204, - "startIndex": 27187, - "textRun": { - "content": " followed by the ", - "textStyle": {} - } - }, - { - "endIndex": 27228, - "startIndex": 27204, - "textRun": { - "content": "open iOS module in Xcode", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27235, - "startIndex": 27228, - "textRun": { - "content": " option", - "textStyle": {} - } - }, - { - "endIndex": 27237, - "startIndex": 27235, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27117 - }, - { - "endIndex": 27238, - "paragraph": { - "elements": [ - { - "endIndex": 27238, - "startIndex": 27237, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27237 - }, - { - "endIndex": 27500, - "paragraph": { - "elements": [ - { - "endIndex": 27282, - "startIndex": 27238, - "textRun": { - "content": "To allow for Google sign-in on iOS, add the ", - "textStyle": {} - } - }, - { - "endIndex": 27298, - "startIndex": 27282, - "textRun": { - "content": "CFBundleURLTypes", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27334, - "startIndex": 27298, - "textRun": { - "content": " configuration option to your build ", - "textStyle": {} - } - }, - { - "endIndex": 27339, - "startIndex": 27334, - "textRun": { - "content": "plist", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27358, - "startIndex": 27339, - "textRun": { - "content": " files. (Check the ", - "textStyle": {} - } - }, - { - "endIndex": 27372, - "startIndex": 27358, - "textRun": { - "content": "google_sign_in", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/google_sign_in#ios-integration" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27380, - "startIndex": 27372, - "textRun": { - "content": " package", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/google_sign_in#ios-integration" - }, - "underline": true - } - } - }, - { - "endIndex": 27385, - "startIndex": 27380, - "textRun": { - "content": " docs", - "textStyle": {} - } - }, - { - "endIndex": 27437, - "startIndex": 27385, - "textRun": { - "content": " for more information.)\u000bIn this case, the files are ", - "textStyle": {} - } - }, - { - "endIndex": 27464, - "startIndex": 27437, - "textRun": { - "content": "ios/Runner/Info-Debug.plist", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27469, - "startIndex": 27464, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 27498, - "startIndex": 27469, - "textRun": { - "content": "ios/Runner/Info-Release.plist", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27500, - "startIndex": 27498, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 27238 - }, - { - "endIndex": 27501, - "paragraph": { - "elements": [ - { - "endIndex": 27501, - "startIndex": 27500, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 27500 - }, - { - "endIndex": 27574, - "paragraph": { - "elements": [ - { - "endIndex": 27574, - "startIndex": 27501, - "textRun": { - "content": "The key-value pair was already added, but their values must be replaced:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 27501 - }, - { - "endIndex": 27575, - "paragraph": { - "elements": [ - { - "endIndex": 27575, - "startIndex": 27574, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 27574 - }, - { - "endIndex": 27708, - "paragraph": { - "bullet": { - "listId": "kix.m7b3lhbn68t8", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 27593, - "startIndex": 27575, - "textRun": { - "content": "Get the value for ", - "textStyle": {} - } - }, - { - "endIndex": 27611, - "startIndex": 27593, - "textRun": { - "content": "REVERSED_CLIENT_ID", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27621, - "startIndex": 27611, - "textRun": { - "content": " from the ", - "textStyle": {} - } - }, - { - "endIndex": 27645, - "startIndex": 27621, - "textRun": { - "content": "GoogleService-Info.plist", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27664, - "startIndex": 27645, - "textRun": { - "content": " file, without the ", - "textStyle": {} - } - }, - { - "endIndex": 27683, - "startIndex": 27664, - "textRun": { - "content": "..", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27708, - "startIndex": 27683, - "textRun": { - "content": " element surrounding it.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27575 - }, - { - "endIndex": 27839, - "paragraph": { - "bullet": { - "listId": "kix.m7b3lhbn68t8", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 27739, - "startIndex": 27708, - "textRun": { - "content": "Replace the value in both your ", - "textStyle": {} - } - }, - { - "endIndex": 27766, - "startIndex": 27739, - "textRun": { - "content": "ios/Runner/Info-Debug.plist", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27771, - "startIndex": 27766, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 27800, - "startIndex": 27771, - "textRun": { - "content": "ios/Runner/Info-Release.plist", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27817, - "startIndex": 27800, - "textRun": { - "content": " files under the ", - "textStyle": {} - } - }, - { - "endIndex": 27833, - "startIndex": 27817, - "textRun": { - "content": "CFBundleURLTypes", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27839, - "startIndex": 27833, - "textRun": { - "content": " key.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27708 - }, - { - "endIndex": 27840, - "paragraph": { - "elements": [ - { - "endIndex": 27840, - "startIndex": 27839, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 27839 - }, - { - "endIndex": 28243, - "startIndex": 27840, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 28242, - "startIndex": 27841, - "tableCells": [ - { - "content": [ - { - "endIndex": 27871, - "paragraph": { - "elements": [ - { - "endIndex": 27871, - "startIndex": 27843, - "textRun": { - "content": "CFBundleURLTypes\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27843 - }, - { - "endIndex": 27879, - "paragraph": { - "elements": [ - { - "endIndex": 27879, - "startIndex": 27871, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27871 - }, - { - "endIndex": 27890, - "paragraph": { - "elements": [ - { - "endIndex": 27890, - "startIndex": 27879, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27879 - }, - { - "endIndex": 27926, - "paragraph": { - "elements": [ - { - "endIndex": 27926, - "startIndex": 27890, - "textRun": { - "content": " CFBundleTypeRole\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27890 - }, - { - "endIndex": 27958, - "paragraph": { - "elements": [ - { - "endIndex": 27958, - "startIndex": 27926, - "textRun": { - "content": " Editor\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27926 - }, - { - "endIndex": 27996, - "paragraph": { - "elements": [ - { - "endIndex": 27996, - "startIndex": 27958, - "textRun": { - "content": " CFBundleURLSchemes\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27958 - }, - { - "endIndex": 28012, - "paragraph": { - "elements": [ - { - "endIndex": 28012, - "startIndex": 27996, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27996 - }, - { - "endIndex": 28058, - "paragraph": { - "elements": [ - { - "endIndex": 28058, - "startIndex": 28012, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28012 - }, - { - "endIndex": 28139, - "paragraph": { - "elements": [ - { - "endIndex": 28139, - "startIndex": 28058, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28058 - }, - { - "endIndex": 28204, - "paragraph": { - "elements": [ - { - "endIndex": 28204, - "startIndex": 28139, - "textRun": { - "content": " com.googleusercontent.apps.REDACTED\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28139 - }, - { - "endIndex": 28221, - "paragraph": { - "elements": [ - { - "endIndex": 28221, - "startIndex": 28204, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28204 - }, - { - "endIndex": 28233, - "paragraph": { - "elements": [ - { - "endIndex": 28233, - "startIndex": 28221, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28221 - }, - { - "endIndex": 28242, - "paragraph": { - "elements": [ - { - "endIndex": 28242, - "startIndex": 28233, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28233 - } - ], - "endIndex": 28242, - "startIndex": 27842, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 28244, - "paragraph": { - "elements": [ - { - "endIndex": 28244, - "startIndex": 28243, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 28243 - }, - { - "endIndex": 28286, - "paragraph": { - "elements": [ - { - "endIndex": 28286, - "startIndex": 28244, - "textRun": { - "content": "You are now done with the Firebase setup.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 28244 - }, - { - "endIndex": 28288, - "paragraph": { - "elements": [ - { - "endIndex": 28287, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 28286 - }, - { - "endIndex": 28288, - "startIndex": 28287, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.u6c3ytk6uvlf", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 28286 - }, - { - "endIndex": 28315, - "paragraph": { - "elements": [ - { - "endIndex": 28315, - "startIndex": 28288, - "textRun": { - "content": "Listen to purchase updates\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.mcahbl9vdrpn", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 28288 - }, - { - "endIndex": 28316, - "paragraph": { - "elements": [ - { - "endIndex": 28316, - "startIndex": 28315, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 28315 - }, - { - "endIndex": 28481, - "paragraph": { - "elements": [ - { - "endIndex": 28481, - "startIndex": 28316, - "textRun": { - "content": "In this part of the codelab you’ll prepare the app for purchasing the products. This process includes listening to purchase updates and errors after the app starts.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 28316 - }, - { - "endIndex": 28482, - "paragraph": { - "elements": [ - { - "endIndex": 28482, - "startIndex": 28481, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 28481 - }, - { - "endIndex": 28509, - "paragraph": { - "elements": [ - { - "endIndex": 28509, - "startIndex": 28482, - "textRun": { - "content": "Listen to purchase updates\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.fcw6hzds1nq", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 28482 - }, - { - "endIndex": 28510, - "paragraph": { - "elements": [ - { - "endIndex": 28510, - "startIndex": 28509, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 28509 - }, - { - "endIndex": 28886, - "paragraph": { - "elements": [ - { - "endIndex": 28513, - "startIndex": 28510, - "textRun": { - "content": "In ", - "textStyle": {} - } - }, - { - "endIndex": 28523, - "startIndex": 28513, - "textRun": { - "content": "main.dart,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28540, - "startIndex": 28523, - "textRun": { - "content": " find the widget ", - "textStyle": {} - } - }, - { - "endIndex": 28550, - "startIndex": 28540, - "textRun": { - "content": "MyHomePage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28562, - "startIndex": 28550, - "textRun": { - "content": " that has a ", - "textStyle": {} - } - }, - { - "endIndex": 28570, - "startIndex": 28562, - "textRun": { - "content": "Scaffold", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28578, - "startIndex": 28570, - "textRun": { - "content": " with a ", - "textStyle": {} - } - }, - { - "endIndex": 28597, - "startIndex": 28578, - "textRun": { - "content": "BottomNavigationBar", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28649, - "startIndex": 28597, - "textRun": { - "content": " containing two pages. This page also creates three ", - "textStyle": {} - } - }, - { - "endIndex": 28657, - "startIndex": 28649, - "textRun": { - "content": "Provider", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28663, - "startIndex": 28657, - "textRun": { - "content": "s for ", - "textStyle": {} - } - }, - { - "endIndex": 28674, - "startIndex": 28663, - "textRun": { - "content": "DashCounter", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28676, - "startIndex": 28674, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 28689, - "startIndex": 28676, - "textRun": { - "content": "DashUpgrades,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28694, - "startIndex": 28689, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 28707, - "startIndex": 28694, - "textRun": { - "content": "DashPurchases", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28709, - "startIndex": 28707, - "textRun": { - "content": ". ", - "textStyle": {} - } - }, - { - "endIndex": 28720, - "startIndex": 28709, - "textRun": { - "content": "DashCounter", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28760, - "startIndex": 28720, - "textRun": { - "content": " tracks the current count of Dashes and ", - "textStyle": {} - } - }, - { - "endIndex": 28764, - "startIndex": 28760, - "textRun": { - "content": "auto", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 28782, - "startIndex": 28764, - "textRun": { - "content": " increments them. ", - "textStyle": {} - } - }, - { - "endIndex": 28794, - "startIndex": 28782, - "textRun": { - "content": "DashUpgrades", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28870, - "startIndex": 28794, - "textRun": { - "content": " manages the upgrades that you can buy with Dashes. This codelab focuses on ", - "textStyle": {} - } - }, - { - "endIndex": 28883, - "startIndex": 28870, - "textRun": { - "content": "DashPurchases", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 28886, - "startIndex": 28883, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 28510 - }, - { - "endIndex": 28887, - "paragraph": { - "elements": [ - { - "endIndex": 28887, - "startIndex": 28886, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 28886 - }, - { - "endIndex": 29099, - "paragraph": { - "elements": [ - { - "endIndex": 29086, - "startIndex": 28887, - "textRun": { - "content": "By default, the object of a provider is defined when that object is first requested. This object listens to purchase updates directly when the app starts, so disable lazy loading on this object with ", - "textStyle": {} - } - }, - { - "endIndex": 29097, - "startIndex": 29086, - "textRun": { - "content": "lazy: false", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29099, - "startIndex": 29097, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 28887 - }, - { - "endIndex": 29113, - "paragraph": { - "elements": [ - { - "endIndex": 29112, - "startIndex": 29099, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_07/app/lib/main.dart#L79-L84" - }, - "underline": true - } - } - }, - { - "endIndex": 29113, - "startIndex": 29112, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.jk048wxvrjkx", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 29099 - }, - { - "endIndex": 29250, - "startIndex": 29113, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 29249, - "startIndex": 29114, - "tableCells": [ - { - "content": [ - { - "endIndex": 29155, - "paragraph": { - "elements": [ - { - "endIndex": 29155, - "startIndex": 29116, - "textRun": { - "content": "ChangeNotifierProvider(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29116 - }, - { - "endIndex": 29193, - "paragraph": { - "elements": [ - { - "endIndex": 29193, - "startIndex": 29155, - "textRun": { - "content": " create: (context) => DashPurchases(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29155 - }, - { - "endIndex": 29226, - "paragraph": { - "elements": [ - { - "endIndex": 29226, - "startIndex": 29193, - "textRun": { - "content": " context.read(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29193 - }, - { - "endIndex": 29231, - "paragraph": { - "elements": [ - { - "endIndex": 29231, - "startIndex": 29226, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29226 - }, - { - "endIndex": 29246, - "paragraph": { - "elements": [ - { - "endIndex": 29246, - "startIndex": 29231, - "textRun": { - "content": " lazy: false,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29231 - }, - { - "endIndex": 29249, - "paragraph": { - "elements": [ - { - "endIndex": 29249, - "startIndex": 29246, - "textRun": { - "content": "),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29246 - } - ], - "endIndex": 29249, - "startIndex": 29115, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 29251, - "paragraph": { - "elements": [ - { - "endIndex": 29251, - "startIndex": 29250, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 29250 - }, - { - "endIndex": 29252, - "paragraph": { - "elements": [ - { - "endIndex": 29252, - "startIndex": 29251, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 29251 - }, - { - "endIndex": 29485, - "paragraph": { - "elements": [ - { - "endIndex": 29285, - "startIndex": 29252, - "textRun": { - "content": "You also need an instance of the ", - "textStyle": {} - } - }, - { - "endIndex": 29308, - "startIndex": 29285, - "textRun": { - "content": "InAppPurchaseConnection", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29474, - "startIndex": 29308, - "textRun": { - "content": ". However, to keep the app testable you need some way to mock the connection. To do this, create an instance method that can be overridden in the test, and add it to ", - "textStyle": {} - } - }, - { - "endIndex": 29483, - "startIndex": 29474, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29485, - "startIndex": 29483, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 29252 - }, - { - "endIndex": 29499, - "paragraph": { - "elements": [ - { - "endIndex": 29498, - "startIndex": 29485, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_07/app/lib/main.dart#L12-L24" - }, - "underline": true - } - } - }, - { - "endIndex": 29499, - "startIndex": 29498, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.o3vvyif9w0v", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 29485 - }, - { - "endIndex": 29784, - "startIndex": 29499, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 29783, - "startIndex": 29500, - "tableCells": [ - { - "content": [ - { - "endIndex": 29544, - "paragraph": { - "elements": [ - { - "endIndex": 29544, - "startIndex": 29502, - "textRun": { - "content": "// Gives the option to override in tests.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29502 - }, - { - "endIndex": 29566, - "paragraph": { - "elements": [ - { - "endIndex": 29566, - "startIndex": 29544, - "textRun": { - "content": "class IAPConnection {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29544 - }, - { - "endIndex": 29601, - "paragraph": { - "elements": [ - { - "endIndex": 29601, - "startIndex": 29566, - "textRun": { - "content": " static InAppPurchase? _instance;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29566 - }, - { - "endIndex": 29646, - "paragraph": { - "elements": [ - { - "endIndex": 29646, - "startIndex": 29601, - "textRun": { - "content": " static set instance(InAppPurchase value) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29601 - }, - { - "endIndex": 29669, - "paragraph": { - "elements": [ - { - "endIndex": 29669, - "startIndex": 29646, - "textRun": { - "content": " _instance = value;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29646 - }, - { - "endIndex": 29673, - "paragraph": { - "elements": [ - { - "endIndex": 29673, - "startIndex": 29669, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29669 - }, - { - "endIndex": 29674, - "paragraph": { - "elements": [ - { - "endIndex": 29674, - "startIndex": 29673, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29673 - }, - { - "endIndex": 29712, - "paragraph": { - "elements": [ - { - "endIndex": 29712, - "startIndex": 29674, - "textRun": { - "content": " static InAppPurchase get instance {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29674 - }, - { - "endIndex": 29754, - "paragraph": { - "elements": [ - { - "endIndex": 29754, - "startIndex": 29712, - "textRun": { - "content": " _instance ??= InAppPurchase.instance;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29712 - }, - { - "endIndex": 29777, - "paragraph": { - "elements": [ - { - "endIndex": 29777, - "startIndex": 29754, - "textRun": { - "content": " return _instance!;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29754 - }, - { - "endIndex": 29781, - "paragraph": { - "elements": [ - { - "endIndex": 29781, - "startIndex": 29777, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29777 - }, - { - "endIndex": 29783, - "paragraph": { - "elements": [ - { - "endIndex": 29783, - "startIndex": 29781, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29781 - } - ], - "endIndex": 29783, - "startIndex": 29501, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 29785, - "paragraph": { - "elements": [ - { - "endIndex": 29785, - "startIndex": 29784, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 29784 - }, - { - "endIndex": 29932, - "paragraph": { - "elements": [ - { - "endIndex": 29863, - "startIndex": 29785, - "textRun": { - "content": "You must slightly update the test if you want the test to keep working. Check ", - "textStyle": {} - } - }, - { - "endIndex": 29879, - "startIndex": 29863, - "textRun": { - "content": "widget_test.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_07/app/test/widget_test.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 29913, - "startIndex": 29879, - "textRun": { - "content": " on GitHub for the full code for ", - "textStyle": {} - } - }, - { - "endIndex": 29930, - "startIndex": 29913, - "textRun": { - "content": "TestIAPConnection", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29932, - "startIndex": 29930, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 29785 - }, - { - "endIndex": 29954, - "paragraph": { - "elements": [ - { - "endIndex": 29953, - "startIndex": 29932, - "textRun": { - "content": "test/widget_test.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_07/app/test/widget_test.dart#L7-L13" - }, - "underline": true - } - } - }, - { - "endIndex": 29954, - "startIndex": 29953, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.iq06bszch0h4", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 29932 - }, - { - "endIndex": 30185, - "startIndex": 29954, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 30184, - "startIndex": 29955, - "tableCells": [ - { - "content": [ - { - "endIndex": 29971, - "paragraph": { - "elements": [ - { - "endIndex": 29971, - "startIndex": 29957, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29957 - }, - { - "endIndex": 30029, - "paragraph": { - "elements": [ - { - "endIndex": 30029, - "startIndex": 29971, - "textRun": { - "content": " testWidgets('App starts', (WidgetTester tester) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29971 - }, - { - "endIndex": 30079, - "paragraph": { - "elements": [ - { - "endIndex": 30079, - "startIndex": 30029, - "textRun": { - "content": " IAPConnection.instance = TestIAPConnection();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30029 - }, - { - "endIndex": 30123, - "paragraph": { - "elements": [ - { - "endIndex": 30123, - "startIndex": 30079, - "textRun": { - "content": " await tester.pumpWidget(const MyApp());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30079 - }, - { - "endIndex": 30176, - "paragraph": { - "elements": [ - { - "endIndex": 30176, - "startIndex": 30123, - "textRun": { - "content": " expect(find.text('Tim Sneath'), findsOneWidget);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30123 - }, - { - "endIndex": 30182, - "paragraph": { - "elements": [ - { - "endIndex": 30182, - "startIndex": 30176, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30176 - }, - { - "endIndex": 30184, - "paragraph": { - "elements": [ - { - "endIndex": 30184, - "startIndex": 30182, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30182 - } - ], - "endIndex": 30184, - "startIndex": 29956, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 30186, - "paragraph": { - "elements": [ - { - "endIndex": 30186, - "startIndex": 30185, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30185 - }, - { - "endIndex": 30187, - "paragraph": { - "elements": [ - { - "endIndex": 30187, - "startIndex": 30186, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30186 - }, - { - "endIndex": 30352, - "paragraph": { - "elements": [ - { - "endIndex": 30190, - "startIndex": 30187, - "textRun": { - "content": "In ", - "textStyle": {} - } - }, - { - "endIndex": 30219, - "startIndex": 30190, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30223, - "startIndex": 30219, - "textRun": { - "content": ", go", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 30240, - "startIndex": 30223, - "textRun": { - "content": " to the code for ", - "textStyle": {} - } - }, - { - "endIndex": 30268, - "startIndex": 30240, - "textRun": { - "content": "DashPurchases ChangeNotifier", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30297, - "startIndex": 30268, - "textRun": { - "content": ". Currently, there is only a ", - "textStyle": {} - } - }, - { - "endIndex": 30308, - "startIndex": 30297, - "textRun": { - "content": "DashCounter", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30352, - "startIndex": 30308, - "textRun": { - "content": " that you can add to your purchased Dashes.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30187 - }, - { - "endIndex": 30353, - "paragraph": { - "elements": [ - { - "endIndex": 30353, - "startIndex": 30352, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30352 - }, - { - "endIndex": 30559, - "paragraph": { - "elements": [ - { - "endIndex": 30389, - "startIndex": 30353, - "textRun": { - "content": "Add a stream subscription property, ", - "textStyle": {} - } - }, - { - "endIndex": 30402, - "startIndex": 30389, - "textRun": { - "content": "_subscription", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30412, - "startIndex": 30402, - "textRun": { - "content": " (of type ", - "textStyle": {} - } - }, - { - "endIndex": 30468, - "startIndex": 30412, - "textRun": { - "content": "StreamSubscription> _subscription;", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30475, - "startIndex": 30468, - "textRun": { - "content": "), the ", - "textStyle": {} - } - }, - { - "endIndex": 30498, - "startIndex": 30475, - "textRun": { - "content": "IAPConnection.instance,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30559, - "startIndex": 30498, - "textRun": { - "content": " and the imports. The resulting code should look at follows:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30353 - }, - { - "endIndex": 30589, - "paragraph": { - "elements": [ - { - "endIndex": 30588, - "startIndex": 30559, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_07/app/lib/logic/dash_purchases.dart#L14" - }, - "underline": true - } - } - }, - { - "endIndex": 30589, - "startIndex": 30588, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.80zn0qqce5ar", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 30559 - }, - { - "endIndex": 30840, - "startIndex": 30589, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 30839, - "startIndex": 30590, - "tableCells": [ - { - "content": [ - { - "endIndex": 30647, - "paragraph": { - "elements": [ - { - "endIndex": 30647, - "startIndex": 30592, - "textRun": { - "content": "import 'package:in_app_purchase/in_app_purchase.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30592 - }, - { - "endIndex": 30648, - "paragraph": { - "elements": [ - { - "endIndex": 30648, - "startIndex": 30647, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30647 - }, - { - "endIndex": 30693, - "paragraph": { - "elements": [ - { - "endIndex": 30693, - "startIndex": 30648, - "textRun": { - "content": "class DashPurchases extends ChangeNotifier {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30648 - }, - { - "endIndex": 30757, - "paragraph": { - "elements": [ - { - "endIndex": 30757, - "startIndex": 30693, - "textRun": { - "content": " late StreamSubscription> _subscription;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30693 - }, - { - "endIndex": 30805, - "paragraph": { - "elements": [ - { - "endIndex": 30805, - "startIndex": 30757, - "textRun": { - "content": " final iapConnection = IAPConnection.instance;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30757 - }, - { - "endIndex": 30806, - "paragraph": { - "elements": [ - { - "endIndex": 30806, - "startIndex": 30805, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30805 - }, - { - "endIndex": 30837, - "paragraph": { - "elements": [ - { - "endIndex": 30837, - "startIndex": 30806, - "textRun": { - "content": " DashPurchases(this.counter);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30806 - }, - { - "endIndex": 30839, - "paragraph": { - "elements": [ - { - "endIndex": 30839, - "startIndex": 30837, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30837 - } - ], - "endIndex": 30839, - "startIndex": 30591, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 30841, - "paragraph": { - "elements": [ - { - "endIndex": 30841, - "startIndex": 30840, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30840 - }, - { - "endIndex": 31147, - "paragraph": { - "elements": [ - { - "endIndex": 30845, - "startIndex": 30841, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 30849, - "startIndex": 30845, - "textRun": { - "content": "late", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30870, - "startIndex": 30849, - "textRun": { - "content": " keyword is added to ", - "textStyle": {} - } - }, - { - "endIndex": 30883, - "startIndex": 30870, - "textRun": { - "content": "_subscription", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30896, - "startIndex": 30883, - "textRun": { - "content": " because the ", - "textStyle": {} - } - }, - { - "endIndex": 30909, - "startIndex": 30896, - "textRun": { - "content": "_subscription", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30924, - "startIndex": 30909, - "textRun": { - "content": " is initialized", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 31096, - "startIndex": 30924, - "textRun": { - "content": " in the constructor. This project is set up to be non-nullable by default (NNBD), which means that properties that aren’t declared nullable must have a non-null value. The ", - "textStyle": {} - } - }, - { - "endIndex": 31100, - "startIndex": 31096, - "textRun": { - "content": "late", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 31147, - "startIndex": 31100, - "textRun": { - "content": " qualifier lets you delay defining this value.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30841 - }, - { - "endIndex": 31148, - "paragraph": { - "elements": [ - { - "endIndex": 31148, - "startIndex": 31147, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31147 - }, - { - "endIndex": 31290, - "paragraph": { - "elements": [ - { - "endIndex": 31176, - "startIndex": 31148, - "textRun": { - "content": "In the constructor, get the ", - "textStyle": {} - } - }, - { - "endIndex": 31197, - "startIndex": 31176, - "textRun": { - "content": "purchaseUpdatedStream", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 31240, - "startIndex": 31197, - "textRun": { - "content": " and start listening to the stream. In the ", - "textStyle": {} - } - }, - { - "endIndex": 31249, - "startIndex": 31240, - "textRun": { - "content": "dispose()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 31290, - "startIndex": 31249, - "textRun": { - "content": " method, cancel the stream subscription.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31148 - }, - { - "endIndex": 31320, - "paragraph": { - "elements": [ - { - "endIndex": 31319, - "startIndex": 31290, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_07/app/lib/logic/dash_purchases.dart#L31-L69" - }, - "underline": true - } - } - }, - { - "endIndex": 31320, - "startIndex": 31319, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.jo3s1whrc6q6", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 31290 - }, - { - "endIndex": 32159, - "startIndex": 31320, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 32158, - "startIndex": 31321, - "tableCells": [ - { - "content": [ - { - "endIndex": 31368, - "paragraph": { - "elements": [ - { - "endIndex": 31368, - "startIndex": 31323, - "textRun": { - "content": "class DashPurchases extends ChangeNotifier {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31323 - }, - { - "endIndex": 31391, - "paragraph": { - "elements": [ - { - "endIndex": 31391, - "startIndex": 31368, - "textRun": { - "content": " DashCounter counter;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31368 - }, - { - "endIndex": 31455, - "paragraph": { - "elements": [ - { - "endIndex": 31455, - "startIndex": 31391, - "textRun": { - "content": " late StreamSubscription> _subscription;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31391 - }, - { - "endIndex": 31503, - "paragraph": { - "elements": [ - { - "endIndex": 31503, - "startIndex": 31455, - "textRun": { - "content": " final iapConnection = IAPConnection.instance;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31455 - }, - { - "endIndex": 31504, - "paragraph": { - "elements": [ - { - "endIndex": 31504, - "startIndex": 31503, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31503 - }, - { - "endIndex": 31536, - "paragraph": { - "elements": [ - { - "endIndex": 31536, - "startIndex": 31504, - "textRun": { - "content": " DashPurchases(this.counter) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31504 - }, - { - "endIndex": 31564, - "paragraph": { - "elements": [ - { - "endIndex": 31564, - "startIndex": 31536, - "textRun": { - "content": " final purchaseUpdated =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31536 - }, - { - "endIndex": 31602, - "paragraph": { - "elements": [ - { - "endIndex": 31602, - "startIndex": 31564, - "textRun": { - "content": " iapConnection.purchaseStream;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31564 - }, - { - "endIndex": 31646, - "paragraph": { - "elements": [ - { - "endIndex": 31646, - "startIndex": 31602, - "textRun": { - "content": " _subscription = purchaseUpdated.listen(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31602 - }, - { - "endIndex": 31671, - "paragraph": { - "elements": [ - { - "endIndex": 31671, - "startIndex": 31646, - "textRun": { - "content": " _onPurchaseUpdate,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31646 - }, - { - "endIndex": 31706, - "paragraph": { - "elements": [ - { - "endIndex": 31706, - "startIndex": 31671, - "textRun": { - "content": " onDone: _updateStreamOnDone,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31671 - }, - { - "endIndex": 31743, - "paragraph": { - "elements": [ - { - "endIndex": 31743, - "startIndex": 31706, - "textRun": { - "content": " onError: _updateStreamOnError,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31706 - }, - { - "endIndex": 31750, - "paragraph": { - "elements": [ - { - "endIndex": 31750, - "startIndex": 31743, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31743 - }, - { - "endIndex": 31754, - "paragraph": { - "elements": [ - { - "endIndex": 31754, - "startIndex": 31750, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31750 - }, - { - "endIndex": 31755, - "paragraph": { - "elements": [ - { - "endIndex": 31755, - "startIndex": 31754, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31754 - }, - { - "endIndex": 31767, - "paragraph": { - "elements": [ - { - "endIndex": 31767, - "startIndex": 31755, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31755 - }, - { - "endIndex": 31786, - "paragraph": { - "elements": [ - { - "endIndex": 31786, - "startIndex": 31767, - "textRun": { - "content": " void dispose() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31767 - }, - { - "endIndex": 31814, - "paragraph": { - "elements": [ - { - "endIndex": 31814, - "startIndex": 31786, - "textRun": { - "content": " _subscription.cancel();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31786 - }, - { - "endIndex": 31835, - "paragraph": { - "elements": [ - { - "endIndex": 31835, - "startIndex": 31814, - "textRun": { - "content": " super.dispose();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31814 - }, - { - "endIndex": 31839, - "paragraph": { - "elements": [ - { - "endIndex": 31839, - "startIndex": 31835, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31835 - }, - { - "endIndex": 31840, - "paragraph": { - "elements": [ - { - "endIndex": 31840, - "startIndex": 31839, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31839 - }, - { - "endIndex": 31895, - "paragraph": { - "elements": [ - { - "endIndex": 31895, - "startIndex": 31840, - "textRun": { - "content": " Future buy(PurchasableProduct product) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31840 - }, - { - "endIndex": 31910, - "paragraph": { - "elements": [ - { - "endIndex": 31910, - "startIndex": 31895, - "textRun": { - "content": " // omitted\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31895 - }, - { - "endIndex": 31914, - "paragraph": { - "elements": [ - { - "endIndex": 31914, - "startIndex": 31910, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31910 - }, - { - "endIndex": 31915, - "paragraph": { - "elements": [ - { - "endIndex": 31915, - "startIndex": 31914, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31914 - }, - { - "endIndex": 31985, - "paragraph": { - "elements": [ - { - "endIndex": 31985, - "startIndex": 31915, - "textRun": { - "content": " void _onPurchaseUpdate(List purchaseDetailsList) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31915 - }, - { - "endIndex": 32014, - "paragraph": { - "elements": [ - { - "endIndex": 32014, - "startIndex": 31985, - "textRun": { - "content": " // Handle purchases here\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31985 - }, - { - "endIndex": 32018, - "paragraph": { - "elements": [ - { - "endIndex": 32018, - "startIndex": 32014, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32014 - }, - { - "endIndex": 32019, - "paragraph": { - "elements": [ - { - "endIndex": 32019, - "startIndex": 32018, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32018 - }, - { - "endIndex": 32050, - "paragraph": { - "elements": [ - { - "endIndex": 32050, - "startIndex": 32019, - "textRun": { - "content": " void _updateStreamOnDone() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32019 - }, - { - "endIndex": 32078, - "paragraph": { - "elements": [ - { - "endIndex": 32078, - "startIndex": 32050, - "textRun": { - "content": " _subscription.cancel();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32050 - }, - { - "endIndex": 32082, - "paragraph": { - "elements": [ - { - "endIndex": 32082, - "startIndex": 32078, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32078 - }, - { - "endIndex": 32083, - "paragraph": { - "elements": [ - { - "endIndex": 32083, - "startIndex": 32082, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32082 - }, - { - "endIndex": 32128, - "paragraph": { - "elements": [ - { - "endIndex": 32128, - "startIndex": 32083, - "textRun": { - "content": " void _updateStreamOnError(dynamic error) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32083 - }, - { - "endIndex": 32152, - "paragraph": { - "elements": [ - { - "endIndex": 32152, - "startIndex": 32128, - "textRun": { - "content": " //Handle error here\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32128 - }, - { - "endIndex": 32156, - "paragraph": { - "elements": [ - { - "endIndex": 32156, - "startIndex": 32152, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32152 - }, - { - "endIndex": 32158, - "paragraph": { - "elements": [ - { - "endIndex": 32158, - "startIndex": 32156, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32156 - } - ], - "endIndex": 32158, - "startIndex": 31322, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 32160, - "paragraph": { - "elements": [ - { - "endIndex": 32160, - "startIndex": 32159, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32159 - }, - { - "endIndex": 32252, - "paragraph": { - "elements": [ - { - "endIndex": 32252, - "startIndex": 32160, - "textRun": { - "content": "Now, the app receives the purchase updates so, in the next section, you’ll make a purchase!\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32160 - }, - { - "endIndex": 32253, - "paragraph": { - "elements": [ - { - "endIndex": 32253, - "startIndex": 32252, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32252 - }, - { - "endIndex": 32349, - "paragraph": { - "elements": [ - { - "endIndex": 32293, - "startIndex": 32253, - "textRun": { - "content": "Before you proceed, run the tests with “", - "textStyle": {} - } - }, - { - "endIndex": 32306, - "startIndex": 32293, - "textRun": { - "content": "flutter test”", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32349, - "startIndex": 32306, - "textRun": { - "content": " to verify everything is set up correctly.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32253 - }, - { - "endIndex": 32350, - "paragraph": { - "elements": [ - { - "endIndex": 32350, - "startIndex": 32349, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32349 - }, - { - "endIndex": 32481, - "startIndex": 32350, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 32480, - "startIndex": 32351, - "tableCells": [ - { - "content": [ - { - "endIndex": 32368, - "paragraph": { - "elements": [ - { - "endIndex": 32368, - "startIndex": 32353, - "textRun": { - "content": "$ flutter test\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32353 - }, - { - "endIndex": 32369, - "paragraph": { - "elements": [ - { - "endIndex": 32369, - "startIndex": 32368, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32368 - }, - { - "endIndex": 32480, - "paragraph": { - "elements": [ - { - "endIndex": 32480, - "startIndex": 32369, - "textRun": { - "content": "00:01 +1: All tests passed! \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32369 - } - ], - "endIndex": 32480, - "startIndex": 32352, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 32483, - "paragraph": { - "elements": [ - { - "endIndex": 32482, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 32481 - }, - { - "endIndex": 32483, - "startIndex": 32482, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.aota0lp76cf5", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 32481 - }, - { - "endIndex": 32498, - "paragraph": { - "elements": [ - { - "endIndex": 32498, - "startIndex": 32483, - "textRun": { - "content": "Make purchases\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.sjju57tbpys9", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 32483 - }, - { - "endIndex": 32499, - "paragraph": { - "elements": [ - { - "endIndex": 32499, - "startIndex": 32498, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32498 - }, - { - "endIndex": 32716, - "paragraph": { - "elements": [ - { - "endIndex": 32716, - "startIndex": 32499, - "textRun": { - "content": "In this part of the codelab, you’ll replace the currently existing mock products with real purchasable products. These products are loaded from the stores, shown in a list, and are purchased when tapping the product.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32499 - }, - { - "endIndex": 32741, - "paragraph": { - "elements": [ - { - "endIndex": 32741, - "startIndex": 32716, - "textRun": { - "content": "Adapt PurchasableProduct\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.x906iqehvpr2", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 32716 - }, - { - "endIndex": 32913, - "paragraph": { - "elements": [ - { - "endIndex": 32759, - "startIndex": 32741, - "textRun": { - "content": "PurchasableProduct", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32835, - "startIndex": 32759, - "textRun": { - "content": " displays a mock product. Update it to show actual content by replacing the ", - "textStyle": {} - } - }, - { - "endIndex": 32853, - "startIndex": 32835, - "textRun": { - "content": "PurchasableProduct", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32863, - "startIndex": 32853, - "textRun": { - "content": " class in ", - "textStyle": {} - } - }, - { - "endIndex": 32887, - "startIndex": 32863, - "textRun": { - "content": "purchasable_product.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32913, - "startIndex": 32887, - "textRun": { - "content": " with the following code:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32741 - }, - { - "endIndex": 32948, - "paragraph": { - "elements": [ - { - "endIndex": 32947, - "startIndex": 32913, - "textRun": { - "content": "lib/model/purchasable_product.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_08/app/lib/model/purchasable_product.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 32948, - "startIndex": 32947, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.rglablhgfq77", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 32913 - }, - { - "endIndex": 33420, - "startIndex": 32948, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 33419, - "startIndex": 32949, - "tableCells": [ - { - "content": [ - { - "endIndex": 33006, - "paragraph": { - "elements": [ - { - "endIndex": 33006, - "startIndex": 32951, - "textRun": { - "content": "import 'package:in_app_purchase/in_app_purchase.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32951 - }, - { - "endIndex": 33007, - "paragraph": { - "elements": [ - { - "endIndex": 33007, - "startIndex": 33006, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33006 - }, - { - "endIndex": 33028, - "paragraph": { - "elements": [ - { - "endIndex": 33028, - "startIndex": 33007, - "textRun": { - "content": "enum ProductStatus {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33007 - }, - { - "endIndex": 33043, - "paragraph": { - "elements": [ - { - "endIndex": 33043, - "startIndex": 33028, - "textRun": { - "content": " purchasable,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33028 - }, - { - "endIndex": 33056, - "paragraph": { - "elements": [ - { - "endIndex": 33056, - "startIndex": 33043, - "textRun": { - "content": " purchased,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33043 - }, - { - "endIndex": 33067, - "paragraph": { - "elements": [ - { - "endIndex": 33067, - "startIndex": 33056, - "textRun": { - "content": " pending,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33056 - }, - { - "endIndex": 33069, - "paragraph": { - "elements": [ - { - "endIndex": 33069, - "startIndex": 33067, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33067 - }, - { - "endIndex": 33070, - "paragraph": { - "elements": [ - { - "endIndex": 33070, - "startIndex": 33069, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33069 - }, - { - "endIndex": 33097, - "paragraph": { - "elements": [ - { - "endIndex": 33097, - "startIndex": 33070, - "textRun": { - "content": "class PurchasableProduct {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33070 - }, - { - "endIndex": 33135, - "paragraph": { - "elements": [ - { - "endIndex": 33135, - "startIndex": 33097, - "textRun": { - "content": " String get id => productDetails.id;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33097 - }, - { - "endIndex": 33179, - "paragraph": { - "elements": [ - { - "endIndex": 33179, - "startIndex": 33135, - "textRun": { - "content": " String get title => productDetails.title;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33135 - }, - { - "endIndex": 33235, - "paragraph": { - "elements": [ - { - "endIndex": 33235, - "startIndex": 33179, - "textRun": { - "content": " String get description => productDetails.description;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33179 - }, - { - "endIndex": 33279, - "paragraph": { - "elements": [ - { - "endIndex": 33279, - "startIndex": 33235, - "textRun": { - "content": " String get price => productDetails.price;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33235 - }, - { - "endIndex": 33303, - "paragraph": { - "elements": [ - { - "endIndex": 33303, - "startIndex": 33279, - "textRun": { - "content": " ProductStatus status;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33279 - }, - { - "endIndex": 33336, - "paragraph": { - "elements": [ - { - "endIndex": 33336, - "startIndex": 33303, - "textRun": { - "content": " ProductDetails productDetails;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33303 - }, - { - "endIndex": 33337, - "paragraph": { - "elements": [ - { - "endIndex": 33337, - "startIndex": 33336, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33336 - }, - { - "endIndex": 33417, - "paragraph": { - "elements": [ - { - "endIndex": 33417, - "startIndex": 33337, - "textRun": { - "content": " PurchasableProduct(this.productDetails) : status = ProductStatus.purchasable;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33337 - }, - { - "endIndex": 33419, - "paragraph": { - "elements": [ - { - "endIndex": 33419, - "startIndex": 33417, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33417 - } - ], - "endIndex": 33419, - "startIndex": 32950, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 33421, - "paragraph": { - "elements": [ - { - "endIndex": 33421, - "startIndex": 33420, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 33420 - }, - { - "endIndex": 33549, - "paragraph": { - "elements": [ - { - "endIndex": 33424, - "startIndex": 33421, - "textRun": { - "content": "In ", - "textStyle": {} - } - }, - { - "endIndex": 33444, - "startIndex": 33424, - "textRun": { - "content": "dash_purchases.dart,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33509, - "startIndex": 33444, - "textRun": { - "content": " remove the dummy purchases and replace them with an empty list, ", - "textStyle": {} - } - }, - { - "endIndex": 33548, - "startIndex": 33509, - "textRun": { - "content": "List products = [];", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33549, - "startIndex": 33548, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 33421 - }, - { - "endIndex": 33574, - "paragraph": { - "elements": [ - { - "endIndex": 33574, - "startIndex": 33549, - "textRun": { - "content": "Load available purchases\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.b00evudm79da", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 33549 - }, - { - "endIndex": 33575, - "paragraph": { - "elements": [ - { - "endIndex": 33575, - "startIndex": 33574, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 33574 - }, - { - "endIndex": 33808, - "paragraph": { - "elements": [ - { - "endIndex": 33742, - "startIndex": 33575, - "textRun": { - "content": "To give a user the ability to make a purchase, load the purchases from the store. First, check whether the store is available. When the store isn’t available, setting ", - "textStyle": {} - } - }, - { - "endIndex": 33752, - "startIndex": 33742, - "textRun": { - "content": "storeState", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33756, - "startIndex": 33752, - "textRun": { - "content": " to ", - "textStyle": {} - } - }, - { - "endIndex": 33768, - "startIndex": 33756, - "textRun": { - "content": "notAvailable", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33807, - "startIndex": 33768, - "textRun": { - "content": " displays an error message to the user.", - "textStyle": {} - } - }, - { - "endIndex": 33808, - "startIndex": 33807, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 33575 - }, - { - "endIndex": 33838, - "paragraph": { - "elements": [ - { - "endIndex": 33837, - "startIndex": 33808, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_08/app/lib/logic/dash_purchases.dart#L32-L38" - }, - "underline": true - } - } - }, - { - "endIndex": 33838, - "startIndex": 33837, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.mgrbbglmvoez", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 33808 - }, - { - "endIndex": 34053, - "startIndex": 33838, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 34052, - "startIndex": 33839, - "tableCells": [ - { - "content": [ - { - "endIndex": 33880, - "paragraph": { - "elements": [ - { - "endIndex": 33880, - "startIndex": 33841, - "textRun": { - "content": " Future loadPurchases() async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33841 - }, - { - "endIndex": 33937, - "paragraph": { - "elements": [ - { - "endIndex": 33937, - "startIndex": 33880, - "textRun": { - "content": " final available = await iapConnection.isAvailable();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33880 - }, - { - "endIndex": 33959, - "paragraph": { - "elements": [ - { - "endIndex": 33959, - "startIndex": 33937, - "textRun": { - "content": " if (!available) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33937 - }, - { - "endIndex": 34003, - "paragraph": { - "elements": [ - { - "endIndex": 34003, - "startIndex": 33959, - "textRun": { - "content": " storeState = StoreState.notAvailable;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33959 - }, - { - "endIndex": 34028, - "paragraph": { - "elements": [ - { - "endIndex": 34028, - "startIndex": 34003, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34003 - }, - { - "endIndex": 34042, - "paragraph": { - "elements": [ - { - "endIndex": 34042, - "startIndex": 34028, - "textRun": { - "content": " return;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34028 - }, - { - "endIndex": 34048, - "paragraph": { - "elements": [ - { - "endIndex": 34048, - "startIndex": 34042, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34042 - }, - { - "endIndex": 34052, - "paragraph": { - "elements": [ - { - "endIndex": 34052, - "startIndex": 34048, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34048 - } - ], - "endIndex": 34052, - "startIndex": 33840, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 34054, - "paragraph": { - "elements": [ - { - "endIndex": 34054, - "startIndex": 34053, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 34053 - }, - { - "endIndex": 34055, - "paragraph": { - "elements": [ - { - "endIndex": 34055, - "startIndex": 34054, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 34054 - }, - { - "endIndex": 34370, - "paragraph": { - "elements": [ - { - "endIndex": 34163, - "startIndex": 34055, - "textRun": { - "content": "When the store is available, load the available purchases. Given the previous Firebase setup, expect to see ", - "textStyle": {} - } - }, - { - "endIndex": 34181, - "startIndex": 34163, - "textRun": { - "content": "storeKeyConsumable", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34183, - "startIndex": 34181, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 34204, - "startIndex": 34183, - "textRun": { - "content": "storeKeySubscription,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34209, - "startIndex": 34204, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 34224, - "startIndex": 34209, - "textRun": { - "content": "storeKeyUpgrade", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34370, - "startIndex": 34224, - "textRun": { - "content": ". When an expected purchase isn’t available, print this information to the console; you might also want to send this info to the backend service.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 34055 - }, - { - "endIndex": 34371, - "paragraph": { - "elements": [ - { - "endIndex": 34371, - "startIndex": 34370, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 34370 - }, - { - "endIndex": 34607, - "paragraph": { - "elements": [ - { - "endIndex": 34375, - "startIndex": 34371, - "textRun": { - "content": "The ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 34418, - "startIndex": 34375, - "textRun": { - "content": "await iapConnection.queryProductDetails(ids", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34419, - "startIndex": 34418, - "textRun": { - "content": ")", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34519, - "startIndex": 34419, - "textRun": { - "content": " method returns both the IDs that aren’t found and the purchasable products that are found. Use the ", - "textStyle": {} - } - }, - { - "endIndex": 34533, - "startIndex": 34519, - "textRun": { - "content": "productDetails", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34582, - "startIndex": 34533, - "textRun": { - "content": " from the response to update the UI, and set the ", - "textStyle": {} - } - }, - { - "endIndex": 34592, - "startIndex": 34582, - "textRun": { - "content": "StoreState", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34596, - "startIndex": 34592, - "textRun": { - "content": " to ", - "textStyle": {} - } - }, - { - "endIndex": 34605, - "startIndex": 34596, - "textRun": { - "content": "available", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34606, - "startIndex": 34605, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 34607, - "startIndex": 34606, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 34371 - }, - { - "endIndex": 34637, - "paragraph": { - "elements": [ - { - "endIndex": 34636, - "startIndex": 34607, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_08/app/lib/logic/dash_purchases.dart#L32-L52" - }, - "underline": true - } - } - }, - { - "endIndex": 34637, - "startIndex": 34636, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ucam5cd4fp6l", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 34607 - }, - { - "endIndex": 35306, - "startIndex": 34637, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 35305, - "startIndex": 34638, - "tableCells": [ - { - "content": [ - { - "endIndex": 34668, - "paragraph": { - "elements": [ - { - "endIndex": 34668, - "startIndex": 34640, - "textRun": { - "content": "import '../constants.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34640 - }, - { - "endIndex": 34669, - "paragraph": { - "elements": [ - { - "endIndex": 34669, - "startIndex": 34668, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34668 - }, - { - "endIndex": 34708, - "paragraph": { - "elements": [ - { - "endIndex": 34708, - "startIndex": 34669, - "textRun": { - "content": " Future loadPurchases() async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34669 - }, - { - "endIndex": 34765, - "paragraph": { - "elements": [ - { - "endIndex": 34765, - "startIndex": 34708, - "textRun": { - "content": " final available = await iapConnection.isAvailable();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34708 - }, - { - "endIndex": 34787, - "paragraph": { - "elements": [ - { - "endIndex": 34787, - "startIndex": 34765, - "textRun": { - "content": " if (!available) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34765 - }, - { - "endIndex": 34831, - "paragraph": { - "elements": [ - { - "endIndex": 34831, - "startIndex": 34787, - "textRun": { - "content": " storeState = StoreState.notAvailable;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34787 - }, - { - "endIndex": 34856, - "paragraph": { - "elements": [ - { - "endIndex": 34856, - "startIndex": 34831, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34831 - }, - { - "endIndex": 34870, - "paragraph": { - "elements": [ - { - "endIndex": 34870, - "startIndex": 34856, - "textRun": { - "content": " return;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34856 - }, - { - "endIndex": 34876, - "paragraph": { - "elements": [ - { - "endIndex": 34876, - "startIndex": 34870, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34870 - }, - { - "endIndex": 34902, - "paragraph": { - "elements": [ - { - "endIndex": 34902, - "startIndex": 34876, - "textRun": { - "content": " const ids = {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34876 - }, - { - "endIndex": 34928, - "paragraph": { - "elements": [ - { - "endIndex": 34928, - "startIndex": 34902, - "textRun": { - "content": " storeKeyConsumable,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34902 - }, - { - "endIndex": 34956, - "paragraph": { - "elements": [ - { - "endIndex": 34956, - "startIndex": 34928, - "textRun": { - "content": " storeKeySubscription,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34928 - }, - { - "endIndex": 34979, - "paragraph": { - "elements": [ - { - "endIndex": 34979, - "startIndex": 34956, - "textRun": { - "content": " storeKeyUpgrade,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34956 - }, - { - "endIndex": 34986, - "paragraph": { - "elements": [ - { - "endIndex": 34986, - "startIndex": 34979, - "textRun": { - "content": " };\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34979 - }, - { - "endIndex": 35053, - "paragraph": { - "elements": [ - { - "endIndex": 35053, - "startIndex": 34986, - "textRun": { - "content": " final response = await iapConnection.queryProductDetails(ids);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34986 - }, - { - "endIndex": 35101, - "paragraph": { - "elements": [ - { - "endIndex": 35101, - "startIndex": 35053, - "textRun": { - "content": " for (var element in response.notFoundIDs) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35053 - }, - { - "endIndex": 35150, - "paragraph": { - "elements": [ - { - "endIndex": 35150, - "startIndex": 35101, - "textRun": { - "content": " debugPrint('Purchase $element not found');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35101 - }, - { - "endIndex": 35156, - "paragraph": { - "elements": [ - { - "endIndex": 35156, - "startIndex": 35150, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35150 - }, - { - "endIndex": 35239, - "paragraph": { - "elements": [ - { - "endIndex": 35239, - "startIndex": 35156, - "textRun": { - "content": " products = response.productDetails.map((e) => PurchasableProduct(e)).toList();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35156 - }, - { - "endIndex": 35278, - "paragraph": { - "elements": [ - { - "endIndex": 35278, - "startIndex": 35239, - "textRun": { - "content": " storeState = StoreState.available;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35239 - }, - { - "endIndex": 35301, - "paragraph": { - "elements": [ - { - "endIndex": 35301, - "startIndex": 35278, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35278 - }, - { - "endIndex": 35305, - "paragraph": { - "elements": [ - { - "endIndex": 35305, - "startIndex": 35301, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35301 - } - ], - "endIndex": 35305, - "startIndex": 34639, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 35307, - "paragraph": { - "elements": [ - { - "endIndex": 35307, - "startIndex": 35306, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35306 - }, - { - "endIndex": 35361, - "paragraph": { - "elements": [ - { - "endIndex": 35316, - "startIndex": 35307, - "textRun": { - "content": "Call the ", - "textStyle": {} - } - }, - { - "endIndex": 35331, - "startIndex": 35316, - "textRun": { - "content": "loadPurchases()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35361, - "startIndex": 35331, - "textRun": { - "content": " function in the constructor:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35307 - }, - { - "endIndex": 35391, - "paragraph": { - "elements": [ - { - "endIndex": 35390, - "startIndex": 35361, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_08/app/lib/logic/dash_purchases.dart#L29" - }, - "underline": true - } - } - }, - { - "endIndex": 35391, - "startIndex": 35390, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.nfvpw72ufdo8", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 35361 - }, - { - "endIndex": 35658, - "startIndex": 35391, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 35657, - "startIndex": 35392, - "tableCells": [ - { - "content": [ - { - "endIndex": 35426, - "paragraph": { - "elements": [ - { - "endIndex": 35426, - "startIndex": 35394, - "textRun": { - "content": " DashPurchases(this.counter) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35394 - }, - { - "endIndex": 35484, - "paragraph": { - "elements": [ - { - "endIndex": 35484, - "startIndex": 35426, - "textRun": { - "content": " final purchaseUpdated = iapConnection.purchaseStream;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35426 - }, - { - "endIndex": 35528, - "paragraph": { - "elements": [ - { - "endIndex": 35528, - "startIndex": 35484, - "textRun": { - "content": " _subscription = purchaseUpdated.listen(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35484 - }, - { - "endIndex": 35553, - "paragraph": { - "elements": [ - { - "endIndex": 35553, - "startIndex": 35528, - "textRun": { - "content": " _onPurchaseUpdate,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35528 - }, - { - "endIndex": 35588, - "paragraph": { - "elements": [ - { - "endIndex": 35588, - "startIndex": 35553, - "textRun": { - "content": " onDone: _updateStreamOnDone,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35553 - }, - { - "endIndex": 35625, - "paragraph": { - "elements": [ - { - "endIndex": 35625, - "startIndex": 35588, - "textRun": { - "content": " onError: _updateStreamOnError,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35588 - }, - { - "endIndex": 35632, - "paragraph": { - "elements": [ - { - "endIndex": 35632, - "startIndex": 35625, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35625 - }, - { - "endIndex": 35653, - "paragraph": { - "elements": [ - { - "endIndex": 35653, - "startIndex": 35632, - "textRun": { - "content": " loadPurchases();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35632 - }, - { - "endIndex": 35657, - "paragraph": { - "elements": [ - { - "endIndex": 35657, - "startIndex": 35653, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35653 - } - ], - "endIndex": 35657, - "startIndex": 35393, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 35659, - "paragraph": { - "elements": [ - { - "endIndex": 35659, - "startIndex": 35658, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35658 - }, - { - "endIndex": 35754, - "paragraph": { - "elements": [ - { - "endIndex": 35688, - "startIndex": 35659, - "textRun": { - "content": "Finally, change the value of ", - "textStyle": {} - } - }, - { - "endIndex": 35698, - "startIndex": 35688, - "textRun": { - "content": "storeState", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35710, - "startIndex": 35698, - "textRun": { - "content": " field from ", - "textStyle": {} - } - }, - { - "endIndex": 35730, - "startIndex": 35710, - "textRun": { - "content": "StoreState.available", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35734, - "startIndex": 35730, - "textRun": { - "content": " to ", - "textStyle": {} - } - }, - { - "endIndex": 35754, - "startIndex": 35734, - "textRun": { - "content": "StoreState.loading:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35659 - }, - { - "endIndex": 35784, - "paragraph": { - "elements": [ - { - "endIndex": 35783, - "startIndex": 35754, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_08/app/lib/logic/dash_purchases.dart#L14" - }, - "underline": true - } - } - }, - { - "endIndex": 35784, - "startIndex": 35783, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.jwn50inqxl6w", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 35754 - }, - { - "endIndex": 35832, - "startIndex": 35784, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 35831, - "startIndex": 35785, - "tableCells": [ - { - "content": [ - { - "endIndex": 35831, - "paragraph": { - "elements": [ - { - "endIndex": 35831, - "startIndex": 35787, - "textRun": { - "content": "StoreState storeState = StoreState.loading;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35787 - } - ], - "endIndex": 35831, - "startIndex": 35786, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 35833, - "paragraph": { - "elements": [ - { - "endIndex": 35833, - "startIndex": 35832, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35832 - }, - { - "endIndex": 35863, - "paragraph": { - "elements": [ - { - "endIndex": 35863, - "startIndex": 35833, - "textRun": { - "content": "Show the purchasable products\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.a9894r9iopct", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 35833 - }, - { - "endIndex": 35864, - "paragraph": { - "elements": [ - { - "endIndex": 35864, - "startIndex": 35863, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35863 - }, - { - "endIndex": 36102, - "paragraph": { - "elements": [ - { - "endIndex": 35872, - "startIndex": 35864, - "textRun": { - "content": "Consider", - "textStyle": {} - } - }, - { - "endIndex": 35877, - "startIndex": 35872, - "textRun": { - "content": " the ", - "textStyle": {} - } - }, - { - "endIndex": 35895, - "startIndex": 35877, - "textRun": { - "content": "purchase_page.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35901, - "startIndex": 35895, - "textRun": { - "content": " file.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 35906, - "startIndex": 35901, - "textRun": { - "content": " The ", - "textStyle": {} - } - }, - { - "endIndex": 35918, - "startIndex": 35906, - "textRun": { - "content": "PurchasePage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35932, - "startIndex": 35918, - "textRun": { - "content": " widget shows ", - "textStyle": {} - } - }, - { - "endIndex": 35949, - "startIndex": 35932, - "textRun": { - "content": "_PurchasesLoading", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35951, - "startIndex": 35949, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 35965, - "startIndex": 35951, - "textRun": { - "content": "_PurchaseList,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35969, - "startIndex": 35965, - "textRun": { - "content": " or ", - "textStyle": {} - } - }, - { - "endIndex": 35992, - "startIndex": 35969, - "textRun": { - "content": "_PurchasesNotAvailable,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36010, - "startIndex": 35992, - "textRun": { - "content": " depending on the ", - "textStyle": {} - } - }, - { - "endIndex": 36020, - "startIndex": 36010, - "textRun": { - "content": "StoreState", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36102, - "startIndex": 36020, - "textRun": { - "content": ". The widget also shows the user’s past purchases which is used in the next step.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35864 - }, - { - "endIndex": 36103, - "paragraph": { - "elements": [ - { - "endIndex": 36103, - "startIndex": 36102, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36102 - }, - { - "endIndex": 36220, - "paragraph": { - "elements": [ - { - "endIndex": 36107, - "startIndex": 36103, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 36120, - "startIndex": 36107, - "textRun": { - "content": "_PurchaseList", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36198, - "startIndex": 36120, - "textRun": { - "content": " widget shows the list of purchasable products and sends a buy request to the ", - "textStyle": {} - } - }, - { - "endIndex": 36211, - "startIndex": 36198, - "textRun": { - "content": "DashPurchases", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36220, - "startIndex": 36211, - "textRun": { - "content": " object.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36103 - }, - { - "endIndex": 36249, - "paragraph": { - "elements": [ - { - "endIndex": 36248, - "startIndex": 36220, - "textRun": { - "content": "lib/pages/purchase_page.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_08/app/lib/pages/purchase_page.dart#L53-L68" - }, - "underline": true - } - } - }, - { - "endIndex": 36249, - "startIndex": 36248, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.o7gdmx3ulp1v", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 36220 - }, - { - "endIndex": 36684, - "startIndex": 36249, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 36683, - "startIndex": 36250, - "tableCells": [ - { - "content": [ - { - "endIndex": 36298, - "paragraph": { - "elements": [ - { - "endIndex": 36298, - "startIndex": 36252, - "textRun": { - "content": "class _PurchaseList extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36252 - }, - { - "endIndex": 36310, - "paragraph": { - "elements": [ - { - "endIndex": 36310, - "startIndex": 36298, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36298 - }, - { - "endIndex": 36349, - "paragraph": { - "elements": [ - { - "endIndex": 36349, - "startIndex": 36310, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36310 - }, - { - "endIndex": 36401, - "paragraph": { - "elements": [ - { - "endIndex": 36401, - "startIndex": 36349, - "textRun": { - "content": " var purchases = context.watch();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36349 - }, - { - "endIndex": 36440, - "paragraph": { - "elements": [ - { - "endIndex": 36440, - "startIndex": 36401, - "textRun": { - "content": " var products = purchases.products;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36401 - }, - { - "endIndex": 36459, - "paragraph": { - "elements": [ - { - "endIndex": 36459, - "startIndex": 36440, - "textRun": { - "content": " return Column(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36440 - }, - { - "endIndex": 36484, - "paragraph": { - "elements": [ - { - "endIndex": 36484, - "startIndex": 36459, - "textRun": { - "content": " children: products\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36459 - }, - { - "endIndex": 36529, - "paragraph": { - "elements": [ - { - "endIndex": 36529, - "startIndex": 36484, - "textRun": { - "content": " .map((product) => _PurchaseWidget(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36484 - }, - { - "endIndex": 36561, - "paragraph": { - "elements": [ - { - "endIndex": 36561, - "startIndex": 36529, - "textRun": { - "content": " product: product,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36529 - }, - { - "endIndex": 36591, - "paragraph": { - "elements": [ - { - "endIndex": 36591, - "startIndex": 36561, - "textRun": { - "content": " onPressed: () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36561 - }, - { - "endIndex": 36631, - "paragraph": { - "elements": [ - { - "endIndex": 36631, - "startIndex": 36591, - "textRun": { - "content": " purchases.buy(product);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36591 - }, - { - "endIndex": 36649, - "paragraph": { - "elements": [ - { - "endIndex": 36649, - "startIndex": 36631, - "textRun": { - "content": " }))\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36631 - }, - { - "endIndex": 36670, - "paragraph": { - "elements": [ - { - "endIndex": 36670, - "startIndex": 36649, - "textRun": { - "content": " .toList(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36649 - }, - { - "endIndex": 36677, - "paragraph": { - "elements": [ - { - "endIndex": 36677, - "startIndex": 36670, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36670 - }, - { - "endIndex": 36681, - "paragraph": { - "elements": [ - { - "endIndex": 36681, - "startIndex": 36677, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36677 - }, - { - "endIndex": 36683, - "paragraph": { - "elements": [ - { - "endIndex": 36683, - "startIndex": 36681, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36681 - } - ], - "endIndex": 36683, - "startIndex": 36251, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 36685, - "paragraph": { - "elements": [ - { - "endIndex": 36685, - "startIndex": 36684, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36684 - }, - { - "endIndex": 36908, - "paragraph": { - "elements": [ - { - "endIndex": 36908, - "startIndex": 36685, - "textRun": { - "content": "You should be able to see the available products on the Android and iOS stores if they are configured correctly. Note that it can take some time before the purchases are available when entered into the respective consoles.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36685 - }, - { - "endIndex": 36910, - "paragraph": { - "elements": [ - { - "endIndex": 36909, - "inlineObjectElement": { - "inlineObjectId": "kix.9qju374jwmgw", - "textStyle": {} - }, - "startIndex": 36908 - }, - { - "endIndex": 36910, - "startIndex": 36909, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36908 - }, - { - "endIndex": 36911, - "paragraph": { - "elements": [ - { - "endIndex": 36911, - "startIndex": 36910, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36910 - }, - { - "endIndex": 37119, - "paragraph": { - "elements": [ - { - "endIndex": 36922, - "startIndex": 36911, - "textRun": { - "content": "Go back to ", - "textStyle": {} - } - }, - { - "endIndex": 36941, - "startIndex": 36922, - "textRun": { - "content": "dash_purchases.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 36942, - "startIndex": 36941, - "textRun": { - "content": ",", - "textStyle": {} - } - }, - { - "endIndex": 37119, - "startIndex": 36942, - "textRun": { - "content": " and implement the function to buy a product. You only need to separate the consumables from the non-consumables. The upgrade and the subscription products are non-consumables.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 36911 - }, - { - "endIndex": 37149, - "paragraph": { - "elements": [ - { - "endIndex": 37148, - "startIndex": 37119, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_08/app/lib/logic/dash_purchases.dart#L60-L74" - }, - "underline": true - } - } - }, - { - "endIndex": 37149, - "startIndex": 37148, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.t2my6pr741wt", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 37119 - }, - { - "endIndex": 37723, - "startIndex": 37149, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 37722, - "startIndex": 37150, - "tableCells": [ - { - "content": [ - { - "endIndex": 37207, - "paragraph": { - "elements": [ - { - "endIndex": 37207, - "startIndex": 37152, - "textRun": { - "content": " Future buy(PurchasableProduct product) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37152 - }, - { - "endIndex": 37288, - "paragraph": { - "elements": [ - { - "endIndex": 37288, - "startIndex": 37207, - "textRun": { - "content": " final purchaseParam = PurchaseParam(productDetails: product.productDetails);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37207 - }, - { - "endIndex": 37314, - "paragraph": { - "elements": [ - { - "endIndex": 37314, - "startIndex": 37288, - "textRun": { - "content": " switch (product.id) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37288 - }, - { - "endIndex": 37345, - "paragraph": { - "elements": [ - { - "endIndex": 37345, - "startIndex": 37314, - "textRun": { - "content": " case storeKeyConsumable:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37314 - }, - { - "endIndex": 37418, - "paragraph": { - "elements": [ - { - "endIndex": 37418, - "startIndex": 37345, - "textRun": { - "content": " await iapConnection.buyConsumable(purchaseParam: purchaseParam);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37345 - }, - { - "endIndex": 37433, - "paragraph": { - "elements": [ - { - "endIndex": 37433, - "startIndex": 37418, - "textRun": { - "content": " break;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37418 - }, - { - "endIndex": 37466, - "paragraph": { - "elements": [ - { - "endIndex": 37466, - "startIndex": 37433, - "textRun": { - "content": " case storeKeySubscription:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37433 - }, - { - "endIndex": 37494, - "paragraph": { - "elements": [ - { - "endIndex": 37494, - "startIndex": 37466, - "textRun": { - "content": " case storeKeyUpgrade:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37466 - }, - { - "endIndex": 37570, - "paragraph": { - "elements": [ - { - "endIndex": 37570, - "startIndex": 37494, - "textRun": { - "content": " await iapConnection.buyNonConsumable(purchaseParam: purchaseParam);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37494 - }, - { - "endIndex": 37585, - "paragraph": { - "elements": [ - { - "endIndex": 37585, - "startIndex": 37570, - "textRun": { - "content": " break;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37570 - }, - { - "endIndex": 37600, - "paragraph": { - "elements": [ - { - "endIndex": 37600, - "startIndex": 37585, - "textRun": { - "content": " default:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37585 - }, - { - "endIndex": 37635, - "paragraph": { - "elements": [ - { - "endIndex": 37635, - "startIndex": 37600, - "textRun": { - "content": " throw ArgumentError.value(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37600 - }, - { - "endIndex": 37712, - "paragraph": { - "elements": [ - { - "endIndex": 37712, - "startIndex": 37635, - "textRun": { - "content": " product.productDetails, '${product.id} is not a known product');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37635 - }, - { - "endIndex": 37718, - "paragraph": { - "elements": [ - { - "endIndex": 37718, - "startIndex": 37712, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37712 - }, - { - "endIndex": 37722, - "paragraph": { - "elements": [ - { - "endIndex": 37722, - "startIndex": 37718, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37718 - } - ], - "endIndex": 37722, - "startIndex": 37151, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 37724, - "paragraph": { - "elements": [ - { - "endIndex": 37724, - "startIndex": 37723, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37723 - }, - { - "endIndex": 37840, - "paragraph": { - "elements": [ - { - "endIndex": 37763, - "startIndex": 37724, - "textRun": { - "content": "Before continuing, create the variable ", - "textStyle": {} - } - }, - { - "endIndex": 37785, - "startIndex": 37763, - "textRun": { - "content": "_beautifiedDashUpgrade", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 37801, - "startIndex": 37785, - "textRun": { - "content": " and update the ", - "textStyle": {} - } - }, - { - "endIndex": 37815, - "startIndex": 37801, - "textRun": { - "content": "beautifiedDash", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 37840, - "startIndex": 37815, - "textRun": { - "content": " getter to reference it.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 37724 - }, - { - "endIndex": 37870, - "paragraph": { - "elements": [ - { - "endIndex": 37869, - "startIndex": 37840, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_08/app/lib/logic/dash_purchases.dart#L76-L99" - }, - "underline": true - } - } - }, - { - "endIndex": 37870, - "startIndex": 37869, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.4f58vfezgh60", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 37840 - }, - { - "endIndex": 37966, - "startIndex": 37870, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 37965, - "startIndex": 37871, - "tableCells": [ - { - "content": [ - { - "endIndex": 37926, - "paragraph": { - "elements": [ - { - "endIndex": 37926, - "startIndex": 37873, - "textRun": { - "content": " bool get beautifiedDash => _beautifiedDashUpgrade;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37873 - }, - { - "endIndex": 37965, - "paragraph": { - "elements": [ - { - "endIndex": 37965, - "startIndex": 37926, - "textRun": { - "content": " bool _beautifiedDashUpgrade = false;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37926 - } - ], - "endIndex": 37965, - "startIndex": 37872, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 37967, - "paragraph": { - "elements": [ - { - "endIndex": 37967, - "startIndex": 37966, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 37966 - }, - { - "endIndex": 38266, - "paragraph": { - "elements": [ - { - "endIndex": 37971, - "startIndex": 37967, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 37988, - "startIndex": 37971, - "textRun": { - "content": "_onPurchaseUpdate", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 37995, - "startIndex": 37988, - "textRun": { - "content": " method", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 38167, - "startIndex": 37995, - "textRun": { - "content": " receives the purchase updates, updates the status of the product that is shown in the purchase page, and applies the purchase to the counter logic. It’s important to call ", - "textStyle": {} - } - }, - { - "endIndex": 38183, - "startIndex": 38167, - "textRun": { - "content": "completePurchase", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38266, - "startIndex": 38183, - "textRun": { - "content": " after handling the purchase so the store knows the purchase is handled correctly.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37967 - }, - { - "endIndex": 38267, - "paragraph": { - "elements": [ - { - "endIndex": 38267, - "startIndex": 38266, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 38266 - }, - { - "endIndex": 38387, - "startIndex": 38267, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 38386, - "startIndex": 38268, - "tableCells": [ - { - "content": [ - { - "endIndex": 38386, - "paragraph": { - "elements": [ - { - "endIndex": 38277, - "startIndex": 38270, - "textRun": { - "content": "Warning", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 38386, - "startIndex": 38277, - "textRun": { - "content": ": If you do not complete the purchase for the Google Play Store within three days, the purchase is refunded.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38270 - } - ], - "endIndex": 38386, - "startIndex": 38269, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8039216, - "green": 0.8980392, - "red": 0.9882353 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 38417, - "paragraph": { - "elements": [ - { - "endIndex": 38416, - "startIndex": 38387, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_08/app/lib/logic/dash_purchases.dart#L76-L99" - }, - "underline": true - } - } - }, - { - "endIndex": 38417, - "startIndex": 38416, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.u1p10v9fz9mc", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 38387 - }, - { - "endIndex": 39234, - "startIndex": 38417, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 39233, - "startIndex": 38418, - "tableCells": [ - { - "content": [ - { - "endIndex": 38454, - "paragraph": { - "elements": [ - { - "endIndex": 38454, - "startIndex": 38420, - "textRun": { - "content": " Future _onPurchaseUpdate(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38420 - }, - { - "endIndex": 38511, - "paragraph": { - "elements": [ - { - "endIndex": 38511, - "startIndex": 38454, - "textRun": { - "content": " List purchaseDetailsList) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38454 - }, - { - "endIndex": 38566, - "paragraph": { - "elements": [ - { - "endIndex": 38566, - "startIndex": 38511, - "textRun": { - "content": " for (var purchaseDetails in purchaseDetailsList) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38511 - }, - { - "endIndex": 38612, - "paragraph": { - "elements": [ - { - "endIndex": 38612, - "startIndex": 38566, - "textRun": { - "content": " await _handlePurchase(purchaseDetails);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38566 - }, - { - "endIndex": 38618, - "paragraph": { - "elements": [ - { - "endIndex": 38618, - "startIndex": 38612, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38612 - }, - { - "endIndex": 38641, - "paragraph": { - "elements": [ - { - "endIndex": 38641, - "startIndex": 38618, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38618 - }, - { - "endIndex": 38645, - "paragraph": { - "elements": [ - { - "endIndex": 38645, - "startIndex": 38641, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38641 - }, - { - "endIndex": 38646, - "paragraph": { - "elements": [ - { - "endIndex": 38646, - "startIndex": 38645, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38645 - }, - { - "endIndex": 38718, - "paragraph": { - "elements": [ - { - "endIndex": 38718, - "startIndex": 38646, - "textRun": { - "content": " Future _handlePurchase(PurchaseDetails purchaseDetails) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38646 - }, - { - "endIndex": 38780, - "paragraph": { - "elements": [ - { - "endIndex": 38780, - "startIndex": 38718, - "textRun": { - "content": " if (purchaseDetails.status == PurchaseStatus.purchased) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38718 - }, - { - "endIndex": 38823, - "paragraph": { - "elements": [ - { - "endIndex": 38823, - "startIndex": 38780, - "textRun": { - "content": " switch (purchaseDetails.productID) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38780 - }, - { - "endIndex": 38858, - "paragraph": { - "elements": [ - { - "endIndex": 38858, - "startIndex": 38823, - "textRun": { - "content": " case storeKeySubscription:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38823 - }, - { - "endIndex": 38899, - "paragraph": { - "elements": [ - { - "endIndex": 38899, - "startIndex": 38858, - "textRun": { - "content": " counter.applyPaidMultiplier();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38858 - }, - { - "endIndex": 38916, - "paragraph": { - "elements": [ - { - "endIndex": 38916, - "startIndex": 38899, - "textRun": { - "content": " break;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38899 - }, - { - "endIndex": 38949, - "paragraph": { - "elements": [ - { - "endIndex": 38949, - "startIndex": 38916, - "textRun": { - "content": " case storeKeyConsumable:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38916 - }, - { - "endIndex": 38990, - "paragraph": { - "elements": [ - { - "endIndex": 38990, - "startIndex": 38949, - "textRun": { - "content": " counter.addBoughtDashes(2000);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38949 - }, - { - "endIndex": 39007, - "paragraph": { - "elements": [ - { - "endIndex": 39007, - "startIndex": 38990, - "textRun": { - "content": " break;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38990 - }, - { - "endIndex": 39037, - "paragraph": { - "elements": [ - { - "endIndex": 39037, - "startIndex": 39007, - "textRun": { - "content": " case storeKeyUpgrade:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39007 - }, - { - "endIndex": 39078, - "paragraph": { - "elements": [ - { - "endIndex": 39078, - "startIndex": 39037, - "textRun": { - "content": " _beautifiedDashUpgrade = true;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39037 - }, - { - "endIndex": 39095, - "paragraph": { - "elements": [ - { - "endIndex": 39095, - "startIndex": 39078, - "textRun": { - "content": " break;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39078 - }, - { - "endIndex": 39103, - "paragraph": { - "elements": [ - { - "endIndex": 39103, - "startIndex": 39095, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39095 - }, - { - "endIndex": 39109, - "paragraph": { - "elements": [ - { - "endIndex": 39109, - "startIndex": 39103, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39103 - }, - { - "endIndex": 39110, - "paragraph": { - "elements": [ - { - "endIndex": 39110, - "startIndex": 39109, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39109 - }, - { - "endIndex": 39161, - "paragraph": { - "elements": [ - { - "endIndex": 39161, - "startIndex": 39110, - "textRun": { - "content": " if (purchaseDetails.pendingCompletePurchase) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39110 - }, - { - "endIndex": 39222, - "paragraph": { - "elements": [ - { - "endIndex": 39222, - "startIndex": 39161, - "textRun": { - "content": " await iapConnection.completePurchase(purchaseDetails);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39161 - }, - { - "endIndex": 39228, - "paragraph": { - "elements": [ - { - "endIndex": 39228, - "startIndex": 39222, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39222 - }, - { - "endIndex": 39232, - "paragraph": { - "elements": [ - { - "endIndex": 39232, - "startIndex": 39228, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39228 - }, - { - "endIndex": 39233, - "paragraph": { - "elements": [ - { - "endIndex": 39233, - "startIndex": 39232, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39232 - } - ], - "endIndex": 39233, - "startIndex": 38419, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 39235, - "paragraph": { - "elements": [ - { - "endIndex": 39235, - "startIndex": 39234, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39234 - }, - { - "endIndex": 39236, - "paragraph": { - "elements": [ - { - "endIndex": 39236, - "startIndex": 39235, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39235 - }, - { - "endIndex": 39525, - "startIndex": 39236, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 39524, - "startIndex": 39237, - "tableCells": [ - { - "content": [ - { - "endIndex": 39524, - "paragraph": { - "elements": [ - { - "endIndex": 39245, - "startIndex": 39239, - "textRun": { - "content": "Note: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 39258, - "startIndex": 39245, - "textRun": { - "content": "buyConsumable", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 39281, - "startIndex": 39258, - "textRun": { - "content": " has a named parameter ", - "textStyle": {} - } - }, - { - "endIndex": 39292, - "startIndex": 39281, - "textRun": { - "content": "autoConsume", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 39301, - "startIndex": 39292, - "textRun": { - "content": " that is ", - "textStyle": {} - } - }, - { - "endIndex": 39305, - "startIndex": 39301, - "textRun": { - "content": "true", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 39347, - "startIndex": 39305, - "textRun": { - "content": " by default. If you set this parameter to ", - "textStyle": {} - } - }, - { - "endIndex": 39352, - "startIndex": 39347, - "textRun": { - "content": "false", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 39374, - "startIndex": 39352, - "textRun": { - "content": ", you’ll have to call ", - "textStyle": {} - } - }, - { - "endIndex": 39387, - "startIndex": 39374, - "textRun": { - "content": "iapConnection", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 39447, - "startIndex": 39387, - "textRun": { - "content": ".getPlatformAddition()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 39480, - "startIndex": 39447, - "textRun": { - "content": ".consumePurchase(purchaseDetails)", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 39524, - "startIndex": 39480, - "textRun": { - "content": " after you consume the purchase on Android.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39239 - } - ], - "endIndex": 39524, - "startIndex": 39238, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 39526, - "paragraph": { - "elements": [ - { - "endIndex": 39526, - "startIndex": 39525, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39525 - }, - { - "endIndex": 39527, - "paragraph": { - "elements": [ - { - "endIndex": 39527, - "startIndex": 39526, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39526 - }, - { - "endIndex": 39529, - "paragraph": { - "elements": [ - { - "endIndex": 39528, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 39527 - }, - { - "endIndex": 39529, - "startIndex": 39528, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.1v3dpqbwl5wu", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 39527 - }, - { - "endIndex": 39548, - "paragraph": { - "elements": [ - { - "endIndex": 39548, - "startIndex": 39529, - "textRun": { - "content": "Set up the backend\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.8dbu8esps88", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 39529 - }, - { - "endIndex": 39549, - "paragraph": { - "elements": [ - { - "endIndex": 39549, - "startIndex": 39548, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39548 - }, - { - "endIndex": 39647, - "paragraph": { - "elements": [ - { - "endIndex": 39647, - "startIndex": 39549, - "textRun": { - "content": "Before moving on to tracking and verifying purchases, set up a Dart backend to support doing so. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39549 - }, - { - "endIndex": 39648, - "paragraph": { - "elements": [ - { - "endIndex": 39648, - "startIndex": 39647, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 39647 - }, - { - "endIndex": 39991, - "startIndex": 39648, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 39990, - "startIndex": 39649, - "tableCells": [ - { - "content": [ - { - "endIndex": 39745, - "paragraph": { - "elements": [ - { - "endIndex": 39657, - "startIndex": 39651, - "textRun": { - "content": "Note: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 39745, - "startIndex": 39657, - "textRun": { - "content": "Using a back-end is a best practice because, as stated before, it has several benefits:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39651 - }, - { - "endIndex": 39746, - "paragraph": { - "elements": [ - { - "endIndex": 39746, - "startIndex": 39745, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 39745 - }, - { - "endIndex": 39784, - "paragraph": { - "bullet": { - "listId": "kix.6o706gv3wzlk", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 39784, - "startIndex": 39746, - "textRun": { - "content": "You can securely verify transactions.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39746 - }, - { - "endIndex": 39837, - "paragraph": { - "bullet": { - "listId": "kix.6o706gv3wzlk", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 39837, - "startIndex": 39784, - "textRun": { - "content": "You can react to billing events from the app stores.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39784 - }, - { - "endIndex": 39888, - "paragraph": { - "bullet": { - "listId": "kix.6o706gv3wzlk", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 39888, - "startIndex": 39837, - "textRun": { - "content": "You can keep track of the purchases in a database.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39837 - }, - { - "endIndex": 39990, - "paragraph": { - "bullet": { - "listId": "kix.6o706gv3wzlk", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 39989, - "startIndex": 39888, - "textRun": { - "content": "Users won’t be able to fool your app into providing premium features by rewinding their system clock.", - "textStyle": {} - } - }, - { - "endIndex": 39990, - "startIndex": 39989, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39888 - } - ], - "endIndex": 39990, - "startIndex": 39650, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 39992, - "paragraph": { - "elements": [ - { - "endIndex": 39992, - "startIndex": 39991, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39991 - }, - { - "endIndex": 40057, - "paragraph": { - "elements": [ - { - "endIndex": 40023, - "startIndex": 39992, - "textRun": { - "content": "In this section, work from the ", - "textStyle": {} - } - }, - { - "endIndex": 40036, - "startIndex": 40023, - "textRun": { - "content": "dart-backend/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 40057, - "startIndex": 40036, - "textRun": { - "content": " folder as the root.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39992 - }, - { - "endIndex": 40058, - "paragraph": { - "elements": [ - { - "endIndex": 40058, - "startIndex": 40057, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 40057 - }, - { - "endIndex": 40113, - "paragraph": { - "elements": [ - { - "endIndex": 40113, - "startIndex": 40058, - "textRun": { - "content": "Make sure that you have the following tools installed:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 40058 - }, - { - "endIndex": 40118, - "paragraph": { - "bullet": { - "listId": "kix.cchm97rrif4y", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 40117, - "startIndex": 40113, - "textRun": { - "content": "Dart", - "textStyle": {} - } - }, - { - "endIndex": 40118, - "startIndex": 40117, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40113 - }, - { - "endIndex": 40131, - "paragraph": { - "bullet": { - "listId": "kix.cchm97rrif4y", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 40130, - "startIndex": 40118, - "textRun": { - "content": "Firebase CLI", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://firebase.google.com/docs/cli#install_the_firebase_cli" - }, - "underline": true - } - } - }, - { - "endIndex": 40131, - "startIndex": 40130, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40118 - }, - { - "endIndex": 40153, - "paragraph": { - "elements": [ - { - "endIndex": 40153, - "startIndex": 40131, - "textRun": { - "content": "Base project overview\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7obu2mgfnlz0", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 40131 - }, - { - "endIndex": 40154, - "paragraph": { - "elements": [ - { - "endIndex": 40154, - "startIndex": 40153, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 40153 - }, - { - "endIndex": 40418, - "paragraph": { - "elements": [ - { - "endIndex": 40418, - "startIndex": 40154, - "textRun": { - "content": "Because some parts of this project are considered out of scope for this codelab, they are included in the starter code. It’s a good idea to go over what is already in the starter code before you get started, to get an idea of how you’re going to structure things.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 40154 - }, - { - "endIndex": 40419, - "paragraph": { - "elements": [ - { - "endIndex": 40419, - "startIndex": 40418, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 40418 - }, - { - "endIndex": 40740, - "paragraph": { - "elements": [ - { - "endIndex": 40740, - "startIndex": 40419, - "textRun": { - "content": "This backend code can run locally on your machine, you don’t need to deploy it to use it. However, you need to be able to connect from your development device (Android or iPhone) to the machine where the server will run. For that, they have to be in the same network, and you need to know the IP address of your machine.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 40419 - }, - { - "endIndex": 40741, - "paragraph": { - "elements": [ - { - "endIndex": 40741, - "startIndex": 40740, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 40740 - }, - { - "endIndex": 40792, - "paragraph": { - "elements": [ - { - "endIndex": 40792, - "startIndex": 40741, - "textRun": { - "content": "Try to run the server using the following command:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 40741 - }, - { - "endIndex": 40793, - "paragraph": { - "elements": [ - { - "endIndex": 40793, - "startIndex": 40792, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 40792 - }, - { - "endIndex": 40854, - "startIndex": 40793, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 40853, - "startIndex": 40794, - "tableCells": [ - { - "content": [ - { - "endIndex": 40821, - "paragraph": { - "elements": [ - { - "endIndex": 40821, - "startIndex": 40796, - "textRun": { - "content": "$ dart ./bin/server.dart\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40796 - }, - { - "endIndex": 40822, - "paragraph": { - "elements": [ - { - "endIndex": 40822, - "startIndex": 40821, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40821 - }, - { - "endIndex": 40853, - "paragraph": { - "elements": [ - { - "endIndex": 40853, - "startIndex": 40822, - "textRun": { - "content": "Serving at http://0.0.0.0:8080\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40822 - } - ], - "endIndex": 40853, - "startIndex": 40795, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 40855, - "paragraph": { - "elements": [ - { - "endIndex": 40855, - "startIndex": 40854, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 40854 - }, - { - "endIndex": 41053, - "paragraph": { - "elements": [ - { - "endIndex": 40877, - "startIndex": 40855, - "textRun": { - "content": "The Dart backend uses ", - "textStyle": {} - } - }, - { - "endIndex": 40882, - "startIndex": 40877, - "textRun": { - "content": "shelf", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/shelf" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 40887, - "startIndex": 40882, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 40899, - "startIndex": 40887, - "textRun": { - "content": "shelf_router", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/shelf_router" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 41053, - "startIndex": 40899, - "textRun": { - "content": " to serve API endpoints. By default, the server doesn’t provide any routes. Later on you will create a route to handle the purchase verification process.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 40855 - }, - { - "endIndex": 41054, - "paragraph": { - "elements": [ - { - "endIndex": 41054, - "startIndex": 41053, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 41053 - }, - { - "endIndex": 41420, - "paragraph": { - "elements": [ - { - "endIndex": 41115, - "startIndex": 41054, - "textRun": { - "content": "One part that is already included in the starter code is the ", - "textStyle": {} - } - }, - { - "endIndex": 41128, - "startIndex": 41115, - "textRun": { - "content": "IapRepository", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 41132, - "startIndex": 41128, - "textRun": { - "content": " in ", - "textStyle": {} - } - }, - { - "endIndex": 41155, - "startIndex": 41132, - "textRun": { - "content": "lib/iap_repository.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 41420, - "startIndex": 41155, - "textRun": { - "content": ". Because learning how to interact with Firestore, or databases in general, isn’t considered to be relevant to this codelab, the starter code contains functions for you to create or update purchases in the Firestore, as well as all the classes for those purchases.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41054 - }, - { - "endIndex": 41421, - "paragraph": { - "elements": [ - { - "endIndex": 41421, - "startIndex": 41420, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41420 - }, - { - "endIndex": 41444, - "paragraph": { - "elements": [ - { - "endIndex": 41444, - "startIndex": 41421, - "textRun": { - "content": "Set up Firebase access\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.dkookxd617q6", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 41421 - }, - { - "endIndex": 41445, - "paragraph": { - "elements": [ - { - "endIndex": 41445, - "startIndex": 41444, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41444 - }, - { - "endIndex": 41649, - "paragraph": { - "elements": [ - { - "endIndex": 41585, - "startIndex": 41445, - "textRun": { - "content": "To access Firebase Firestore, you need a service account access key. Generate one opening the Firebase project settings and navigate to the ", - "textStyle": {} - } - }, - { - "endIndex": 41601, - "startIndex": 41585, - "textRun": { - "content": "Service accounts", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 41623, - "startIndex": 41601, - "textRun": { - "content": " section, then select ", - "textStyle": {} - } - }, - { - "endIndex": 41647, - "startIndex": 41623, - "textRun": { - "content": "Generate new private key", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 41649, - "startIndex": 41647, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41445 - }, - { - "endIndex": 41650, - "paragraph": { - "elements": [ - { - "endIndex": 41650, - "startIndex": 41649, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41649 - }, - { - "endIndex": 41652, - "paragraph": { - "elements": [ - { - "endIndex": 41651, - "inlineObjectElement": { - "inlineObjectId": "kix.8jh32bs85q1q", - "textStyle": {} - }, - "startIndex": 41650 - }, - { - "endIndex": 41652, - "startIndex": 41651, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41650 - }, - { - "endIndex": 41653, - "paragraph": { - "elements": [ - { - "endIndex": 41653, - "startIndex": 41652, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41652 - }, - { - "endIndex": 41754, - "paragraph": { - "elements": [ - { - "endIndex": 41690, - "startIndex": 41653, - "textRun": { - "content": "Copy the downloaded JSON file to the ", - "textStyle": {} - } - }, - { - "endIndex": 41697, - "startIndex": 41690, - "textRun": { - "content": "assets/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 41723, - "startIndex": 41697, - "textRun": { - "content": " folder, and rename it to ", - "textStyle": {} - } - }, - { - "endIndex": 41752, - "startIndex": 41723, - "textRun": { - "content": "service-account-firebase.json", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 41754, - "startIndex": 41752, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41653 - }, - { - "endIndex": 41755, - "paragraph": { - "elements": [ - { - "endIndex": 41755, - "startIndex": 41754, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41754 - }, - { - "endIndex": 41756, - "paragraph": { - "elements": [ - { - "endIndex": 41756, - "startIndex": 41755, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41755 - }, - { - "endIndex": 41757, - "paragraph": { - "elements": [ - { - "endIndex": 41757, - "startIndex": 41756, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41756 - }, - { - "endIndex": 41758, - "paragraph": { - "elements": [ - { - "endIndex": 41758, - "startIndex": 41757, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41757 - }, - { - "endIndex": 41759, - "paragraph": { - "elements": [ - { - "endIndex": 41759, - "startIndex": 41758, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41758 - }, - { - "endIndex": 41785, - "paragraph": { - "elements": [ - { - "endIndex": 41785, - "startIndex": 41759, - "textRun": { - "content": "Set up Google Play access\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.knv4xp21ktnt", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 41759 - }, - { - "endIndex": 41786, - "paragraph": { - "elements": [ - { - "endIndex": 41786, - "startIndex": 41785, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41785 - }, - { - "endIndex": 41938, - "paragraph": { - "elements": [ - { - "endIndex": 41938, - "startIndex": 41786, - "textRun": { - "content": "To access the Play Store for verifying purchases, you must generate a service account with these permissions, and download the JSON credentials for it.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 41786 - }, - { - "endIndex": 41939, - "paragraph": { - "elements": [ - { - "endIndex": 41939, - "startIndex": 41938, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 41938 - }, - { - "endIndex": 42115, - "startIndex": 41939, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 42114, - "startIndex": 41940, - "tableCells": [ - { - "content": [ - { - "endIndex": 42114, - "paragraph": { - "elements": [ - { - "endIndex": 41946, - "startIndex": 41942, - "textRun": { - "content": "Note", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 42113, - "startIndex": 41946, - "textRun": { - "content": ": Only the owner of the developer account can set this up. An invited user with admin credentials doesn’t have the necessary permissions to generate these credentials.", - "textStyle": {} - } - }, - { - "endIndex": 42114, - "startIndex": 42113, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41942 - } - ], - "endIndex": 42114, - "startIndex": 41941, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8039216, - "green": 0.8980392, - "red": 0.9882353 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 42116, - "paragraph": { - "elements": [ - { - "endIndex": 42116, - "startIndex": 42115, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 42115 - }, - { - "endIndex": 42117, - "paragraph": { - "elements": [ - { - "endIndex": 42117, - "startIndex": 42116, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 42116 - }, - { - "endIndex": 42183, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 42167, - "startIndex": 42117, - "textRun": { - "content": "Go to the Google Play Console, and start from the ", - "textStyle": {} - } - }, - { - "endIndex": 42175, - "startIndex": 42167, - "textRun": { - "content": "All apps", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 42183, - "startIndex": 42175, - "textRun": { - "content": " page.\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42117 - }, - { - "endIndex": 42346, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 42189, - "startIndex": 42183, - "textRun": { - "content": "Go to ", - "textStyle": {} - } - }, - { - "endIndex": 42207, - "startIndex": 42189, - "textRun": { - "content": "Setup > API access", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 42208, - "startIndex": 42207, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 42209, - "startIndex": 42208, - "textRun": { - "content": "\u000b", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 42210, - "inlineObjectElement": { - "inlineObjectId": "kix.wwxo1r4c7v0g", - "textStyle": {} - }, - "startIndex": 42209 - }, - { - "endIndex": 42211, - "startIndex": 42210, - "textRun": { - "content": "\u000b", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 42344, - "startIndex": 42211, - "textRun": { - "content": "In case the Google Play Console requests that you create or link to an existing project, do so first and then come back to this page.", - "textStyle": {} - } - }, - { - "endIndex": 42346, - "startIndex": 42344, - "textRun": { - "content": "\u000b\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42183 - }, - { - "endIndex": 42443, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 42412, - "startIndex": 42346, - "textRun": { - "content": "Find the section where you can define service accounts, and click ", - "textStyle": {} - } - }, - { - "endIndex": 42440, - "startIndex": 42412, - "textRun": { - "content": "Create new service account.\u000b", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 42441, - "inlineObjectElement": { - "inlineObjectId": "kix.2cd8z374al3f", - "textStyle": {} - }, - "startIndex": 42440 - }, - { - "endIndex": 42442, - "startIndex": 42441, - "textRun": { - "content": "\u000b", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 42443, - "startIndex": 42442, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42346 - }, - { - "endIndex": 42511, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 42453, - "startIndex": 42443, - "textRun": { - "content": "Click the ", - "textStyle": {} - } - }, - { - "endIndex": 42474, - "startIndex": 42453, - "textRun": { - "content": "Google Cloud Platform", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 42508, - "startIndex": 42474, - "textRun": { - "content": " link in the dialog that pops up.\u000b", - "textStyle": {} - } - }, - { - "endIndex": 42509, - "inlineObjectElement": { - "inlineObjectId": "kix.k2jqdsuz2fno", - "textStyle": {} - }, - "startIndex": 42508 - }, - { - "endIndex": 42511, - "startIndex": 42509, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42443 - }, - { - "endIndex": 42670, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 42626, - "startIndex": 42511, - "textRun": { - "content": "Select your project. If you don’t see it, make sure that you are signed in to the correct Google account under the ", - "textStyle": {} - } - }, - { - "endIndex": 42633, - "startIndex": 42626, - "textRun": { - "content": "Account", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 42667, - "startIndex": 42633, - "textRun": { - "content": " drop-down list in the top right.\u000b", - "textStyle": {} - } - }, - { - "endIndex": 42668, - "inlineObjectElement": { - "inlineObjectId": "kix.vxc4y3subwbz", - "textStyle": {} - }, - "startIndex": 42667 - }, - { - "endIndex": 42670, - "startIndex": 42668, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42511 - }, - { - "endIndex": 42755, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 42706, - "startIndex": 42670, - "textRun": { - "content": "After selecting your project, click ", - "textStyle": {} - } - }, - { - "endIndex": 42730, - "startIndex": 42706, - "textRun": { - "content": "+ Create Service Account", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 42752, - "startIndex": 42730, - "textRun": { - "content": " in the top menu bar.\u000b", - "textStyle": {} - } - }, - { - "endIndex": 42753, - "inlineObjectElement": { - "inlineObjectId": "kix.9fz92ja09nmf", - "textStyle": {} - }, - "startIndex": 42752 - }, - { - "endIndex": 42755, - "startIndex": 42753, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42670 - }, - { - "endIndex": 42895, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 42892, - "startIndex": 42755, - "textRun": { - "content": "Provide a name for the service account, optionally provide a description so that you’ll remember what it’s for, and go to the next step.\u000b", - "textStyle": {} - } - }, - { - "endIndex": 42893, - "inlineObjectElement": { - "inlineObjectId": "kix.s4pnpsjksset", - "textStyle": {} - }, - "startIndex": 42892 - }, - { - "endIndex": 42895, - "startIndex": 42893, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42755 - }, - { - "endIndex": 42942, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 42926, - "startIndex": 42895, - "textRun": { - "content": "Assign the service account the ", - "textStyle": {} - } - }, - { - "endIndex": 42932, - "startIndex": 42926, - "textRun": { - "content": "Editor", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 42939, - "startIndex": 42932, - "textRun": { - "content": " role.\u000b", - "textStyle": {} - } - }, - { - "endIndex": 42940, - "inlineObjectElement": { - "inlineObjectId": "kix.esxpknacoi32", - "textStyle": {} - }, - "startIndex": 42939 - }, - { - "endIndex": 42942, - "startIndex": 42940, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42895 - }, - { - "endIndex": 43116, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 42976, - "startIndex": 42942, - "textRun": { - "content": "Finish the wizard, go back to the ", - "textStyle": {} - } - }, - { - "endIndex": 42986, - "startIndex": 42976, - "textRun": { - "content": "API Access", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 43032, - "startIndex": 42986, - "textRun": { - "content": " page within the developer console, and click ", - "textStyle": {} - } - }, - { - "endIndex": 43057, - "startIndex": 43032, - "textRun": { - "content": "Refresh service accounts.", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 43113, - "startIndex": 43057, - "textRun": { - "content": " You should see your newly created account in the list.\u000b", - "textStyle": {} - } - }, - { - "endIndex": 43114, - "inlineObjectElement": { - "inlineObjectId": "kix.4lnpl4yh01t0", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - } - } - }, - "startIndex": 43113 - }, - { - "endIndex": 43116, - "startIndex": 43114, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42942 - }, - { - "endIndex": 43166, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 43122, - "startIndex": 43116, - "textRun": { - "content": "Click ", - "textStyle": {} - } - }, - { - "endIndex": 43134, - "startIndex": 43122, - "textRun": { - "content": "Grant access", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 43166, - "startIndex": 43134, - "textRun": { - "content": " for your new service account.\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43116 - }, - { - "endIndex": 43338, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 43200, - "startIndex": 43166, - "textRun": { - "content": "Scroll down the next page, to the ", - "textStyle": {} - } - }, - { - "endIndex": 43214, - "startIndex": 43200, - "textRun": { - "content": "Financial data", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 43234, - "startIndex": 43214, - "textRun": { - "content": " block. Select both ", - "textStyle": {} - } - }, - { - "endIndex": 43296, - "startIndex": 43234, - "textRun": { - "content": "View financial data, orders, and cancellation survey responses", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 43301, - "startIndex": 43296, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 43332, - "startIndex": 43301, - "textRun": { - "content": "Manage orders and subscriptions", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 43335, - "startIndex": 43332, - "textRun": { - "content": ". \u000b", - "textStyle": {} - } - }, - { - "endIndex": 43336, - "inlineObjectElement": { - "inlineObjectId": "kix.i1nagngzzitk", - "textStyle": {} - }, - "startIndex": 43335 - }, - { - "endIndex": 43338, - "startIndex": 43336, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43166 - }, - { - "endIndex": 43360, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 43344, - "startIndex": 43338, - "textRun": { - "content": "Click ", - "textStyle": {} - } - }, - { - "endIndex": 43355, - "startIndex": 43344, - "textRun": { - "content": "Invite user", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 43357, - "startIndex": 43355, - "textRun": { - "content": ".\u000b", - "textStyle": {} - } - }, - { - "endIndex": 43358, - "inlineObjectElement": { - "inlineObjectId": "kix.3bd123g21oey", - "textStyle": {} - }, - "startIndex": 43357 - }, - { - "endIndex": 43360, - "startIndex": 43358, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43338 - }, - { - "endIndex": 43581, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 43564, - "startIndex": 43360, - "textRun": { - "content": "Now that the account is set up, you just need to generate some credentials. Back in the cloud console, find your service account in the list of service accounts, click the three vertical dots, and choose ", - "textStyle": {} - } - }, - { - "endIndex": 43575, - "startIndex": 43564, - "textRun": { - "content": "Manage keys", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 43578, - "startIndex": 43575, - "textRun": { - "content": ". \u000b", - "textStyle": {} - } - }, - { - "endIndex": 43579, - "inlineObjectElement": { - "inlineObjectId": "kix.2egsspufz1c8", - "textStyle": {} - }, - "startIndex": 43578 - }, - { - "endIndex": 43581, - "startIndex": 43579, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43360 - }, - { - "endIndex": 43625, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 43621, - "startIndex": 43581, - "textRun": { - "content": "Create a new JSON key and download it. \u000b", - "textStyle": {} - } - }, - { - "endIndex": 43622, - "inlineObjectElement": { - "inlineObjectId": "kix.icoz7xengcze", - "textStyle": {} - }, - "startIndex": 43621 - }, - { - "endIndex": 43623, - "inlineObjectElement": { - "inlineObjectId": "kix.3vn591ev65x6", - "textStyle": {} - }, - "startIndex": 43622 - }, - { - "endIndex": 43625, - "startIndex": 43623, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43581 - }, - { - "endIndex": 43730, - "paragraph": { - "bullet": { - "listId": "kix.273gbycvqbpv", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 43655, - "startIndex": 43625, - "textRun": { - "content": "Rename the downloaded file to ", - "textStyle": {} - } - }, - { - "endIndex": 43688, - "startIndex": 43655, - "textRun": { - "content": "service-account-google-play.json,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 43710, - "startIndex": 43688, - "textRun": { - "content": " and move it into the ", - "textStyle": {} - } - }, - { - "endIndex": 43717, - "startIndex": 43710, - "textRun": { - "content": "assets/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 43730, - "startIndex": 43717, - "textRun": { - "content": " directory.\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43625 - }, - { - "endIndex": 43886, - "paragraph": { - "elements": [ - { - "endIndex": 43767, - "startIndex": 43730, - "textRun": { - "content": "One more thing we need to do is open ", - "textStyle": {} - } - }, - { - "endIndex": 43786, - "startIndex": 43767, - "textRun": { - "content": "lib/constants.dart,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 43812, - "startIndex": 43786, - "textRun": { - "content": " and replace the value of ", - "textStyle": {} - } - }, - { - "endIndex": 43828, - "startIndex": 43812, - "textRun": { - "content": "androidPackageId", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 43886, - "startIndex": 43828, - "textRun": { - "content": " with the package ID that you chose for your Android app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 43730 - }, - { - "endIndex": 43887, - "paragraph": { - "elements": [ - { - "endIndex": 43887, - "startIndex": 43886, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 43886 - }, - { - "endIndex": 44129, - "startIndex": 43887, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 44128, - "startIndex": 43888, - "tableCells": [ - { - "content": [ - { - "endIndex": 44128, - "paragraph": { - "elements": [ - { - "endIndex": 43895, - "startIndex": 43890, - "textRun": { - "content": "Note:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 44128, - "startIndex": 43895, - "textRun": { - "content": " It can take a while before the service account grants you access to the Android Publisher APIs. If you run into a situation where your API calls are being denied based on your permissions, try again in a few hours or the next day. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43890 - } - ], - "endIndex": 44128, - "startIndex": 43889, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8039216, - "green": 0.8980392, - "red": 0.9882353 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 44130, - "paragraph": { - "elements": [ - { - "endIndex": 44130, - "startIndex": 44129, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44129 - }, - { - "endIndex": 44160, - "paragraph": { - "elements": [ - { - "endIndex": 44160, - "startIndex": 44130, - "textRun": { - "content": "Set up Apple App Store access\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.g72vs8nlqhfu", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 44130 - }, - { - "endIndex": 44161, - "paragraph": { - "elements": [ - { - "endIndex": 44161, - "startIndex": 44160, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44160 - }, - { - "endIndex": 44247, - "paragraph": { - "elements": [ - { - "endIndex": 44247, - "startIndex": 44161, - "textRun": { - "content": "To access the App Store for verifying purchases, you have to set up a shared secret: \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44161 - }, - { - "endIndex": 44248, - "paragraph": { - "elements": [ - { - "endIndex": 44248, - "startIndex": 44247, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44247 - }, - { - "endIndex": 44272, - "paragraph": { - "bullet": { - "listId": "kix.8vyn4hgvahf0", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 44253, - "startIndex": 44248, - "textRun": { - "content": "Open ", - "textStyle": {} - } - }, - { - "endIndex": 44270, - "startIndex": 44253, - "textRun": { - "content": "App Store Connect", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://appstoreconnect.apple.com/" - }, - "underline": true - } - } - }, - { - "endIndex": 44272, - "startIndex": 44270, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44248 - }, - { - "endIndex": 44308, - "paragraph": { - "bullet": { - "listId": "kix.8vyn4hgvahf0", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 44278, - "startIndex": 44272, - "textRun": { - "content": "Go to ", - "textStyle": {} - } - }, - { - "endIndex": 44286, - "startIndex": 44278, - "textRun": { - "content": "My Apps,", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 44308, - "startIndex": 44286, - "textRun": { - "content": " and select your app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44272 - }, - { - "endIndex": 44368, - "paragraph": { - "bullet": { - "listId": "kix.8vyn4hgvahf0", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 44341, - "startIndex": 44308, - "textRun": { - "content": "In the sidebar navigation, go to ", - "textStyle": {} - } - }, - { - "endIndex": 44366, - "startIndex": 44341, - "textRun": { - "content": "In-App Purchases > Manage", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 44368, - "startIndex": 44366, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44308 - }, - { - "endIndex": 44433, - "paragraph": { - "bullet": { - "listId": "kix.8vyn4hgvahf0", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 44404, - "startIndex": 44368, - "textRun": { - "content": "At the top right of the list, click ", - "textStyle": {} - } - }, - { - "endIndex": 44431, - "startIndex": 44404, - "textRun": { - "content": "App-Specific Shared Secret.", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 44433, - "startIndex": 44431, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44368 - }, - { - "endIndex": 44469, - "paragraph": { - "bullet": { - "listId": "kix.8vyn4hgvahf0", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 44469, - "startIndex": 44433, - "textRun": { - "content": "Generate a new secret, and copy it.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44433 - }, - { - "endIndex": 44583, - "paragraph": { - "bullet": { - "listId": "kix.8vyn4hgvahf0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 44474, - "startIndex": 44469, - "textRun": { - "content": "Open ", - "textStyle": {} - } - }, - { - "endIndex": 44493, - "startIndex": 44474, - "textRun": { - "content": "lib/constants.dart,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 44519, - "startIndex": 44493, - "textRun": { - "content": " and replace the value of ", - "textStyle": {} - } - }, - { - "endIndex": 44539, - "startIndex": 44519, - "textRun": { - "content": "appStoreSharedSecret", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 44583, - "startIndex": 44539, - "textRun": { - "content": " with the shared secret you just generated.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44469 - }, - { - "endIndex": 44584, - "paragraph": { - "elements": [ - { - "endIndex": 44584, - "startIndex": 44583, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44583 - }, - { - "endIndex": 44586, - "paragraph": { - "elements": [ - { - "endIndex": 44585, - "inlineObjectElement": { - "inlineObjectId": "kix.16xo8udq7e3c", - "textStyle": {} - }, - "startIndex": 44584 - }, - { - "endIndex": 44586, - "startIndex": 44585, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44584 - }, - { - "endIndex": 44588, - "paragraph": { - "elements": [ - { - "endIndex": 44587, - "inlineObjectElement": { - "inlineObjectId": "kix.7ner1pebor2s", - "textStyle": {} - }, - "startIndex": 44586 - }, - { - "endIndex": 44588, - "startIndex": 44587, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44586 - }, - { - "endIndex": 44618, - "paragraph": { - "elements": [ - { - "endIndex": 44618, - "startIndex": 44588, - "textRun": { - "content": "\u000bConstants configuration file\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.aqc59yhf20q", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 44588 - }, - { - "endIndex": 44619, - "paragraph": { - "elements": [ - { - "endIndex": 44619, - "startIndex": 44618, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44618 - }, - { - "endIndex": 44724, - "paragraph": { - "elements": [ - { - "endIndex": 44699, - "startIndex": 44619, - "textRun": { - "content": "Before proceeding, make sure that the following constants are configured in the ", - "textStyle": {} - } - }, - { - "endIndex": 44717, - "startIndex": 44699, - "textRun": { - "content": "lib/constants.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 44724, - "startIndex": 44717, - "textRun": { - "content": " file:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44619 - }, - { - "endIndex": 44725, - "paragraph": { - "elements": [ - { - "endIndex": 44725, - "startIndex": 44724, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44724 - }, - { - "endIndex": 44800, - "paragraph": { - "bullet": { - "listId": "kix.d576od65k8ms", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 44741, - "startIndex": 44725, - "textRun": { - "content": "androidPackageId", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 44776, - "startIndex": 44741, - "textRun": { - "content": ": Package ID used on Android. e.g. ", - "textStyle": {} - } - }, - { - "endIndex": 44800, - "startIndex": 44776, - "textRun": { - "content": "com.example.dashclicker\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44725 - }, - { - "endIndex": 44898, - "paragraph": { - "bullet": { - "listId": "kix.d576od65k8ms", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 44820, - "startIndex": 44800, - "textRun": { - "content": "appStoreSharedSecret", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 44898, - "startIndex": 44820, - "textRun": { - "content": ": Shared secret to access App Store Connect to perform purchase verification.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44800 - }, - { - "endIndex": 44960, - "paragraph": { - "bullet": { - "listId": "kix.d576od65k8ms", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 44906, - "startIndex": 44898, - "textRun": { - "content": "bundleId", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 44935, - "startIndex": 44906, - "textRun": { - "content": ": Bundle ID used on iOS. e.g.", - "textStyle": {} - } - }, - { - "endIndex": 44960, - "startIndex": 44935, - "textRun": { - "content": " com.example.dashclicker\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44898 - }, - { - "endIndex": 44961, - "paragraph": { - "elements": [ - { - "endIndex": 44961, - "startIndex": 44960, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44960 - }, - { - "endIndex": 45022, - "paragraph": { - "elements": [ - { - "endIndex": 45022, - "startIndex": 44961, - "textRun": { - "content": "You can ignore the rest of the constants for the time being.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 44961 - }, - { - "endIndex": 45023, - "paragraph": { - "elements": [ - { - "endIndex": 45023, - "startIndex": 45022, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45022 - }, - { - "endIndex": 45025, - "paragraph": { - "elements": [ - { - "endIndex": 45024, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 45023 - }, - { - "endIndex": 45025, - "startIndex": 45024, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ndve8xf0xaa0", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 45023 - }, - { - "endIndex": 45042, - "paragraph": { - "elements": [ - { - "endIndex": 45042, - "startIndex": 45025, - "textRun": { - "content": "Verify purchases\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.92eefa9xpwex", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 45025 - }, - { - "endIndex": 45115, - "paragraph": { - "elements": [ - { - "endIndex": 45115, - "startIndex": 45042, - "textRun": { - "content": "The general flow for verifying purchases is similar for iOS and Android.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45042 - }, - { - "endIndex": 45116, - "paragraph": { - "elements": [ - { - "endIndex": 45116, - "startIndex": 45115, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45115 - }, - { - "endIndex": 45192, - "paragraph": { - "elements": [ - { - "endIndex": 45192, - "startIndex": 45116, - "textRun": { - "content": "For both stores, your application receives a token when a purchase is made.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45116 - }, - { - "endIndex": 45193, - "paragraph": { - "elements": [ - { - "endIndex": 45193, - "startIndex": 45192, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45192 - }, - { - "endIndex": 45353, - "paragraph": { - "elements": [ - { - "endIndex": 45353, - "startIndex": 45193, - "textRun": { - "content": "This token is sent by the app to your backend service, which then, in turn, verifies the purchase with the respective store’s servers using the provided token.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45193 - }, - { - "endIndex": 45354, - "paragraph": { - "elements": [ - { - "endIndex": 45354, - "startIndex": 45353, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45353 - }, - { - "endIndex": 45482, - "paragraph": { - "elements": [ - { - "endIndex": 45482, - "startIndex": 45354, - "textRun": { - "content": "The backend service can then choose to store the purchase, and reply to the application whether the purchase was valid or not. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45354 - }, - { - "endIndex": 45483, - "paragraph": { - "elements": [ - { - "endIndex": 45483, - "startIndex": 45482, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45482 - }, - { - "endIndex": 45713, - "paragraph": { - "elements": [ - { - "endIndex": 45713, - "startIndex": 45483, - "textRun": { - "content": "By having the backend service do the validation with the stores rather than the application running on your user’s device, you can prevent the user gaining access to premium features by, for example, rewinding their system clock.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45483 - }, - { - "endIndex": 45714, - "paragraph": { - "elements": [ - { - "endIndex": 45714, - "startIndex": 45713, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45713 - }, - { - "endIndex": 45738, - "paragraph": { - "elements": [ - { - "endIndex": 45737, - "startIndex": 45714, - "textRun": { - "content": "Set up the Flutter side", - "textStyle": {} - } - }, - { - "endIndex": 45738, - "startIndex": 45737, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.aoaadshh2reg", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 45714 - }, - { - "endIndex": 45760, - "paragraph": { - "elements": [ - { - "endIndex": 45760, - "startIndex": 45738, - "textRun": { - "content": "Set up authentication\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.134djrxwtck0", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 45738 - }, - { - "endIndex": 46160, - "paragraph": { - "elements": [ - { - "endIndex": 46010, - "startIndex": 45760, - "textRun": { - "content": "As you are going to send the purchases to your backend service, you want to make sure the user is authenticated while making a purchase. Most of the authentication logic is already added for you in the starter project, you just have to make sure the ", - "textStyle": {} - } - }, - { - "endIndex": 46022, - "startIndex": 46010, - "textRun": { - "content": "PurchasePage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46145, - "startIndex": 46022, - "textRun": { - "content": " shows the login button when the user is not logged in yet. Add the following code to the beginning of the build method of ", - "textStyle": {} - } - }, - { - "endIndex": 46157, - "startIndex": 46145, - "textRun": { - "content": "PurchasePage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46160, - "startIndex": 46157, - "textRun": { - "content": ": \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45760 - }, - { - "endIndex": 46189, - "paragraph": { - "elements": [ - { - "endIndex": 46188, - "startIndex": 46160, - "textRun": { - "content": "lib/pages/purchase_page.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/app/lib/pages/purchase_page.dart#L15-L27" - }, - "underline": true - } - } - }, - { - "endIndex": 46189, - "startIndex": 46188, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.bqda879f77zo", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 46160 - }, - { - "endIndex": 46815, - "startIndex": 46189, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 46814, - "startIndex": 46190, - "tableCells": [ - { - "content": [ - { - "endIndex": 46234, - "paragraph": { - "elements": [ - { - "endIndex": 46234, - "startIndex": 46192, - "textRun": { - "content": "import '../logic/firebase_notifier.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46192 - }, - { - "endIndex": 46273, - "paragraph": { - "elements": [ - { - "endIndex": 46273, - "startIndex": 46234, - "textRun": { - "content": "import '../model/firebase_state.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46234 - }, - { - "endIndex": 46299, - "paragraph": { - "elements": [ - { - "endIndex": 46299, - "startIndex": 46273, - "textRun": { - "content": "import 'login_page.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46273 - }, - { - "endIndex": 46300, - "paragraph": { - "elements": [ - { - "endIndex": 46300, - "startIndex": 46299, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46299 - }, - { - "endIndex": 46347, - "paragraph": { - "elements": [ - { - "endIndex": 46347, - "startIndex": 46300, - "textRun": { - "content": "class PurchasePage extends StatelessWidget { \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46300 - }, - { - "endIndex": 46399, - "paragraph": { - "elements": [ - { - "endIndex": 46399, - "startIndex": 46347, - "textRun": { - "content": " const PurchasePage({Key? key}) : super(key: key);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46347 - }, - { - "endIndex": 46400, - "paragraph": { - "elements": [ - { - "endIndex": 46400, - "startIndex": 46399, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46399 - }, - { - "endIndex": 46412, - "paragraph": { - "elements": [ - { - "endIndex": 46412, - "startIndex": 46400, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46400 - }, - { - "endIndex": 46451, - "paragraph": { - "elements": [ - { - "endIndex": 46451, - "startIndex": 46412, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46412 - }, - { - "endIndex": 46513, - "paragraph": { - "elements": [ - { - "endIndex": 46513, - "startIndex": 46451, - "textRun": { - "content": " var firebaseNotifier = context.watch();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46451 - }, - { - "endIndex": 46572, - "paragraph": { - "elements": [ - { - "endIndex": 46572, - "startIndex": 46513, - "textRun": { - "content": " if (firebaseNotifier.state == FirebaseState.loading) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46513 - }, - { - "endIndex": 46606, - "paragraph": { - "elements": [ - { - "endIndex": 46606, - "startIndex": 46572, - "textRun": { - "content": " return _PurchasesLoading();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46572 - }, - { - "endIndex": 46677, - "paragraph": { - "elements": [ - { - "endIndex": 46677, - "startIndex": 46606, - "textRun": { - "content": " } else if (firebaseNotifier.state == FirebaseState.notAvailable) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46606 - }, - { - "endIndex": 46716, - "paragraph": { - "elements": [ - { - "endIndex": 46716, - "startIndex": 46677, - "textRun": { - "content": " return _PurchasesNotAvailable();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46677 - }, - { - "endIndex": 46722, - "paragraph": { - "elements": [ - { - "endIndex": 46722, - "startIndex": 46716, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46716 - }, - { - "endIndex": 46723, - "paragraph": { - "elements": [ - { - "endIndex": 46723, - "startIndex": 46722, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46722 - }, - { - "endIndex": 46761, - "paragraph": { - "elements": [ - { - "endIndex": 46761, - "startIndex": 46723, - "textRun": { - "content": " if (!firebaseNotifier.loggedIn) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46723 - }, - { - "endIndex": 46793, - "paragraph": { - "elements": [ - { - "endIndex": 46793, - "startIndex": 46761, - "textRun": { - "content": " return const LoginPage();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46761 - }, - { - "endIndex": 46799, - "paragraph": { - "elements": [ - { - "endIndex": 46799, - "startIndex": 46793, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46793 - }, - { - "endIndex": 46814, - "paragraph": { - "elements": [ - { - "endIndex": 46814, - "startIndex": 46799, - "textRun": { - "content": " // omitted\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46799 - } - ], - "endIndex": 46814, - "startIndex": 46191, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 46816, - "paragraph": { - "elements": [ - { - "endIndex": 46816, - "startIndex": 46815, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 46815 - }, - { - "endIndex": 46856, - "paragraph": { - "elements": [ - { - "endIndex": 46856, - "startIndex": 46816, - "textRun": { - "content": "Call verification endpoint from the app\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.fpeghnmhyjw5", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 46816 - }, - { - "endIndex": 46857, - "paragraph": { - "elements": [ - { - "endIndex": 46857, - "startIndex": 46856, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 46856 - }, - { - "endIndex": 47024, - "paragraph": { - "elements": [ - { - "endIndex": 46880, - "startIndex": 46857, - "textRun": { - "content": "In the app, create the ", - "textStyle": {} - } - }, - { - "endIndex": 46928, - "startIndex": 46880, - "textRun": { - "content": "_verifyPurchase(PurchaseDetails purchaseDetails)", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46938, - "startIndex": 46928, - "textRun": { - "content": " function ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 46953, - "startIndex": 46938, - "textRun": { - "content": "that calls the ", - "textStyle": {} - } - }, - { - "endIndex": 46968, - "startIndex": 46953, - "textRun": { - "content": "/verifypurchase", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 47024, - "startIndex": 46968, - "textRun": { - "content": " endpoint on your Dart backend using an http post call.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 46857 - }, - { - "endIndex": 47025, - "paragraph": { - "elements": [ - { - "endIndex": 47025, - "startIndex": 47024, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 47024 - }, - { - "endIndex": 47238, - "paragraph": { - "elements": [ - { - "endIndex": 47050, - "startIndex": 47025, - "textRun": { - "content": "Send the selected store (", - "textStyle": {} - } - }, - { - "endIndex": 47061, - "startIndex": 47050, - "textRun": { - "content": "google_play", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 47084, - "startIndex": 47061, - "textRun": { - "content": " for the Play Store or ", - "textStyle": {} - } - }, - { - "endIndex": 47093, - "startIndex": 47084, - "textRun": { - "content": "app_store", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 47111, - "startIndex": 47093, - "textRun": { - "content": " for the App Store", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 47118, - "startIndex": 47111, - "textRun": { - "content": "), the ", - "textStyle": {} - } - }, - { - "endIndex": 47140, - "startIndex": 47118, - "textRun": { - "content": "serverVerificationData", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 47141, - "startIndex": 47140, - "textRun": { - "content": ",", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 47150, - "startIndex": 47141, - "textRun": { - "content": " and the ", - "textStyle": {} - } - }, - { - "endIndex": 47159, - "startIndex": 47150, - "textRun": { - "content": "productID", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 47238, - "startIndex": 47159, - "textRun": { - "content": ". The server returns status code indicating whether the purchase is verified. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 47025 - }, - { - "endIndex": 47239, - "paragraph": { - "elements": [ - { - "endIndex": 47239, - "startIndex": 47238, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 47238 - }, - { - "endIndex": 47319, - "paragraph": { - "elements": [ - { - "endIndex": 47319, - "startIndex": 47239, - "textRun": { - "content": "In the app constants, configure the server IP to your local machine IP address.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 47239 - }, - { - "endIndex": 47320, - "paragraph": { - "elements": [ - { - "endIndex": 47320, - "startIndex": 47319, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 47319 - }, - { - "endIndex": 47350, - "paragraph": { - "elements": [ - { - "endIndex": 47349, - "startIndex": 47320, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/app/lib/logic/dash_purchases.dart#L16-L25" - }, - "underline": true - } - } - }, - { - "endIndex": 47350, - "startIndex": 47349, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ambb17bea5eu", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 47320 - }, - { - "endIndex": 47466, - "startIndex": 47350, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 47465, - "startIndex": 47351, - "tableCells": [ - { - "content": [ - { - "endIndex": 47390, - "paragraph": { - "elements": [ - { - "endIndex": 47390, - "startIndex": 47353, - "textRun": { - "content": " FirebaseNotifier firebaseNotifier;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47353 - }, - { - "endIndex": 47391, - "paragraph": { - "elements": [ - { - "endIndex": 47391, - "startIndex": 47390, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47390 - }, - { - "endIndex": 47446, - "paragraph": { - "elements": [ - { - "endIndex": 47446, - "startIndex": 47391, - "textRun": { - "content": " DashPurchases(this.counter, this.firebaseNotifier) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47391 - }, - { - "endIndex": 47461, - "paragraph": { - "elements": [ - { - "endIndex": 47461, - "startIndex": 47446, - "textRun": { - "content": " // omitted\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47446 - }, - { - "endIndex": 47465, - "paragraph": { - "elements": [ - { - "endIndex": 47465, - "startIndex": 47461, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47461 - } - ], - "endIndex": 47465, - "startIndex": 47352, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 47467, - "paragraph": { - "elements": [ - { - "endIndex": 47467, - "startIndex": 47466, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 47466 - }, - { - "endIndex": 47541, - "paragraph": { - "elements": [ - { - "endIndex": 47475, - "startIndex": 47467, - "textRun": { - "content": "Add the ", - "textStyle": {} - } - }, - { - "endIndex": 47491, - "startIndex": 47475, - "textRun": { - "content": "firebaseNotifier", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 47513, - "startIndex": 47491, - "textRun": { - "content": " with the creation of ", - "textStyle": {} - } - }, - { - "endIndex": 47526, - "startIndex": 47513, - "textRun": { - "content": "DashPurchases", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 47530, - "startIndex": 47526, - "textRun": { - "content": " in ", - "textStyle": {} - } - }, - { - "endIndex": 47541, - "startIndex": 47530, - "textRun": { - "content": "main.dart:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 47467 - }, - { - "endIndex": 47555, - "paragraph": { - "elements": [ - { - "endIndex": 47554, - "startIndex": 47541, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/app/lib/main.dart#L79-L85" - }, - "underline": true - } - } - }, - { - "endIndex": 47555, - "startIndex": 47554, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.h3a9vrs8wpa6", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 47541 - }, - { - "endIndex": 47786, - "startIndex": 47555, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 47785, - "startIndex": 47556, - "tableCells": [ - { - "content": [ - { - "endIndex": 47605, - "paragraph": { - "elements": [ - { - "endIndex": 47605, - "startIndex": 47558, - "textRun": { - "content": " ChangeNotifierProvider(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47558 - }, - { - "endIndex": 47651, - "paragraph": { - "elements": [ - { - "endIndex": 47651, - "startIndex": 47605, - "textRun": { - "content": " create: (context) => DashPurchases(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47605 - }, - { - "endIndex": 47692, - "paragraph": { - "elements": [ - { - "endIndex": 47692, - "startIndex": 47651, - "textRun": { - "content": " context.read(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47651 - }, - { - "endIndex": 47738, - "paragraph": { - "elements": [ - { - "endIndex": 47738, - "startIndex": 47692, - "textRun": { - "content": " context.read(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47692 - }, - { - "endIndex": 47751, - "paragraph": { - "elements": [ - { - "endIndex": 47751, - "startIndex": 47738, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47738 - }, - { - "endIndex": 47774, - "paragraph": { - "elements": [ - { - "endIndex": 47774, - "startIndex": 47751, - "textRun": { - "content": " lazy: false,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47751 - }, - { - "endIndex": 47785, - "paragraph": { - "elements": [ - { - "endIndex": 47785, - "startIndex": 47774, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47774 - } - ], - "endIndex": 47785, - "startIndex": 47557, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 47787, - "paragraph": { - "elements": [ - { - "endIndex": 47787, - "startIndex": 47786, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 47786 - }, - { - "endIndex": 47899, - "paragraph": { - "elements": [ - { - "endIndex": 47899, - "startIndex": 47787, - "textRun": { - "content": "Add a getter for the User in the FirebaseNotifier, so you can pass the user ID to the verify purchase function.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 47787 - }, - { - "endIndex": 47932, - "paragraph": { - "elements": [ - { - "endIndex": 47931, - "startIndex": 47899, - "textRun": { - "content": "lib/logic/firebase_notifier.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/app/lib/logic/firebase_notifier.dart#L32-L33" - }, - "underline": true - } - } - }, - { - "endIndex": 47932, - "startIndex": 47931, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.w07tm7tj04kl", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 47899 - }, - { - "endIndex": 47991, - "startIndex": 47932, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 47990, - "startIndex": 47933, - "tableCells": [ - { - "content": [ - { - "endIndex": 47990, - "paragraph": { - "elements": [ - { - "endIndex": 47990, - "startIndex": 47935, - "textRun": { - "content": " User? get user => FirebaseAuth.instance.currentUser;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47935 - } - ], - "endIndex": 47990, - "startIndex": 47934, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 47992, - "paragraph": { - "elements": [ - { - "endIndex": 47992, - "startIndex": 47991, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 47991 - }, - { - "endIndex": 47993, - "paragraph": { - "elements": [ - { - "endIndex": 47993, - "startIndex": 47992, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 47992 - }, - { - "endIndex": 48138, - "paragraph": { - "elements": [ - { - "endIndex": 48010, - "startIndex": 47993, - "textRun": { - "content": "Add the function ", - "textStyle": {} - } - }, - { - "endIndex": 48025, - "startIndex": 48010, - "textRun": { - "content": "_verifyPurchase", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 48033, - "startIndex": 48025, - "textRun": { - "content": " to the ", - "textStyle": {} - } - }, - { - "endIndex": 48046, - "startIndex": 48033, - "textRun": { - "content": "DashPurchases", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 48059, - "startIndex": 48046, - "textRun": { - "content": " class. This ", - "textStyle": {} - } - }, - { - "endIndex": 48064, - "startIndex": 48059, - "textRun": { - "content": "async", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 48138, - "startIndex": 48064, - "textRun": { - "content": " function returns a boolean indicating whether the purchase is validated.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 47993 - }, - { - "endIndex": 48168, - "paragraph": { - "elements": [ - { - "endIndex": 48167, - "startIndex": 48138, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/app/lib/logic/dash_purchases.dart#L119-L130" - }, - "underline": true - } - } - }, - { - "endIndex": 48168, - "startIndex": 48167, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ikjulurznqpp", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 48138 - }, - { - "endIndex": 49004, - "startIndex": 48168, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 49003, - "startIndex": 48169, - "tableCells": [ - { - "content": [ - { - "endIndex": 48243, - "paragraph": { - "elements": [ - { - "endIndex": 48243, - "startIndex": 48171, - "textRun": { - "content": " Future _verifyPurchase(PurchaseDetails purchaseDetails) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48171 - }, - { - "endIndex": 48310, - "paragraph": { - "elements": [ - { - "endIndex": 48310, - "startIndex": 48243, - "textRun": { - "content": " final url = Uri.parse('http://$serverIp:8080/verifypurchase');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48243 - }, - { - "endIndex": 48332, - "paragraph": { - "elements": [ - { - "endIndex": 48332, - "startIndex": 48310, - "textRun": { - "content": " const headers = {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48310 - }, - { - "endIndex": 48374, - "paragraph": { - "elements": [ - { - "endIndex": 48374, - "startIndex": 48332, - "textRun": { - "content": " 'Content-type': 'application/json',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48332 - }, - { - "endIndex": 48410, - "paragraph": { - "elements": [ - { - "endIndex": 48410, - "startIndex": 48374, - "textRun": { - "content": " 'Accept': 'application/json',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48374 - }, - { - "endIndex": 48417, - "paragraph": { - "elements": [ - { - "endIndex": 48417, - "startIndex": 48410, - "textRun": { - "content": " };\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48410 - }, - { - "endIndex": 48455, - "paragraph": { - "elements": [ - { - "endIndex": 48455, - "startIndex": 48417, - "textRun": { - "content": " final response = await http.post(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48417 - }, - { - "endIndex": 48466, - "paragraph": { - "elements": [ - { - "endIndex": 48466, - "startIndex": 48455, - "textRun": { - "content": " url,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48455 - }, - { - "endIndex": 48491, - "paragraph": { - "elements": [ - { - "endIndex": 48491, - "startIndex": 48466, - "textRun": { - "content": " body: jsonEncode({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48466 - }, - { - "endIndex": 48550, - "paragraph": { - "elements": [ - { - "endIndex": 48550, - "startIndex": 48491, - "textRun": { - "content": " 'source': purchaseDetails.verificationData.source,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48491 - }, - { - "endIndex": 48598, - "paragraph": { - "elements": [ - { - "endIndex": 48598, - "startIndex": 48550, - "textRun": { - "content": " 'productId': purchaseDetails.productID,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48550 - }, - { - "endIndex": 48626, - "paragraph": { - "elements": [ - { - "endIndex": 48626, - "startIndex": 48598, - "textRun": { - "content": " 'verificationData':\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48598 - }, - { - "endIndex": 48695, - "paragraph": { - "elements": [ - { - "endIndex": 48695, - "startIndex": 48626, - "textRun": { - "content": " purchaseDetails.verificationData.serverVerificationData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48626 - }, - { - "endIndex": 48741, - "paragraph": { - "elements": [ - { - "endIndex": 48741, - "startIndex": 48695, - "textRun": { - "content": " 'userId': firebaseNotifier.user?.uid,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48695 - }, - { - "endIndex": 48751, - "paragraph": { - "elements": [ - { - "endIndex": 48751, - "startIndex": 48741, - "textRun": { - "content": " }),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48741 - }, - { - "endIndex": 48775, - "paragraph": { - "elements": [ - { - "endIndex": 48775, - "startIndex": 48751, - "textRun": { - "content": " headers: headers,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48751 - }, - { - "endIndex": 48782, - "paragraph": { - "elements": [ - { - "endIndex": 48782, - "startIndex": 48775, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48775 - }, - { - "endIndex": 48820, - "paragraph": { - "elements": [ - { - "endIndex": 48820, - "startIndex": 48782, - "textRun": { - "content": " if (response.statusCode == 200) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48782 - }, - { - "endIndex": 48867, - "paragraph": { - "elements": [ - { - "endIndex": 48867, - "startIndex": 48820, - "textRun": { - "content": " print('Successfully verified purchase');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48820 - }, - { - "endIndex": 48886, - "paragraph": { - "elements": [ - { - "endIndex": 48886, - "startIndex": 48867, - "textRun": { - "content": " return true;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48867 - }, - { - "endIndex": 48899, - "paragraph": { - "elements": [ - { - "endIndex": 48899, - "startIndex": 48886, - "textRun": { - "content": " } else {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48886 - }, - { - "endIndex": 48973, - "paragraph": { - "elements": [ - { - "endIndex": 48973, - "startIndex": 48899, - "textRun": { - "content": " print('failed request: ${response.statusCode} - ${response.body}');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48899 - }, - { - "endIndex": 48993, - "paragraph": { - "elements": [ - { - "endIndex": 48993, - "startIndex": 48973, - "textRun": { - "content": " return false;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48973 - }, - { - "endIndex": 48999, - "paragraph": { - "elements": [ - { - "endIndex": 48999, - "startIndex": 48993, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48993 - }, - { - "endIndex": 49003, - "paragraph": { - "elements": [ - { - "endIndex": 49003, - "startIndex": 48999, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48999 - } - ], - "endIndex": 49003, - "startIndex": 48170, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 49005, - "paragraph": { - "elements": [ - { - "endIndex": 49005, - "startIndex": 49004, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 49004 - }, - { - "endIndex": 49006, - "paragraph": { - "elements": [ - { - "endIndex": 49006, - "startIndex": 49005, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 49005 - }, - { - "endIndex": 49402, - "paragraph": { - "elements": [ - { - "endIndex": 49015, - "startIndex": 49006, - "textRun": { - "content": "Call the ", - "textStyle": {} - } - }, - { - "endIndex": 49030, - "startIndex": 49015, - "textRun": { - "content": "_verifyPurchase", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 49043, - "startIndex": 49030, - "textRun": { - "content": " function in ", - "textStyle": {} - } - }, - { - "endIndex": 49058, - "startIndex": 49043, - "textRun": { - "content": "_handlePurchase", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 49401, - "startIndex": 49058, - "textRun": { - "content": " just before you apply the purchase. You should only apply the purchase when it’s verified. In a production app, you can specify this further to, for example, apply a trial subscription when the store is temporarily unavailable. However, for this example, keep it simple, and only apply the purchase when the purchase is verified successfully.", - "textStyle": {} - } - }, - { - "endIndex": 49402, - "startIndex": 49401, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 49006 - }, - { - "endIndex": 49432, - "paragraph": { - "elements": [ - { - "endIndex": 49431, - "startIndex": 49402, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/app/lib/logic/dash_purchases.dart#L86-L117" - }, - "underline": true - } - } - }, - { - "endIndex": 49432, - "startIndex": 49431, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ipyt35k9ps3s", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 49402 - }, - { - "endIndex": 50335, - "startIndex": 49432, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 50334, - "startIndex": 49433, - "tableCells": [ - { - "content": [ - { - "endIndex": 49469, - "paragraph": { - "elements": [ - { - "endIndex": 49469, - "startIndex": 49435, - "textRun": { - "content": " Future _onPurchaseUpdate(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49435 - }, - { - "endIndex": 49526, - "paragraph": { - "elements": [ - { - "endIndex": 49526, - "startIndex": 49469, - "textRun": { - "content": " List purchaseDetailsList) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49469 - }, - { - "endIndex": 49581, - "paragraph": { - "elements": [ - { - "endIndex": 49581, - "startIndex": 49526, - "textRun": { - "content": " for (var purchaseDetails in purchaseDetailsList) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49526 - }, - { - "endIndex": 49627, - "paragraph": { - "elements": [ - { - "endIndex": 49627, - "startIndex": 49581, - "textRun": { - "content": " await _handlePurchase(purchaseDetails);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49581 - }, - { - "endIndex": 49633, - "paragraph": { - "elements": [ - { - "endIndex": 49633, - "startIndex": 49627, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49627 - }, - { - "endIndex": 49656, - "paragraph": { - "elements": [ - { - "endIndex": 49656, - "startIndex": 49633, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49633 - }, - { - "endIndex": 49660, - "paragraph": { - "elements": [ - { - "endIndex": 49660, - "startIndex": 49656, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49656 - }, - { - "endIndex": 49661, - "paragraph": { - "elements": [ - { - "endIndex": 49661, - "startIndex": 49660, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49660 - }, - { - "endIndex": 49733, - "paragraph": { - "elements": [ - { - "endIndex": 49733, - "startIndex": 49661, - "textRun": { - "content": " Future _handlePurchase(PurchaseDetails purchaseDetails) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49661 - }, - { - "endIndex": 49795, - "paragraph": { - "elements": [ - { - "endIndex": 49795, - "startIndex": 49733, - "textRun": { - "content": " if (purchaseDetails.status == PurchaseStatus.purchased) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49733 - }, - { - "endIndex": 49819, - "paragraph": { - "elements": [ - { - "endIndex": 49819, - "startIndex": 49795, - "textRun": { - "content": " // Send to server\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49795 - }, - { - "endIndex": 49885, - "paragraph": { - "elements": [ - { - "endIndex": 49885, - "startIndex": 49819, - "textRun": { - "content": " var validPurchase = await _verifyPurchase(purchaseDetails);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49819 - }, - { - "endIndex": 49886, - "paragraph": { - "elements": [ - { - "endIndex": 49886, - "startIndex": 49885, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49885 - }, - { - "endIndex": 49913, - "paragraph": { - "elements": [ - { - "endIndex": 49913, - "startIndex": 49886, - "textRun": { - "content": " if (validPurchase) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49886 - }, - { - "endIndex": 49946, - "paragraph": { - "elements": [ - { - "endIndex": 49946, - "startIndex": 49913, - "textRun": { - "content": " // Apply changes locally\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49913 - }, - { - "endIndex": 49991, - "paragraph": { - "elements": [ - { - "endIndex": 49991, - "startIndex": 49946, - "textRun": { - "content": " switch (purchaseDetails.productID) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49946 - }, - { - "endIndex": 50028, - "paragraph": { - "elements": [ - { - "endIndex": 50028, - "startIndex": 49991, - "textRun": { - "content": " case storeKeySubscription:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 49991 - }, - { - "endIndex": 50071, - "paragraph": { - "elements": [ - { - "endIndex": 50071, - "startIndex": 50028, - "textRun": { - "content": " counter.applyPaidMultiplier();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50028 - }, - { - "endIndex": 50090, - "paragraph": { - "elements": [ - { - "endIndex": 50090, - "startIndex": 50071, - "textRun": { - "content": " break;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50071 - }, - { - "endIndex": 50125, - "paragraph": { - "elements": [ - { - "endIndex": 50125, - "startIndex": 50090, - "textRun": { - "content": " case storeKeyConsumable:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50090 - }, - { - "endIndex": 50168, - "paragraph": { - "elements": [ - { - "endIndex": 50168, - "startIndex": 50125, - "textRun": { - "content": " counter.addBoughtDashes(1000);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50125 - }, - { - "endIndex": 50187, - "paragraph": { - "elements": [ - { - "endIndex": 50187, - "startIndex": 50168, - "textRun": { - "content": " break;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50168 - }, - { - "endIndex": 50197, - "paragraph": { - "elements": [ - { - "endIndex": 50197, - "startIndex": 50187, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50187 - }, - { - "endIndex": 50205, - "paragraph": { - "elements": [ - { - "endIndex": 50205, - "startIndex": 50197, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50197 - }, - { - "endIndex": 50211, - "paragraph": { - "elements": [ - { - "endIndex": 50211, - "startIndex": 50205, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50205 - }, - { - "endIndex": 50212, - "paragraph": { - "elements": [ - { - "endIndex": 50212, - "startIndex": 50211, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50211 - }, - { - "endIndex": 50263, - "paragraph": { - "elements": [ - { - "endIndex": 50263, - "startIndex": 50212, - "textRun": { - "content": " if (purchaseDetails.pendingCompletePurchase) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50212 - }, - { - "endIndex": 50324, - "paragraph": { - "elements": [ - { - "endIndex": 50324, - "startIndex": 50263, - "textRun": { - "content": " await iapConnection.completePurchase(purchaseDetails);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50263 - }, - { - "endIndex": 50330, - "paragraph": { - "elements": [ - { - "endIndex": 50330, - "startIndex": 50324, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50324 - }, - { - "endIndex": 50334, - "paragraph": { - "elements": [ - { - "endIndex": 50334, - "startIndex": 50330, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50330 - } - ], - "endIndex": 50334, - "startIndex": 49434, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 50336, - "paragraph": { - "elements": [ - { - "endIndex": 50336, - "startIndex": 50335, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 50335 - }, - { - "endIndex": 50398, - "paragraph": { - "elements": [ - { - "endIndex": 50398, - "startIndex": 50336, - "textRun": { - "content": "In the app everything is now ready to validate the purchases.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 50336 - }, - { - "endIndex": 50425, - "paragraph": { - "elements": [ - { - "endIndex": 50425, - "startIndex": 50398, - "textRun": { - "content": "Set up the backend service\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.w21b5bvfuwiw", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 50398 - }, - { - "endIndex": 50497, - "paragraph": { - "elements": [ - { - "endIndex": 50497, - "startIndex": 50425, - "textRun": { - "content": "Next, set up the cloud function for verifying purchases on the backend.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 50425 - }, - { - "endIndex": 50521, - "paragraph": { - "elements": [ - { - "endIndex": 50521, - "startIndex": 50497, - "textRun": { - "content": "Build purchase handlers\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.q27vh9nf8lin", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 50497 - }, - { - "endIndex": 50677, - "paragraph": { - "elements": [ - { - "endIndex": 50609, - "startIndex": 50521, - "textRun": { - "content": "Because the verification flow for both stores is close to identical, set up an abstract ", - "textStyle": {} - } - }, - { - "endIndex": 50624, - "startIndex": 50609, - "textRun": { - "content": "PurchaseHandler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50677, - "startIndex": 50624, - "textRun": { - "content": " class with separate implementations for each store.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 50521 - }, - { - "endIndex": 50679, - "paragraph": { - "elements": [ - { - "endIndex": 50678, - "inlineObjectElement": { - "inlineObjectId": "kix.bqwp3g2c0vyr", - "textStyle": {} - }, - "startIndex": 50677 - }, - { - "endIndex": 50679, - "startIndex": 50678, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 50677 - }, - { - "endIndex": 50680, - "paragraph": { - "elements": [ - { - "endIndex": 50680, - "startIndex": 50679, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 50679 - }, - { - "endIndex": 50907, - "paragraph": { - "elements": [ - { - "endIndex": 50698, - "startIndex": 50680, - "textRun": { - "content": "Start by adding a ", - "textStyle": {} - } - }, - { - "endIndex": 50719, - "startIndex": 50698, - "textRun": { - "content": "purchase_handler.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50732, - "startIndex": 50719, - "textRun": { - "content": " file to the ", - "textStyle": {} - } - }, - { - "endIndex": 50736, - "startIndex": 50732, - "textRun": { - "content": "lib/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50774, - "startIndex": 50736, - "textRun": { - "content": " folder, where you define an abstract ", - "textStyle": {} - } - }, - { - "endIndex": 50789, - "startIndex": 50774, - "textRun": { - "content": "PurchaseHandler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 50907, - "startIndex": 50789, - "textRun": { - "content": " class with two abstract methods for verifying two different kinds of purchases: subscriptions and non-subscriptions.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 50680 - }, - { - "endIndex": 50933, - "paragraph": { - "elements": [ - { - "endIndex": 50932, - "startIndex": 50907, - "textRun": { - "content": "lib/purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 50933, - "startIndex": 50932, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.lzo8w6ec9do", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 50907 - }, - { - "endIndex": 51556, - "startIndex": 50933, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 51555, - "startIndex": 50934, - "tableCells": [ - { - "content": [ - { - "endIndex": 50960, - "paragraph": { - "elements": [ - { - "endIndex": 50960, - "startIndex": 50936, - "textRun": { - "content": "import 'products.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50936 - }, - { - "endIndex": 50961, - "paragraph": { - "elements": [ - { - "endIndex": 50961, - "startIndex": 50960, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50960 - }, - { - "endIndex": 50991, - "paragraph": { - "elements": [ - { - "endIndex": 50991, - "startIndex": 50961, - "textRun": { - "content": "/// Generic purchase handler,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50961 - }, - { - "endIndex": 51047, - "paragraph": { - "elements": [ - { - "endIndex": 51047, - "startIndex": 50991, - "textRun": { - "content": "/// must be implemented for Google Play and Apple Store\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 50991 - }, - { - "endIndex": 51080, - "paragraph": { - "elements": [ - { - "endIndex": 51080, - "startIndex": 51047, - "textRun": { - "content": "abstract class PurchaseHandler {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51047 - }, - { - "endIndex": 51081, - "paragraph": { - "elements": [ - { - "endIndex": 51081, - "startIndex": 51080, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51080 - }, - { - "endIndex": 51149, - "paragraph": { - "elements": [ - { - "endIndex": 51149, - "startIndex": 51081, - "textRun": { - "content": " /// Verify if non-subscription purchase (aka consumable) is valid\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51081 - }, - { - "endIndex": 51179, - "paragraph": { - "elements": [ - { - "endIndex": 51179, - "startIndex": 51149, - "textRun": { - "content": " /// and update the database\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51149 - }, - { - "endIndex": 51218, - "paragraph": { - "elements": [ - { - "endIndex": 51218, - "startIndex": 51179, - "textRun": { - "content": " Future handleNonSubscription({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51179 - }, - { - "endIndex": 51246, - "paragraph": { - "elements": [ - { - "endIndex": 51246, - "startIndex": 51218, - "textRun": { - "content": " required String userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51218 - }, - { - "endIndex": 51284, - "paragraph": { - "elements": [ - { - "endIndex": 51284, - "startIndex": 51246, - "textRun": { - "content": " required ProductData productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51246 - }, - { - "endIndex": 51311, - "paragraph": { - "elements": [ - { - "endIndex": 51311, - "startIndex": 51284, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51284 - }, - { - "endIndex": 51317, - "paragraph": { - "elements": [ - { - "endIndex": 51317, - "startIndex": 51311, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51311 - }, - { - "endIndex": 51318, - "paragraph": { - "elements": [ - { - "endIndex": 51318, - "startIndex": 51317, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51317 - }, - { - "endIndex": 51386, - "paragraph": { - "elements": [ - { - "endIndex": 51386, - "startIndex": 51318, - "textRun": { - "content": " /// Verify if subscription purchase (aka non-consumable) is valid\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51318 - }, - { - "endIndex": 51416, - "paragraph": { - "elements": [ - { - "endIndex": 51416, - "startIndex": 51386, - "textRun": { - "content": " /// and update the database\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51386 - }, - { - "endIndex": 51452, - "paragraph": { - "elements": [ - { - "endIndex": 51452, - "startIndex": 51416, - "textRun": { - "content": " Future handleSubscription({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51416 - }, - { - "endIndex": 51480, - "paragraph": { - "elements": [ - { - "endIndex": 51480, - "startIndex": 51452, - "textRun": { - "content": " required String userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51452 - }, - { - "endIndex": 51518, - "paragraph": { - "elements": [ - { - "endIndex": 51518, - "startIndex": 51480, - "textRun": { - "content": " required ProductData productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51480 - }, - { - "endIndex": 51545, - "paragraph": { - "elements": [ - { - "endIndex": 51545, - "startIndex": 51518, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51518 - }, - { - "endIndex": 51551, - "paragraph": { - "elements": [ - { - "endIndex": 51551, - "startIndex": 51545, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51545 - }, - { - "endIndex": 51553, - "paragraph": { - "elements": [ - { - "endIndex": 51553, - "startIndex": 51551, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51551 - }, - { - "endIndex": 51554, - "paragraph": { - "elements": [ - { - "endIndex": 51554, - "startIndex": 51553, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51553 - }, - { - "endIndex": 51555, - "paragraph": { - "elements": [ - { - "endIndex": 51555, - "startIndex": 51554, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 51554 - } - ], - "endIndex": 51555, - "startIndex": 50935, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 51557, - "paragraph": { - "elements": [ - { - "endIndex": 51557, - "startIndex": 51556, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 51556 - }, - { - "endIndex": 51612, - "paragraph": { - "elements": [ - { - "endIndex": 51612, - "startIndex": 51557, - "textRun": { - "content": "As you can see, each method requires three parameters:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 51557 - }, - { - "endIndex": 51688, - "paragraph": { - "bullet": { - "listId": "kix.7mxsheck861c", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 51619, - "startIndex": 51612, - "textRun": { - "content": "userId:", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51620, - "startIndex": 51619, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 51688, - "startIndex": 51620, - "textRun": { - "content": "The ID of the logged-in user, so you can tie purchases to the user.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 51612 - }, - { - "endIndex": 51767, - "paragraph": { - "bullet": { - "listId": "kix.7mxsheck861c", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 51700, - "startIndex": 51688, - "textRun": { - "content": "productData:", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51701, - "startIndex": 51700, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 51767, - "startIndex": 51701, - "textRun": { - "content": "Data about the product. You are going to define this in a minute.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 51688 - }, - { - "endIndex": 51819, - "paragraph": { - "bullet": { - "listId": "kix.7mxsheck861c", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 51773, - "startIndex": 51767, - "textRun": { - "content": "token:", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51819, - "startIndex": 51773, - "textRun": { - "content": " The token provided to the user by the store.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 51767 - }, - { - "endIndex": 51820, - "paragraph": { - "elements": [ - { - "endIndex": 51820, - "startIndex": 51819, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 51819 - }, - { - "endIndex": 51974, - "paragraph": { - "elements": [ - { - "endIndex": 51887, - "startIndex": 51820, - "textRun": { - "content": "Additionally, to make these purchase handlers easier to use, add a ", - "textStyle": {} - } - }, - { - "endIndex": 51904, - "startIndex": 51887, - "textRun": { - "content": "verifyPurchase() ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 51974, - "startIndex": 51904, - "textRun": { - "content": "method that can be used for both subscriptions and non-subscriptions:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 51820 - }, - { - "endIndex": 52000, - "paragraph": { - "elements": [ - { - "endIndex": 51999, - "startIndex": 51974, - "textRun": { - "content": "lib/purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 52000, - "startIndex": 51999, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.geakaektj298", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 51974 - }, - { - "endIndex": 52587, - "startIndex": 52000, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 52586, - "startIndex": 52001, - "tableCells": [ - { - "content": [ - { - "endIndex": 52061, - "paragraph": { - "elements": [ - { - "endIndex": 52061, - "startIndex": 52003, - "textRun": { - "content": " /// Verify if purchase is valid and update the database\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52003 - }, - { - "endIndex": 52093, - "paragraph": { - "elements": [ - { - "endIndex": 52093, - "startIndex": 52061, - "textRun": { - "content": " Future verifyPurchase({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52061 - }, - { - "endIndex": 52121, - "paragraph": { - "elements": [ - { - "endIndex": 52121, - "startIndex": 52093, - "textRun": { - "content": " required String userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52093 - }, - { - "endIndex": 52159, - "paragraph": { - "elements": [ - { - "endIndex": 52159, - "startIndex": 52121, - "textRun": { - "content": " required ProductData productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52121 - }, - { - "endIndex": 52186, - "paragraph": { - "elements": [ - { - "endIndex": 52186, - "startIndex": 52159, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52159 - }, - { - "endIndex": 52199, - "paragraph": { - "elements": [ - { - "endIndex": 52199, - "startIndex": 52186, - "textRun": { - "content": " }) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52186 - }, - { - "endIndex": 52231, - "paragraph": { - "elements": [ - { - "endIndex": 52231, - "startIndex": 52199, - "textRun": { - "content": " switch (productData.type) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52199 - }, - { - "endIndex": 52268, - "paragraph": { - "elements": [ - { - "endIndex": 52268, - "startIndex": 52231, - "textRun": { - "content": " case ProductType.subscription:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52231 - }, - { - "endIndex": 52303, - "paragraph": { - "elements": [ - { - "endIndex": 52303, - "startIndex": 52268, - "textRun": { - "content": " return handleSubscription(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52268 - }, - { - "endIndex": 52329, - "paragraph": { - "elements": [ - { - "endIndex": 52329, - "startIndex": 52303, - "textRun": { - "content": " userId: userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52303 - }, - { - "endIndex": 52365, - "paragraph": { - "elements": [ - { - "endIndex": 52365, - "startIndex": 52329, - "textRun": { - "content": " productData: productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52329 - }, - { - "endIndex": 52389, - "paragraph": { - "elements": [ - { - "endIndex": 52389, - "startIndex": 52365, - "textRun": { - "content": " token: token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52365 - }, - { - "endIndex": 52400, - "paragraph": { - "elements": [ - { - "endIndex": 52400, - "startIndex": 52389, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52389 - }, - { - "endIndex": 52440, - "paragraph": { - "elements": [ - { - "endIndex": 52440, - "startIndex": 52400, - "textRun": { - "content": " case ProductType.nonSubscription:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52400 - }, - { - "endIndex": 52478, - "paragraph": { - "elements": [ - { - "endIndex": 52478, - "startIndex": 52440, - "textRun": { - "content": " return handleNonSubscription(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52440 - }, - { - "endIndex": 52504, - "paragraph": { - "elements": [ - { - "endIndex": 52504, - "startIndex": 52478, - "textRun": { - "content": " userId: userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52478 - }, - { - "endIndex": 52540, - "paragraph": { - "elements": [ - { - "endIndex": 52540, - "startIndex": 52504, - "textRun": { - "content": " productData: productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52504 - }, - { - "endIndex": 52564, - "paragraph": { - "elements": [ - { - "endIndex": 52564, - "startIndex": 52540, - "textRun": { - "content": " token: token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52540 - }, - { - "endIndex": 52575, - "paragraph": { - "elements": [ - { - "endIndex": 52575, - "startIndex": 52564, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52564 - }, - { - "endIndex": 52581, - "paragraph": { - "elements": [ - { - "endIndex": 52581, - "startIndex": 52575, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52575 - }, - { - "endIndex": 52585, - "paragraph": { - "elements": [ - { - "endIndex": 52585, - "startIndex": 52581, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52581 - }, - { - "endIndex": 52586, - "paragraph": { - "elements": [ - { - "endIndex": 52586, - "startIndex": 52585, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52585 - } - ], - "endIndex": 52586, - "startIndex": 52002, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 52588, - "paragraph": { - "elements": [ - { - "endIndex": 52588, - "startIndex": 52587, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 52587 - }, - { - "endIndex": 52683, - "paragraph": { - "elements": [ - { - "endIndex": 52611, - "startIndex": 52588, - "textRun": { - "content": "Now, you can just call ", - "textStyle": {} - } - }, - { - "endIndex": 52625, - "startIndex": 52611, - "textRun": { - "content": "verifyPurchase", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 52683, - "startIndex": 52625, - "textRun": { - "content": " for both cases, but still have separate implementations!\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 52588 - }, - { - "endIndex": 52684, - "paragraph": { - "elements": [ - { - "endIndex": 52684, - "startIndex": 52683, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 52683 - }, - { - "endIndex": 52862, - "paragraph": { - "elements": [ - { - "endIndex": 52688, - "startIndex": 52684, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 52699, - "startIndex": 52688, - "textRun": { - "content": "ProductData", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 52849, - "startIndex": 52699, - "textRun": { - "content": " class contains basic information about the different purchasable products, which includes the product ID (sometimes also referred to as SKU) and the ", - "textStyle": {} - } - }, - { - "endIndex": 52860, - "startIndex": 52849, - "textRun": { - "content": "ProductType", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 52862, - "startIndex": 52860, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 52684 - }, - { - "endIndex": 52880, - "paragraph": { - "elements": [ - { - "endIndex": 52879, - "startIndex": 52862, - "textRun": { - "content": "lib/products.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/products.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 52880, - "startIndex": 52879, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7futscu8mmb", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 52862 - }, - { - "endIndex": 53007, - "startIndex": 52880, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 53006, - "startIndex": 52881, - "tableCells": [ - { - "content": [ - { - "endIndex": 52903, - "paragraph": { - "elements": [ - { - "endIndex": 52903, - "startIndex": 52883, - "textRun": { - "content": "class ProductData {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52883 - }, - { - "endIndex": 52929, - "paragraph": { - "elements": [ - { - "endIndex": 52929, - "startIndex": 52903, - "textRun": { - "content": " final String productId;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52903 - }, - { - "endIndex": 52955, - "paragraph": { - "elements": [ - { - "endIndex": 52955, - "startIndex": 52929, - "textRun": { - "content": " final ProductType type;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52929 - }, - { - "endIndex": 52956, - "paragraph": { - "elements": [ - { - "endIndex": 52956, - "startIndex": 52955, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52955 - }, - { - "endIndex": 53004, - "paragraph": { - "elements": [ - { - "endIndex": 53004, - "startIndex": 52956, - "textRun": { - "content": " const ProductData(this.productId, this.type);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 52956 - }, - { - "endIndex": 53006, - "paragraph": { - "elements": [ - { - "endIndex": 53006, - "startIndex": 53004, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53004 - } - ], - "endIndex": 53006, - "startIndex": 52882, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 53008, - "paragraph": { - "elements": [ - { - "endIndex": 53008, - "startIndex": 53007, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53007 - }, - { - "endIndex": 53076, - "paragraph": { - "elements": [ - { - "endIndex": 53012, - "startIndex": 53008, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 53023, - "startIndex": 53012, - "textRun": { - "content": "ProductType", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 53076, - "startIndex": 53023, - "textRun": { - "content": " can either be a subscription or a non-subscription.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 53008 - }, - { - "endIndex": 53094, - "paragraph": { - "elements": [ - { - "endIndex": 53093, - "startIndex": 53076, - "textRun": { - "content": "lib/products.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/products.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 53094, - "startIndex": 53093, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6rh56l6ga4h6", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 53076 - }, - { - "endIndex": 53154, - "startIndex": 53094, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 53153, - "startIndex": 53095, - "tableCells": [ - { - "content": [ - { - "endIndex": 53116, - "paragraph": { - "elements": [ - { - "endIndex": 53116, - "startIndex": 53097, - "textRun": { - "content": "enum ProductType {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53097 - }, - { - "endIndex": 53132, - "paragraph": { - "elements": [ - { - "endIndex": 53132, - "startIndex": 53116, - "textRun": { - "content": " subscription,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53116 - }, - { - "endIndex": 53151, - "paragraph": { - "elements": [ - { - "endIndex": 53151, - "startIndex": 53132, - "textRun": { - "content": " nonSubscription,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53132 - }, - { - "endIndex": 53153, - "paragraph": { - "elements": [ - { - "endIndex": 53153, - "startIndex": 53151, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53151 - } - ], - "endIndex": 53153, - "startIndex": 53096, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 53155, - "paragraph": { - "elements": [ - { - "endIndex": 53155, - "startIndex": 53154, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53154 - }, - { - "endIndex": 53223, - "paragraph": { - "elements": [ - { - "endIndex": 53223, - "startIndex": 53155, - "textRun": { - "content": "Finally, the list of products is defined as a map in the same file.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 53155 - }, - { - "endIndex": 53241, - "paragraph": { - "elements": [ - { - "endIndex": 53240, - "startIndex": 53223, - "textRun": { - "content": "lib/products.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/products.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 53241, - "startIndex": 53240, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6qjhvq3h7jd4", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 53223 - }, - { - "endIndex": 53581, - "startIndex": 53241, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 53580, - "startIndex": 53242, - "tableCells": [ - { - "content": [ - { - "endIndex": 53269, - "paragraph": { - "elements": [ - { - "endIndex": 53269, - "startIndex": 53244, - "textRun": { - "content": "const productDataMap = {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53244 - }, - { - "endIndex": 53306, - "paragraph": { - "elements": [ - { - "endIndex": 53306, - "startIndex": 53269, - "textRun": { - "content": " 'dash_consumable_2k': ProductData(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53269 - }, - { - "endIndex": 53332, - "paragraph": { - "elements": [ - { - "endIndex": 53332, - "startIndex": 53306, - "textRun": { - "content": " 'dash_consumable_2k',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53306 - }, - { - "endIndex": 53365, - "paragraph": { - "elements": [ - { - "endIndex": 53365, - "startIndex": 53332, - "textRun": { - "content": " ProductType.nonSubscription,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53332 - }, - { - "endIndex": 53370, - "paragraph": { - "elements": [ - { - "endIndex": 53370, - "startIndex": 53365, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53365 - }, - { - "endIndex": 53404, - "paragraph": { - "elements": [ - { - "endIndex": 53404, - "startIndex": 53370, - "textRun": { - "content": " 'dash_upgrade_3d': ProductData(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53370 - }, - { - "endIndex": 53427, - "paragraph": { - "elements": [ - { - "endIndex": 53427, - "startIndex": 53404, - "textRun": { - "content": " 'dash_upgrade_3d',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53404 - }, - { - "endIndex": 53460, - "paragraph": { - "elements": [ - { - "endIndex": 53460, - "startIndex": 53427, - "textRun": { - "content": " ProductType.nonSubscription,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53427 - }, - { - "endIndex": 53465, - "paragraph": { - "elements": [ - { - "endIndex": 53465, - "startIndex": 53460, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53460 - }, - { - "endIndex": 53509, - "paragraph": { - "elements": [ - { - "endIndex": 53509, - "startIndex": 53465, - "textRun": { - "content": " 'dash_subscription_doubler': ProductData(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53465 - }, - { - "endIndex": 53542, - "paragraph": { - "elements": [ - { - "endIndex": 53542, - "startIndex": 53509, - "textRun": { - "content": " 'dash_subscription_doubler',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53509 - }, - { - "endIndex": 53572, - "paragraph": { - "elements": [ - { - "endIndex": 53572, - "startIndex": 53542, - "textRun": { - "content": " ProductType.subscription,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53542 - }, - { - "endIndex": 53577, - "paragraph": { - "elements": [ - { - "endIndex": 53577, - "startIndex": 53572, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53572 - }, - { - "endIndex": 53580, - "paragraph": { - "elements": [ - { - "endIndex": 53580, - "startIndex": 53577, - "textRun": { - "content": "};\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53577 - } - ], - "endIndex": 53580, - "startIndex": 53243, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 53582, - "paragraph": { - "elements": [ - { - "endIndex": 53582, - "startIndex": 53581, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 53581 - }, - { - "endIndex": 53583, - "paragraph": { - "elements": [ - { - "endIndex": 53583, - "startIndex": 53582, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 53582 - }, - { - "endIndex": 53704, - "paragraph": { - "elements": [ - { - "endIndex": 53704, - "startIndex": 53583, - "textRun": { - "content": "Next, define some placeholder implementations for the Google Play Store and the Apple App Store. Start with Google Play:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 53583 - }, - { - "endIndex": 53705, - "paragraph": { - "elements": [ - { - "endIndex": 53705, - "startIndex": 53704, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 53704 - }, - { - "endIndex": 53816, - "paragraph": { - "elements": [ - { - "endIndex": 53712, - "startIndex": 53705, - "textRun": { - "content": "Create ", - "textStyle": {} - } - }, - { - "endIndex": 53749, - "startIndex": 53712, - "textRun": { - "content": "lib/google_play_purchase_handler.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 53750, - "startIndex": 53749, - "textRun": { - "content": ",", - "textStyle": {} - } - }, - { - "endIndex": 53784, - "startIndex": 53750, - "textRun": { - "content": " and add a class that extends the ", - "textStyle": {} - } - }, - { - "endIndex": 53799, - "startIndex": 53784, - "textRun": { - "content": "PurchaseHandler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 53816, - "startIndex": 53799, - "textRun": { - "content": " you just wrote:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 53705 - }, - { - "endIndex": 53854, - "paragraph": { - "elements": [ - { - "endIndex": 53853, - "startIndex": 53816, - "textRun": { - "content": "lib/google_play_purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/google_play_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 53854, - "startIndex": 53853, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hit9xghmtn82", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 53816 - }, - { - "endIndex": 54643, - "startIndex": 53854, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 54642, - "startIndex": 53855, - "tableCells": [ - { - "content": [ - { - "endIndex": 53878, - "paragraph": { - "elements": [ - { - "endIndex": 53878, - "startIndex": 53857, - "textRun": { - "content": "import 'dart:async';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53857 - }, - { - "endIndex": 53879, - "paragraph": { - "elements": [ - { - "endIndex": 53879, - "startIndex": 53878, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53878 - }, - { - "endIndex": 53939, - "paragraph": { - "elements": [ - { - "endIndex": 53939, - "startIndex": 53879, - "textRun": { - "content": "import 'package:googleapis/androidpublisher/v3.dart' as ap;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53879 - }, - { - "endIndex": 53940, - "paragraph": { - "elements": [ - { - "endIndex": 53940, - "startIndex": 53939, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53939 - }, - { - "endIndex": 53965, - "paragraph": { - "elements": [ - { - "endIndex": 53965, - "startIndex": 53940, - "textRun": { - "content": "import 'constants.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53940 - }, - { - "endIndex": 53995, - "paragraph": { - "elements": [ - { - "endIndex": 53995, - "startIndex": 53965, - "textRun": { - "content": "import 'iap_repository.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53965 - }, - { - "endIndex": 54019, - "paragraph": { - "elements": [ - { - "endIndex": 54019, - "startIndex": 53995, - "textRun": { - "content": "import 'products.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 53995 - }, - { - "endIndex": 54051, - "paragraph": { - "elements": [ - { - "endIndex": 54051, - "startIndex": 54019, - "textRun": { - "content": "import 'purchase_handler.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54019 - }, - { - "endIndex": 54052, - "paragraph": { - "elements": [ - { - "endIndex": 54052, - "startIndex": 54051, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54051 - }, - { - "endIndex": 54110, - "paragraph": { - "elements": [ - { - "endIndex": 54110, - "startIndex": 54052, - "textRun": { - "content": "class GooglePlayPurchaseHandler extends PurchaseHandler {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54052 - }, - { - "endIndex": 54159, - "paragraph": { - "elements": [ - { - "endIndex": 54159, - "startIndex": 54110, - "textRun": { - "content": " final ap.AndroidPublisherApi androidPublisher;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54110 - }, - { - "endIndex": 54196, - "paragraph": { - "elements": [ - { - "endIndex": 54196, - "startIndex": 54159, - "textRun": { - "content": " final IapRepository iapRepository;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54159 - }, - { - "endIndex": 54197, - "paragraph": { - "elements": [ - { - "endIndex": 54197, - "startIndex": 54196, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54196 - }, - { - "endIndex": 54226, - "paragraph": { - "elements": [ - { - "endIndex": 54226, - "startIndex": 54197, - "textRun": { - "content": " GooglePlayPurchaseHandler(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54197 - }, - { - "endIndex": 54253, - "paragraph": { - "elements": [ - { - "endIndex": 54253, - "startIndex": 54226, - "textRun": { - "content": " this.androidPublisher,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54226 - }, - { - "endIndex": 54277, - "paragraph": { - "elements": [ - { - "endIndex": 54277, - "startIndex": 54253, - "textRun": { - "content": " this.iapRepository,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54253 - }, - { - "endIndex": 54282, - "paragraph": { - "elements": [ - { - "endIndex": 54282, - "startIndex": 54277, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54277 - }, - { - "endIndex": 54283, - "paragraph": { - "elements": [ - { - "endIndex": 54283, - "startIndex": 54282, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54282 - }, - { - "endIndex": 54295, - "paragraph": { - "elements": [ - { - "endIndex": 54295, - "startIndex": 54283, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54283 - }, - { - "endIndex": 54334, - "paragraph": { - "elements": [ - { - "endIndex": 54334, - "startIndex": 54295, - "textRun": { - "content": " Future handleNonSubscription({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54295 - }, - { - "endIndex": 54363, - "paragraph": { - "elements": [ - { - "endIndex": 54363, - "startIndex": 54334, - "textRun": { - "content": " required String? userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54334 - }, - { - "endIndex": 54401, - "paragraph": { - "elements": [ - { - "endIndex": 54401, - "startIndex": 54363, - "textRun": { - "content": " required ProductData productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54363 - }, - { - "endIndex": 54428, - "paragraph": { - "elements": [ - { - "endIndex": 54428, - "startIndex": 54401, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54401 - }, - { - "endIndex": 54441, - "paragraph": { - "elements": [ - { - "endIndex": 54441, - "startIndex": 54428, - "textRun": { - "content": " }) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54428 - }, - { - "endIndex": 54458, - "paragraph": { - "elements": [ - { - "endIndex": 54458, - "startIndex": 54441, - "textRun": { - "content": " return true;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54441 - }, - { - "endIndex": 54462, - "paragraph": { - "elements": [ - { - "endIndex": 54462, - "startIndex": 54458, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54458 - }, - { - "endIndex": 54463, - "paragraph": { - "elements": [ - { - "endIndex": 54463, - "startIndex": 54462, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54462 - }, - { - "endIndex": 54475, - "paragraph": { - "elements": [ - { - "endIndex": 54475, - "startIndex": 54463, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54463 - }, - { - "endIndex": 54511, - "paragraph": { - "elements": [ - { - "endIndex": 54511, - "startIndex": 54475, - "textRun": { - "content": " Future handleSubscription({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54475 - }, - { - "endIndex": 54540, - "paragraph": { - "elements": [ - { - "endIndex": 54540, - "startIndex": 54511, - "textRun": { - "content": " required String? userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54511 - }, - { - "endIndex": 54578, - "paragraph": { - "elements": [ - { - "endIndex": 54578, - "startIndex": 54540, - "textRun": { - "content": " required ProductData productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54540 - }, - { - "endIndex": 54605, - "paragraph": { - "elements": [ - { - "endIndex": 54605, - "startIndex": 54578, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54578 - }, - { - "endIndex": 54618, - "paragraph": { - "elements": [ - { - "endIndex": 54618, - "startIndex": 54605, - "textRun": { - "content": " }) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54605 - }, - { - "endIndex": 54635, - "paragraph": { - "elements": [ - { - "endIndex": 54635, - "startIndex": 54618, - "textRun": { - "content": " return true;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54618 - }, - { - "endIndex": 54639, - "paragraph": { - "elements": [ - { - "endIndex": 54639, - "startIndex": 54635, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54635 - }, - { - "endIndex": 54641, - "paragraph": { - "elements": [ - { - "endIndex": 54641, - "startIndex": 54639, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54639 - }, - { - "endIndex": 54642, - "paragraph": { - "elements": [ - { - "endIndex": 54642, - "startIndex": 54641, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 54641 - } - ], - "endIndex": 54642, - "startIndex": 53856, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 54644, - "paragraph": { - "elements": [ - { - "endIndex": 54644, - "startIndex": 54643, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 54643 - }, - { - "endIndex": 54720, - "paragraph": { - "elements": [ - { - "endIndex": 54664, - "startIndex": 54644, - "textRun": { - "content": "For now, it returns ", - "textStyle": {} - } - }, - { - "endIndex": 54668, - "startIndex": 54664, - "textRun": { - "content": "true", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 54720, - "startIndex": 54668, - "textRun": { - "content": " for the handler methods; you’ll get to them later.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 54644 - }, - { - "endIndex": 54721, - "paragraph": { - "elements": [ - { - "endIndex": 54721, - "startIndex": 54720, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 54720 - }, - { - "endIndex": 54979, - "paragraph": { - "elements": [ - { - "endIndex": 54789, - "startIndex": 54721, - "textRun": { - "content": "As you might have noticed, the constructor takes an instance of the ", - "textStyle": {} - } - }, - { - "endIndex": 54802, - "startIndex": 54789, - "textRun": { - "content": "IapRepository", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 54958, - "startIndex": 54802, - "textRun": { - "content": ". The purchase handler uses this instance to store information about purchases in Firestore later on. To communicate with Google Play, you use the provided ", - "textStyle": {} - } - }, - { - "endIndex": 54977, - "startIndex": 54958, - "textRun": { - "content": "AndroidPublisherApi", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 54979, - "startIndex": 54977, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 54721 - }, - { - "endIndex": 54980, - "paragraph": { - "elements": [ - { - "endIndex": 54980, - "startIndex": 54979, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 54979 - }, - { - "endIndex": 55125, - "paragraph": { - "elements": [ - { - "endIndex": 55032, - "startIndex": 54980, - "textRun": { - "content": "Next, do the same for the app store handler. Create ", - "textStyle": {} - } - }, - { - "endIndex": 55067, - "startIndex": 55032, - "textRun": { - "content": "lib/app_store_purchase_handler.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 55068, - "startIndex": 55067, - "textRun": { - "content": ",", - "textStyle": {} - } - }, - { - "endIndex": 55102, - "startIndex": 55068, - "textRun": { - "content": " and add a class that extends the ", - "textStyle": {} - } - }, - { - "endIndex": 55117, - "startIndex": 55102, - "textRun": { - "content": "PurchaseHandler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 55125, - "startIndex": 55117, - "textRun": { - "content": " again:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 54980 - }, - { - "endIndex": 55161, - "paragraph": { - "elements": [ - { - "endIndex": 55160, - "startIndex": 55125, - "textRun": { - "content": "lib/app_store_purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/app_store_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 55161, - "startIndex": 55160, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.c6clao1n9asp", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 55125 - }, - { - "endIndex": 55860, - "startIndex": 55161, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 55859, - "startIndex": 55162, - "tableCells": [ - { - "content": [ - { - "endIndex": 55185, - "paragraph": { - "elements": [ - { - "endIndex": 55185, - "startIndex": 55164, - "textRun": { - "content": "import 'dart:async';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55164 - }, - { - "endIndex": 55186, - "paragraph": { - "elements": [ - { - "endIndex": 55186, - "startIndex": 55185, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55185 - }, - { - "endIndex": 55251, - "paragraph": { - "elements": [ - { - "endIndex": 55251, - "startIndex": 55186, - "textRun": { - "content": "import 'package:app_store_server_sdk/app_store_server_sdk.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55186 - }, - { - "endIndex": 55252, - "paragraph": { - "elements": [ - { - "endIndex": 55252, - "startIndex": 55251, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55251 - }, - { - "endIndex": 55277, - "paragraph": { - "elements": [ - { - "endIndex": 55277, - "startIndex": 55252, - "textRun": { - "content": "import 'constants.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55252 - }, - { - "endIndex": 55307, - "paragraph": { - "elements": [ - { - "endIndex": 55307, - "startIndex": 55277, - "textRun": { - "content": "import 'iap_repository.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55277 - }, - { - "endIndex": 55331, - "paragraph": { - "elements": [ - { - "endIndex": 55331, - "startIndex": 55307, - "textRun": { - "content": "import 'products.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55307 - }, - { - "endIndex": 55363, - "paragraph": { - "elements": [ - { - "endIndex": 55363, - "startIndex": 55331, - "textRun": { - "content": "import 'purchase_handler.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55331 - }, - { - "endIndex": 55364, - "paragraph": { - "elements": [ - { - "endIndex": 55364, - "startIndex": 55363, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55363 - }, - { - "endIndex": 55420, - "paragraph": { - "elements": [ - { - "endIndex": 55420, - "startIndex": 55364, - "textRun": { - "content": "class AppStorePurchaseHandler extends PurchaseHandler {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55364 - }, - { - "endIndex": 55457, - "paragraph": { - "elements": [ - { - "endIndex": 55457, - "startIndex": 55420, - "textRun": { - "content": " final IapRepository iapRepository;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55420 - }, - { - "endIndex": 55458, - "paragraph": { - "elements": [ - { - "endIndex": 55458, - "startIndex": 55457, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55457 - }, - { - "endIndex": 55485, - "paragraph": { - "elements": [ - { - "endIndex": 55485, - "startIndex": 55458, - "textRun": { - "content": " AppStorePurchaseHandler(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55458 - }, - { - "endIndex": 55509, - "paragraph": { - "elements": [ - { - "endIndex": 55509, - "startIndex": 55485, - "textRun": { - "content": " this.iapRepository,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55485 - }, - { - "endIndex": 55514, - "paragraph": { - "elements": [ - { - "endIndex": 55514, - "startIndex": 55509, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55509 - }, - { - "endIndex": 55515, - "paragraph": { - "elements": [ - { - "endIndex": 55515, - "startIndex": 55514, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55514 - }, - { - "endIndex": 55527, - "paragraph": { - "elements": [ - { - "endIndex": 55527, - "startIndex": 55515, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55515 - }, - { - "endIndex": 55566, - "paragraph": { - "elements": [ - { - "endIndex": 55566, - "startIndex": 55527, - "textRun": { - "content": " Future handleNonSubscription({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55527 - }, - { - "endIndex": 55594, - "paragraph": { - "elements": [ - { - "endIndex": 55594, - "startIndex": 55566, - "textRun": { - "content": " required String userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55566 - }, - { - "endIndex": 55632, - "paragraph": { - "elements": [ - { - "endIndex": 55632, - "startIndex": 55594, - "textRun": { - "content": " required ProductData productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55594 - }, - { - "endIndex": 55659, - "paragraph": { - "elements": [ - { - "endIndex": 55659, - "startIndex": 55632, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55632 - }, - { - "endIndex": 55666, - "paragraph": { - "elements": [ - { - "endIndex": 55666, - "startIndex": 55659, - "textRun": { - "content": " }) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55659 - }, - { - "endIndex": 55683, - "paragraph": { - "elements": [ - { - "endIndex": 55683, - "startIndex": 55666, - "textRun": { - "content": " return true;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55666 - }, - { - "endIndex": 55687, - "paragraph": { - "elements": [ - { - "endIndex": 55687, - "startIndex": 55683, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55683 - }, - { - "endIndex": 55688, - "paragraph": { - "elements": [ - { - "endIndex": 55688, - "startIndex": 55687, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55687 - }, - { - "endIndex": 55700, - "paragraph": { - "elements": [ - { - "endIndex": 55700, - "startIndex": 55688, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55688 - }, - { - "endIndex": 55736, - "paragraph": { - "elements": [ - { - "endIndex": 55736, - "startIndex": 55700, - "textRun": { - "content": " Future handleSubscription({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55700 - }, - { - "endIndex": 55764, - "paragraph": { - "elements": [ - { - "endIndex": 55764, - "startIndex": 55736, - "textRun": { - "content": " required String userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55736 - }, - { - "endIndex": 55802, - "paragraph": { - "elements": [ - { - "endIndex": 55802, - "startIndex": 55764, - "textRun": { - "content": " required ProductData productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55764 - }, - { - "endIndex": 55829, - "paragraph": { - "elements": [ - { - "endIndex": 55829, - "startIndex": 55802, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55802 - }, - { - "endIndex": 55836, - "paragraph": { - "elements": [ - { - "endIndex": 55836, - "startIndex": 55829, - "textRun": { - "content": " }) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55829 - }, - { - "endIndex": 55853, - "paragraph": { - "elements": [ - { - "endIndex": 55853, - "startIndex": 55836, - "textRun": { - "content": " return true;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55836 - }, - { - "endIndex": 55857, - "paragraph": { - "elements": [ - { - "endIndex": 55857, - "startIndex": 55853, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55853 - }, - { - "endIndex": 55859, - "paragraph": { - "elements": [ - { - "endIndex": 55859, - "startIndex": 55857, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 55857 - } - ], - "endIndex": 55859, - "startIndex": 55163, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 55861, - "paragraph": { - "elements": [ - { - "endIndex": 55861, - "startIndex": 55860, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 55860 - }, - { - "endIndex": 55963, - "paragraph": { - "elements": [ - { - "endIndex": 55963, - "startIndex": 55861, - "textRun": { - "content": "Great! Now you have two purchase handlers. Next, let’s create the purchase verification API endpoint.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 55861 - }, - { - "endIndex": 55964, - "paragraph": { - "elements": [ - { - "endIndex": 55964, - "startIndex": 55963, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 55963 - }, - { - "endIndex": 55986, - "paragraph": { - "elements": [ - { - "endIndex": 55986, - "startIndex": 55964, - "textRun": { - "content": "Use purchase handlers\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.xz19ykk8ox68", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 55964 - }, - { - "endIndex": 55987, - "paragraph": { - "elements": [ - { - "endIndex": 55987, - "startIndex": 55986, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 55986 - }, - { - "endIndex": 56054, - "paragraph": { - "elements": [ - { - "endIndex": 55992, - "startIndex": 55987, - "textRun": { - "content": "Open ", - "textStyle": {} - } - }, - { - "endIndex": 56007, - "startIndex": 55992, - "textRun": { - "content": "bin/server.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 56041, - "startIndex": 56007, - "textRun": { - "content": " and create an API endpoint using ", - "textStyle": {} - } - }, - { - "endIndex": 56052, - "startIndex": 56041, - "textRun": { - "content": "shelf_route", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 56054, - "startIndex": 56052, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 55987 - }, - { - "endIndex": 56070, - "paragraph": { - "elements": [ - { - "endIndex": 56069, - "startIndex": 56054, - "textRun": { - "content": "bin/server.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/bin/server.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 56070, - "startIndex": 56069, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.msbj0axd2zkw", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 56054 - }, - { - "endIndex": 57215, - "startIndex": 56070, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 57214, - "startIndex": 56071, - "tableCells": [ - { - "content": [ - { - "endIndex": 56101, - "paragraph": { - "elements": [ - { - "endIndex": 56101, - "startIndex": 56073, - "textRun": { - "content": "Future main() async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56073 - }, - { - "endIndex": 56128, - "paragraph": { - "elements": [ - { - "endIndex": 56128, - "startIndex": 56101, - "textRun": { - "content": " final router = Router();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56101 - }, - { - "endIndex": 56129, - "paragraph": { - "elements": [ - { - "endIndex": 56129, - "startIndex": 56128, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56128 - }, - { - "endIndex": 56189, - "paragraph": { - "elements": [ - { - "endIndex": 56189, - "startIndex": 56129, - "textRun": { - "content": " final purchaseHandlers = await _createPurchaseHandlers();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56129 - }, - { - "endIndex": 56190, - "paragraph": { - "elements": [ - { - "endIndex": 56190, - "startIndex": 56189, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56189 - }, - { - "endIndex": 56249, - "paragraph": { - "elements": [ - { - "endIndex": 56249, - "startIndex": 56190, - "textRun": { - "content": " router.post('/verifypurchase', (Request request) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56190 - }, - { - "endIndex": 56320, - "paragraph": { - "elements": [ - { - "endIndex": 56320, - "startIndex": 56249, - "textRun": { - "content": " final dynamic payload = json.decode(await request.readAsString());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56249 - }, - { - "endIndex": 56321, - "paragraph": { - "elements": [ - { - "endIndex": 56321, - "startIndex": 56320, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56320 - }, - { - "endIndex": 56400, - "paragraph": { - "elements": [ - { - "endIndex": 56400, - "startIndex": 56321, - "textRun": { - "content": " final (:userId, :source, :productData, :token) = getPurchaseData(payload);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56321 - }, - { - "endIndex": 56401, - "paragraph": { - "elements": [ - { - "endIndex": 56401, - "startIndex": 56400, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56400 - }, - { - "endIndex": 56468, - "paragraph": { - "elements": [ - { - "endIndex": 56468, - "startIndex": 56401, - "textRun": { - "content": " final result = await purchaseHandlers[source]!.verifyPurchase(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56401 - }, - { - "endIndex": 56490, - "paragraph": { - "elements": [ - { - "endIndex": 56490, - "startIndex": 56468, - "textRun": { - "content": " userId: userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56468 - }, - { - "endIndex": 56522, - "paragraph": { - "elements": [ - { - "endIndex": 56522, - "startIndex": 56490, - "textRun": { - "content": " productData: productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56490 - }, - { - "endIndex": 56542, - "paragraph": { - "elements": [ - { - "endIndex": 56542, - "startIndex": 56522, - "textRun": { - "content": " token: token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56522 - }, - { - "endIndex": 56549, - "paragraph": { - "elements": [ - { - "endIndex": 56549, - "startIndex": 56542, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56542 - }, - { - "endIndex": 56550, - "paragraph": { - "elements": [ - { - "endIndex": 56550, - "startIndex": 56549, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56549 - }, - { - "endIndex": 56568, - "paragraph": { - "elements": [ - { - "endIndex": 56568, - "startIndex": 56550, - "textRun": { - "content": " if (result) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56550 - }, - { - "endIndex": 56607, - "paragraph": { - "elements": [ - { - "endIndex": 56607, - "startIndex": 56568, - "textRun": { - "content": " return Response.ok('all good!');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56568 - }, - { - "endIndex": 56620, - "paragraph": { - "elements": [ - { - "endIndex": 56620, - "startIndex": 56607, - "textRun": { - "content": " } else {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56607 - }, - { - "endIndex": 56665, - "paragraph": { - "elements": [ - { - "endIndex": 56665, - "startIndex": 56620, - "textRun": { - "content": " return Response.internalServerError();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56620 - }, - { - "endIndex": 56671, - "paragraph": { - "elements": [ - { - "endIndex": 56671, - "startIndex": 56665, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56665 - }, - { - "endIndex": 56677, - "paragraph": { - "elements": [ - { - "endIndex": 56677, - "startIndex": 56671, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56671 - }, - { - "endIndex": 56678, - "paragraph": { - "elements": [ - { - "endIndex": 56678, - "startIndex": 56677, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56677 - }, - { - "endIndex": 56708, - "paragraph": { - "elements": [ - { - "endIndex": 56708, - "startIndex": 56678, - "textRun": { - "content": " await serveHandler(router);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56678 - }, - { - "endIndex": 56710, - "paragraph": { - "elements": [ - { - "endIndex": 56710, - "startIndex": 56708, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56708 - }, - { - "endIndex": 56711, - "paragraph": { - "elements": [ - { - "endIndex": 56711, - "startIndex": 56710, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56710 - }, - { - "endIndex": 56714, - "paragraph": { - "elements": [ - { - "endIndex": 56714, - "startIndex": 56711, - "textRun": { - "content": "({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56711 - }, - { - "endIndex": 56731, - "paragraph": { - "elements": [ - { - "endIndex": 56731, - "startIndex": 56714, - "textRun": { - "content": " String userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56714 - }, - { - "endIndex": 56748, - "paragraph": { - "elements": [ - { - "endIndex": 56748, - "startIndex": 56731, - "textRun": { - "content": " String source,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56731 - }, - { - "endIndex": 56775, - "paragraph": { - "elements": [ - { - "endIndex": 56775, - "startIndex": 56748, - "textRun": { - "content": " ProductData productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56748 - }, - { - "endIndex": 56791, - "paragraph": { - "elements": [ - { - "endIndex": 56791, - "startIndex": 56775, - "textRun": { - "content": " String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56775 - }, - { - "endIndex": 56829, - "paragraph": { - "elements": [ - { - "endIndex": 56829, - "startIndex": 56791, - "textRun": { - "content": "}) getPurchaseData(dynamic payload) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56791 - }, - { - "endIndex": 56843, - "paragraph": { - "elements": [ - { - "endIndex": 56843, - "startIndex": 56829, - "textRun": { - "content": " if (payload\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56829 - }, - { - "endIndex": 56856, - "paragraph": { - "elements": [ - { - "endIndex": 56856, - "startIndex": 56843, - "textRun": { - "content": " case {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56843 - }, - { - "endIndex": 56889, - "paragraph": { - "elements": [ - { - "endIndex": 56889, - "startIndex": 56856, - "textRun": { - "content": " 'userId': String userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56856 - }, - { - "endIndex": 56922, - "paragraph": { - "elements": [ - { - "endIndex": 56922, - "startIndex": 56889, - "textRun": { - "content": " 'source': String source,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56889 - }, - { - "endIndex": 56961, - "paragraph": { - "elements": [ - { - "endIndex": 56961, - "startIndex": 56922, - "textRun": { - "content": " 'productId': String productId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56922 - }, - { - "endIndex": 57003, - "paragraph": { - "elements": [ - { - "endIndex": 57003, - "startIndex": 56961, - "textRun": { - "content": " 'verificationData': String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 56961 - }, - { - "endIndex": 57014, - "paragraph": { - "elements": [ - { - "endIndex": 57014, - "startIndex": 57003, - "textRun": { - "content": " }) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57003 - }, - { - "endIndex": 57027, - "paragraph": { - "elements": [ - { - "endIndex": 57027, - "startIndex": 57014, - "textRun": { - "content": " return (\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57014 - }, - { - "endIndex": 57049, - "paragraph": { - "elements": [ - { - "endIndex": 57049, - "startIndex": 57027, - "textRun": { - "content": " userId: userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57027 - }, - { - "endIndex": 57071, - "paragraph": { - "elements": [ - { - "endIndex": 57071, - "startIndex": 57049, - "textRun": { - "content": " source: source,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57049 - }, - { - "endIndex": 57118, - "paragraph": { - "elements": [ - { - "endIndex": 57118, - "startIndex": 57071, - "textRun": { - "content": " productData: productDataMap[productId]!,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57071 - }, - { - "endIndex": 57138, - "paragraph": { - "elements": [ - { - "endIndex": 57138, - "startIndex": 57118, - "textRun": { - "content": " token: token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57118 - }, - { - "endIndex": 57145, - "paragraph": { - "elements": [ - { - "endIndex": 57145, - "startIndex": 57138, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57138 - }, - { - "endIndex": 57156, - "paragraph": { - "elements": [ - { - "endIndex": 57156, - "startIndex": 57145, - "textRun": { - "content": " } else {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57145 - }, - { - "endIndex": 57208, - "paragraph": { - "elements": [ - { - "endIndex": 57208, - "startIndex": 57156, - "textRun": { - "content": " throw const FormatException('Unexpected JSON');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57156 - }, - { - "endIndex": 57212, - "paragraph": { - "elements": [ - { - "endIndex": 57212, - "startIndex": 57208, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57208 - }, - { - "endIndex": 57214, - "paragraph": { - "elements": [ - { - "endIndex": 57214, - "startIndex": 57212, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57212 - } - ], - "endIndex": 57214, - "startIndex": 56072, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 57255, - "paragraph": { - "elements": [ - { - "endIndex": 57255, - "startIndex": 57215, - "textRun": { - "content": "\u000bThe above code is doing the following:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 57215 - }, - { - "endIndex": 57256, - "paragraph": { - "elements": [ - { - "endIndex": 57256, - "startIndex": 57255, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 57255 - }, - { - "endIndex": 57336, - "paragraph": { - "bullet": { - "listId": "kix.9n48gbutqkqj", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 57336, - "startIndex": 57256, - "textRun": { - "content": "Define a POST endpoint that will be called from the app you created previously.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57256 - }, - { - "endIndex": 57399, - "paragraph": { - "bullet": { - "listId": "kix.9n48gbutqkqj", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 57399, - "startIndex": 57336, - "textRun": { - "content": "Decode the JSON payload and extract the following information:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57336 - }, - { - "endIndex": 57435, - "paragraph": { - "bullet": { - "listId": "kix.9n48gbutqkqj", - "nestingLevel": 1, - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 57405, - "startIndex": 57399, - "textRun": { - "content": "userId", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 57435, - "startIndex": 57405, - "textRun": { - "content": ": Currently logged in user ID\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57399 - }, - { - "endIndex": 57488, - "paragraph": { - "bullet": { - "listId": "kix.9n48gbutqkqj", - "nestingLevel": 1, - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 57441, - "startIndex": 57435, - "textRun": { - "content": "source", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 57462, - "startIndex": 57441, - "textRun": { - "content": ": Store used, either ", - "textStyle": {} - } - }, - { - "endIndex": 57471, - "startIndex": 57462, - "textRun": { - "content": "app_store", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 57475, - "startIndex": 57471, - "textRun": { - "content": " or ", - "textStyle": {} - } - }, - { - "endIndex": 57486, - "startIndex": 57475, - "textRun": { - "content": "google_play", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 57488, - "startIndex": 57486, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57435 - }, - { - "endIndex": 57558, - "paragraph": { - "bullet": { - "listId": "kix.9n48gbutqkqj", - "nestingLevel": 1, - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 57499, - "startIndex": 57488, - "textRun": { - "content": "productData", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 57519, - "startIndex": 57499, - "textRun": { - "content": ": Obtained from the ", - "textStyle": {} - } - }, - { - "endIndex": 57533, - "startIndex": 57519, - "textRun": { - "content": "productDataMap", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 57558, - "startIndex": 57533, - "textRun": { - "content": " you created previously.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57488 - }, - { - "endIndex": 57619, - "paragraph": { - "bullet": { - "listId": "kix.9n48gbutqkqj", - "nestingLevel": 1, - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 57563, - "startIndex": 57558, - "textRun": { - "content": "token", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 57619, - "startIndex": 57563, - "textRun": { - "content": ": Contains the verification data to send to the stores.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57558 - }, - { - "endIndex": 57752, - "paragraph": { - "bullet": { - "listId": "kix.9n48gbutqkqj", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 57631, - "startIndex": 57619, - "textRun": { - "content": "Call to the ", - "textStyle": {} - } - }, - { - "endIndex": 57645, - "startIndex": 57631, - "textRun": { - "content": "verifyPurchase", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 57669, - "startIndex": 57645, - "textRun": { - "content": " method, either for the ", - "textStyle": {} - } - }, - { - "endIndex": 57694, - "startIndex": 57669, - "textRun": { - "content": "GooglePlayPurchaseHandler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 57702, - "startIndex": 57694, - "textRun": { - "content": " or the ", - "textStyle": {} - } - }, - { - "endIndex": 57725, - "startIndex": 57702, - "textRun": { - "content": "AppStorePurchaseHandler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 57752, - "startIndex": 57725, - "textRun": { - "content": ", depending on the source.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57619 - }, - { - "endIndex": 57836, - "paragraph": { - "bullet": { - "listId": "kix.9n48gbutqkqj", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 57809, - "startIndex": 57752, - "textRun": { - "content": "If the verification was successful, the method returns a ", - "textStyle": {} - } - }, - { - "endIndex": 57820, - "startIndex": 57809, - "textRun": { - "content": "Response.ok", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 57836, - "startIndex": 57820, - "textRun": { - "content": " to the client.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57752 - }, - { - "endIndex": 57928, - "paragraph": { - "bullet": { - "listId": "kix.9n48gbutqkqj", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 57884, - "startIndex": 57836, - "textRun": { - "content": "If the verification fails, the method returns a ", - "textStyle": {} - } - }, - { - "endIndex": 57912, - "startIndex": 57884, - "textRun": { - "content": "Response.internalServerError", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 57928, - "startIndex": 57912, - "textRun": { - "content": " to the client.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57836 - }, - { - "endIndex": 57929, - "paragraph": { - "elements": [ - { - "endIndex": 57929, - "startIndex": 57928, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 57928 - }, - { - "endIndex": 58347, - "startIndex": 57929, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 58346, - "startIndex": 57930, - "tableCells": [ - { - "content": [ - { - "endIndex": 58346, - "paragraph": { - "elements": [ - { - "endIndex": 57937, - "startIndex": 57932, - "textRun": { - "content": "Note:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 58346, - "startIndex": 57937, - "textRun": { - "content": " The verifypurchase endpoint you just created does not offer any kind of authentication mechanism, meaning that anyone with access to your server could communicate to it. This is not a problem in the context of this codelab, as your server will run locally in your home network, but when thinking about deploying this or a similar solution, you should implement some sort of user authentication for security.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 57932 - } - ], - "endIndex": 58346, - "startIndex": 57931, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8039216, - "green": 0.8980392, - "red": 0.9882353 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 58348, - "paragraph": { - "elements": [ - { - "endIndex": 58348, - "startIndex": 58347, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 58347 - }, - { - "endIndex": 58707, - "paragraph": { - "elements": [ - { - "endIndex": 58707, - "startIndex": 58348, - "textRun": { - "content": "After creating the API endpoint, you need to configure the two purchase handlers. This requires you to load the service account keys you obtained in the previous step and configure the access to the different services, including the Android Publisher API and the Firebase Firestore API. Then, create the two purchase handlers with the different dependencies:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 58348 - }, - { - "endIndex": 58723, - "paragraph": { - "elements": [ - { - "endIndex": 58722, - "startIndex": 58707, - "textRun": { - "content": "bin/server.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/bin/server.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 58723, - "startIndex": 58722, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.uspc23ixrdx5", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 58707 - }, - { - "endIndex": 60091, - "startIndex": 58723, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 60090, - "startIndex": 58724, - "tableCells": [ - { - "content": [ - { - "endIndex": 58797, - "paragraph": { - "elements": [ - { - "endIndex": 58797, - "startIndex": 58726, - "textRun": { - "content": "Future> _createPurchaseHandlers() async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 58726 - }, - { - "endIndex": 58841, - "paragraph": { - "elements": [ - { - "endIndex": 58841, - "startIndex": 58797, - "textRun": { - "content": " // Configure Android Publisher API access\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 58797 - }, - { - "endIndex": 58876, - "paragraph": { - "elements": [ - { - "endIndex": 58876, - "startIndex": 58841, - "textRun": { - "content": " final serviceAccountGooglePlay =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 58841 - }, - { - "endIndex": 58950, - "paragraph": { - "elements": [ - { - "endIndex": 58950, - "startIndex": 58876, - "textRun": { - "content": " File('assets/service-account-google-play.json').readAsStringSync();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 58876 - }, - { - "endIndex": 58988, - "paragraph": { - "elements": [ - { - "endIndex": 58988, - "startIndex": 58950, - "textRun": { - "content": " final clientCredentialsGooglePlay =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 58950 - }, - { - "endIndex": 59061, - "paragraph": { - "elements": [ - { - "endIndex": 59061, - "startIndex": 58988, - "textRun": { - "content": " auth.ServiceAccountCredentials.fromJson(serviceAccountGooglePlay);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 58988 - }, - { - "endIndex": 59088, - "paragraph": { - "elements": [ - { - "endIndex": 59088, - "startIndex": 59061, - "textRun": { - "content": " final clientGooglePlay =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59061 - }, - { - "endIndex": 59160, - "paragraph": { - "elements": [ - { - "endIndex": 59160, - "startIndex": 59088, - "textRun": { - "content": " await auth.clientViaServiceAccount(clientCredentialsGooglePlay, [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59088 - }, - { - "endIndex": 59210, - "paragraph": { - "elements": [ - { - "endIndex": 59210, - "startIndex": 59160, - "textRun": { - "content": " ap.AndroidPublisherApi.androidpublisherScope,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59160 - }, - { - "endIndex": 59216, - "paragraph": { - "elements": [ - { - "endIndex": 59216, - "startIndex": 59210, - "textRun": { - "content": " ]);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59210 - }, - { - "endIndex": 59285, - "paragraph": { - "elements": [ - { - "endIndex": 59285, - "startIndex": 59216, - "textRun": { - "content": " final androidPublisher = ap.AndroidPublisherApi(clientGooglePlay);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59216 - }, - { - "endIndex": 59286, - "paragraph": { - "elements": [ - { - "endIndex": 59286, - "startIndex": 59285, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59285 - }, - { - "endIndex": 59322, - "paragraph": { - "elements": [ - { - "endIndex": 59322, - "startIndex": 59286, - "textRun": { - "content": " // Configure Firestore API access\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59286 - }, - { - "endIndex": 59355, - "paragraph": { - "elements": [ - { - "endIndex": 59355, - "startIndex": 59322, - "textRun": { - "content": " final serviceAccountFirebase =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59322 - }, - { - "endIndex": 59426, - "paragraph": { - "elements": [ - { - "endIndex": 59426, - "startIndex": 59355, - "textRun": { - "content": " File('assets/service-account-firebase.json').readAsStringSync();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59355 - }, - { - "endIndex": 59462, - "paragraph": { - "elements": [ - { - "endIndex": 59462, - "startIndex": 59426, - "textRun": { - "content": " final clientCredentialsFirebase =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59426 - }, - { - "endIndex": 59533, - "paragraph": { - "elements": [ - { - "endIndex": 59533, - "startIndex": 59462, - "textRun": { - "content": " auth.ServiceAccountCredentials.fromJson(serviceAccountFirebase);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59462 - }, - { - "endIndex": 59558, - "paragraph": { - "elements": [ - { - "endIndex": 59558, - "startIndex": 59533, - "textRun": { - "content": " final clientFirebase =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59533 - }, - { - "endIndex": 59628, - "paragraph": { - "elements": [ - { - "endIndex": 59628, - "startIndex": 59558, - "textRun": { - "content": " await auth.clientViaServiceAccount(clientCredentialsFirebase, [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59558 - }, - { - "endIndex": 59668, - "paragraph": { - "elements": [ - { - "endIndex": 59668, - "startIndex": 59628, - "textRun": { - "content": " fs.FirestoreApi.cloudPlatformScope,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59628 - }, - { - "endIndex": 59674, - "paragraph": { - "elements": [ - { - "endIndex": 59674, - "startIndex": 59668, - "textRun": { - "content": " ]);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59668 - }, - { - "endIndex": 59730, - "paragraph": { - "elements": [ - { - "endIndex": 59730, - "startIndex": 59674, - "textRun": { - "content": " final firestoreApi = fs.FirestoreApi(clientFirebase);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59674 - }, - { - "endIndex": 59789, - "paragraph": { - "elements": [ - { - "endIndex": 59789, - "startIndex": 59730, - "textRun": { - "content": " final dynamic json = jsonDecode(serviceAccountFirebase);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59730 - }, - { - "endIndex": 59839, - "paragraph": { - "elements": [ - { - "endIndex": 59839, - "startIndex": 59789, - "textRun": { - "content": " final projectId = json['project_id'] as String;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59789 - }, - { - "endIndex": 59903, - "paragraph": { - "elements": [ - { - "endIndex": 59903, - "startIndex": 59839, - "textRun": { - "content": " final iapRepository = IapRepository(firestoreApi, projectId);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59839 - }, - { - "endIndex": 59904, - "paragraph": { - "elements": [ - { - "endIndex": 59904, - "startIndex": 59903, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59903 - }, - { - "endIndex": 59915, - "paragraph": { - "elements": [ - { - "endIndex": 59915, - "startIndex": 59904, - "textRun": { - "content": " return {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59904 - }, - { - "endIndex": 59961, - "paragraph": { - "elements": [ - { - "endIndex": 59961, - "startIndex": 59915, - "textRun": { - "content": " 'google_play': GooglePlayPurchaseHandler(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59915 - }, - { - "endIndex": 59985, - "paragraph": { - "elements": [ - { - "endIndex": 59985, - "startIndex": 59961, - "textRun": { - "content": " androidPublisher,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59961 - }, - { - "endIndex": 60006, - "paragraph": { - "elements": [ - { - "endIndex": 60006, - "startIndex": 59985, - "textRun": { - "content": " iapRepository,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 59985 - }, - { - "endIndex": 60013, - "paragraph": { - "elements": [ - { - "endIndex": 60013, - "startIndex": 60006, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60006 - }, - { - "endIndex": 60055, - "paragraph": { - "elements": [ - { - "endIndex": 60055, - "startIndex": 60013, - "textRun": { - "content": " 'app_store': AppStorePurchaseHandler(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60013 - }, - { - "endIndex": 60076, - "paragraph": { - "elements": [ - { - "endIndex": 60076, - "startIndex": 60055, - "textRun": { - "content": " iapRepository,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60055 - }, - { - "endIndex": 60083, - "paragraph": { - "elements": [ - { - "endIndex": 60083, - "startIndex": 60076, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60076 - }, - { - "endIndex": 60088, - "paragraph": { - "elements": [ - { - "endIndex": 60088, - "startIndex": 60083, - "textRun": { - "content": " };\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60083 - }, - { - "endIndex": 60090, - "paragraph": { - "elements": [ - { - "endIndex": 60090, - "startIndex": 60088, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60088 - } - ], - "endIndex": 60090, - "startIndex": 58725, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 60093, - "paragraph": { - "elements": [ - { - "endIndex": 60093, - "startIndex": 60091, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 60091 - }, - { - "endIndex": 60149, - "paragraph": { - "elements": [ - { - "endIndex": 60148, - "startIndex": 60093, - "textRun": { - "content": "Verify Android purchases: Implement the purchase hander", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - } - }, - { - "endIndex": 60149, - "startIndex": 60148, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 60093 - }, - { - "endIndex": 60150, - "paragraph": { - "elements": [ - { - "endIndex": 60150, - "startIndex": 60149, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 60149 - }, - { - "endIndex": 60212, - "paragraph": { - "elements": [ - { - "endIndex": 60212, - "startIndex": 60150, - "textRun": { - "content": "Next, continue implementing the Google Play purchase handler.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 60150 - }, - { - "endIndex": 60213, - "paragraph": { - "elements": [ - { - "endIndex": 60213, - "startIndex": 60212, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 60212 - }, - { - "endIndex": 60413, - "paragraph": { - "elements": [ - { - "endIndex": 60339, - "startIndex": 60213, - "textRun": { - "content": "Google already provides Dart packages for interacting with the APIs you need to verify purchases. You initialized them in the ", - "textStyle": {} - } - }, - { - "endIndex": 60350, - "startIndex": 60339, - "textRun": { - "content": "server.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 60380, - "startIndex": 60350, - "textRun": { - "content": " file and now use them in the ", - "textStyle": {} - } - }, - { - "endIndex": 60405, - "startIndex": 60380, - "textRun": { - "content": "GooglePlayPurchaseHandler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 60413, - "startIndex": 60405, - "textRun": { - "content": " class.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 60213 - }, - { - "endIndex": 60414, - "paragraph": { - "elements": [ - { - "endIndex": 60414, - "startIndex": 60413, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 60413 - }, - { - "endIndex": 60473, - "paragraph": { - "elements": [ - { - "endIndex": 60415, - "startIndex": 60414, - "textRun": { - "content": "I", - "textStyle": {} - } - }, - { - "endIndex": 60473, - "startIndex": 60415, - "textRun": { - "content": "mplement the handler for non-subscription-type purchases:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 60414 - }, - { - "endIndex": 60511, - "paragraph": { - "elements": [ - { - "endIndex": 60510, - "startIndex": 60473, - "textRun": { - "content": "lib/google_play_purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/google_play_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 60511, - "startIndex": 60510, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.bzcfe5iik6t1", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 60473 - }, - { - "endIndex": 62391, - "startIndex": 60511, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 62390, - "startIndex": 60512, - "tableCells": [ - { - "content": [ - { - "endIndex": 60526, - "paragraph": { - "elements": [ - { - "endIndex": 60526, - "startIndex": 60514, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60514 - }, - { - "endIndex": 60565, - "paragraph": { - "elements": [ - { - "endIndex": 60565, - "startIndex": 60526, - "textRun": { - "content": " Future handleNonSubscription({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60526 - }, - { - "endIndex": 60594, - "paragraph": { - "elements": [ - { - "endIndex": 60594, - "startIndex": 60565, - "textRun": { - "content": " required String? userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60565 - }, - { - "endIndex": 60632, - "paragraph": { - "elements": [ - { - "endIndex": 60632, - "startIndex": 60594, - "textRun": { - "content": " required ProductData productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60594 - }, - { - "endIndex": 60659, - "paragraph": { - "elements": [ - { - "endIndex": 60659, - "startIndex": 60632, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60632 - }, - { - "endIndex": 60672, - "paragraph": { - "elements": [ - { - "endIndex": 60672, - "startIndex": 60659, - "textRun": { - "content": " }) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60659 - }, - { - "endIndex": 60683, - "paragraph": { - "elements": [ - { - "endIndex": 60683, - "startIndex": 60672, - "textRun": { - "content": " print(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60672 - }, - { - "endIndex": 60739, - "paragraph": { - "elements": [ - { - "endIndex": 60739, - "startIndex": 60683, - "textRun": { - "content": " 'GooglePlayPurchaseHandler.handleNonSubscription'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60683 - }, - { - "endIndex": 60813, - "paragraph": { - "elements": [ - { - "endIndex": 60813, - "startIndex": 60739, - "textRun": { - "content": " '($userId, ${productData.productId}, ${token.substring(0, 5)}...)',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60739 - }, - { - "endIndex": 60820, - "paragraph": { - "elements": [ - { - "endIndex": 60820, - "startIndex": 60813, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60813 - }, - { - "endIndex": 60821, - "paragraph": { - "elements": [ - { - "endIndex": 60821, - "startIndex": 60820, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60820 - }, - { - "endIndex": 60831, - "paragraph": { - "elements": [ - { - "endIndex": 60831, - "startIndex": 60821, - "textRun": { - "content": " try {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60821 - }, - { - "endIndex": 60868, - "paragraph": { - "elements": [ - { - "endIndex": 60868, - "startIndex": 60831, - "textRun": { - "content": " // Verify purchase with Google\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60831 - }, - { - "endIndex": 60938, - "paragraph": { - "elements": [ - { - "endIndex": 60938, - "startIndex": 60868, - "textRun": { - "content": " final response = await androidPublisher.purchases.products.get(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60868 - }, - { - "endIndex": 60964, - "paragraph": { - "elements": [ - { - "endIndex": 60964, - "startIndex": 60938, - "textRun": { - "content": " androidPackageId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60938 - }, - { - "endIndex": 60995, - "paragraph": { - "elements": [ - { - "endIndex": 60995, - "startIndex": 60964, - "textRun": { - "content": " productData.productId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60964 - }, - { - "endIndex": 61010, - "paragraph": { - "elements": [ - { - "endIndex": 61010, - "startIndex": 60995, - "textRun": { - "content": " token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 60995 - }, - { - "endIndex": 61019, - "paragraph": { - "elements": [ - { - "endIndex": 61019, - "startIndex": 61010, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61010 - }, - { - "endIndex": 61020, - "paragraph": { - "elements": [ - { - "endIndex": 61020, - "startIndex": 61019, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61019 - }, - { - "endIndex": 61077, - "paragraph": { - "elements": [ - { - "endIndex": 61077, - "startIndex": 61020, - "textRun": { - "content": " print('Purchases response: ${response.toJson()}');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61020 - }, - { - "endIndex": 61078, - "paragraph": { - "elements": [ - { - "endIndex": 61078, - "startIndex": 61077, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61077 - }, - { - "endIndex": 61116, - "paragraph": { - "elements": [ - { - "endIndex": 61116, - "startIndex": 61078, - "textRun": { - "content": " // Make sure an order id exists\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61078 - }, - { - "endIndex": 61154, - "paragraph": { - "elements": [ - { - "endIndex": 61154, - "startIndex": 61116, - "textRun": { - "content": " if (response.orderId == null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61116 - }, - { - "endIndex": 61215, - "paragraph": { - "elements": [ - { - "endIndex": 61215, - "startIndex": 61154, - "textRun": { - "content": " print('Could not handle purchase without order id');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61154 - }, - { - "endIndex": 61237, - "paragraph": { - "elements": [ - { - "endIndex": 61237, - "startIndex": 61215, - "textRun": { - "content": " return false;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61215 - }, - { - "endIndex": 61245, - "paragraph": { - "elements": [ - { - "endIndex": 61245, - "startIndex": 61237, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61237 - }, - { - "endIndex": 61286, - "paragraph": { - "elements": [ - { - "endIndex": 61286, - "startIndex": 61245, - "textRun": { - "content": " final orderId = response.orderId!;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61245 - }, - { - "endIndex": 61287, - "paragraph": { - "elements": [ - { - "endIndex": 61287, - "startIndex": 61286, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61286 - }, - { - "endIndex": 61339, - "paragraph": { - "elements": [ - { - "endIndex": 61339, - "startIndex": 61287, - "textRun": { - "content": " final purchaseData = NonSubscriptionPurchase(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61287 - }, - { - "endIndex": 61398, - "paragraph": { - "elements": [ - { - "endIndex": 61398, - "startIndex": 61339, - "textRun": { - "content": " purchaseDate: DateTime.fromMillisecondsSinceEpoch(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61339 - }, - { - "endIndex": 61455, - "paragraph": { - "elements": [ - { - "endIndex": 61455, - "startIndex": 61398, - "textRun": { - "content": " int.parse(response.purchaseTimeMillis ?? '0'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61398 - }, - { - "endIndex": 61466, - "paragraph": { - "elements": [ - { - "endIndex": 61466, - "startIndex": 61455, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61455 - }, - { - "endIndex": 61492, - "paragraph": { - "elements": [ - { - "endIndex": 61492, - "startIndex": 61466, - "textRun": { - "content": " orderId: orderId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61466 - }, - { - "endIndex": 61534, - "paragraph": { - "elements": [ - { - "endIndex": 61534, - "startIndex": 61492, - "textRun": { - "content": " productId: productData.productId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61492 - }, - { - "endIndex": 61609, - "paragraph": { - "elements": [ - { - "endIndex": 61609, - "startIndex": 61534, - "textRun": { - "content": " status: NonSubscriptionStatus.values[response.purchaseState ?? 0],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61534 - }, - { - "endIndex": 61633, - "paragraph": { - "elements": [ - { - "endIndex": 61633, - "startIndex": 61609, - "textRun": { - "content": " userId: userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61609 - }, - { - "endIndex": 61674, - "paragraph": { - "elements": [ - { - "endIndex": 61674, - "startIndex": 61633, - "textRun": { - "content": " iapSource: IAPSource.googleplay,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61633 - }, - { - "endIndex": 61683, - "paragraph": { - "elements": [ - { - "endIndex": 61683, - "startIndex": 61674, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61674 - }, - { - "endIndex": 61684, - "paragraph": { - "elements": [ - { - "endIndex": 61684, - "startIndex": 61683, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61683 - }, - { - "endIndex": 61713, - "paragraph": { - "elements": [ - { - "endIndex": 61713, - "startIndex": 61684, - "textRun": { - "content": " // Update the database\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61684 - }, - { - "endIndex": 61741, - "paragraph": { - "elements": [ - { - "endIndex": 61741, - "startIndex": 61713, - "textRun": { - "content": " if (userId != null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61713 - }, - { - "endIndex": 61775, - "paragraph": { - "elements": [ - { - "endIndex": 61775, - "startIndex": 61741, - "textRun": { - "content": " // If we know the userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61741 - }, - { - "endIndex": 61850, - "paragraph": { - "elements": [ - { - "endIndex": 61850, - "startIndex": 61775, - "textRun": { - "content": " // update the existing purchase or create it if it does not exist.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61775 - }, - { - "endIndex": 61916, - "paragraph": { - "elements": [ - { - "endIndex": 61916, - "startIndex": 61850, - "textRun": { - "content": " await iapRepository.createOrUpdatePurchase(purchaseData);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61850 - }, - { - "endIndex": 61931, - "paragraph": { - "elements": [ - { - "endIndex": 61931, - "startIndex": 61916, - "textRun": { - "content": " } else {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61916 - }, - { - "endIndex": 62003, - "paragraph": { - "elements": [ - { - "endIndex": 62003, - "startIndex": 61931, - "textRun": { - "content": " // If we do not know the user id, a previous entry must already\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61931 - }, - { - "endIndex": 62052, - "paragraph": { - "elements": [ - { - "endIndex": 62052, - "startIndex": 62003, - "textRun": { - "content": " // exist, and thus we'll only update it.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62003 - }, - { - "endIndex": 62110, - "paragraph": { - "elements": [ - { - "endIndex": 62110, - "startIndex": 62052, - "textRun": { - "content": " await iapRepository.updatePurchase(purchaseData);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62052 - }, - { - "endIndex": 62118, - "paragraph": { - "elements": [ - { - "endIndex": 62118, - "startIndex": 62110, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62110 - }, - { - "endIndex": 62137, - "paragraph": { - "elements": [ - { - "endIndex": 62137, - "startIndex": 62118, - "textRun": { - "content": " return true;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62118 - }, - { - "endIndex": 62185, - "paragraph": { - "elements": [ - { - "endIndex": 62185, - "startIndex": 62137, - "textRun": { - "content": " } on ap.DetailedApiRequestError catch (e) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62137 - }, - { - "endIndex": 62198, - "paragraph": { - "elements": [ - { - "endIndex": 62198, - "startIndex": 62185, - "textRun": { - "content": " print(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62185 - }, - { - "endIndex": 62246, - "paragraph": { - "elements": [ - { - "endIndex": 62246, - "startIndex": 62198, - "textRun": { - "content": " 'Error on handle NonSubscription: $e\\n'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62198 - }, - { - "endIndex": 62281, - "paragraph": { - "elements": [ - { - "endIndex": 62281, - "startIndex": 62246, - "textRun": { - "content": " 'JSON: ${e.jsonResponse}',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62246 - }, - { - "endIndex": 62290, - "paragraph": { - "elements": [ - { - "endIndex": 62290, - "startIndex": 62281, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62281 - }, - { - "endIndex": 62308, - "paragraph": { - "elements": [ - { - "endIndex": 62308, - "startIndex": 62290, - "textRun": { - "content": " } catch (e) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62290 - }, - { - "endIndex": 62362, - "paragraph": { - "elements": [ - { - "endIndex": 62362, - "startIndex": 62308, - "textRun": { - "content": " print('Error on handle NonSubscription: $e\\n');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62308 - }, - { - "endIndex": 62368, - "paragraph": { - "elements": [ - { - "endIndex": 62368, - "startIndex": 62362, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62362 - }, - { - "endIndex": 62386, - "paragraph": { - "elements": [ - { - "endIndex": 62386, - "startIndex": 62368, - "textRun": { - "content": " return false;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62368 - }, - { - "endIndex": 62390, - "paragraph": { - "elements": [ - { - "endIndex": 62390, - "startIndex": 62386, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62386 - } - ], - "endIndex": 62390, - "startIndex": 60513, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 62392, - "paragraph": { - "elements": [ - { - "endIndex": 62392, - "startIndex": 62391, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 62391 - }, - { - "endIndex": 62459, - "paragraph": { - "elements": [ - { - "endIndex": 62459, - "startIndex": 62392, - "textRun": { - "content": "You can update the subscription purchase handler in a similar way:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 62392 - }, - { - "endIndex": 62497, - "paragraph": { - "elements": [ - { - "endIndex": 62496, - "startIndex": 62459, - "textRun": { - "content": "lib/google_play_purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/google_play_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 62497, - "startIndex": 62496, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.help2qie24gr", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 62459 - }, - { - "endIndex": 64646, - "startIndex": 62497, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 64645, - "startIndex": 62498, - "tableCells": [ - { - "content": [ - { - "endIndex": 62537, - "paragraph": { - "elements": [ - { - "endIndex": 62537, - "startIndex": 62500, - "textRun": { - "content": " /// Handle subscription purchases.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62500 - }, - { - "endIndex": 62543, - "paragraph": { - "elements": [ - { - "endIndex": 62543, - "startIndex": 62537, - "textRun": { - "content": " ///\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62537 - }, - { - "endIndex": 62608, - "paragraph": { - "elements": [ - { - "endIndex": 62608, - "startIndex": 62543, - "textRun": { - "content": " /// Retrieves the purchase status from Google Play and updates\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62543 - }, - { - "endIndex": 62650, - "paragraph": { - "elements": [ - { - "endIndex": 62650, - "startIndex": 62608, - "textRun": { - "content": " /// the Firestore Database accordingly.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62608 - }, - { - "endIndex": 62662, - "paragraph": { - "elements": [ - { - "endIndex": 62662, - "startIndex": 62650, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62650 - }, - { - "endIndex": 62698, - "paragraph": { - "elements": [ - { - "endIndex": 62698, - "startIndex": 62662, - "textRun": { - "content": " Future handleSubscription({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62662 - }, - { - "endIndex": 62727, - "paragraph": { - "elements": [ - { - "endIndex": 62727, - "startIndex": 62698, - "textRun": { - "content": " required String? userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62698 - }, - { - "endIndex": 62765, - "paragraph": { - "elements": [ - { - "endIndex": 62765, - "startIndex": 62727, - "textRun": { - "content": " required ProductData productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62727 - }, - { - "endIndex": 62792, - "paragraph": { - "elements": [ - { - "endIndex": 62792, - "startIndex": 62765, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62765 - }, - { - "endIndex": 62805, - "paragraph": { - "elements": [ - { - "endIndex": 62805, - "startIndex": 62792, - "textRun": { - "content": " }) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62792 - }, - { - "endIndex": 62816, - "paragraph": { - "elements": [ - { - "endIndex": 62816, - "startIndex": 62805, - "textRun": { - "content": " print(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62805 - }, - { - "endIndex": 62869, - "paragraph": { - "elements": [ - { - "endIndex": 62869, - "startIndex": 62816, - "textRun": { - "content": " 'GooglePlayPurchaseHandler.handleSubscription'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62816 - }, - { - "endIndex": 62943, - "paragraph": { - "elements": [ - { - "endIndex": 62943, - "startIndex": 62869, - "textRun": { - "content": " '($userId, ${productData.productId}, ${token.substring(0, 5)}...)',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62869 - }, - { - "endIndex": 62950, - "paragraph": { - "elements": [ - { - "endIndex": 62950, - "startIndex": 62943, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62943 - }, - { - "endIndex": 62951, - "paragraph": { - "elements": [ - { - "endIndex": 62951, - "startIndex": 62950, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62950 - }, - { - "endIndex": 62961, - "paragraph": { - "elements": [ - { - "endIndex": 62961, - "startIndex": 62951, - "textRun": { - "content": " try {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62951 - }, - { - "endIndex": 62998, - "paragraph": { - "elements": [ - { - "endIndex": 62998, - "startIndex": 62961, - "textRun": { - "content": " // Verify purchase with Google\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62961 - }, - { - "endIndex": 63073, - "paragraph": { - "elements": [ - { - "endIndex": 63073, - "startIndex": 62998, - "textRun": { - "content": " final response = await androidPublisher.purchases.subscriptions.get(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 62998 - }, - { - "endIndex": 63099, - "paragraph": { - "elements": [ - { - "endIndex": 63099, - "startIndex": 63073, - "textRun": { - "content": " androidPackageId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63073 - }, - { - "endIndex": 63130, - "paragraph": { - "elements": [ - { - "endIndex": 63130, - "startIndex": 63099, - "textRun": { - "content": " productData.productId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63099 - }, - { - "endIndex": 63145, - "paragraph": { - "elements": [ - { - "endIndex": 63145, - "startIndex": 63130, - "textRun": { - "content": " token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63130 - }, - { - "endIndex": 63154, - "paragraph": { - "elements": [ - { - "endIndex": 63154, - "startIndex": 63145, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63145 - }, - { - "endIndex": 63155, - "paragraph": { - "elements": [ - { - "endIndex": 63155, - "startIndex": 63154, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63154 - }, - { - "endIndex": 63215, - "paragraph": { - "elements": [ - { - "endIndex": 63215, - "startIndex": 63155, - "textRun": { - "content": " print('Subscription response: ${response.toJson()}');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63155 - }, - { - "endIndex": 63216, - "paragraph": { - "elements": [ - { - "endIndex": 63216, - "startIndex": 63215, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63215 - }, - { - "endIndex": 63254, - "paragraph": { - "elements": [ - { - "endIndex": 63254, - "startIndex": 63216, - "textRun": { - "content": " // Make sure an order id exists\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63216 - }, - { - "endIndex": 63292, - "paragraph": { - "elements": [ - { - "endIndex": 63292, - "startIndex": 63254, - "textRun": { - "content": " if (response.orderId == null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63254 - }, - { - "endIndex": 63353, - "paragraph": { - "elements": [ - { - "endIndex": 63353, - "startIndex": 63292, - "textRun": { - "content": " print('Could not handle purchase without order id');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63292 - }, - { - "endIndex": 63375, - "paragraph": { - "elements": [ - { - "endIndex": 63375, - "startIndex": 63353, - "textRun": { - "content": " return false;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63353 - }, - { - "endIndex": 63383, - "paragraph": { - "elements": [ - { - "endIndex": 63383, - "startIndex": 63375, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63375 - }, - { - "endIndex": 63440, - "paragraph": { - "elements": [ - { - "endIndex": 63440, - "startIndex": 63383, - "textRun": { - "content": " final orderId = extractOrderId(response.orderId!);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63383 - }, - { - "endIndex": 63441, - "paragraph": { - "elements": [ - { - "endIndex": 63441, - "startIndex": 63440, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63440 - }, - { - "endIndex": 63490, - "paragraph": { - "elements": [ - { - "endIndex": 63490, - "startIndex": 63441, - "textRun": { - "content": " final purchaseData = SubscriptionPurchase(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63441 - }, - { - "endIndex": 63549, - "paragraph": { - "elements": [ - { - "endIndex": 63549, - "startIndex": 63490, - "textRun": { - "content": " purchaseDate: DateTime.fromMillisecondsSinceEpoch(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63490 - }, - { - "endIndex": 63603, - "paragraph": { - "elements": [ - { - "endIndex": 63603, - "startIndex": 63549, - "textRun": { - "content": " int.parse(response.startTimeMillis ?? '0'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63549 - }, - { - "endIndex": 63614, - "paragraph": { - "elements": [ - { - "endIndex": 63614, - "startIndex": 63603, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63603 - }, - { - "endIndex": 63640, - "paragraph": { - "elements": [ - { - "endIndex": 63640, - "startIndex": 63614, - "textRun": { - "content": " orderId: orderId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63614 - }, - { - "endIndex": 63682, - "paragraph": { - "elements": [ - { - "endIndex": 63682, - "startIndex": 63640, - "textRun": { - "content": " productId: productData.productId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63640 - }, - { - "endIndex": 63745, - "paragraph": { - "elements": [ - { - "endIndex": 63745, - "startIndex": 63682, - "textRun": { - "content": " status: subscriptionStatusFrom(response.paymentState),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63682 - }, - { - "endIndex": 63769, - "paragraph": { - "elements": [ - { - "endIndex": 63769, - "startIndex": 63745, - "textRun": { - "content": " userId: userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63745 - }, - { - "endIndex": 63810, - "paragraph": { - "elements": [ - { - "endIndex": 63810, - "startIndex": 63769, - "textRun": { - "content": " iapSource: IAPSource.googleplay,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63769 - }, - { - "endIndex": 63867, - "paragraph": { - "elements": [ - { - "endIndex": 63867, - "startIndex": 63810, - "textRun": { - "content": " expiryDate: DateTime.fromMillisecondsSinceEpoch(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63810 - }, - { - "endIndex": 63922, - "paragraph": { - "elements": [ - { - "endIndex": 63922, - "startIndex": 63867, - "textRun": { - "content": " int.parse(response.expiryTimeMillis ?? '0'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63867 - }, - { - "endIndex": 63933, - "paragraph": { - "elements": [ - { - "endIndex": 63933, - "startIndex": 63922, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63922 - }, - { - "endIndex": 63942, - "paragraph": { - "elements": [ - { - "endIndex": 63942, - "startIndex": 63933, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63933 - }, - { - "endIndex": 63943, - "paragraph": { - "elements": [ - { - "endIndex": 63943, - "startIndex": 63942, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63942 - }, - { - "endIndex": 63972, - "paragraph": { - "elements": [ - { - "endIndex": 63972, - "startIndex": 63943, - "textRun": { - "content": " // Update the database\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63943 - }, - { - "endIndex": 64000, - "paragraph": { - "elements": [ - { - "endIndex": 64000, - "startIndex": 63972, - "textRun": { - "content": " if (userId != null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 63972 - }, - { - "endIndex": 64034, - "paragraph": { - "elements": [ - { - "endIndex": 64034, - "startIndex": 64000, - "textRun": { - "content": " // If we know the userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64000 - }, - { - "endIndex": 64109, - "paragraph": { - "elements": [ - { - "endIndex": 64109, - "startIndex": 64034, - "textRun": { - "content": " // update the existing purchase or create it if it does not exist.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64034 - }, - { - "endIndex": 64175, - "paragraph": { - "elements": [ - { - "endIndex": 64175, - "startIndex": 64109, - "textRun": { - "content": " await iapRepository.createOrUpdatePurchase(purchaseData);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64109 - }, - { - "endIndex": 64190, - "paragraph": { - "elements": [ - { - "endIndex": 64190, - "startIndex": 64175, - "textRun": { - "content": " } else {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64175 - }, - { - "endIndex": 64262, - "paragraph": { - "elements": [ - { - "endIndex": 64262, - "startIndex": 64190, - "textRun": { - "content": " // If we do not know the user id, a previous entry must already\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64190 - }, - { - "endIndex": 64311, - "paragraph": { - "elements": [ - { - "endIndex": 64311, - "startIndex": 64262, - "textRun": { - "content": " // exist, and thus we'll only update it.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64262 - }, - { - "endIndex": 64369, - "paragraph": { - "elements": [ - { - "endIndex": 64369, - "startIndex": 64311, - "textRun": { - "content": " await iapRepository.updatePurchase(purchaseData);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64311 - }, - { - "endIndex": 64377, - "paragraph": { - "elements": [ - { - "endIndex": 64377, - "startIndex": 64369, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64369 - }, - { - "endIndex": 64396, - "paragraph": { - "elements": [ - { - "endIndex": 64396, - "startIndex": 64377, - "textRun": { - "content": " return true;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64377 - }, - { - "endIndex": 64444, - "paragraph": { - "elements": [ - { - "endIndex": 64444, - "startIndex": 64396, - "textRun": { - "content": " } on ap.DetailedApiRequestError catch (e) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64396 - }, - { - "endIndex": 64457, - "paragraph": { - "elements": [ - { - "endIndex": 64457, - "startIndex": 64444, - "textRun": { - "content": " print(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64444 - }, - { - "endIndex": 64502, - "paragraph": { - "elements": [ - { - "endIndex": 64502, - "startIndex": 64457, - "textRun": { - "content": " 'Error on handle Subscription: $e\\n'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64457 - }, - { - "endIndex": 64537, - "paragraph": { - "elements": [ - { - "endIndex": 64537, - "startIndex": 64502, - "textRun": { - "content": " 'JSON: ${e.jsonResponse}',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64502 - }, - { - "endIndex": 64546, - "paragraph": { - "elements": [ - { - "endIndex": 64546, - "startIndex": 64537, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64537 - }, - { - "endIndex": 64564, - "paragraph": { - "elements": [ - { - "endIndex": 64564, - "startIndex": 64546, - "textRun": { - "content": " } catch (e) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64546 - }, - { - "endIndex": 64615, - "paragraph": { - "elements": [ - { - "endIndex": 64615, - "startIndex": 64564, - "textRun": { - "content": " print('Error on handle Subscription: $e\\n');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64564 - }, - { - "endIndex": 64621, - "paragraph": { - "elements": [ - { - "endIndex": 64621, - "startIndex": 64615, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64615 - }, - { - "endIndex": 64639, - "paragraph": { - "elements": [ - { - "endIndex": 64639, - "startIndex": 64621, - "textRun": { - "content": " return false;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64621 - }, - { - "endIndex": 64643, - "paragraph": { - "elements": [ - { - "endIndex": 64643, - "startIndex": 64639, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64639 - }, - { - "endIndex": 64645, - "paragraph": { - "elements": [ - { - "endIndex": 64645, - "startIndex": 64643, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64643 - } - ], - "endIndex": 64645, - "startIndex": 62499, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 64647, - "paragraph": { - "elements": [ - { - "endIndex": 64647, - "startIndex": 64646, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 64646 - }, - { - "endIndex": 64711, - "paragraph": { - "elements": [ - { - "endIndex": 64711, - "startIndex": 64647, - "textRun": { - "content": "Add the following method to facilitate the parsing of order IDs\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 64647 - }, - { - "endIndex": 64749, - "paragraph": { - "elements": [ - { - "endIndex": 64748, - "startIndex": 64711, - "textRun": { - "content": "lib/google_play_purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/google_play_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 64749, - "startIndex": 64748, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.sgnrtfnvk634", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 64711 - }, - { - "endIndex": 64992, - "startIndex": 64749, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 64991, - "startIndex": 64750, - "tableCells": [ - { - "content": [ - { - "endIndex": 64819, - "paragraph": { - "elements": [ - { - "endIndex": 64819, - "startIndex": 64752, - "textRun": { - "content": "/// If a subscription suffix is present (..#) extract the orderId.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64752 - }, - { - "endIndex": 64859, - "paragraph": { - "elements": [ - { - "endIndex": 64859, - "startIndex": 64819, - "textRun": { - "content": "String extractOrderId(String orderId) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64819 - }, - { - "endIndex": 64903, - "paragraph": { - "elements": [ - { - "endIndex": 64903, - "startIndex": 64859, - "textRun": { - "content": " final orderIdSplit = orderId.split('..');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64859 - }, - { - "endIndex": 64936, - "paragraph": { - "elements": [ - { - "endIndex": 64936, - "startIndex": 64903, - "textRun": { - "content": " if (orderIdSplit.isNotEmpty) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64903 - }, - { - "endIndex": 64967, - "paragraph": { - "elements": [ - { - "endIndex": 64967, - "startIndex": 64936, - "textRun": { - "content": " orderId = orderIdSplit[0];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64936 - }, - { - "endIndex": 64971, - "paragraph": { - "elements": [ - { - "endIndex": 64971, - "startIndex": 64967, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64967 - }, - { - "endIndex": 64989, - "paragraph": { - "elements": [ - { - "endIndex": 64989, - "startIndex": 64971, - "textRun": { - "content": " return orderId;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64971 - }, - { - "endIndex": 64991, - "paragraph": { - "elements": [ - { - "endIndex": 64991, - "startIndex": 64989, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 64989 - } - ], - "endIndex": 64991, - "startIndex": 64751, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 64993, - "paragraph": { - "elements": [ - { - "endIndex": 64993, - "startIndex": 64992, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 64992 - }, - { - "endIndex": 65118, - "paragraph": { - "elements": [ - { - "endIndex": 65117, - "startIndex": 64993, - "textRun": { - "content": "Your Google Play purchases should now be verified and stored in the database.\u000b\u000bNext, move on to App Store purchases for iOS.", - "textStyle": {} - } - }, - { - "endIndex": 65118, - "startIndex": 65117, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 64993 - }, - { - "endIndex": 65171, - "paragraph": { - "elements": [ - { - "endIndex": 65171, - "startIndex": 65118, - "textRun": { - "content": "Verify iOS purchases: Implement the purchase handler\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.msyta1i4r4lp", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 65118 - }, - { - "endIndex": 65172, - "paragraph": { - "elements": [ - { - "endIndex": 65172, - "startIndex": 65171, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 65171 - }, - { - "endIndex": 65440, - "paragraph": { - "elements": [ - { - "endIndex": 65256, - "startIndex": 65172, - "textRun": { - "content": "For verifying purchases with the App Store, a third-party Dart package exists named ", - "textStyle": {} - } - }, - { - "endIndex": 65276, - "startIndex": 65256, - "textRun": { - "content": "app_store_server_sdk", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/app_store_server_sdk" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 65282, - "startIndex": 65276, - "textRun": { - "content": " that ", - "textStyle": {} - } - }, - { - "endIndex": 65332, - "startIndex": 65282, - "textRun": { - "content": "makes the process easier. \u000b\u000bStart by creating the ", - "textStyle": {} - } - }, - { - "endIndex": 65341, - "startIndex": 65332, - "textRun": { - "content": "ITunesApi", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 65440, - "startIndex": 65341, - "textRun": { - "content": " instance. Use the sandbox configuration, as well as enable logging to facilitate error debugging.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 65172 - }, - { - "endIndex": 65476, - "paragraph": { - "elements": [ - { - "endIndex": 65475, - "startIndex": 65440, - "textRun": { - "content": "lib/app_store_purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/app_store_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 65476, - "startIndex": 65475, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.2t5pqbdpku2n", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 65440 - }, - { - "endIndex": 65609, - "startIndex": 65476, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 65608, - "startIndex": 65477, - "tableCells": [ - { - "content": [ - { - "endIndex": 65511, - "paragraph": { - "elements": [ - { - "endIndex": 65511, - "startIndex": 65479, - "textRun": { - "content": " final _iTunesAPI = ITunesApi(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 65479 - }, - { - "endIndex": 65533, - "paragraph": { - "elements": [ - { - "endIndex": 65533, - "startIndex": 65511, - "textRun": { - "content": " ITunesHttpClient(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 65511 - }, - { - "endIndex": 65568, - "paragraph": { - "elements": [ - { - "endIndex": 65568, - "startIndex": 65533, - "textRun": { - "content": " ITunesEnvironment.sandbox(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 65533 - }, - { - "endIndex": 65596, - "paragraph": { - "elements": [ - { - "endIndex": 65596, - "startIndex": 65568, - "textRun": { - "content": " loggingEnabled: true,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 65568 - }, - { - "endIndex": 65603, - "paragraph": { - "elements": [ - { - "endIndex": 65603, - "startIndex": 65596, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 65596 - }, - { - "endIndex": 65608, - "paragraph": { - "elements": [ - { - "endIndex": 65608, - "startIndex": 65603, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 65603 - } - ], - "endIndex": 65608, - "startIndex": 65478, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 65610, - "paragraph": { - "elements": [ - { - "endIndex": 65610, - "startIndex": 65609, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 65609 - }, - { - "endIndex": 65852, - "paragraph": { - "elements": [ - { - "endIndex": 65852, - "startIndex": 65610, - "textRun": { - "content": "Now, unlike the Google Play APIs, the App Store uses the same API endpoints for both subscriptions and non-subscriptions. This means that you can use the same logic for both handlers. Merge them together so they call the same implementation:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 65610 - }, - { - "endIndex": 65888, - "paragraph": { - "elements": [ - { - "endIndex": 65887, - "startIndex": 65852, - "textRun": { - "content": "lib/app_store_purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/app_store_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 65888, - "startIndex": 65887, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7cku17nbdcke", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 65852 - }, - { - "endIndex": 66467, - "startIndex": 65888, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 66466, - "startIndex": 65889, - "tableCells": [ - { - "content": [ - { - "endIndex": 65903, - "paragraph": { - "elements": [ - { - "endIndex": 65903, - "startIndex": 65891, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 65891 - }, - { - "endIndex": 65942, - "paragraph": { - "elements": [ - { - "endIndex": 65942, - "startIndex": 65903, - "textRun": { - "content": " Future handleNonSubscription({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 65903 - }, - { - "endIndex": 65970, - "paragraph": { - "elements": [ - { - "endIndex": 65970, - "startIndex": 65942, - "textRun": { - "content": " required String userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 65942 - }, - { - "endIndex": 66008, - "paragraph": { - "elements": [ - { - "endIndex": 66008, - "startIndex": 65970, - "textRun": { - "content": " required ProductData productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 65970 - }, - { - "endIndex": 66035, - "paragraph": { - "elements": [ - { - "endIndex": 66035, - "startIndex": 66008, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66008 - }, - { - "endIndex": 66042, - "paragraph": { - "elements": [ - { - "endIndex": 66042, - "startIndex": 66035, - "textRun": { - "content": " }) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66035 - }, - { - "endIndex": 66101, - "paragraph": { - "elements": [ - { - "endIndex": 66101, - "startIndex": 66042, - "textRun": { - "content": " return handleValidation(userId: userId, token: token);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66042 - }, - { - "endIndex": 66105, - "paragraph": { - "elements": [ - { - "endIndex": 66105, - "startIndex": 66101, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66101 - }, - { - "endIndex": 66106, - "paragraph": { - "elements": [ - { - "endIndex": 66106, - "startIndex": 66105, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66105 - }, - { - "endIndex": 66118, - "paragraph": { - "elements": [ - { - "endIndex": 66118, - "startIndex": 66106, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66106 - }, - { - "endIndex": 66154, - "paragraph": { - "elements": [ - { - "endIndex": 66154, - "startIndex": 66118, - "textRun": { - "content": " Future handleSubscription({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66118 - }, - { - "endIndex": 66182, - "paragraph": { - "elements": [ - { - "endIndex": 66182, - "startIndex": 66154, - "textRun": { - "content": " required String userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66154 - }, - { - "endIndex": 66220, - "paragraph": { - "elements": [ - { - "endIndex": 66220, - "startIndex": 66182, - "textRun": { - "content": " required ProductData productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66182 - }, - { - "endIndex": 66247, - "paragraph": { - "elements": [ - { - "endIndex": 66247, - "startIndex": 66220, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66220 - }, - { - "endIndex": 66254, - "paragraph": { - "elements": [ - { - "endIndex": 66254, - "startIndex": 66247, - "textRun": { - "content": " }) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66247 - }, - { - "endIndex": 66313, - "paragraph": { - "elements": [ - { - "endIndex": 66313, - "startIndex": 66254, - "textRun": { - "content": " return handleValidation(userId: userId, token: token);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66254 - }, - { - "endIndex": 66317, - "paragraph": { - "elements": [ - { - "endIndex": 66317, - "startIndex": 66313, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66313 - }, - { - "endIndex": 66318, - "paragraph": { - "elements": [ - { - "endIndex": 66318, - "startIndex": 66317, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66317 - }, - { - "endIndex": 66352, - "paragraph": { - "elements": [ - { - "endIndex": 66352, - "startIndex": 66318, - "textRun": { - "content": " /// Handle purchase validation.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66318 - }, - { - "endIndex": 66386, - "paragraph": { - "elements": [ - { - "endIndex": 66386, - "startIndex": 66352, - "textRun": { - "content": " Future handleValidation({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66352 - }, - { - "endIndex": 66414, - "paragraph": { - "elements": [ - { - "endIndex": 66414, - "startIndex": 66386, - "textRun": { - "content": " required String userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66386 - }, - { - "endIndex": 66441, - "paragraph": { - "elements": [ - { - "endIndex": 66441, - "startIndex": 66414, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66414 - }, - { - "endIndex": 66454, - "paragraph": { - "elements": [ - { - "endIndex": 66454, - "startIndex": 66441, - "textRun": { - "content": " }) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66441 - }, - { - "endIndex": 66462, - "paragraph": { - "elements": [ - { - "endIndex": 66462, - "startIndex": 66454, - "textRun": { - "content": " //..\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66454 - }, - { - "endIndex": 66466, - "paragraph": { - "elements": [ - { - "endIndex": 66466, - "startIndex": 66462, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66462 - } - ], - "endIndex": 66466, - "startIndex": 65890, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 66468, - "paragraph": { - "elements": [ - { - "endIndex": 66468, - "startIndex": 66467, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 66467 - }, - { - "endIndex": 66501, - "paragraph": { - "elements": [ - { - "endIndex": 66483, - "startIndex": 66468, - "textRun": { - "content": "Now, implement ", - "textStyle": {} - } - }, - { - "endIndex": 66499, - "startIndex": 66483, - "textRun": { - "content": "handleValidation", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 66501, - "startIndex": 66499, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 66468 - }, - { - "endIndex": 66537, - "paragraph": { - "elements": [ - { - "endIndex": 66536, - "startIndex": 66501, - "textRun": { - "content": "lib/app_store_purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/step_09/dart-backend/lib/app_store_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 66537, - "startIndex": 66536, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.xi83ilzt8dz", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 66501 - }, - { - "endIndex": 68658, - "startIndex": 66537, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 68657, - "startIndex": 66538, - "tableCells": [ - { - "content": [ - { - "endIndex": 66574, - "paragraph": { - "elements": [ - { - "endIndex": 66574, - "startIndex": 66540, - "textRun": { - "content": " /// Handle purchase validation.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66540 - }, - { - "endIndex": 66608, - "paragraph": { - "elements": [ - { - "endIndex": 66608, - "startIndex": 66574, - "textRun": { - "content": " Future handleValidation({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66574 - }, - { - "endIndex": 66636, - "paragraph": { - "elements": [ - { - "endIndex": 66636, - "startIndex": 66608, - "textRun": { - "content": " required String userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66608 - }, - { - "endIndex": 66663, - "paragraph": { - "elements": [ - { - "endIndex": 66663, - "startIndex": 66636, - "textRun": { - "content": " required String token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66636 - }, - { - "endIndex": 66676, - "paragraph": { - "elements": [ - { - "endIndex": 66676, - "startIndex": 66663, - "textRun": { - "content": " }) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66663 - }, - { - "endIndex": 66731, - "paragraph": { - "elements": [ - { - "endIndex": 66731, - "startIndex": 66676, - "textRun": { - "content": " print('AppStorePurchaseHandler.handleValidation');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66676 - }, - { - "endIndex": 66784, - "paragraph": { - "elements": [ - { - "endIndex": 66784, - "startIndex": 66731, - "textRun": { - "content": " final response = await _iTunesAPI.verifyReceipt(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66731 - }, - { - "endIndex": 66822, - "paragraph": { - "elements": [ - { - "endIndex": 66822, - "startIndex": 66784, - "textRun": { - "content": " password: appStoreSharedSecret,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66784 - }, - { - "endIndex": 66848, - "paragraph": { - "elements": [ - { - "endIndex": 66848, - "startIndex": 66822, - "textRun": { - "content": " receiptData: token,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66822 - }, - { - "endIndex": 66855, - "paragraph": { - "elements": [ - { - "endIndex": 66855, - "startIndex": 66848, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66848 - }, - { - "endIndex": 66889, - "paragraph": { - "elements": [ - { - "endIndex": 66889, - "startIndex": 66855, - "textRun": { - "content": " print('response: $response');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66855 - }, - { - "endIndex": 66921, - "paragraph": { - "elements": [ - { - "endIndex": 66921, - "startIndex": 66889, - "textRun": { - "content": " if (response.status == 0) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66889 - }, - { - "endIndex": 66968, - "paragraph": { - "elements": [ - { - "endIndex": 66968, - "startIndex": 66921, - "textRun": { - "content": " print('Successfully verified purchase');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66921 - }, - { - "endIndex": 67025, - "paragraph": { - "elements": [ - { - "endIndex": 67025, - "startIndex": 66968, - "textRun": { - "content": " final receipts = response.latestReceiptInfo ?? [];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 66968 - }, - { - "endIndex": 67065, - "paragraph": { - "elements": [ - { - "endIndex": 67065, - "startIndex": 67025, - "textRun": { - "content": " for (final receipt in receipts) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67025 - }, - { - "endIndex": 67124, - "paragraph": { - "elements": [ - { - "endIndex": 67124, - "startIndex": 67065, - "textRun": { - "content": " final product = productDataMap[receipt.productId];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67065 - }, - { - "endIndex": 67155, - "paragraph": { - "elements": [ - { - "endIndex": 67155, - "startIndex": 67124, - "textRun": { - "content": " if (product == null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67124 - }, - { - "endIndex": 67220, - "paragraph": { - "elements": [ - { - "endIndex": 67220, - "startIndex": 67155, - "textRun": { - "content": " print('Error: Unknown product: ${receipt.productId}');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67155 - }, - { - "endIndex": 67240, - "paragraph": { - "elements": [ - { - "endIndex": 67240, - "startIndex": 67220, - "textRun": { - "content": " continue;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67220 - }, - { - "endIndex": 67250, - "paragraph": { - "elements": [ - { - "endIndex": 67250, - "startIndex": 67240, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67240 - }, - { - "endIndex": 67282, - "paragraph": { - "elements": [ - { - "endIndex": 67282, - "startIndex": 67250, - "textRun": { - "content": " switch (product.type) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67250 - }, - { - "endIndex": 67326, - "paragraph": { - "elements": [ - { - "endIndex": 67326, - "startIndex": 67282, - "textRun": { - "content": " case ProductType.nonSubscription:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67282 - }, - { - "endIndex": 67406, - "paragraph": { - "elements": [ - { - "endIndex": 67406, - "startIndex": 67326, - "textRun": { - "content": " await iapRepository.createOrUpdatePurchase(NonSubscriptionPurchase(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67326 - }, - { - "endIndex": 67436, - "paragraph": { - "elements": [ - { - "endIndex": 67436, - "startIndex": 67406, - "textRun": { - "content": " userId: userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67406 - }, - { - "endIndex": 67486, - "paragraph": { - "elements": [ - { - "endIndex": 67486, - "startIndex": 67436, - "textRun": { - "content": " productId: receipt.productId ?? '',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67436 - }, - { - "endIndex": 67531, - "paragraph": { - "elements": [ - { - "endIndex": 67531, - "startIndex": 67486, - "textRun": { - "content": " iapSource: IAPSource.appstore,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67486 - }, - { - "endIndex": 67591, - "paragraph": { - "elements": [ - { - "endIndex": 67591, - "startIndex": 67531, - "textRun": { - "content": " orderId: receipt.originalTransactionId ?? '',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67531 - }, - { - "endIndex": 67656, - "paragraph": { - "elements": [ - { - "endIndex": 67656, - "startIndex": 67591, - "textRun": { - "content": " purchaseDate: DateTime.fromMillisecondsSinceEpoch(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67591 - }, - { - "endIndex": 67725, - "paragraph": { - "elements": [ - { - "endIndex": 67725, - "startIndex": 67656, - "textRun": { - "content": " int.parse(receipt.originalPurchaseDateMs ?? '0')),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67656 - }, - { - "endIndex": 67759, - "paragraph": { - "elements": [ - { - "endIndex": 67759, - "startIndex": 67725, - "textRun": { - "content": " type: product.type,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67725 - }, - { - "endIndex": 67814, - "paragraph": { - "elements": [ - { - "endIndex": 67814, - "startIndex": 67759, - "textRun": { - "content": " status: NonSubscriptionStatus.completed,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67759 - }, - { - "endIndex": 67830, - "paragraph": { - "elements": [ - { - "endIndex": 67830, - "startIndex": 67814, - "textRun": { - "content": " ));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67814 - }, - { - "endIndex": 67849, - "paragraph": { - "elements": [ - { - "endIndex": 67849, - "startIndex": 67830, - "textRun": { - "content": " break;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67830 - }, - { - "endIndex": 67890, - "paragraph": { - "elements": [ - { - "endIndex": 67890, - "startIndex": 67849, - "textRun": { - "content": " case ProductType.subscription:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67849 - }, - { - "endIndex": 67967, - "paragraph": { - "elements": [ - { - "endIndex": 67967, - "startIndex": 67890, - "textRun": { - "content": " await iapRepository.createOrUpdatePurchase(SubscriptionPurchase(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67890 - }, - { - "endIndex": 67997, - "paragraph": { - "elements": [ - { - "endIndex": 67997, - "startIndex": 67967, - "textRun": { - "content": " userId: userId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67967 - }, - { - "endIndex": 68047, - "paragraph": { - "elements": [ - { - "endIndex": 68047, - "startIndex": 67997, - "textRun": { - "content": " productId: receipt.productId ?? '',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 67997 - }, - { - "endIndex": 68092, - "paragraph": { - "elements": [ - { - "endIndex": 68092, - "startIndex": 68047, - "textRun": { - "content": " iapSource: IAPSource.appstore,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68047 - }, - { - "endIndex": 68152, - "paragraph": { - "elements": [ - { - "endIndex": 68152, - "startIndex": 68092, - "textRun": { - "content": " orderId: receipt.originalTransactionId ?? '',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68092 - }, - { - "endIndex": 68217, - "paragraph": { - "elements": [ - { - "endIndex": 68217, - "startIndex": 68152, - "textRun": { - "content": " purchaseDate: DateTime.fromMillisecondsSinceEpoch(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68152 - }, - { - "endIndex": 68286, - "paragraph": { - "elements": [ - { - "endIndex": 68286, - "startIndex": 68217, - "textRun": { - "content": " int.parse(receipt.originalPurchaseDateMs ?? '0')),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68217 - }, - { - "endIndex": 68320, - "paragraph": { - "elements": [ - { - "endIndex": 68320, - "startIndex": 68286, - "textRun": { - "content": " type: product.type,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68286 - }, - { - "endIndex": 68383, - "paragraph": { - "elements": [ - { - "endIndex": 68383, - "startIndex": 68320, - "textRun": { - "content": " expiryDate: DateTime.fromMillisecondsSinceEpoch(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68320 - }, - { - "endIndex": 68443, - "paragraph": { - "elements": [ - { - "endIndex": 68443, - "startIndex": 68383, - "textRun": { - "content": " int.parse(receipt.expiresDateMs ?? '0')),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68383 - }, - { - "endIndex": 68492, - "paragraph": { - "elements": [ - { - "endIndex": 68492, - "startIndex": 68443, - "textRun": { - "content": " status: SubscriptionStatus.active,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68443 - }, - { - "endIndex": 68508, - "paragraph": { - "elements": [ - { - "endIndex": 68508, - "startIndex": 68492, - "textRun": { - "content": " ));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68492 - }, - { - "endIndex": 68527, - "paragraph": { - "elements": [ - { - "endIndex": 68527, - "startIndex": 68508, - "textRun": { - "content": " break;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68508 - }, - { - "endIndex": 68537, - "paragraph": { - "elements": [ - { - "endIndex": 68537, - "startIndex": 68527, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68527 - }, - { - "endIndex": 68545, - "paragraph": { - "elements": [ - { - "endIndex": 68545, - "startIndex": 68537, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68537 - }, - { - "endIndex": 68564, - "paragraph": { - "elements": [ - { - "endIndex": 68564, - "startIndex": 68545, - "textRun": { - "content": " return true;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68545 - }, - { - "endIndex": 68577, - "paragraph": { - "elements": [ - { - "endIndex": 68577, - "startIndex": 68564, - "textRun": { - "content": " } else {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68564 - }, - { - "endIndex": 68627, - "paragraph": { - "elements": [ - { - "endIndex": 68627, - "startIndex": 68577, - "textRun": { - "content": " print('Error: Status: ${response.status}');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68577 - }, - { - "endIndex": 68647, - "paragraph": { - "elements": [ - { - "endIndex": 68647, - "startIndex": 68627, - "textRun": { - "content": " return false;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68627 - }, - { - "endIndex": 68653, - "paragraph": { - "elements": [ - { - "endIndex": 68653, - "startIndex": 68647, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68647 - }, - { - "endIndex": 68657, - "paragraph": { - "elements": [ - { - "endIndex": 68657, - "startIndex": 68653, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68653 - } - ], - "endIndex": 68657, - "startIndex": 66539, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 68659, - "paragraph": { - "elements": [ - { - "endIndex": 68659, - "startIndex": 68658, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 68658 - }, - { - "endIndex": 68735, - "paragraph": { - "elements": [ - { - "endIndex": 68735, - "startIndex": 68659, - "textRun": { - "content": "Your App Store purchases should now be verified and stored in the database!\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 68659 - }, - { - "endIndex": 68736, - "paragraph": { - "elements": [ - { - "endIndex": 68736, - "startIndex": 68735, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 68735 - }, - { - "endIndex": 68752, - "paragraph": { - "elements": [ - { - "endIndex": 68752, - "startIndex": 68736, - "textRun": { - "content": "Run the backend\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.jb3eo77qkroq", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 68736 - }, - { - "endIndex": 68840, - "paragraph": { - "elements": [ - { - "endIndex": 68779, - "startIndex": 68752, - "textRun": { - "content": "At this point, you can run ", - "textStyle": {} - } - }, - { - "endIndex": 68800, - "startIndex": 68779, - "textRun": { - "content": "dart bin/server.dart ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 68814, - "startIndex": 68800, - "textRun": { - "content": " to serve the ", - "textStyle": {} - } - }, - { - "endIndex": 68829, - "startIndex": 68814, - "textRun": { - "content": "/verifypurchase", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 68840, - "startIndex": 68829, - "textRun": { - "content": " endpoint.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 68752 - }, - { - "endIndex": 68841, - "paragraph": { - "elements": [ - { - "endIndex": 68841, - "startIndex": 68840, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 68840 - }, - { - "endIndex": 68900, - "startIndex": 68841, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 68899, - "startIndex": 68842, - "tableCells": [ - { - "content": [ - { - "endIndex": 68868, - "paragraph": { - "elements": [ - { - "endIndex": 68868, - "startIndex": 68844, - "textRun": { - "content": "$ dart bin/server.dart \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68844 - }, - { - "endIndex": 68899, - "paragraph": { - "elements": [ - { - "endIndex": 68899, - "startIndex": 68868, - "textRun": { - "content": "Serving at http://0.0.0.0:8080\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 68868 - } - ], - "endIndex": 68899, - "startIndex": 68843, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 68901, - "paragraph": { - "elements": [ - { - "endIndex": 68901, - "startIndex": 68900, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 68900 - }, - { - "endIndex": 68902, - "paragraph": { - "elements": [ - { - "endIndex": 68902, - "startIndex": 68901, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 68901 - }, - { - "endIndex": 68903, - "paragraph": { - "elements": [ - { - "endIndex": 68903, - "startIndex": 68902, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 68902 - }, - { - "endIndex": 68904, - "paragraph": { - "elements": [ - { - "endIndex": 68904, - "startIndex": 68903, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 68903 - }, - { - "endIndex": 68906, - "paragraph": { - "elements": [ - { - "endIndex": 68905, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 68904 - }, - { - "endIndex": 68906, - "startIndex": 68905, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 68904 - }, - { - "endIndex": 68930, - "paragraph": { - "elements": [ - { - "endIndex": 68930, - "startIndex": 68906, - "textRun": { - "content": "Keep track of purchases\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.dd0rjca1enw0", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 68906 - }, - { - "endIndex": 68931, - "paragraph": { - "elements": [ - { - "endIndex": 68931, - "startIndex": 68930, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 68930 - }, - { - "endIndex": 69209, - "paragraph": { - "elements": [ - { - "endIndex": 69209, - "startIndex": 68931, - "textRun": { - "content": "The recommended way to track your users’ purchases is in the backend service. This is because your backend can respond to events from the store and thus is less prone to running into outdated information due to caching, as well as being less susceptible to being tampered with.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 68931 - }, - { - "endIndex": 69210, - "paragraph": { - "elements": [ - { - "endIndex": 69210, - "startIndex": 69209, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 69209 - }, - { - "endIndex": 69314, - "paragraph": { - "elements": [ - { - "endIndex": 69314, - "startIndex": 69210, - "textRun": { - "content": "First, set up the processing of store events on the backend with the Dart backend you’ve been building.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 69210 - }, - { - "endIndex": 69315, - "paragraph": { - "elements": [ - { - "endIndex": 69315, - "startIndex": 69314, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 69314 - }, - { - "endIndex": 69351, - "paragraph": { - "elements": [ - { - "endIndex": 69351, - "startIndex": 69315, - "textRun": { - "content": "Process store events on the backend\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ti7vyj5prcjk", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 69315 - }, - { - "endIndex": 69352, - "paragraph": { - "elements": [ - { - "endIndex": 69352, - "startIndex": 69351, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 69351 - }, - { - "endIndex": 69646, - "paragraph": { - "elements": [ - { - "endIndex": 69646, - "startIndex": 69352, - "textRun": { - "content": "Stores have the ability to inform your backend of any billing events that happen, such as when subscriptions renew. You can process these events in your backend to keep the purchases in your database current. In this section, set this up for both the Google Play Store and the Apple App Store.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 69352 - }, - { - "endIndex": 69681, - "paragraph": { - "elements": [ - { - "endIndex": 69681, - "startIndex": 69646, - "textRun": { - "content": "Process Google Play billing events\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.sxk3tsy39sxr", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 69646 - }, - { - "endIndex": 69682, - "paragraph": { - "elements": [ - { - "endIndex": 69682, - "startIndex": 69681, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 69681 - }, - { - "endIndex": 69862, - "paragraph": { - "elements": [ - { - "endIndex": 69743, - "startIndex": 69682, - "textRun": { - "content": "Google Play provides billing events through what they call a ", - "textStyle": {} - } - }, - { - "endIndex": 69762, - "startIndex": 69743, - "textRun": { - "content": "cloud pub/sub topic", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 69862, - "startIndex": 69762, - "textRun": { - "content": ". These are essentially message queues that messages can be published on, as well as consumed from.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 69682 - }, - { - "endIndex": 69863, - "paragraph": { - "elements": [ - { - "endIndex": 69863, - "startIndex": 69862, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 69862 - }, - { - "endIndex": 69984, - "paragraph": { - "elements": [ - { - "endIndex": 69956, - "startIndex": 69863, - "textRun": { - "content": "Because this is functionality specific to Google Play, you include this functionality in the ", - "textStyle": {} - } - }, - { - "endIndex": 69981, - "startIndex": 69956, - "textRun": { - "content": "GooglePlayPurchaseHandler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 69984, - "startIndex": 69981, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 69863 - }, - { - "endIndex": 69985, - "paragraph": { - "elements": [ - { - "endIndex": 69985, - "startIndex": 69984, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 69984 - }, - { - "endIndex": 70077, - "paragraph": { - "elements": [ - { - "endIndex": 70005, - "startIndex": 69985, - "textRun": { - "content": "Start by opening up ", - "textStyle": {} - } - }, - { - "endIndex": 70042, - "startIndex": 70005, - "textRun": { - "content": "lib/google_play_purchase_handler.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 70077, - "startIndex": 70042, - "textRun": { - "content": ", and adding the PubsubApi import:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 69985 - }, - { - "endIndex": 70115, - "paragraph": { - "elements": [ - { - "endIndex": 70114, - "startIndex": 70077, - "textRun": { - "content": "lib/google_play_purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/dart-backend/lib/google_play_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 70115, - "startIndex": 70114, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.aecu2q40uqsk", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 70077 - }, - { - "endIndex": 70173, - "startIndex": 70115, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 70172, - "startIndex": 70116, - "tableCells": [ - { - "content": [ - { - "endIndex": 70172, - "paragraph": { - "elements": [ - { - "endIndex": 70172, - "startIndex": 70118, - "textRun": { - "content": "import 'package:googleapis/pubsub/v1.dart' as pubsub;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70118 - } - ], - "endIndex": 70172, - "startIndex": 70117, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 70174, - "paragraph": { - "elements": [ - { - "endIndex": 70174, - "startIndex": 70173, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 70173 - }, - { - "endIndex": 70296, - "paragraph": { - "elements": [ - { - "endIndex": 70189, - "startIndex": 70174, - "textRun": { - "content": "Then, pass the ", - "textStyle": {} - } - }, - { - "endIndex": 70198, - "startIndex": 70189, - "textRun": { - "content": "PubsubApi", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 70206, - "startIndex": 70198, - "textRun": { - "content": " to the ", - "textStyle": {} - } - }, - { - "endIndex": 70231, - "startIndex": 70206, - "textRun": { - "content": "GooglePlayPurchaseHandler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 70278, - "startIndex": 70231, - "textRun": { - "content": ", and modify the class constructor to create a ", - "textStyle": {} - } - }, - { - "endIndex": 70283, - "startIndex": 70278, - "textRun": { - "content": "Timer", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 70284, - "startIndex": 70283, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 70296, - "startIndex": 70284, - "textRun": { - "content": "as follows:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 70174 - }, - { - "endIndex": 70334, - "paragraph": { - "elements": [ - { - "endIndex": 70333, - "startIndex": 70296, - "textRun": { - "content": "lib/google_play_purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/dart-backend/lib/google_play_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 70334, - "startIndex": 70333, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.h0yuk8vhe476", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 70296 - }, - { - "endIndex": 70782, - "startIndex": 70334, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 70781, - "startIndex": 70335, - "tableCells": [ - { - "content": [ - { - "endIndex": 70395, - "paragraph": { - "elements": [ - { - "endIndex": 70395, - "startIndex": 70337, - "textRun": { - "content": "class GooglePlayPurchaseHandler extends PurchaseHandler {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70337 - }, - { - "endIndex": 70444, - "paragraph": { - "elements": [ - { - "endIndex": 70444, - "startIndex": 70395, - "textRun": { - "content": " final ap.AndroidPublisherApi androidPublisher;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70395 - }, - { - "endIndex": 70481, - "paragraph": { - "elements": [ - { - "endIndex": 70481, - "startIndex": 70444, - "textRun": { - "content": " final IapRepository iapRepository;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70444 - }, - { - "endIndex": 70524, - "paragraph": { - "elements": [ - { - "endIndex": 70524, - "startIndex": 70481, - "textRun": { - "content": " final pubsub.PubsubApi pubsubApi; // new\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70481 - }, - { - "endIndex": 70525, - "paragraph": { - "elements": [ - { - "endIndex": 70525, - "startIndex": 70524, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70524 - }, - { - "endIndex": 70554, - "paragraph": { - "elements": [ - { - "endIndex": 70554, - "startIndex": 70525, - "textRun": { - "content": " GooglePlayPurchaseHandler(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70525 - }, - { - "endIndex": 70581, - "paragraph": { - "elements": [ - { - "endIndex": 70581, - "startIndex": 70554, - "textRun": { - "content": " this.androidPublisher,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70554 - }, - { - "endIndex": 70605, - "paragraph": { - "elements": [ - { - "endIndex": 70605, - "startIndex": 70581, - "textRun": { - "content": " this.iapRepository,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70581 - }, - { - "endIndex": 70632, - "paragraph": { - "elements": [ - { - "endIndex": 70632, - "startIndex": 70605, - "textRun": { - "content": " this.pubsubApi, // new\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70605 - }, - { - "endIndex": 70638, - "paragraph": { - "elements": [ - { - "endIndex": 70638, - "startIndex": 70632, - "textRun": { - "content": " ) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70632 - }, - { - "endIndex": 70689, - "paragraph": { - "elements": [ - { - "endIndex": 70689, - "startIndex": 70638, - "textRun": { - "content": " // Poll messages from Pub/Sub every 10 seconds\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70638 - }, - { - "endIndex": 70737, - "paragraph": { - "elements": [ - { - "endIndex": 70737, - "startIndex": 70689, - "textRun": { - "content": " Timer.periodic(Duration(seconds: 10), (_) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70689 - }, - { - "endIndex": 70769, - "paragraph": { - "elements": [ - { - "endIndex": 70769, - "startIndex": 70737, - "textRun": { - "content": " _pullMessageFromPubSub();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70737 - }, - { - "endIndex": 70777, - "paragraph": { - "elements": [ - { - "endIndex": 70777, - "startIndex": 70769, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70769 - }, - { - "endIndex": 70781, - "paragraph": { - "elements": [ - { - "endIndex": 70781, - "startIndex": 70777, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70777 - } - ], - "endIndex": 70781, - "startIndex": 70336, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 70783, - "paragraph": { - "elements": [ - { - "endIndex": 70783, - "startIndex": 70782, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 70782 - }, - { - "endIndex": 70920, - "paragraph": { - "elements": [ - { - "endIndex": 70787, - "startIndex": 70783, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 70792, - "startIndex": 70787, - "textRun": { - "content": "Timer", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 70819, - "startIndex": 70792, - "textRun": { - "content": " is configured to call the ", - "textStyle": {} - } - }, - { - "endIndex": 70841, - "startIndex": 70819, - "textRun": { - "content": "_pullMessageFromSubSub", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 70920, - "startIndex": 70841, - "textRun": { - "content": " method every ten seconds. You can adjust the Duration to your own preference.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 70783 - }, - { - "endIndex": 70921, - "paragraph": { - "elements": [ - { - "endIndex": 70921, - "startIndex": 70920, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 70920 - }, - { - "endIndex": 70961, - "paragraph": { - "elements": [ - { - "endIndex": 70938, - "startIndex": 70921, - "textRun": { - "content": "Then, create the ", - "textStyle": {} - } - }, - { - "endIndex": 70961, - "startIndex": 70938, - "textRun": { - "content": "_pullMessageFromSubSub\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 70921 - }, - { - "endIndex": 70999, - "paragraph": { - "elements": [ - { - "endIndex": 70998, - "startIndex": 70961, - "textRun": { - "content": "lib/google_play_purchase_handler.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/dart-backend/lib/google_play_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 70999, - "startIndex": 70998, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.nvc7e2wjg9po", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 70961 - }, - { - "endIndex": 73764, - "startIndex": 70999, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 73763, - "startIndex": 71000, - "tableCells": [ - { - "content": [ - { - "endIndex": 71042, - "paragraph": { - "elements": [ - { - "endIndex": 71042, - "startIndex": 71002, - "textRun": { - "content": " /// Process messages from Google Play\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71002 - }, - { - "endIndex": 71072, - "paragraph": { - "elements": [ - { - "endIndex": 71072, - "startIndex": 71042, - "textRun": { - "content": " /// Called every 10 seconds\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71042 - }, - { - "endIndex": 71120, - "paragraph": { - "elements": [ - { - "endIndex": 71120, - "startIndex": 71072, - "textRun": { - "content": " Future _pullMessageFromPubSub() async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71072 - }, - { - "endIndex": 71163, - "paragraph": { - "elements": [ - { - "endIndex": 71163, - "startIndex": 71120, - "textRun": { - "content": " print('Polling Google Play messages');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71120 - }, - { - "endIndex": 71203, - "paragraph": { - "elements": [ - { - "endIndex": 71203, - "startIndex": 71163, - "textRun": { - "content": " final request = pubsub.PullRequest(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71163 - }, - { - "endIndex": 71228, - "paragraph": { - "elements": [ - { - "endIndex": 71228, - "startIndex": 71203, - "textRun": { - "content": " maxMessages: 1000,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71203 - }, - { - "endIndex": 71235, - "paragraph": { - "elements": [ - { - "endIndex": 71235, - "startIndex": 71228, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71228 - }, - { - "endIndex": 71257, - "paragraph": { - "elements": [ - { - "endIndex": 71257, - "startIndex": 71235, - "textRun": { - "content": " final topicName =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71235 - }, - { - "endIndex": 71348, - "paragraph": { - "elements": [ - { - "endIndex": 71348, - "startIndex": 71257, - "textRun": { - "content": " 'projects/$googlePlayProjectName/subscriptions/$googlePlayPubsubBillingTopic-sub';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71257 - }, - { - "endIndex": 71418, - "paragraph": { - "elements": [ - { - "endIndex": 71418, - "startIndex": 71348, - "textRun": { - "content": " final pullResponse = await pubsubApi.projects.subscriptions.pull(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71348 - }, - { - "endIndex": 71433, - "paragraph": { - "elements": [ - { - "endIndex": 71433, - "startIndex": 71418, - "textRun": { - "content": " request,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71418 - }, - { - "endIndex": 71450, - "paragraph": { - "elements": [ - { - "endIndex": 71450, - "startIndex": 71433, - "textRun": { - "content": " topicName,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71433 - }, - { - "endIndex": 71457, - "paragraph": { - "elements": [ - { - "endIndex": 71457, - "startIndex": 71450, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71450 - }, - { - "endIndex": 71515, - "paragraph": { - "elements": [ - { - "endIndex": 71515, - "startIndex": 71457, - "textRun": { - "content": " final messages = pullResponse.receivedMessages ?? [];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71457 - }, - { - "endIndex": 71553, - "paragraph": { - "elements": [ - { - "endIndex": 71553, - "startIndex": 71515, - "textRun": { - "content": " for (final message in messages) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71515 - }, - { - "endIndex": 71597, - "paragraph": { - "elements": [ - { - "endIndex": 71597, - "startIndex": 71553, - "textRun": { - "content": " final data64 = message.message?.data;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71553 - }, - { - "endIndex": 71625, - "paragraph": { - "elements": [ - { - "endIndex": 71625, - "startIndex": 71597, - "textRun": { - "content": " if (data64 != null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71597 - }, - { - "endIndex": 71679, - "paragraph": { - "elements": [ - { - "endIndex": 71679, - "startIndex": 71625, - "textRun": { - "content": " await _processMessage(data64, message.ackId);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71625 - }, - { - "endIndex": 71687, - "paragraph": { - "elements": [ - { - "endIndex": 71687, - "startIndex": 71679, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71679 - }, - { - "endIndex": 71693, - "paragraph": { - "elements": [ - { - "endIndex": 71693, - "startIndex": 71687, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71687 - }, - { - "endIndex": 71697, - "paragraph": { - "elements": [ - { - "endIndex": 71697, - "startIndex": 71693, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71693 - }, - { - "endIndex": 71698, - "paragraph": { - "elements": [ - { - "endIndex": 71698, - "startIndex": 71697, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71697 - }, - { - "endIndex": 71767, - "paragraph": { - "elements": [ - { - "endIndex": 71767, - "startIndex": 71698, - "textRun": { - "content": " Future _processMessage(String data64, String? ackId) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71698 - }, - { - "endIndex": 71822, - "paragraph": { - "elements": [ - { - "endIndex": 71822, - "startIndex": 71767, - "textRun": { - "content": " final dataRaw = utf8.decode(base64Decode(data64));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71767 - }, - { - "endIndex": 71860, - "paragraph": { - "elements": [ - { - "endIndex": 71860, - "startIndex": 71822, - "textRun": { - "content": " print('Received data: $dataRaw');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71822 - }, - { - "endIndex": 71906, - "paragraph": { - "elements": [ - { - "endIndex": 71906, - "startIndex": 71860, - "textRun": { - "content": " final dynamic data = jsonDecode(dataRaw);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71860 - }, - { - "endIndex": 71950, - "paragraph": { - "elements": [ - { - "endIndex": 71950, - "startIndex": 71906, - "textRun": { - "content": " if (data['testNotification'] != null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71906 - }, - { - "endIndex": 71985, - "paragraph": { - "elements": [ - { - "endIndex": 71985, - "startIndex": 71950, - "textRun": { - "content": " print('Skip test messages');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71950 - }, - { - "endIndex": 72012, - "paragraph": { - "elements": [ - { - "endIndex": 72012, - "startIndex": 71985, - "textRun": { - "content": " if (ackId != null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71985 - }, - { - "endIndex": 72046, - "paragraph": { - "elements": [ - { - "endIndex": 72046, - "startIndex": 72012, - "textRun": { - "content": " await _ackMessage(ackId);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72012 - }, - { - "endIndex": 72054, - "paragraph": { - "elements": [ - { - "endIndex": 72054, - "startIndex": 72046, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72046 - }, - { - "endIndex": 72068, - "paragraph": { - "elements": [ - { - "endIndex": 72068, - "startIndex": 72054, - "textRun": { - "content": " return;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72054 - }, - { - "endIndex": 72074, - "paragraph": { - "elements": [ - { - "endIndex": 72074, - "startIndex": 72068, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72068 - }, - { - "endIndex": 72153, - "paragraph": { - "elements": [ - { - "endIndex": 72153, - "startIndex": 72074, - "textRun": { - "content": " final dynamic subscriptionNotification = data['subscriptionNotification'];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72074 - }, - { - "endIndex": 72200, - "paragraph": { - "elements": [ - { - "endIndex": 72200, - "startIndex": 72153, - "textRun": { - "content": " final dynamic oneTimeProductNotification =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72153 - }, - { - "endIndex": 72244, - "paragraph": { - "elements": [ - { - "endIndex": 72244, - "startIndex": 72200, - "textRun": { - "content": " data['oneTimeProductNotification'];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72200 - }, - { - "endIndex": 72288, - "paragraph": { - "elements": [ - { - "endIndex": 72288, - "startIndex": 72244, - "textRun": { - "content": " if (subscriptionNotification != null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72244 - }, - { - "endIndex": 72328, - "paragraph": { - "elements": [ - { - "endIndex": 72328, - "startIndex": 72288, - "textRun": { - "content": " print('Processing Subscription');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72288 - }, - { - "endIndex": 72357, - "paragraph": { - "elements": [ - { - "endIndex": 72357, - "startIndex": 72328, - "textRun": { - "content": " final subscriptionId =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72328 - }, - { - "endIndex": 72421, - "paragraph": { - "elements": [ - { - "endIndex": 72421, - "startIndex": 72357, - "textRun": { - "content": " subscriptionNotification['subscriptionId'] as String;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72357 - }, - { - "endIndex": 72502, - "paragraph": { - "elements": [ - { - "endIndex": 72502, - "startIndex": 72421, - "textRun": { - "content": " final purchaseToken = subscriptionNotification['purchaseToken'] as String;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72421 - }, - { - "endIndex": 72561, - "paragraph": { - "elements": [ - { - "endIndex": 72561, - "startIndex": 72502, - "textRun": { - "content": " final productData = productDataMap[subscriptionId]!;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72502 - }, - { - "endIndex": 72608, - "paragraph": { - "elements": [ - { - "endIndex": 72608, - "startIndex": 72561, - "textRun": { - "content": " final result = await handleSubscription(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72561 - }, - { - "endIndex": 72630, - "paragraph": { - "elements": [ - { - "endIndex": 72630, - "startIndex": 72608, - "textRun": { - "content": " userId: null,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72608 - }, - { - "endIndex": 72664, - "paragraph": { - "elements": [ - { - "endIndex": 72664, - "startIndex": 72630, - "textRun": { - "content": " productData: productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72630 - }, - { - "endIndex": 72694, - "paragraph": { - "elements": [ - { - "endIndex": 72694, - "startIndex": 72664, - "textRun": { - "content": " token: purchaseToken,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72664 - }, - { - "endIndex": 72703, - "paragraph": { - "elements": [ - { - "endIndex": 72703, - "startIndex": 72694, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72694 - }, - { - "endIndex": 72740, - "paragraph": { - "elements": [ - { - "endIndex": 72740, - "startIndex": 72703, - "textRun": { - "content": " if (result && ackId != null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72703 - }, - { - "endIndex": 72774, - "paragraph": { - "elements": [ - { - "endIndex": 72774, - "startIndex": 72740, - "textRun": { - "content": " await _ackMessage(ackId);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72740 - }, - { - "endIndex": 72782, - "paragraph": { - "elements": [ - { - "endIndex": 72782, - "startIndex": 72774, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72774 - }, - { - "endIndex": 72835, - "paragraph": { - "elements": [ - { - "endIndex": 72835, - "startIndex": 72782, - "textRun": { - "content": " } else if (oneTimeProductNotification != null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72782 - }, - { - "endIndex": 72878, - "paragraph": { - "elements": [ - { - "endIndex": 72878, - "startIndex": 72835, - "textRun": { - "content": " print('Processing NonSubscription');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72835 - }, - { - "endIndex": 72941, - "paragraph": { - "elements": [ - { - "endIndex": 72941, - "startIndex": 72878, - "textRun": { - "content": " final sku = oneTimeProductNotification['sku'] as String;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72878 - }, - { - "endIndex": 72969, - "paragraph": { - "elements": [ - { - "endIndex": 72969, - "startIndex": 72941, - "textRun": { - "content": " final purchaseToken =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72941 - }, - { - "endIndex": 73034, - "paragraph": { - "elements": [ - { - "endIndex": 73034, - "startIndex": 72969, - "textRun": { - "content": " oneTimeProductNotification['purchaseToken'] as String;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 72969 - }, - { - "endIndex": 73082, - "paragraph": { - "elements": [ - { - "endIndex": 73082, - "startIndex": 73034, - "textRun": { - "content": " final productData = productDataMap[sku]!;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73034 - }, - { - "endIndex": 73132, - "paragraph": { - "elements": [ - { - "endIndex": 73132, - "startIndex": 73082, - "textRun": { - "content": " final result = await handleNonSubscription(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73082 - }, - { - "endIndex": 73154, - "paragraph": { - "elements": [ - { - "endIndex": 73154, - "startIndex": 73132, - "textRun": { - "content": " userId: null,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73132 - }, - { - "endIndex": 73188, - "paragraph": { - "elements": [ - { - "endIndex": 73188, - "startIndex": 73154, - "textRun": { - "content": " productData: productData,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73154 - }, - { - "endIndex": 73218, - "paragraph": { - "elements": [ - { - "endIndex": 73218, - "startIndex": 73188, - "textRun": { - "content": " token: purchaseToken,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73188 - }, - { - "endIndex": 73227, - "paragraph": { - "elements": [ - { - "endIndex": 73227, - "startIndex": 73218, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73218 - }, - { - "endIndex": 73264, - "paragraph": { - "elements": [ - { - "endIndex": 73264, - "startIndex": 73227, - "textRun": { - "content": " if (result && ackId != null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73227 - }, - { - "endIndex": 73298, - "paragraph": { - "elements": [ - { - "endIndex": 73298, - "startIndex": 73264, - "textRun": { - "content": " await _ackMessage(ackId);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73264 - }, - { - "endIndex": 73306, - "paragraph": { - "elements": [ - { - "endIndex": 73306, - "startIndex": 73298, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73298 - }, - { - "endIndex": 73319, - "paragraph": { - "elements": [ - { - "endIndex": 73319, - "startIndex": 73306, - "textRun": { - "content": " } else {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73306 - }, - { - "endIndex": 73348, - "paragraph": { - "elements": [ - { - "endIndex": 73348, - "startIndex": 73319, - "textRun": { - "content": " print('invalid data');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73319 - }, - { - "endIndex": 73354, - "paragraph": { - "elements": [ - { - "endIndex": 73354, - "startIndex": 73348, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73348 - }, - { - "endIndex": 73358, - "paragraph": { - "elements": [ - { - "endIndex": 73358, - "startIndex": 73354, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73354 - }, - { - "endIndex": 73359, - "paragraph": { - "elements": [ - { - "endIndex": 73359, - "startIndex": 73358, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73358 - }, - { - "endIndex": 73391, - "paragraph": { - "elements": [ - { - "endIndex": 73391, - "startIndex": 73359, - "textRun": { - "content": " /// ACK Messages from Pub/Sub\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73359 - }, - { - "endIndex": 73437, - "paragraph": { - "elements": [ - { - "endIndex": 73437, - "startIndex": 73391, - "textRun": { - "content": " Future _ackMessage(String id) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73391 - }, - { - "endIndex": 73463, - "paragraph": { - "elements": [ - { - "endIndex": 73463, - "startIndex": 73437, - "textRun": { - "content": " print('ACK Message');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73437 - }, - { - "endIndex": 73510, - "paragraph": { - "elements": [ - { - "endIndex": 73510, - "startIndex": 73463, - "textRun": { - "content": " final request = pubsub.AcknowledgeRequest(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73463 - }, - { - "endIndex": 73530, - "paragraph": { - "elements": [ - { - "endIndex": 73530, - "startIndex": 73510, - "textRun": { - "content": " ackIds: [id],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73510 - }, - { - "endIndex": 73537, - "paragraph": { - "elements": [ - { - "endIndex": 73537, - "startIndex": 73530, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73530 - }, - { - "endIndex": 73566, - "paragraph": { - "elements": [ - { - "endIndex": 73566, - "startIndex": 73537, - "textRun": { - "content": " final subscriptionName =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73537 - }, - { - "endIndex": 73657, - "paragraph": { - "elements": [ - { - "endIndex": 73657, - "startIndex": 73566, - "textRun": { - "content": " 'projects/$googlePlayProjectName/subscriptions/$googlePlayPubsubBillingTopic-sub';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73566 - }, - { - "endIndex": 73713, - "paragraph": { - "elements": [ - { - "endIndex": 73713, - "startIndex": 73657, - "textRun": { - "content": " await pubsubApi.projects.subscriptions.acknowledge(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73657 - }, - { - "endIndex": 73728, - "paragraph": { - "elements": [ - { - "endIndex": 73728, - "startIndex": 73713, - "textRun": { - "content": " request,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73713 - }, - { - "endIndex": 73752, - "paragraph": { - "elements": [ - { - "endIndex": 73752, - "startIndex": 73728, - "textRun": { - "content": " subscriptionName,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73728 - }, - { - "endIndex": 73759, - "paragraph": { - "elements": [ - { - "endIndex": 73759, - "startIndex": 73752, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73752 - }, - { - "endIndex": 73763, - "paragraph": { - "elements": [ - { - "endIndex": 73763, - "startIndex": 73759, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 73759 - } - ], - "endIndex": 73763, - "startIndex": 71001, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 73765, - "paragraph": { - "elements": [ - { - "endIndex": 73765, - "startIndex": 73764, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 73764 - }, - { - "endIndex": 73949, - "paragraph": { - "elements": [ - { - "endIndex": 73924, - "startIndex": 73765, - "textRun": { - "content": "The code you just added communicates with the Pub/Sub Topic from Google Cloud every ten seconds and asks for new messages. Then, processes each message in the ", - "textStyle": {} - } - }, - { - "endIndex": 73939, - "startIndex": 73924, - "textRun": { - "content": "_processMessage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 73949, - "startIndex": 73939, - "textRun": { - "content": " method. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 73765 - }, - { - "endIndex": 73950, - "paragraph": { - "elements": [ - { - "endIndex": 73950, - "startIndex": 73949, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 73949 - }, - { - "endIndex": 74170, - "paragraph": { - "elements": [ - { - "endIndex": 74112, - "startIndex": 73950, - "textRun": { - "content": "This method decodes the incoming messages and obtains the updated information about each purchase, both subscriptions and non-subscriptions, calling the existing ", - "textStyle": {} - } - }, - { - "endIndex": 74130, - "startIndex": 74112, - "textRun": { - "content": "handleSubscription", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 74134, - "startIndex": 74130, - "textRun": { - "content": " or ", - "textStyle": {} - } - }, - { - "endIndex": 74155, - "startIndex": 74134, - "textRun": { - "content": "handleNonSubscription", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 74170, - "startIndex": 74155, - "textRun": { - "content": " if necessary.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 73950 - }, - { - "endIndex": 74171, - "paragraph": { - "elements": [ - { - "endIndex": 74171, - "startIndex": 74170, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 74170 - }, - { - "endIndex": 74238, - "paragraph": { - "elements": [ - { - "endIndex": 74218, - "startIndex": 74171, - "textRun": { - "content": "Each message needs to be acknowledged with the ", - "textStyle": {} - } - }, - { - "endIndex": 74229, - "startIndex": 74218, - "textRun": { - "content": "_askMessage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 74238, - "startIndex": 74229, - "textRun": { - "content": " method.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 74171 - }, - { - "endIndex": 74239, - "paragraph": { - "elements": [ - { - "endIndex": 74239, - "startIndex": 74238, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 74238 - }, - { - "endIndex": 74371, - "paragraph": { - "elements": [ - { - "endIndex": 74282, - "startIndex": 74239, - "textRun": { - "content": "Next, add the required dependencies to the ", - "textStyle": {} - } - }, - { - "endIndex": 74293, - "startIndex": 74282, - "textRun": { - "content": "server.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 74371, - "startIndex": 74293, - "textRun": { - "content": " file. Add the PubsubApi.cloudPlatformScope to the credentials configuration:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 74239 - }, - { - "endIndex": 74387, - "paragraph": { - "elements": [ - { - "endIndex": 74386, - "startIndex": 74371, - "textRun": { - "content": "bin/server.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/dart-backend/bin/server.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 74387, - "startIndex": 74386, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.e8qkvvxxsdv3", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 74371 - }, - { - "endIndex": 74593, - "startIndex": 74387, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 74592, - "startIndex": 74388, - "tableCells": [ - { - "content": [ - { - "endIndex": 74416, - "paragraph": { - "elements": [ - { - "endIndex": 74416, - "startIndex": 74390, - "textRun": { - "content": " final clientGooglePlay =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74390 - }, - { - "endIndex": 74488, - "paragraph": { - "elements": [ - { - "endIndex": 74488, - "startIndex": 74416, - "textRun": { - "content": " await auth.clientViaServiceAccount(clientCredentialsGooglePlay, [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74416 - }, - { - "endIndex": 74538, - "paragraph": { - "elements": [ - { - "endIndex": 74538, - "startIndex": 74488, - "textRun": { - "content": " ap.AndroidPublisherApi.androidpublisherScope,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74488 - }, - { - "endIndex": 74586, - "paragraph": { - "elements": [ - { - "endIndex": 74586, - "startIndex": 74538, - "textRun": { - "content": " pubsub.PubsubApi.cloudPlatformScope, // new\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74538 - }, - { - "endIndex": 74592, - "paragraph": { - "elements": [ - { - "endIndex": 74592, - "startIndex": 74586, - "textRun": { - "content": " ]);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74586 - } - ], - "endIndex": 74592, - "startIndex": 74389, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 74594, - "paragraph": { - "elements": [ - { - "endIndex": 74594, - "startIndex": 74593, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 74593 - }, - { - "endIndex": 74631, - "paragraph": { - "elements": [ - { - "endIndex": 74631, - "startIndex": 74594, - "textRun": { - "content": "Then, create the PubsubApi instance:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 74594 - }, - { - "endIndex": 74647, - "paragraph": { - "elements": [ - { - "endIndex": 74646, - "startIndex": 74631, - "textRun": { - "content": "bin/server.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/dart-backend/bin/server.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 74647, - "startIndex": 74646, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.g22rpr7r4d9x", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 74631 - }, - { - "endIndex": 74707, - "startIndex": 74647, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 74706, - "startIndex": 74648, - "tableCells": [ - { - "content": [ - { - "endIndex": 74706, - "paragraph": { - "elements": [ - { - "endIndex": 74706, - "startIndex": 74650, - "textRun": { - "content": " final pubsubApi = pubsub.PubsubApi(clientGooglePlay);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74650 - } - ], - "endIndex": 74706, - "startIndex": 74649, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 74708, - "paragraph": { - "elements": [ - { - "endIndex": 74708, - "startIndex": 74707, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 74707 - }, - { - "endIndex": 74775, - "paragraph": { - "elements": [ - { - "endIndex": 74736, - "startIndex": 74708, - "textRun": { - "content": "And finally, pass it to the ", - "textStyle": {} - } - }, - { - "endIndex": 74761, - "startIndex": 74736, - "textRun": { - "content": "GooglePlayPurchaseHandler", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 74775, - "startIndex": 74761, - "textRun": { - "content": " constructor:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 74708 - }, - { - "endIndex": 74791, - "paragraph": { - "elements": [ - { - "endIndex": 74790, - "startIndex": 74775, - "textRun": { - "content": "bin/server.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/dart-backend/bin/server.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 74791, - "startIndex": 74790, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.8k6qyft8atf5", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 74775 - }, - { - "endIndex": 75003, - "startIndex": 74791, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 75002, - "startIndex": 74792, - "tableCells": [ - { - "content": [ - { - "endIndex": 74805, - "paragraph": { - "elements": [ - { - "endIndex": 74805, - "startIndex": 74794, - "textRun": { - "content": " return {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74794 - }, - { - "endIndex": 74851, - "paragraph": { - "elements": [ - { - "endIndex": 74851, - "startIndex": 74805, - "textRun": { - "content": " 'google_play': GooglePlayPurchaseHandler(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74805 - }, - { - "endIndex": 74875, - "paragraph": { - "elements": [ - { - "endIndex": 74875, - "startIndex": 74851, - "textRun": { - "content": " androidPublisher,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74851 - }, - { - "endIndex": 74896, - "paragraph": { - "elements": [ - { - "endIndex": 74896, - "startIndex": 74875, - "textRun": { - "content": " iapRepository,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74875 - }, - { - "endIndex": 74920, - "paragraph": { - "elements": [ - { - "endIndex": 74920, - "startIndex": 74896, - "textRun": { - "content": " pubsubApi, // new\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74896 - }, - { - "endIndex": 74927, - "paragraph": { - "elements": [ - { - "endIndex": 74927, - "startIndex": 74920, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74920 - }, - { - "endIndex": 74969, - "paragraph": { - "elements": [ - { - "endIndex": 74969, - "startIndex": 74927, - "textRun": { - "content": " 'app_store': AppStorePurchaseHandler(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74927 - }, - { - "endIndex": 74990, - "paragraph": { - "elements": [ - { - "endIndex": 74990, - "startIndex": 74969, - "textRun": { - "content": " iapRepository,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74969 - }, - { - "endIndex": 74997, - "paragraph": { - "elements": [ - { - "endIndex": 74997, - "startIndex": 74990, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74990 - }, - { - "endIndex": 75002, - "paragraph": { - "elements": [ - { - "endIndex": 75002, - "startIndex": 74997, - "textRun": { - "content": " };\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 74997 - } - ], - "endIndex": 75002, - "startIndex": 74793, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 75004, - "paragraph": { - "elements": [ - { - "endIndex": 75004, - "startIndex": 75003, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 75003 - }, - { - "endIndex": 75005, - "paragraph": { - "elements": [ - { - "endIndex": 75005, - "startIndex": 75004, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 75004 - }, - { - "endIndex": 75023, - "paragraph": { - "elements": [ - { - "endIndex": 75023, - "startIndex": 75005, - "textRun": { - "content": "Google Play setup\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.nkijb68mlhu2", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 75005 - }, - { - "endIndex": 75024, - "paragraph": { - "elements": [ - { - "endIndex": 75024, - "startIndex": 75023, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 75023 - }, - { - "endIndex": 75210, - "paragraph": { - "elements": [ - { - "endIndex": 75210, - "startIndex": 75024, - "textRun": { - "content": "You’ve written the code to consume billing events from the pub/sub topic, but you haven’t created the pub/sub topic, nor are you publishing any billing events. It’s time to set this up.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 75024 - }, - { - "endIndex": 75211, - "paragraph": { - "elements": [ - { - "endIndex": 75211, - "startIndex": 75210, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 75210 - }, - { - "endIndex": 75242, - "paragraph": { - "elements": [ - { - "endIndex": 75242, - "startIndex": 75211, - "textRun": { - "content": "First, create a pub/sub topic:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 75211 - }, - { - "endIndex": 75300, - "paragraph": { - "bullet": { - "listId": "kix.pltqaannoum0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 75252, - "startIndex": 75242, - "textRun": { - "content": "Visit the ", - "textStyle": {} - } - }, - { - "endIndex": 75270, - "startIndex": 75252, - "textRun": { - "content": "Cloud Pub/Sub page", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://console.cloud.google.com/cloudpubsub/topic/list" - }, - "underline": true - } - } - }, - { - "endIndex": 75300, - "startIndex": 75270, - "textRun": { - "content": " on the Google Cloud Console.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 75242 - }, - { - "endIndex": 75374, - "paragraph": { - "bullet": { - "listId": "kix.pltqaannoum0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 75355, - "startIndex": 75300, - "textRun": { - "content": "Ensure that you’re on your Firebase project, and click ", - "textStyle": {} - } - }, - { - "endIndex": 75369, - "startIndex": 75355, - "textRun": { - "content": "+ Create Topic", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 75371, - "startIndex": 75369, - "textRun": { - "content": ".\u000b", - "textStyle": {} - } - }, - { - "endIndex": 75372, - "inlineObjectElement": { - "inlineObjectId": "kix.vsyt8x9u450c", - "textStyle": {} - }, - "startIndex": 75371 - }, - { - "endIndex": 75374, - "startIndex": 75372, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 75300 - }, - { - "endIndex": 75603, - "paragraph": { - "bullet": { - "listId": "kix.pltqaannoum0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 75432, - "startIndex": 75374, - "textRun": { - "content": "Give the new topic a name, identical to the value set for ", - "textStyle": {} - } - }, - { - "endIndex": 75465, - "startIndex": 75432, - "textRun": { - "content": "GOOGLE_PLAY_PUBSUB_BILLING_TOPIC ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 75467, - "startIndex": 75465, - "textRun": { - "content": "in", - "textStyle": {} - } - }, - { - "endIndex": 75480, - "startIndex": 75467, - "textRun": { - "content": " constants.ts", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 75504, - "startIndex": 75480, - "textRun": { - "content": ". In this case, name it ", - "textStyle": {} - } - }, - { - "endIndex": 75516, - "startIndex": 75504, - "textRun": { - "content": "play_billing", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 75568, - "startIndex": 75516, - "textRun": { - "content": ". If you choose something else, make sure to update ", - "textStyle": {} - } - }, - { - "endIndex": 75580, - "startIndex": 75568, - "textRun": { - "content": "constants.ts", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 75600, - "startIndex": 75580, - "textRun": { - "content": ". Create the topic.\u000b", - "textStyle": {} - } - }, - { - "endIndex": 75601, - "inlineObjectElement": { - "inlineObjectId": "kix.5xdu2wapi4y2", - "textStyle": {} - }, - "startIndex": 75600 - }, - { - "endIndex": 75603, - "startIndex": 75601, - "textRun": { - "content": "\u000b\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 75374 - }, - { - "endIndex": 75731, - "paragraph": { - "bullet": { - "listId": "kix.pltqaannoum0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 75711, - "startIndex": 75603, - "textRun": { - "content": "In the list of your pub/sub topics, click the three vertical dots for the topic you just created, and click ", - "textStyle": {} - } - }, - { - "endIndex": 75727, - "startIndex": 75711, - "textRun": { - "content": "View permissions", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 75729, - "startIndex": 75727, - "textRun": { - "content": ".\u000b", - "textStyle": {} - } - }, - { - "endIndex": 75730, - "inlineObjectElement": { - "inlineObjectId": "kix.k80ohjcbndwt", - "textStyle": {} - }, - "startIndex": 75729 - }, - { - "endIndex": 75731, - "startIndex": 75730, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 75603 - }, - { - "endIndex": 75782, - "paragraph": { - "bullet": { - "listId": "kix.pltqaannoum0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 75767, - "startIndex": 75731, - "textRun": { - "content": "In the sidebar on the right, choose ", - "textStyle": {} - } - }, - { - "endIndex": 75780, - "startIndex": 75767, - "textRun": { - "content": "Add principal", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 75782, - "startIndex": 75780, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 75731 - }, - { - "endIndex": 75902, - "paragraph": { - "bullet": { - "listId": "kix.pltqaannoum0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 75792, - "startIndex": 75782, - "textRun": { - "content": "Here, add ", - "textStyle": {} - } - }, - { - "endIndex": 75854, - "startIndex": 75792, - "textRun": { - "content": "google-play-developer-notifications@system.gserviceaccount.com", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 75881, - "startIndex": 75854, - "textRun": { - "content": ", and grant it the role of ", - "textStyle": {} - } - }, - { - "endIndex": 75898, - "startIndex": 75881, - "textRun": { - "content": "Pub/Sub Publisher", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 75900, - "startIndex": 75898, - "textRun": { - "content": ".\u000b", - "textStyle": {} - } - }, - { - "endIndex": 75901, - "inlineObjectElement": { - "inlineObjectId": "kix.1bvcn5cpml5v", - "textStyle": {} - }, - "startIndex": 75900 - }, - { - "endIndex": 75902, - "startIndex": 75901, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 75782 - }, - { - "endIndex": 75931, - "paragraph": { - "bullet": { - "listId": "kix.pltqaannoum0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 75931, - "startIndex": 75902, - "textRun": { - "content": "Save the permission changes.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 75902 - }, - { - "endIndex": 75985, - "paragraph": { - "bullet": { - "listId": "kix.pltqaannoum0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 75940, - "startIndex": 75931, - "textRun": { - "content": "Copy the ", - "textStyle": {} - } - }, - { - "endIndex": 75950, - "startIndex": 75940, - "textRun": { - "content": "Topic name", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 75985, - "startIndex": 75950, - "textRun": { - "content": " of the topic you’ve just created.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 75931 - }, - { - "endIndex": 76058, - "paragraph": { - "bullet": { - "listId": "kix.pltqaannoum0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 76043, - "startIndex": 75985, - "textRun": { - "content": "Open the Play Console again, and choose your app from the ", - "textStyle": {} - } - }, - { - "endIndex": 76051, - "startIndex": 76043, - "textRun": { - "content": "All Apps", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 76058, - "startIndex": 76051, - "textRun": { - "content": " list.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 75985 - }, - { - "endIndex": 76111, - "paragraph": { - "bullet": { - "listId": "kix.pltqaannoum0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 76080, - "startIndex": 76058, - "textRun": { - "content": "Scroll down and go to ", - "textStyle": {} - } - }, - { - "endIndex": 76109, - "startIndex": 76080, - "textRun": { - "content": "Monetize > Monetization Setup", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 76111, - "startIndex": 76109, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 76058 - }, - { - "endIndex": 76160, - "paragraph": { - "bullet": { - "listId": "kix.pltqaannoum0", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 76158, - "startIndex": 76111, - "textRun": { - "content": "Fill in the full topic and save your changes. \u000b", - "textStyle": {} - } - }, - { - "endIndex": 76159, - "inlineObjectElement": { - "inlineObjectId": "kix.30fj9inmygy5", - "textStyle": {} - }, - "startIndex": 76158 - }, - { - "endIndex": 76160, - "startIndex": 76159, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 76111 - }, - { - "endIndex": 76227, - "paragraph": { - "elements": [ - { - "endIndex": 76226, - "startIndex": 76160, - "textRun": { - "content": "All Google Play billing events will now be published on the topic.", - "textStyle": {} - } - }, - { - "endIndex": 76227, - "startIndex": 76226, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 76160 - }, - { - "endIndex": 76228, - "paragraph": { - "elements": [ - { - "endIndex": 76228, - "startIndex": 76227, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.59om19b6p0vr", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 76227 - }, - { - "endIndex": 76261, - "paragraph": { - "elements": [ - { - "endIndex": 76261, - "startIndex": 76228, - "textRun": { - "content": "Process App Store billing events\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.cbs9z18fhfqs", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 76228 - }, - { - "endIndex": 76262, - "paragraph": { - "elements": [ - { - "endIndex": 76262, - "startIndex": 76261, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 76261 - }, - { - "endIndex": 76672, - "paragraph": { - "elements": [ - { - "endIndex": 76672, - "startIndex": 76262, - "textRun": { - "content": "Next, do the same for the App Store billing events. There are two effective ways to implement handling updates in purchases for the App Store. One is by implementing a webhook that you provide to Apple and they use to communicate with your server. The second way, which is the one you will find in this codelab, is by connecting to the App Store Server API and obtaining the subscription information manually.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 76262 - }, - { - "endIndex": 76673, - "paragraph": { - "elements": [ - { - "endIndex": 76673, - "startIndex": 76672, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 76672 - }, - { - "endIndex": 76831, - "paragraph": { - "elements": [ - { - "endIndex": 76831, - "startIndex": 76673, - "textRun": { - "content": "The reason why this codelab focuses on the second solution is because you would have to expose your server to the Internet in order to implement the webhook.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 76673 - }, - { - "endIndex": 76832, - "paragraph": { - "elements": [ - { - "endIndex": 76832, - "startIndex": 76831, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 76831 - }, - { - "endIndex": 77041, - "paragraph": { - "elements": [ - { - "endIndex": 77041, - "startIndex": 76832, - "textRun": { - "content": "In a production environment, ideally you would like to have both. The webhook to obtain events from the App Store, and the Server API in case you missed an event or need to double check a subscription status.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 76832 - }, - { - "endIndex": 77042, - "paragraph": { - "elements": [ - { - "endIndex": 77042, - "startIndex": 77041, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 77041 - }, - { - "endIndex": 77144, - "paragraph": { - "elements": [ - { - "endIndex": 77062, - "startIndex": 77042, - "textRun": { - "content": "Start by opening up ", - "textStyle": {} - } - }, - { - "endIndex": 77097, - "startIndex": 77062, - "textRun": { - "content": "lib/app_store_purchase_handler.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 77144, - "startIndex": 77097, - "textRun": { - "content": ", and adding the AppStoreServerAPI dependency:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 77042 - }, - { - "endIndex": 77181, - "paragraph": { - "elements": [ - { - "endIndex": 77145, - "startIndex": 77144, - "textRun": { - "content": "\u000b", - "textStyle": {} - } - }, - { - "endIndex": 77180, - "startIndex": 77145, - "textRun": { - "content": "lib/app_store_purchase_handler.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/dart-backend/lib/app_store_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 77181, - "startIndex": 77180, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 77144 - }, - { - "endIndex": 77311, - "startIndex": 77181, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 77310, - "startIndex": 77182, - "tableCells": [ - { - "content": [ - { - "endIndex": 77227, - "paragraph": { - "elements": [ - { - "endIndex": 77227, - "startIndex": 77184, - "textRun": { - "content": "final AppStoreServerAPI appStoreServerAPI;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77184 - }, - { - "endIndex": 77228, - "paragraph": { - "elements": [ - { - "endIndex": 77228, - "startIndex": 77227, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77227 - }, - { - "endIndex": 77253, - "paragraph": { - "elements": [ - { - "endIndex": 77253, - "startIndex": 77228, - "textRun": { - "content": "AppStorePurchaseHandler(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77228 - }, - { - "endIndex": 77275, - "paragraph": { - "elements": [ - { - "endIndex": 77275, - "startIndex": 77253, - "textRun": { - "content": " this.iapRepository,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77253 - }, - { - "endIndex": 77308, - "paragraph": { - "elements": [ - { - "endIndex": 77308, - "startIndex": 77275, - "textRun": { - "content": " this.appStoreServerAPI, // new\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77275 - }, - { - "endIndex": 77310, - "paragraph": { - "elements": [ - { - "endIndex": 77310, - "startIndex": 77308, - "textRun": { - "content": ")\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77308 - } - ], - "endIndex": 77310, - "startIndex": 77183, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 77312, - "paragraph": { - "elements": [ - { - "endIndex": 77312, - "startIndex": 77311, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 77311 - }, - { - "endIndex": 77510, - "paragraph": { - "elements": [ - { - "endIndex": 77372, - "startIndex": 77312, - "textRun": { - "content": "Modify the constructor to add a timer that will call to the ", - "textStyle": {} - } - }, - { - "endIndex": 77383, - "startIndex": 77372, - "textRun": { - "content": "_pullStatus", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 77423, - "startIndex": 77383, - "textRun": { - "content": " method. This timer will be calling the ", - "textStyle": {} - } - }, - { - "endIndex": 77434, - "startIndex": 77423, - "textRun": { - "content": "_pullStatus", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 77510, - "startIndex": 77434, - "textRun": { - "content": " method every 10 seconds. You can adjust this timer duration to your needs.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 77312 - }, - { - "endIndex": 77511, - "paragraph": { - "elements": [ - { - "endIndex": 77511, - "startIndex": 77510, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 77510 - }, - { - "endIndex": 77547, - "paragraph": { - "elements": [ - { - "endIndex": 77546, - "startIndex": 77511, - "textRun": { - "content": "lib/app_store_purchase_handler.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/dart-backend/lib/app_store_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 77547, - "startIndex": 77546, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 77511 - }, - { - "endIndex": 77767, - "startIndex": 77547, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 77766, - "startIndex": 77548, - "tableCells": [ - { - "content": [ - { - "endIndex": 77577, - "paragraph": { - "elements": [ - { - "endIndex": 77577, - "startIndex": 77550, - "textRun": { - "content": " AppStorePurchaseHandler(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77550 - }, - { - "endIndex": 77601, - "paragraph": { - "elements": [ - { - "endIndex": 77601, - "startIndex": 77577, - "textRun": { - "content": " this.iapRepository,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77577 - }, - { - "endIndex": 77629, - "paragraph": { - "elements": [ - { - "endIndex": 77629, - "startIndex": 77601, - "textRun": { - "content": " this.appStoreServerAPI,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77601 - }, - { - "endIndex": 77635, - "paragraph": { - "elements": [ - { - "endIndex": 77635, - "startIndex": 77629, - "textRun": { - "content": " ) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77629 - }, - { - "endIndex": 77685, - "paragraph": { - "elements": [ - { - "endIndex": 77685, - "startIndex": 77635, - "textRun": { - "content": " // Poll Subscription status every 10 seconds.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77635 - }, - { - "endIndex": 77733, - "paragraph": { - "elements": [ - { - "endIndex": 77733, - "startIndex": 77685, - "textRun": { - "content": " Timer.periodic(Duration(seconds: 10), (_) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77685 - }, - { - "endIndex": 77754, - "paragraph": { - "elements": [ - { - "endIndex": 77754, - "startIndex": 77733, - "textRun": { - "content": " _pullStatus();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77733 - }, - { - "endIndex": 77762, - "paragraph": { - "elements": [ - { - "endIndex": 77762, - "startIndex": 77754, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77754 - }, - { - "endIndex": 77766, - "paragraph": { - "elements": [ - { - "endIndex": 77766, - "startIndex": 77762, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77762 - } - ], - "endIndex": 77766, - "startIndex": 77549, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 77768, - "paragraph": { - "elements": [ - { - "endIndex": 77768, - "startIndex": 77767, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 77767 - }, - { - "endIndex": 77816, - "paragraph": { - "elements": [ - { - "endIndex": 77816, - "startIndex": 77768, - "textRun": { - "content": "Then, create the _pullStatus method as follows:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 77768 - }, - { - "endIndex": 77817, - "paragraph": { - "elements": [ - { - "endIndex": 77817, - "startIndex": 77816, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 77816 - }, - { - "endIndex": 77853, - "paragraph": { - "elements": [ - { - "endIndex": 77852, - "startIndex": 77817, - "textRun": { - "content": "lib/app_store_purchase_handler.dart", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/dart-backend/lib/app_store_purchase_handler.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 77853, - "startIndex": 77852, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 77817 - }, - { - "endIndex": 79614, - "startIndex": 77853, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 79613, - "startIndex": 77854, - "tableCells": [ - { - "content": [ - { - "endIndex": 77893, - "paragraph": { - "elements": [ - { - "endIndex": 77893, - "startIndex": 77856, - "textRun": { - "content": " Future _pullStatus() async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77856 - }, - { - "endIndex": 77925, - "paragraph": { - "elements": [ - { - "endIndex": 77925, - "startIndex": 77893, - "textRun": { - "content": " print('Polling App Store');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77893 - }, - { - "endIndex": 77983, - "paragraph": { - "elements": [ - { - "endIndex": 77983, - "startIndex": 77925, - "textRun": { - "content": " final purchases = await iapRepository.getPurchases();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77925 - }, - { - "endIndex": 78025, - "paragraph": { - "elements": [ - { - "endIndex": 78025, - "startIndex": 77983, - "textRun": { - "content": " // filter for App Store subscriptions\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 77983 - }, - { - "endIndex": 78088, - "paragraph": { - "elements": [ - { - "endIndex": 78088, - "startIndex": 78025, - "textRun": { - "content": " final appStoreSubscriptions = purchases.where((element) =>\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78025 - }, - { - "endIndex": 78140, - "paragraph": { - "elements": [ - { - "endIndex": 78140, - "startIndex": 78088, - "textRun": { - "content": " element.type == ProductType.subscription &&\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78088 - }, - { - "endIndex": 78190, - "paragraph": { - "elements": [ - { - "endIndex": 78190, - "startIndex": 78140, - "textRun": { - "content": " element.iapSource == IAPSource.appstore);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78140 - }, - { - "endIndex": 78242, - "paragraph": { - "elements": [ - { - "endIndex": 78242, - "startIndex": 78190, - "textRun": { - "content": " for (final purchase in appStoreSubscriptions) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78190 - }, - { - "endIndex": 78263, - "paragraph": { - "elements": [ - { - "endIndex": 78263, - "startIndex": 78242, - "textRun": { - "content": " final status =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78242 - }, - { - "endIndex": 78343, - "paragraph": { - "elements": [ - { - "endIndex": 78343, - "startIndex": 78263, - "textRun": { - "content": " await appStoreServerAPI.getAllSubscriptionStatuses(purchase.orderId);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78263 - }, - { - "endIndex": 78395, - "paragraph": { - "elements": [ - { - "endIndex": 78395, - "startIndex": 78343, - "textRun": { - "content": " // Obtain all subscriptions for the order id.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78343 - }, - { - "endIndex": 78443, - "paragraph": { - "elements": [ - { - "endIndex": 78443, - "startIndex": 78395, - "textRun": { - "content": " for (final subscription in status.data) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78395 - }, - { - "endIndex": 78505, - "paragraph": { - "elements": [ - { - "endIndex": 78505, - "startIndex": 78443, - "textRun": { - "content": " // Last transaction contains the subscription status.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78443 - }, - { - "endIndex": 78572, - "paragraph": { - "elements": [ - { - "endIndex": 78572, - "startIndex": 78505, - "textRun": { - "content": " for (final transaction in subscription.lastTransactions) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78505 - }, - { - "endIndex": 78642, - "paragraph": { - "elements": [ - { - "endIndex": 78642, - "startIndex": 78572, - "textRun": { - "content": " final expirationDate = DateTime.fromMillisecondsSinceEpoch(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78572 - }, - { - "endIndex": 78703, - "paragraph": { - "elements": [ - { - "endIndex": 78703, - "startIndex": 78642, - "textRun": { - "content": " transaction.transactionInfo.expiresDate ?? 0);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78642 - }, - { - "endIndex": 78751, - "paragraph": { - "elements": [ - { - "endIndex": 78751, - "startIndex": 78703, - "textRun": { - "content": " // Check if subscription has expired.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78703 - }, - { - "endIndex": 78820, - "paragraph": { - "elements": [ - { - "endIndex": 78820, - "startIndex": 78751, - "textRun": { - "content": " final isExpired = expirationDate.isBefore(DateTime.now());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78751 - }, - { - "endIndex": 78897, - "paragraph": { - "elements": [ - { - "endIndex": 78897, - "startIndex": 78820, - "textRun": { - "content": " print('Expiration Date: $expirationDate - isExpired: $isExpired');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78820 - }, - { - "endIndex": 78982, - "paragraph": { - "elements": [ - { - "endIndex": 78982, - "startIndex": 78897, - "textRun": { - "content": " // Update the subscription status with the new expiration date and status.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78897 - }, - { - "endIndex": 79049, - "paragraph": { - "elements": [ - { - "endIndex": 79049, - "startIndex": 78982, - "textRun": { - "content": " await iapRepository.updatePurchase(SubscriptionPurchase(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 78982 - }, - { - "endIndex": 79075, - "paragraph": { - "elements": [ - { - "endIndex": 79075, - "startIndex": 79049, - "textRun": { - "content": " userId: null,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79049 - }, - { - "endIndex": 79137, - "paragraph": { - "elements": [ - { - "endIndex": 79137, - "startIndex": 79075, - "textRun": { - "content": " productId: transaction.transactionInfo.productId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79075 - }, - { - "endIndex": 79180, - "paragraph": { - "elements": [ - { - "endIndex": 79180, - "startIndex": 79137, - "textRun": { - "content": " iapSource: IAPSource.appstore,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79137 - }, - { - "endIndex": 79236, - "paragraph": { - "elements": [ - { - "endIndex": 79236, - "startIndex": 79180, - "textRun": { - "content": " orderId: transaction.originalTransactionId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79180 - }, - { - "endIndex": 79299, - "paragraph": { - "elements": [ - { - "endIndex": 79299, - "startIndex": 79236, - "textRun": { - "content": " purchaseDate: DateTime.fromMillisecondsSinceEpoch(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79236 - }, - { - "endIndex": 79366, - "paragraph": { - "elements": [ - { - "endIndex": 79366, - "startIndex": 79299, - "textRun": { - "content": " transaction.transactionInfo.originalPurchaseDate),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79299 - }, - { - "endIndex": 79410, - "paragraph": { - "elements": [ - { - "endIndex": 79410, - "startIndex": 79366, - "textRun": { - "content": " type: ProductType.subscription,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79366 - }, - { - "endIndex": 79450, - "paragraph": { - "elements": [ - { - "endIndex": 79450, - "startIndex": 79410, - "textRun": { - "content": " expiryDate: expirationDate,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79410 - }, - { - "endIndex": 79480, - "paragraph": { - "elements": [ - { - "endIndex": 79480, - "startIndex": 79450, - "textRun": { - "content": " status: isExpired\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79450 - }, - { - "endIndex": 79525, - "paragraph": { - "elements": [ - { - "endIndex": 79525, - "startIndex": 79480, - "textRun": { - "content": " ? SubscriptionStatus.expired\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79480 - }, - { - "endIndex": 79570, - "paragraph": { - "elements": [ - { - "endIndex": 79570, - "startIndex": 79525, - "textRun": { - "content": " : SubscriptionStatus.active,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79525 - }, - { - "endIndex": 79584, - "paragraph": { - "elements": [ - { - "endIndex": 79584, - "startIndex": 79570, - "textRun": { - "content": " ));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79570 - }, - { - "endIndex": 79594, - "paragraph": { - "elements": [ - { - "endIndex": 79594, - "startIndex": 79584, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79584 - }, - { - "endIndex": 79602, - "paragraph": { - "elements": [ - { - "endIndex": 79602, - "startIndex": 79594, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79594 - }, - { - "endIndex": 79608, - "paragraph": { - "elements": [ - { - "endIndex": 79608, - "startIndex": 79602, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79602 - }, - { - "endIndex": 79612, - "paragraph": { - "elements": [ - { - "endIndex": 79612, - "startIndex": 79608, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79608 - }, - { - "endIndex": 79613, - "paragraph": { - "elements": [ - { - "endIndex": 79613, - "startIndex": 79612, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79612 - } - ], - "endIndex": 79613, - "startIndex": 77855, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 79615, - "paragraph": { - "elements": [ - { - "endIndex": 79615, - "startIndex": 79614, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 79614 - }, - { - "endIndex": 79645, - "paragraph": { - "elements": [ - { - "endIndex": 79645, - "startIndex": 79615, - "textRun": { - "content": "This method works as follow: \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 79615 - }, - { - "endIndex": 79726, - "paragraph": { - "bullet": { - "listId": "kix.nvpgk8rs848i", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 79726, - "startIndex": 79645, - "textRun": { - "content": "Obtains the list of active subscriptions from Firestore using the IapRepository.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79645 - }, - { - "endIndex": 79807, - "paragraph": { - "bullet": { - "listId": "kix.nvpgk8rs848i", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 79807, - "startIndex": 79726, - "textRun": { - "content": "For each order, it requests the subscription status to the App Store Server API.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79726 - }, - { - "endIndex": 79868, - "paragraph": { - "bullet": { - "listId": "kix.nvpgk8rs848i", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 79868, - "startIndex": 79807, - "textRun": { - "content": "Obtains the last transaction for that subscription purchase.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79807 - }, - { - "endIndex": 79896, - "paragraph": { - "bullet": { - "listId": "kix.nvpgk8rs848i", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 79896, - "startIndex": 79868, - "textRun": { - "content": "Checks the expiration date.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79868 - }, - { - "endIndex": 79986, - "paragraph": { - "bullet": { - "listId": "kix.nvpgk8rs848i", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 79986, - "startIndex": 79896, - "textRun": { - "content": "Updates the subscription status on Firestore, if it is expired it will be marked as such.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79896 - }, - { - "endIndex": 79987, - "paragraph": { - "elements": [ - { - "endIndex": 79987, - "startIndex": 79986, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 79986 - }, - { - "endIndex": 79988, - "paragraph": { - "elements": [ - { - "endIndex": 79988, - "startIndex": 79987, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 79987 - }, - { - "endIndex": 80275, - "startIndex": 79988, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 80274, - "startIndex": 79989, - "tableCells": [ - { - "content": [ - { - "endIndex": 80274, - "paragraph": { - "elements": [ - { - "endIndex": 79996, - "startIndex": 79991, - "textRun": { - "content": "Note:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 80274, - "startIndex": 79996, - "textRun": { - "content": " This codelab is presented as a basic example for handling expiring subscriptions. In a production environment, you will have to handle different types of events like renewals, cancellations, offers, etc. As well, you should implement the event webhook as recommended by Apple.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 79991 - } - ], - "endIndex": 80274, - "startIndex": 79990, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8039216, - "green": 0.8980392, - "red": 0.9882353 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 80276, - "paragraph": { - "elements": [ - { - "endIndex": 80276, - "startIndex": 80275, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 80275 - }, - { - "endIndex": 80359, - "paragraph": { - "elements": [ - { - "endIndex": 80359, - "startIndex": 80276, - "textRun": { - "content": "\u000bFinally, add all the necessary code to configure the App Store Server API access:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 80276 - }, - { - "endIndex": 80375, - "paragraph": { - "elements": [ - { - "endIndex": 80374, - "startIndex": 80359, - "textRun": { - "content": "bin/server.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/dart-backend/bin/server.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 80375, - "startIndex": 80374, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hox2bo38k8ju", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 80359 - }, - { - "endIndex": 81428, - "startIndex": 80375, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 81427, - "startIndex": 80376, - "tableCells": [ - { - "content": [ - { - "endIndex": 80397, - "paragraph": { - "elements": [ - { - "endIndex": 80397, - "startIndex": 80378, - "textRun": { - "content": " // add from here\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80378 - }, - { - "endIndex": 80431, - "paragraph": { - "elements": [ - { - "endIndex": 80431, - "startIndex": 80397, - "textRun": { - "content": " final subscriptionKeyAppStore =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80397 - }, - { - "endIndex": 80491, - "paragraph": { - "elements": [ - { - "endIndex": 80491, - "startIndex": 80431, - "textRun": { - "content": " File('assets/SubscriptionKey.p8').readAsStringSync();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80431 - }, - { - "endIndex": 80492, - "paragraph": { - "elements": [ - { - "endIndex": 80492, - "startIndex": 80491, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80491 - }, - { - "endIndex": 80530, - "paragraph": { - "elements": [ - { - "endIndex": 80530, - "startIndex": 80492, - "textRun": { - "content": " // Configure Apple Store API access\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80492 - }, - { - "endIndex": 80587, - "paragraph": { - "elements": [ - { - "endIndex": 80587, - "startIndex": 80530, - "textRun": { - "content": " var appStoreEnvironment = AppStoreEnvironment.sandbox(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80530 - }, - { - "endIndex": 80611, - "paragraph": { - "elements": [ - { - "endIndex": 80611, - "startIndex": 80587, - "textRun": { - "content": " bundleId: bundleId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80587 - }, - { - "endIndex": 80643, - "paragraph": { - "elements": [ - { - "endIndex": 80643, - "startIndex": 80611, - "textRun": { - "content": " issuerId: appStoreIssuerId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80611 - }, - { - "endIndex": 80669, - "paragraph": { - "elements": [ - { - "endIndex": 80669, - "startIndex": 80643, - "textRun": { - "content": " keyId: appStoreKeyId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80643 - }, - { - "endIndex": 80710, - "paragraph": { - "elements": [ - { - "endIndex": 80710, - "startIndex": 80669, - "textRun": { - "content": " privateKey: subscriptionKeyAppStore,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80669 - }, - { - "endIndex": 80715, - "paragraph": { - "elements": [ - { - "endIndex": 80715, - "startIndex": 80710, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80710 - }, - { - "endIndex": 80716, - "paragraph": { - "elements": [ - { - "endIndex": 80716, - "startIndex": 80715, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80715 - }, - { - "endIndex": 80775, - "paragraph": { - "elements": [ - { - "endIndex": 80775, - "startIndex": 80716, - "textRun": { - "content": " // Stored token for Apple Store API access, if available\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80716 - }, - { - "endIndex": 80821, - "paragraph": { - "elements": [ - { - "endIndex": 80821, - "startIndex": 80775, - "textRun": { - "content": " final file = File('assets/appstore.token');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80775 - }, - { - "endIndex": 80846, - "paragraph": { - "elements": [ - { - "endIndex": 80846, - "startIndex": 80821, - "textRun": { - "content": " String? appStoreToken;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80821 - }, - { - "endIndex": 80898, - "paragraph": { - "elements": [ - { - "endIndex": 80898, - "startIndex": 80846, - "textRun": { - "content": " if (file.existsSync() && file.lengthSync() > 0) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80846 - }, - { - "endIndex": 80943, - "paragraph": { - "elements": [ - { - "endIndex": 80943, - "startIndex": 80898, - "textRun": { - "content": " appStoreToken = file.readAsStringSync();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80898 - }, - { - "endIndex": 80947, - "paragraph": { - "elements": [ - { - "endIndex": 80947, - "startIndex": 80943, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80943 - }, - { - "endIndex": 80948, - "paragraph": { - "elements": [ - { - "endIndex": 80948, - "startIndex": 80947, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80947 - }, - { - "endIndex": 80995, - "paragraph": { - "elements": [ - { - "endIndex": 80995, - "startIndex": 80948, - "textRun": { - "content": " final appStoreServerAPI = AppStoreServerAPI(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80948 - }, - { - "endIndex": 81025, - "paragraph": { - "elements": [ - { - "endIndex": 81025, - "startIndex": 80995, - "textRun": { - "content": " AppStoreServerHttpClient(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80995 - }, - { - "endIndex": 81052, - "paragraph": { - "elements": [ - { - "endIndex": 81052, - "startIndex": 81025, - "textRun": { - "content": " appStoreEnvironment,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81025 - }, - { - "endIndex": 81078, - "paragraph": { - "elements": [ - { - "endIndex": 81078, - "startIndex": 81052, - "textRun": { - "content": " jwt: appStoreToken,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81052 - }, - { - "endIndex": 81119, - "paragraph": { - "elements": [ - { - "endIndex": 81119, - "startIndex": 81078, - "textRun": { - "content": " jwtTokenUpdatedCallback: (token) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81078 - }, - { - "endIndex": 81158, - "paragraph": { - "elements": [ - { - "endIndex": 81158, - "startIndex": 81119, - "textRun": { - "content": " file.writeAsStringSync(token);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81119 - }, - { - "endIndex": 81167, - "paragraph": { - "elements": [ - { - "endIndex": 81167, - "startIndex": 81158, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81158 - }, - { - "endIndex": 81174, - "paragraph": { - "elements": [ - { - "endIndex": 81174, - "startIndex": 81167, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81167 - }, - { - "endIndex": 81179, - "paragraph": { - "elements": [ - { - "endIndex": 81179, - "startIndex": 81174, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81174 - }, - { - "endIndex": 81192, - "paragraph": { - "elements": [ - { - "endIndex": 81192, - "startIndex": 81179, - "textRun": { - "content": " // to here\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81179 - }, - { - "endIndex": 81193, - "paragraph": { - "elements": [ - { - "endIndex": 81193, - "startIndex": 81192, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81192 - }, - { - "endIndex": 81194, - "paragraph": { - "elements": [ - { - "endIndex": 81194, - "startIndex": 81193, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81193 - }, - { - "endIndex": 81205, - "paragraph": { - "elements": [ - { - "endIndex": 81205, - "startIndex": 81194, - "textRun": { - "content": " return {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81194 - }, - { - "endIndex": 81251, - "paragraph": { - "elements": [ - { - "endIndex": 81251, - "startIndex": 81205, - "textRun": { - "content": " 'google_play': GooglePlayPurchaseHandler(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81205 - }, - { - "endIndex": 81275, - "paragraph": { - "elements": [ - { - "endIndex": 81275, - "startIndex": 81251, - "textRun": { - "content": " androidPublisher,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81251 - }, - { - "endIndex": 81296, - "paragraph": { - "elements": [ - { - "endIndex": 81296, - "startIndex": 81275, - "textRun": { - "content": " iapRepository,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81275 - }, - { - "endIndex": 81313, - "paragraph": { - "elements": [ - { - "endIndex": 81313, - "startIndex": 81296, - "textRun": { - "content": " pubsubApi,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81296 - }, - { - "endIndex": 81320, - "paragraph": { - "elements": [ - { - "endIndex": 81320, - "startIndex": 81313, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81313 - }, - { - "endIndex": 81362, - "paragraph": { - "elements": [ - { - "endIndex": 81362, - "startIndex": 81320, - "textRun": { - "content": " 'app_store': AppStorePurchaseHandler(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81320 - }, - { - "endIndex": 81383, - "paragraph": { - "elements": [ - { - "endIndex": 81383, - "startIndex": 81362, - "textRun": { - "content": " iapRepository,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81362 - }, - { - "endIndex": 81415, - "paragraph": { - "elements": [ - { - "endIndex": 81415, - "startIndex": 81383, - "textRun": { - "content": " appStoreServerAPI, // new\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81383 - }, - { - "endIndex": 81422, - "paragraph": { - "elements": [ - { - "endIndex": 81422, - "startIndex": 81415, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81415 - }, - { - "endIndex": 81427, - "paragraph": { - "elements": [ - { - "endIndex": 81427, - "startIndex": 81422, - "textRun": { - "content": " };\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81422 - } - ], - "endIndex": 81427, - "startIndex": 80377, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 81429, - "paragraph": { - "elements": [ - { - "endIndex": 81429, - "startIndex": 81428, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 81428 - }, - { - "endIndex": 81445, - "paragraph": { - "elements": [ - { - "endIndex": 81445, - "startIndex": 81429, - "textRun": { - "content": "App Store setup\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.easdahjt03hd", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 81429 - }, - { - "endIndex": 81446, - "paragraph": { - "elements": [ - { - "endIndex": 81446, - "startIndex": 81445, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 81445 - }, - { - "endIndex": 81474, - "paragraph": { - "elements": [ - { - "endIndex": 81474, - "startIndex": 81446, - "textRun": { - "content": "Next, set up the App Store:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 81446 - }, - { - "endIndex": 81475, - "paragraph": { - "elements": [ - { - "endIndex": 81475, - "startIndex": 81474, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 81474 - }, - { - "endIndex": 81533, - "paragraph": { - "bullet": { - "listId": "kix.dvi16evrie1w", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 81485, - "startIndex": 81475, - "textRun": { - "content": "Log in to ", - "textStyle": {} - } - }, - { - "endIndex": 81502, - "startIndex": 81485, - "textRun": { - "content": "App Store Connect", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://appstoreconnect.apple.com/" - }, - "underline": true - } - } - }, - { - "endIndex": 81515, - "startIndex": 81502, - "textRun": { - "content": ", and select ", - "textStyle": {} - } - }, - { - "endIndex": 81531, - "startIndex": 81515, - "textRun": { - "content": "Users and Access", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 81533, - "startIndex": 81531, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81475 - }, - { - "endIndex": 81567, - "paragraph": { - "bullet": { - "listId": "kix.dvi16evrie1w", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 81538, - "startIndex": 81533, - "textRun": { - "content": "Go to", - "textStyle": {} - } - }, - { - "endIndex": 81565, - "startIndex": 81538, - "textRun": { - "content": " Key Type > In-App Purchase", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 81567, - "startIndex": 81565, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81533 - }, - { - "endIndex": 81608, - "paragraph": { - "bullet": { - "listId": "kix.dvi16evrie1w", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 81608, - "startIndex": 81567, - "textRun": { - "content": "Tap on the “plus” icon to add a new one.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81567 - }, - { - "endIndex": 81644, - "paragraph": { - "bullet": { - "listId": "kix.dvi16evrie1w", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 81644, - "startIndex": 81608, - "textRun": { - "content": "Give it a name, e.g. “Codelab key”.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81608 - }, - { - "endIndex": 81685, - "paragraph": { - "bullet": { - "listId": "kix.dvi16evrie1w", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 81685, - "startIndex": 81644, - "textRun": { - "content": "Download the p8 file containing the key.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81644 - }, - { - "endIndex": 81749, - "paragraph": { - "bullet": { - "listId": "kix.dvi16evrie1w", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 81729, - "startIndex": 81685, - "textRun": { - "content": "Copy it to the assets folder, with the name ", - "textStyle": {} - } - }, - { - "endIndex": 81747, - "startIndex": 81729, - "textRun": { - "content": "SubscriptionKey.p8", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 81749, - "startIndex": 81747, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81685 - }, - { - "endIndex": 81861, - "paragraph": { - "bullet": { - "listId": "kix.dvi16evrie1w", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 81806, - "startIndex": 81749, - "textRun": { - "content": "Copy the key ID from the newly created key and set it to ", - "textStyle": {} - } - }, - { - "endIndex": 81819, - "startIndex": 81806, - "textRun": { - "content": "appStoreKeyId", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 81835, - "startIndex": 81819, - "textRun": { - "content": " constant in the", - "textStyle": {} - } - }, - { - "endIndex": 81854, - "startIndex": 81835, - "textRun": { - "content": " lib/constants.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 81861, - "startIndex": 81854, - "textRun": { - "content": " file.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81749 - }, - { - "endIndex": 81987, - "paragraph": { - "bullet": { - "listId": "kix.dvi16evrie1w", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 81929, - "startIndex": 81861, - "textRun": { - "content": "Copy the Issuer ID right at the top of the keys list, and set it to ", - "textStyle": {} - } - }, - { - "endIndex": 81945, - "startIndex": 81929, - "textRun": { - "content": "appStoreIssuerId", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 81961, - "startIndex": 81945, - "textRun": { - "content": " constant in the", - "textStyle": {} - } - }, - { - "endIndex": 81980, - "startIndex": 81961, - "textRun": { - "content": " lib/constants.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 81986, - "startIndex": 81980, - "textRun": { - "content": " file.", - "textStyle": {} - } - }, - { - "endIndex": 81987, - "startIndex": 81986, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81861 - }, - { - "endIndex": 81988, - "paragraph": { - "elements": [ - { - "endIndex": 81988, - "startIndex": 81987, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 81987 - }, - { - "endIndex": 82128, - "startIndex": 81988, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 82127, - "startIndex": 81989, - "tableCells": [ - { - "content": [ - { - "endIndex": 82127, - "paragraph": { - "elements": [ - { - "endIndex": 81996, - "startIndex": 81991, - "textRun": { - "content": "Note:", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 82127, - "startIndex": 81996, - "textRun": { - "content": " The generated key can only be downloaded once, create a new one if you lose it. Never share your App Store Server API key online.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 81991 - } - ], - "endIndex": 82127, - "startIndex": 81990, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8039216, - "green": 0.8980392, - "red": 0.9882353 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 82129, - "paragraph": { - "elements": [ - { - "endIndex": 82129, - "startIndex": 82128, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 82128 - }, - { - "endIndex": 82131, - "paragraph": { - "elements": [ - { - "endIndex": 82130, - "inlineObjectElement": { - "inlineObjectId": "kix.uca4yzl4krz9", - "textStyle": {} - }, - "startIndex": 82129 - }, - { - "endIndex": 82131, - "startIndex": 82130, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 82129 - }, - { - "endIndex": 82132, - "paragraph": { - "elements": [ - { - "endIndex": 82132, - "startIndex": 82131, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 82131 - }, - { - "endIndex": 82162, - "paragraph": { - "elements": [ - { - "endIndex": 82162, - "startIndex": 82132, - "textRun": { - "content": "Track purchases on the device\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.iuugivjoy0l3", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 82132 - }, - { - "endIndex": 82163, - "paragraph": { - "elements": [ - { - "endIndex": 82163, - "startIndex": 82162, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 82162 - }, - { - "endIndex": 82515, - "paragraph": { - "elements": [ - { - "endIndex": 82515, - "startIndex": 82163, - "textRun": { - "content": "The most secure way to track your purchases is on the server side because the client is hard to secure, but you need to have some way to get the information back to the client so the app can act on the subscription status information. By storing the purchases in Firestore, you can easily sync the data to the client and keep it updated automatically.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 82163 - }, - { - "endIndex": 82516, - "paragraph": { - "elements": [ - { - "endIndex": 82516, - "startIndex": 82515, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 82515 - }, - { - "endIndex": 82887, - "paragraph": { - "elements": [ - { - "endIndex": 82541, - "startIndex": 82516, - "textRun": { - "content": "You already included the ", - "textStyle": {} - } - }, - { - "endIndex": 82548, - "startIndex": 82541, - "textRun": { - "content": "IAPRepo", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/app/lib/repo/iap_repo.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 82645, - "startIndex": 82548, - "textRun": { - "content": " in the app, which is the Firestore repository that contains all of the user’s purchase data in ", - "textStyle": {} - } - }, - { - "endIndex": 82673, - "startIndex": 82645, - "textRun": { - "content": "List purchases", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 82704, - "startIndex": 82673, - "textRun": { - "content": ". The repository also contains ", - "textStyle": {} - } - }, - { - "endIndex": 82726, - "startIndex": 82704, - "textRun": { - "content": "hasActiveSubscription,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 82771, - "startIndex": 82726, - "textRun": { - "content": " which is true when there is a purchase with ", - "textStyle": {} - } - }, - { - "endIndex": 82801, - "startIndex": 82771, - "textRun": { - "content": "productId storeKeySubscription", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 82887, - "startIndex": 82801, - "textRun": { - "content": " with a status that is not expired. When the user isn’t logged in, the list is empty.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 82516 - }, - { - "endIndex": 82910, - "paragraph": { - "elements": [ - { - "endIndex": 82909, - "startIndex": 82887, - "textRun": { - "content": "lib/repo/iap_repo.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/app/lib/repo/iap_repo.dart#L40-L70" - }, - "underline": true - } - } - }, - { - "endIndex": 82910, - "startIndex": 82909, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.xgm7m0la00z6", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 82887 - }, - { - "endIndex": 83793, - "startIndex": 82910, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 83792, - "startIndex": 82911, - "tableCells": [ - { - "content": [ - { - "endIndex": 82940, - "paragraph": { - "elements": [ - { - "endIndex": 82940, - "startIndex": 82913, - "textRun": { - "content": " void updatePurchases() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 82913 - }, - { - "endIndex": 82977, - "paragraph": { - "elements": [ - { - "endIndex": 82977, - "startIndex": 82940, - "textRun": { - "content": " _purchaseSubscription?.cancel();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 82940 - }, - { - "endIndex": 82999, - "paragraph": { - "elements": [ - { - "endIndex": 82999, - "startIndex": 82977, - "textRun": { - "content": " var user = _user;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 82977 - }, - { - "endIndex": 83023, - "paragraph": { - "elements": [ - { - "endIndex": 83023, - "startIndex": 82999, - "textRun": { - "content": " if (user == null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 82999 - }, - { - "endIndex": 83045, - "paragraph": { - "elements": [ - { - "endIndex": 83045, - "startIndex": 83023, - "textRun": { - "content": " purchases = [];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83023 - }, - { - "endIndex": 83082, - "paragraph": { - "elements": [ - { - "endIndex": 83082, - "startIndex": 83045, - "textRun": { - "content": " hasActiveSubscription = false;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83045 - }, - { - "endIndex": 83108, - "paragraph": { - "elements": [ - { - "endIndex": 83108, - "startIndex": 83082, - "textRun": { - "content": " hasUpgrade = false;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83082 - }, - { - "endIndex": 83122, - "paragraph": { - "elements": [ - { - "endIndex": 83122, - "startIndex": 83108, - "textRun": { - "content": " return;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83108 - }, - { - "endIndex": 83128, - "paragraph": { - "elements": [ - { - "endIndex": 83128, - "startIndex": 83122, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83122 - }, - { - "endIndex": 83164, - "paragraph": { - "elements": [ - { - "endIndex": 83164, - "startIndex": 83128, - "textRun": { - "content": " var purchaseStream = _firestore\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83128 - }, - { - "endIndex": 83197, - "paragraph": { - "elements": [ - { - "endIndex": 83197, - "startIndex": 83164, - "textRun": { - "content": " .collection('purchases')\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83164 - }, - { - "endIndex": 83243, - "paragraph": { - "elements": [ - { - "endIndex": 83243, - "startIndex": 83197, - "textRun": { - "content": " .where('userId', isEqualTo: user.uid)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83197 - }, - { - "endIndex": 83265, - "paragraph": { - "elements": [ - { - "endIndex": 83265, - "startIndex": 83243, - "textRun": { - "content": " .snapshots();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83243 - }, - { - "endIndex": 83328, - "paragraph": { - "elements": [ - { - "endIndex": 83328, - "startIndex": 83265, - "textRun": { - "content": " _purchaseSubscription = purchaseStream.listen((snapshot) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83265 - }, - { - "endIndex": 83394, - "paragraph": { - "elements": [ - { - "endIndex": 83394, - "startIndex": 83328, - "textRun": { - "content": " purchases = snapshot.docs.map((DocumentSnapshot document) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83328 - }, - { - "endIndex": 83430, - "paragraph": { - "elements": [ - { - "endIndex": 83430, - "startIndex": 83394, - "textRun": { - "content": " var data = document.data();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83394 - }, - { - "endIndex": 83474, - "paragraph": { - "elements": [ - { - "endIndex": 83474, - "startIndex": 83430, - "textRun": { - "content": " return PastPurchase.fromJson(data);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83430 - }, - { - "endIndex": 83493, - "paragraph": { - "elements": [ - { - "endIndex": 83493, - "startIndex": 83474, - "textRun": { - "content": " }).toList();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83474 - }, - { - "endIndex": 83494, - "paragraph": { - "elements": [ - { - "endIndex": 83494, - "startIndex": 83493, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83493 - }, - { - "endIndex": 83551, - "paragraph": { - "elements": [ - { - "endIndex": 83551, - "startIndex": 83494, - "textRun": { - "content": " hasActiveSubscription = purchases.any((element) =>\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83494 - }, - { - "endIndex": 83606, - "paragraph": { - "elements": [ - { - "endIndex": 83606, - "startIndex": 83551, - "textRun": { - "content": " element.productId == storeKeySubscription &&\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83551 - }, - { - "endIndex": 83651, - "paragraph": { - "elements": [ - { - "endIndex": 83651, - "startIndex": 83606, - "textRun": { - "content": " element.status != Status.expired);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83606 - }, - { - "endIndex": 83652, - "paragraph": { - "elements": [ - { - "endIndex": 83652, - "startIndex": 83651, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83651 - }, - { - "endIndex": 83686, - "paragraph": { - "elements": [ - { - "endIndex": 83686, - "startIndex": 83652, - "textRun": { - "content": " hasUpgrade = purchases.any(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83652 - }, - { - "endIndex": 83745, - "paragraph": { - "elements": [ - { - "endIndex": 83745, - "startIndex": 83686, - "textRun": { - "content": " (element) => element.productId == storeKeyUpgrade,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83686 - }, - { - "endIndex": 83754, - "paragraph": { - "elements": [ - { - "endIndex": 83754, - "startIndex": 83745, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83745 - }, - { - "endIndex": 83755, - "paragraph": { - "elements": [ - { - "endIndex": 83755, - "startIndex": 83754, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83754 - }, - { - "endIndex": 83780, - "paragraph": { - "elements": [ - { - "endIndex": 83780, - "startIndex": 83755, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83755 - }, - { - "endIndex": 83788, - "paragraph": { - "elements": [ - { - "endIndex": 83788, - "startIndex": 83780, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83780 - }, - { - "endIndex": 83792, - "paragraph": { - "elements": [ - { - "endIndex": 83792, - "startIndex": 83788, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 83788 - } - ], - "endIndex": 83792, - "startIndex": 82912, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 83794, - "paragraph": { - "elements": [ - { - "endIndex": 83794, - "startIndex": 83793, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 83793 - }, - { - "endIndex": 84343, - "paragraph": { - "elements": [ - { - "endIndex": 83823, - "startIndex": 83794, - "textRun": { - "content": "All purchase logic is in the ", - "textStyle": {} - } - }, - { - "endIndex": 83837, - "startIndex": 83823, - "textRun": { - "content": "DashPurchases ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 83912, - "startIndex": 83837, - "textRun": { - "content": "class and is where subscriptions should be applied or removed. So, add the ", - "textStyle": {} - } - }, - { - "endIndex": 83920, - "startIndex": 83912, - "textRun": { - "content": "iapRepo ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 83962, - "startIndex": 83920, - "textRun": { - "content": "as a property in the class and assign the ", - "textStyle": {} - } - }, - { - "endIndex": 83970, - "startIndex": 83962, - "textRun": { - "content": "iapRepo ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 84072, - "startIndex": 83970, - "textRun": { - "content": "in the constructor. Next, directly add a listener in the constructor, and remove the listener in the ", - "textStyle": {} - } - }, - { - "endIndex": 84081, - "startIndex": 84072, - "textRun": { - "content": "dispose()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 84088, - "startIndex": 84081, - "textRun": { - "content": " method", - "textStyle": {} - } - }, - { - "endIndex": 84156, - "startIndex": 84088, - "textRun": { - "content": ". At first, the listener can just be an empty function. Because the ", - "textStyle": {} - } - }, - { - "endIndex": 84164, - "startIndex": 84156, - "textRun": { - "content": "IAPRepo ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 84169, - "startIndex": 84164, - "textRun": { - "content": "is a ", - "textStyle": {} - } - }, - { - "endIndex": 84184, - "startIndex": 84169, - "textRun": { - "content": "ChangeNotifier ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 84197, - "startIndex": 84184, - "textRun": { - "content": "and you call ", - "textStyle": {} - } - }, - { - "endIndex": 84214, - "startIndex": 84197, - "textRun": { - "content": "notifyListeners()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 84265, - "startIndex": 84214, - "textRun": { - "content": " every time the purchases in Firestore change, the ", - "textStyle": {} - } - }, - { - "endIndex": 84283, - "startIndex": 84265, - "textRun": { - "content": "purchasesUpdate() ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 84289, - "startIndex": 84283, - "textRun": { - "content": "method", - "textStyle": {} - } - }, - { - "endIndex": 84342, - "startIndex": 84289, - "textRun": { - "content": " is always called when the purchased products change.", - "textStyle": {} - } - }, - { - "endIndex": 84343, - "startIndex": 84342, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 83794 - }, - { - "endIndex": 84373, - "paragraph": { - "elements": [ - { - "endIndex": 84372, - "startIndex": 84343, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/app/lib/logic/dash_purchases.dart#L26-L35" - }, - "underline": true - } - } - }, - { - "endIndex": 84373, - "startIndex": 84372, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.2jm5f1b6gkhx", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 84343 - }, - { - "endIndex": 84935, - "startIndex": 84373, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 84934, - "startIndex": 84374, - "tableCells": [ - { - "content": [ - { - "endIndex": 84395, - "paragraph": { - "elements": [ - { - "endIndex": 84395, - "startIndex": 84376, - "textRun": { - "content": " IAPRepo iapRepo;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84376 - }, - { - "endIndex": 84396, - "paragraph": { - "elements": [ - { - "endIndex": 84396, - "startIndex": 84395, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84395 - }, - { - "endIndex": 84465, - "paragraph": { - "elements": [ - { - "endIndex": 84465, - "startIndex": 84396, - "textRun": { - "content": " DashPurchases(this.counter, this.firebaseNotifier, this.iapRepo) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84396 - }, - { - "endIndex": 84493, - "paragraph": { - "elements": [ - { - "endIndex": 84493, - "startIndex": 84465, - "textRun": { - "content": " final purchaseUpdated =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84465 - }, - { - "endIndex": 84531, - "paragraph": { - "elements": [ - { - "endIndex": 84531, - "startIndex": 84493, - "textRun": { - "content": " iapConnection.purchaseStream;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84493 - }, - { - "endIndex": 84575, - "paragraph": { - "elements": [ - { - "endIndex": 84575, - "startIndex": 84531, - "textRun": { - "content": " _subscription = purchaseUpdated.listen(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84531 - }, - { - "endIndex": 84600, - "paragraph": { - "elements": [ - { - "endIndex": 84600, - "startIndex": 84575, - "textRun": { - "content": " _onPurchaseUpdate,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84575 - }, - { - "endIndex": 84635, - "paragraph": { - "elements": [ - { - "endIndex": 84635, - "startIndex": 84600, - "textRun": { - "content": " onDone: _updateStreamOnDone,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84600 - }, - { - "endIndex": 84672, - "paragraph": { - "elements": [ - { - "endIndex": 84672, - "startIndex": 84635, - "textRun": { - "content": " onError: _updateStreamOnError,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84635 - }, - { - "endIndex": 84679, - "paragraph": { - "elements": [ - { - "endIndex": 84679, - "startIndex": 84672, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84672 - }, - { - "endIndex": 84721, - "paragraph": { - "elements": [ - { - "endIndex": 84721, - "startIndex": 84679, - "textRun": { - "content": " iapRepo.addListener(purchasesUpdate);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84679 - }, - { - "endIndex": 84742, - "paragraph": { - "elements": [ - { - "endIndex": 84742, - "startIndex": 84721, - "textRun": { - "content": " loadPurchases();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84721 - }, - { - "endIndex": 84746, - "paragraph": { - "elements": [ - { - "endIndex": 84746, - "startIndex": 84742, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84742 - }, - { - "endIndex": 84747, - "paragraph": { - "elements": [ - { - "endIndex": 84747, - "startIndex": 84746, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84746 - }, - { - "endIndex": 84759, - "paragraph": { - "elements": [ - { - "endIndex": 84759, - "startIndex": 84747, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84747 - }, - { - "endIndex": 84778, - "paragraph": { - "elements": [ - { - "endIndex": 84778, - "startIndex": 84759, - "textRun": { - "content": " void dispose() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84759 - }, - { - "endIndex": 84823, - "paragraph": { - "elements": [ - { - "endIndex": 84823, - "startIndex": 84778, - "textRun": { - "content": " iapRepo.removeListener(purchasesUpdate);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84778 - }, - { - "endIndex": 84851, - "paragraph": { - "elements": [ - { - "endIndex": 84851, - "startIndex": 84823, - "textRun": { - "content": " _subscription.cancel();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84823 - }, - { - "endIndex": 84872, - "paragraph": { - "elements": [ - { - "endIndex": 84872, - "startIndex": 84851, - "textRun": { - "content": " super.dispose();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84851 - }, - { - "endIndex": 84876, - "paragraph": { - "elements": [ - { - "endIndex": 84876, - "startIndex": 84872, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84872 - }, - { - "endIndex": 84877, - "paragraph": { - "elements": [ - { - "endIndex": 84877, - "startIndex": 84876, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84876 - }, - { - "endIndex": 84904, - "paragraph": { - "elements": [ - { - "endIndex": 84904, - "startIndex": 84877, - "textRun": { - "content": " void purchasesUpdate() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84877 - }, - { - "endIndex": 84930, - "paragraph": { - "elements": [ - { - "endIndex": 84930, - "startIndex": 84904, - "textRun": { - "content": " //TODO manage updates\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84904 - }, - { - "endIndex": 84934, - "paragraph": { - "elements": [ - { - "endIndex": 84934, - "startIndex": 84930, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 84930 - } - ], - "endIndex": 84934, - "startIndex": 84375, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 84936, - "paragraph": { - "elements": [ - { - "endIndex": 84936, - "startIndex": 84935, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 84935 - }, - { - "endIndex": 84937, - "paragraph": { - "elements": [ - { - "endIndex": 84937, - "startIndex": 84936, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 84936 - }, - { - "endIndex": 85088, - "paragraph": { - "elements": [ - { - "endIndex": 84954, - "startIndex": 84937, - "textRun": { - "content": "Next, supply the ", - "textStyle": {} - } - }, - { - "endIndex": 84962, - "startIndex": 84954, - "textRun": { - "content": "IAPRepo ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 84984, - "startIndex": 84962, - "textRun": { - "content": "to the constructor in ", - "textStyle": {} - } - }, - { - "endIndex": 84994, - "startIndex": 84984, - "textRun": { - "content": "main.dart.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 85031, - "startIndex": 84994, - "textRun": { - "content": " You can get the repository by using ", - "textStyle": {} - } - }, - { - "endIndex": 85043, - "startIndex": 85031, - "textRun": { - "content": "context.read", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 85078, - "startIndex": 85043, - "textRun": { - "content": " because it’s already created in a ", - "textStyle": {} - } - }, - { - "endIndex": 85086, - "startIndex": 85078, - "textRun": { - "content": "Provider", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 85088, - "startIndex": 85086, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 84937 - }, - { - "endIndex": 85102, - "paragraph": { - "elements": [ - { - "endIndex": 85101, - "startIndex": 85088, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/app/lib/main.dart#L79-L86" - }, - "underline": true - } - } - }, - { - "endIndex": 85102, - "startIndex": 85101, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6ifsfvloq7cr", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 85088 - }, - { - "endIndex": 85370, - "startIndex": 85102, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 85369, - "startIndex": 85103, - "tableCells": [ - { - "content": [ - { - "endIndex": 85152, - "paragraph": { - "elements": [ - { - "endIndex": 85152, - "startIndex": 85105, - "textRun": { - "content": " ChangeNotifierProvider(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 85105 - }, - { - "endIndex": 85198, - "paragraph": { - "elements": [ - { - "endIndex": 85198, - "startIndex": 85152, - "textRun": { - "content": " create: (context) => DashPurchases(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 85152 - }, - { - "endIndex": 85239, - "paragraph": { - "elements": [ - { - "endIndex": 85239, - "startIndex": 85198, - "textRun": { - "content": " context.read(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 85198 - }, - { - "endIndex": 85285, - "paragraph": { - "elements": [ - { - "endIndex": 85285, - "startIndex": 85239, - "textRun": { - "content": " context.read(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 85239 - }, - { - "endIndex": 85322, - "paragraph": { - "elements": [ - { - "endIndex": 85322, - "startIndex": 85285, - "textRun": { - "content": " context.read(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 85285 - }, - { - "endIndex": 85335, - "paragraph": { - "elements": [ - { - "endIndex": 85335, - "startIndex": 85322, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 85322 - }, - { - "endIndex": 85358, - "paragraph": { - "elements": [ - { - "endIndex": 85358, - "startIndex": 85335, - "textRun": { - "content": " lazy: false,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 85335 - }, - { - "endIndex": 85369, - "paragraph": { - "elements": [ - { - "endIndex": 85369, - "startIndex": 85358, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 85358 - } - ], - "endIndex": 85369, - "startIndex": 85104, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 85371, - "paragraph": { - "elements": [ - { - "endIndex": 85371, - "startIndex": 85370, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 85370 - }, - { - "endIndex": 85858, - "paragraph": { - "elements": [ - { - "endIndex": 85400, - "startIndex": 85371, - "textRun": { - "content": "Next, write the code for the ", - "textStyle": {} - } - }, - { - "endIndex": 85416, - "startIndex": 85400, - "textRun": { - "content": "purchaseUpdate()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 85430, - "startIndex": 85416, - "textRun": { - "content": " function. In ", - "textStyle": {} - } - }, - { - "endIndex": 85448, - "startIndex": 85430, - "textRun": { - "content": "dash_counter.dart,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 85453, - "startIndex": 85448, - "textRun": { - "content": " the ", - "textStyle": {} - } - }, - { - "endIndex": 85473, - "startIndex": 85453, - "textRun": { - "content": "applyPaidMultiplier ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 85477, - "startIndex": 85473, - "textRun": { - "content": "and ", - "textStyle": {} - } - }, - { - "endIndex": 85497, - "startIndex": 85477, - "textRun": { - "content": "removePaidMultiplier", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 85498, - "startIndex": 85497, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 85786, - "startIndex": 85498, - "textRun": { - "content": "methods set the multiplier to 10 or 1, respectively, so you don’t have to check whether the subscription is already applied. When the subscription status changes, you also update the status of the purchasable product so you can show in the purchase page that it’s already active. Set the ", - "textStyle": {} - } - }, - { - "endIndex": 85808, - "startIndex": 85786, - "textRun": { - "content": "_beautifiedDashUpgrade", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 85857, - "startIndex": 85808, - "textRun": { - "content": " property based on whether the upgrade is bought.", - "textStyle": {} - } - }, - { - "endIndex": 85858, - "startIndex": 85857, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 85371 - }, - { - "endIndex": 85888, - "paragraph": { - "elements": [ - { - "endIndex": 85887, - "startIndex": 85858, - "textRun": { - "content": "lib/logic/dash_purchases.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/in_app_purchases/complete/app/lib/logic/dash_purchases.dart#L146-L190" - }, - "underline": true - } - } - }, - { - "endIndex": 85888, - "startIndex": 85887, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.br9j03ile7e3", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 85858 - }, - { - "endIndex": 87511, - "startIndex": 85888, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 87510, - "startIndex": 85889, - "tableCells": [ - { - "content": [ - { - "endIndex": 85916, - "paragraph": { - "elements": [ - { - "endIndex": 85916, - "startIndex": 85891, - "textRun": { - "content": "void purchasesUpdate() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 85891 - }, - { - "endIndex": 85964, - "paragraph": { - "elements": [ - { - "endIndex": 85964, - "startIndex": 85916, - "textRun": { - "content": " var subscriptions = [];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 85916 - }, - { - "endIndex": 86007, - "paragraph": { - "elements": [ - { - "endIndex": 86007, - "startIndex": 85964, - "textRun": { - "content": " var upgrades = [];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 85964 - }, - { - "endIndex": 86083, - "paragraph": { - "elements": [ - { - "endIndex": 86083, - "startIndex": 86007, - "textRun": { - "content": " // Get a list of purchasable products for the subscription and upgrade.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86007 - }, - { - "endIndex": 86117, - "paragraph": { - "elements": [ - { - "endIndex": 86117, - "startIndex": 86083, - "textRun": { - "content": " // This should be 1 per type.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86083 - }, - { - "endIndex": 86148, - "paragraph": { - "elements": [ - { - "endIndex": 86148, - "startIndex": 86117, - "textRun": { - "content": " if (products.isNotEmpty) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86117 - }, - { - "endIndex": 86179, - "paragraph": { - "elements": [ - { - "endIndex": 86179, - "startIndex": 86148, - "textRun": { - "content": " subscriptions = products\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86148 - }, - { - "endIndex": 86260, - "paragraph": { - "elements": [ - { - "endIndex": 86260, - "startIndex": 86179, - "textRun": { - "content": " .where((element) => element.productDetails.id == storeKeySubscription)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86179 - }, - { - "endIndex": 86281, - "paragraph": { - "elements": [ - { - "endIndex": 86281, - "startIndex": 86260, - "textRun": { - "content": " .toList();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86260 - }, - { - "endIndex": 86307, - "paragraph": { - "elements": [ - { - "endIndex": 86307, - "startIndex": 86281, - "textRun": { - "content": " upgrades = products\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86281 - }, - { - "endIndex": 86383, - "paragraph": { - "elements": [ - { - "endIndex": 86383, - "startIndex": 86307, - "textRun": { - "content": " .where((element) => element.productDetails.id == storeKeyUpgrade)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86307 - }, - { - "endIndex": 86404, - "paragraph": { - "elements": [ - { - "endIndex": 86404, - "startIndex": 86383, - "textRun": { - "content": " .toList();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86383 - }, - { - "endIndex": 86410, - "paragraph": { - "elements": [ - { - "endIndex": 86410, - "startIndex": 86404, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86404 - }, - { - "endIndex": 86411, - "paragraph": { - "elements": [ - { - "endIndex": 86411, - "startIndex": 86410, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86410 - }, - { - "endIndex": 86491, - "paragraph": { - "elements": [ - { - "endIndex": 86491, - "startIndex": 86411, - "textRun": { - "content": " // Set the subscription in the counter logic and show/hide purchased on the\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86411 - }, - { - "endIndex": 86514, - "paragraph": { - "elements": [ - { - "endIndex": 86514, - "startIndex": 86491, - "textRun": { - "content": " // purchases page.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86491 - }, - { - "endIndex": 86555, - "paragraph": { - "elements": [ - { - "endIndex": 86555, - "startIndex": 86514, - "textRun": { - "content": " if (iapRepo.hasActiveSubscription) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86514 - }, - { - "endIndex": 86592, - "paragraph": { - "elements": [ - { - "endIndex": 86592, - "startIndex": 86555, - "textRun": { - "content": " counter.applyPaidMultiplier();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86555 - }, - { - "endIndex": 86635, - "paragraph": { - "elements": [ - { - "endIndex": 86635, - "startIndex": 86592, - "textRun": { - "content": " for (var element in subscriptions) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86592 - }, - { - "endIndex": 86692, - "paragraph": { - "elements": [ - { - "endIndex": 86692, - "startIndex": 86635, - "textRun": { - "content": " _updateStatus(element, ProductStatus.purchased);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86635 - }, - { - "endIndex": 86700, - "paragraph": { - "elements": [ - { - "endIndex": 86700, - "startIndex": 86692, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86692 - }, - { - "endIndex": 86713, - "paragraph": { - "elements": [ - { - "endIndex": 86713, - "startIndex": 86700, - "textRun": { - "content": " } else {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86700 - }, - { - "endIndex": 86751, - "paragraph": { - "elements": [ - { - "endIndex": 86751, - "startIndex": 86713, - "textRun": { - "content": " counter.removePaidMultiplier();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86713 - }, - { - "endIndex": 86794, - "paragraph": { - "elements": [ - { - "endIndex": 86794, - "startIndex": 86751, - "textRun": { - "content": " for (var element in subscriptions) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86751 - }, - { - "endIndex": 86853, - "paragraph": { - "elements": [ - { - "endIndex": 86853, - "startIndex": 86794, - "textRun": { - "content": " _updateStatus(element, ProductStatus.purchasable);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86794 - }, - { - "endIndex": 86861, - "paragraph": { - "elements": [ - { - "endIndex": 86861, - "startIndex": 86853, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86853 - }, - { - "endIndex": 86867, - "paragraph": { - "elements": [ - { - "endIndex": 86867, - "startIndex": 86861, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86861 - }, - { - "endIndex": 86868, - "paragraph": { - "elements": [ - { - "endIndex": 86868, - "startIndex": 86867, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86867 - }, - { - "endIndex": 86926, - "paragraph": { - "elements": [ - { - "endIndex": 86926, - "startIndex": 86868, - "textRun": { - "content": " // Set the Dash beautifier and show/hide purchased on\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86868 - }, - { - "endIndex": 86953, - "paragraph": { - "elements": [ - { - "endIndex": 86953, - "startIndex": 86926, - "textRun": { - "content": " // the purchases page.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86926 - }, - { - "endIndex": 87009, - "paragraph": { - "elements": [ - { - "endIndex": 87009, - "startIndex": 86953, - "textRun": { - "content": " if (iapRepo.hasUpgrade != _beautifiedDashUpgrade) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 86953 - }, - { - "endIndex": 87060, - "paragraph": { - "elements": [ - { - "endIndex": 87060, - "startIndex": 87009, - "textRun": { - "content": " _beautifiedDashUpgrade = iapRepo.hasUpgrade;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87009 - }, - { - "endIndex": 87098, - "paragraph": { - "elements": [ - { - "endIndex": 87098, - "startIndex": 87060, - "textRun": { - "content": " for (var element in upgrades) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87060 - }, - { - "endIndex": 87121, - "paragraph": { - "elements": [ - { - "endIndex": 87121, - "startIndex": 87098, - "textRun": { - "content": " _updateStatus(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87098 - }, - { - "endIndex": 87140, - "paragraph": { - "elements": [ - { - "endIndex": 87140, - "startIndex": 87121, - "textRun": { - "content": " element,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87121 - }, - { - "endIndex": 87173, - "paragraph": { - "elements": [ - { - "endIndex": 87173, - "startIndex": 87140, - "textRun": { - "content": " _beautifiedDashUpgrade\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87140 - }, - { - "endIndex": 87213, - "paragraph": { - "elements": [ - { - "endIndex": 87213, - "startIndex": 87173, - "textRun": { - "content": " ? ProductStatus.purchased\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87173 - }, - { - "endIndex": 87257, - "paragraph": { - "elements": [ - { - "endIndex": 87257, - "startIndex": 87213, - "textRun": { - "content": " : ProductStatus.purchasable);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87213 - }, - { - "endIndex": 87265, - "paragraph": { - "elements": [ - { - "endIndex": 87265, - "startIndex": 87257, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87257 - }, - { - "endIndex": 87290, - "paragraph": { - "elements": [ - { - "endIndex": 87290, - "startIndex": 87265, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87265 - }, - { - "endIndex": 87296, - "paragraph": { - "elements": [ - { - "endIndex": 87296, - "startIndex": 87290, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87290 - }, - { - "endIndex": 87300, - "paragraph": { - "elements": [ - { - "endIndex": 87300, - "startIndex": 87296, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87296 - }, - { - "endIndex": 87301, - "paragraph": { - "elements": [ - { - "endIndex": 87301, - "startIndex": 87300, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87300 - }, - { - "endIndex": 87374, - "paragraph": { - "elements": [ - { - "endIndex": 87374, - "startIndex": 87301, - "textRun": { - "content": " void _updateStatus(PurchasableProduct product, ProductStatus status) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87301 - }, - { - "endIndex": 87427, - "paragraph": { - "elements": [ - { - "endIndex": 87427, - "startIndex": 87374, - "textRun": { - "content": " if (product.status != ProductStatus.purchased) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87374 - }, - { - "endIndex": 87475, - "paragraph": { - "elements": [ - { - "endIndex": 87475, - "startIndex": 87427, - "textRun": { - "content": " product.status = ProductStatus.purchased;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87427 - }, - { - "endIndex": 87500, - "paragraph": { - "elements": [ - { - "endIndex": 87500, - "startIndex": 87475, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87475 - }, - { - "endIndex": 87506, - "paragraph": { - "elements": [ - { - "endIndex": 87506, - "startIndex": 87500, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87500 - }, - { - "endIndex": 87510, - "paragraph": { - "elements": [ - { - "endIndex": 87510, - "startIndex": 87506, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 87506 - } - ], - "endIndex": 87510, - "startIndex": 85890, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 87512, - "paragraph": { - "elements": [ - { - "endIndex": 87512, - "startIndex": 87511, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 87511 - }, - { - "endIndex": 87748, - "paragraph": { - "elements": [ - { - "endIndex": 87748, - "startIndex": 87512, - "textRun": { - "content": "You have now ensured that the subscription and upgrade status is always current in the backend service and synchronized with the app. The app acts accordingly and applies the subscription and upgrade features to your Dash clicker game.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 87512 - }, - { - "endIndex": 87749, - "paragraph": { - "elements": [ - { - "endIndex": 87749, - "startIndex": 87748, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.75bij8b5w8zu", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 87748 - }, - { - "endIndex": 87750, - "paragraph": { - "elements": [ - { - "endIndex": 87750, - "startIndex": 87749, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 87749 - }, - { - "endIndex": 87752, - "paragraph": { - "elements": [ - { - "endIndex": 87751, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 87750 - }, - { - "endIndex": 87752, - "startIndex": 87751, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ktyvuy8ff6gv", - "lineSpacing": 100.0, - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 15.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - } - }, - "startIndex": 87750 - }, - { - "endIndex": 87762, - "paragraph": { - "elements": [ - { - "endIndex": 87762, - "startIndex": 87752, - "textRun": { - "content": "All done!\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.b777ki4f2xms", - "lineSpacing": 100.0, - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 15.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - } - } - }, - "startIndex": 87752 - }, - { - "endIndex": 87887, - "paragraph": { - "elements": [ - { - "endIndex": 87869, - "startIndex": 87762, - "textRun": { - "content": "Congratulations!!! You have completed the codelab. You can find the completed code for this codelab in the ", - "textStyle": {} - } - }, - { - "endIndex": 87870, - "inlineObjectElement": { - "inlineObjectId": "kix.h0phbrfzr2hj", - "textStyle": {} - }, - "startIndex": 87869 - }, - { - "endIndex": 87887, - "startIndex": 87870, - "textRun": { - "content": "complete folder.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 87762 - }, - { - "endIndex": 87934, - "paragraph": { - "elements": [ - { - "endIndex": 87916, - "startIndex": 87887, - "textRun": { - "content": "To learn more, try the other ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - }, - { - "endIndex": 87932, - "startIndex": 87916, - "textRun": { - "content": "Flutter codelabs", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.9098039, - "green": 0.4509804, - "red": 0.101960786 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/codelabs" - }, - "underline": true - } - } - }, - { - "endIndex": 87934, - "startIndex": 87932, - "textRun": { - "content": ".\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 87887 - }, - { - "endIndex": 87935, - "paragraph": { - "elements": [ - { - "endIndex": 87935, - "startIndex": 87934, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7dw9tpdpl689", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 87934 - } - ] - }, - "documentId": "1EQtDsZv6vkvgreuOrF0KMo6kiKJ-534DShEFGankv20", - "documentStyle": { - "background": { - "color": {} - }, - "marginBottom": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72.0, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792.0, - "unit": "PT" - }, - "width": { - "magnitude": 612.0, - "unit": "PT" - } - }, - "useCustomHeaderFooterMargins": true - }, - "inlineObjects": { - "kix.16xo8udq7e3c": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/4qgynG9-U14a51LvsOxmR1fD1Shsfi1UwDbvOz9RsQDKLQ-lTFnVRKc_Cg07FHiPTYZEydUPZfxc6BCwyfJGEk67DoyoAYnnACXTQL_Edysr7jU0zrFTyQbU5z1rfhayMcv7p47NhLJCqan3uS6fxNb7N5sT6rIq", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 114.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.16xo8udq7e3c" - }, - "kix.1bvcn5cpml5v": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/zGfmNAzFvjrGDW-fe-vXWUxDjaZLYHP6mzO9rU13ht5TYEpAGyd7L3kI50qr53r6Juwoy5fnfPU7H9A_AFakxUQr9LGz-y04kO-RqYVUee7Zb78VrBa9s8nx0vt57UepIeUPxv29i81psq1-62MaGge5Dzqini-Y", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 347.625, - "unit": "PT" - }, - "width": { - "magnitude": 426.16502946954813, - "unit": "PT" - } - } - } - }, - "objectId": "kix.1bvcn5cpml5v" - }, - "kix.1ewb15mdsw1y": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/Wn9y4dB3-FlRUUlUO1YaZszCdwc9lPJRbeeGp5F2ddzDj_dJqurMOXJ8QboPGuLqWTXpcOYuVPWCR_nwMoRI1ezK1Obm4AMNWxHF-Ermr0R9LOb6h8JfGBHre5P-1mDSi6K56AKD5pTqRBDZVYizuUsEbWF3TwtX", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 182.625, - "unit": "PT" - }, - "width": { - "magnitude": 311.7133561643836, - "unit": "PT" - } - } - } - }, - "objectId": "kix.1ewb15mdsw1y" - }, - "kix.2cd8z374al3f": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/WLlEo_30SAAQgHYuWasx2Yo6QB9HQ_iVp4zZTYsqwn4S1luqLmDubLljNcQ9dhyt1fZlPxKmNUXmQ3yFeRbms9_Kzakfvku00Ra2zTxsE_pAC9lg6LRH7DlcZ1SP4O5GUSiWiBcPdA7A25hfS0OzX8qiGKquvYbP", - "cropProperties": { - "offsetLeft": 0.0021476997, - "offsetRight": 0.0021476997 - } - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 113.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.2cd8z374al3f" - }, - "kix.2egsspufz1c8": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/pjjC61qsjdeEPNAI1ZsgpjRSuUj-LRE_Axy3ptEqpZPuUYfatG0HSA4w9gyPTIuWyHQMzkeffcJq8dq-v0QFmzF7dtQd1XoIO9B_tg8If3w-NnLLl6wngJ1v8jrvxSAidd1TNGEaBM7UxT9eAM_jABBBR3hDgDzm", - "cropProperties": { - "offsetLeft": 0.0043220613, - "offsetRight": 0.0043220613 - } - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 103.48232421875036, - "unit": "PT" - }, - "width": { - "magnitude": 463.2526476708544, - "unit": "PT" - } - } - } - }, - "objectId": "kix.2egsspufz1c8" - }, - "kix.30fj9inmygy5": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/iDrW9lN1cvK98Dx4Dp97QQiQHa31Zsqm9EogyJX5D9rYmdDrHIsfkpczU9dWIq6qM-3u4-ktThq48R-hewY5L8wdWxH0BWwhsp50PfubsgKwZxpUWxPYinNhqNTaMZsqQ4LjB-v35wixoOGO_EVrxJQtY5BuDUXO", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 115.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.30fj9inmygy5" - }, - "kix.3bd123g21oey": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/o3AByd4gmIAOzCoWeD48ca5XQgr9-TPMiY85VBPQfL8djzsDY2iQ4U7r876nVYSgzDZwfiiQUMWgX1UFSPBeCkUIJfhqENU2i_XSQno6LEBXaTS320Fw2exm5jDRGilSucEj9KpQjQJGU2kLfgk8IQxBS4T34pMp", - "cropProperties": { - "offsetBottom": 0.0001915154, - "offsetTop": 0.0001915154 - } - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 126.78316953316953, - "unit": "PT" - }, - "width": { - "magnitude": 241.125, - "unit": "PT" - } - } - } - }, - "objectId": "kix.3bd123g21oey" - }, - "kix.3vn591ev65x6": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/2K-bWnSjeU-xLNzMPPnZ7RH_tk-hf2Pwva2zdUb5GWr3l1ZVYUpP9gqmRk2CiDx0Fb9FwYZRBminLXUQTJgaaMgLgqa8PwnmXjsi4l5yF5issYU7UuFJp5TnIp3hXSFWTruX3rhZhbJOCrghdYBtnE8HetPrJGlM", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 139.0383738601824, - "unit": "PT" - }, - "width": { - "magnitude": 208.875, - "unit": "PT" - } - } - } - }, - "objectId": "kix.3vn591ev65x6" - }, - "kix.4lnpl4yh01t0": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/8w2X5qcZqXQS3lklLM-q7jDvNLPuOwv7ZEsIE0RVyssIAektmQ14PWkvyUJHBxROPLVOxn-40ujpLSdOwaB5LQSY3Iu1b0bcWOvCK_tO_zsGDhmfSa2vD2ZcOUUZujWDVbZSWD4qsh9qJpY1UA6AUjRf88G5cBmJ", - "cropProperties": { - "offsetLeft": 0.0005589396, - "offsetRight": 0.0005589396 - } - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 113.1436298076923, - "unit": "PT" - }, - "width": { - "magnitude": 412.875, - "unit": "PT" - } - } - } - }, - "objectId": "kix.4lnpl4yh01t0" - }, - "kix.4nqtsh4zysec": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/_QM6ZjMMNZkPqAxhRaWBU7KQap8FUtjOH9PI4Le-1NOCMMD-d_5MI-uMDVUD718H8L9_qEuVT-WDWtrYZ75aXWalzDTXHmg93RePd5DYRsSpHw1McwaWspGLcMW31skA14dZJ1O1_JMGrc4qmRv6ZubwvcW5cAEZ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 367.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.4nqtsh4zysec" - }, - "kix.5fekoxtber2j": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/sdgasCYbBWbUNvT2a7loCtN1c_AuKWkvXyEtf301iHSpIfyyuN6gEOM02raiLbE5LOI1xvbAMl4t-MuxcDYXN9b9GR9KXRGt7YG6gEeXaW4tbRvGKYmWqA6Hl_THKZB9lE1K0MR-Bwc1T6Tlg9cYeBSFHsSFRJX7", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 37.69542253521127, - "unit": "PT" - }, - "width": { - "magnitude": 297.375, - "unit": "PT" - } - } - } - }, - "objectId": "kix.5fekoxtber2j" - }, - "kix.5vhpoytm1398": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/4ZNIQ1LRCDRDVYgVK2pQf4994YBD3al46jItN5KwdGu7uf766vK5IR05V1ZAjjcGjr_avIlPWu_BVodN04o9XlJvKgl-ap4NMEaLsYFkPVpXIbEmwGcI6ACd7ePlD4G4eoXDM5rQbn9Y5Sy1yXe1tKD-2PcvBqOa", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 280.875, - "unit": "PT" - }, - "width": { - "magnitude": 369.05668604651163, - "unit": "PT" - } - } - } - }, - "objectId": "kix.5vhpoytm1398" - }, - "kix.5xdu2wapi4y2": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/tMyns4X0N4JlOAWFHYY4Q6jHSd4Hy-Js-QoCibrovtdzHP0qzoUqQ8rN9d-kzpEfzLcfxGAIHZWtHmlQjzPj7Wp_EK7A9JvT5_aMjNlQwKQwYj8Uki7AR0THxzKyDVX33ZpsLdEs-iAJlLJMR9O8kueM9zFUEJhL", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 215.05588942307693, - "unit": "PT" - }, - "width": { - "magnitude": 298.875, - "unit": "PT" - } - } - } - }, - "objectId": "kix.5xdu2wapi4y2" - }, - "kix.6pb13kk3wfit": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/wKTHV7YycFfOWlwPVR0B7vAnvJdieZY9KRm6K1abMNC_s4yG5fssjh87vI4ZFlufvhAXLTH8CnzStzmdx_JQjm-9viO69fLXkh-NaRQfp75Lpnp5C03LtFZxKCDoPpMuUjsEf7_7BDMW8dBBiP4UrRbGkbEkAxRz", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 363.10929230769233, - "unit": "PT" - }, - "width": { - "magnitude": 369.36, - "unit": "PT" - } - } - } - }, - "objectId": "kix.6pb13kk3wfit" - }, - "kix.71g2qymec6v9": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/8Kmd5EJUhy5cmWz84jGJE-36h2t-BUQxBV0j1loUtBOy65tktjWnQnaIOMPciWXeYpU7U8c9Wh6QyWTRHbkPsK7z2xcHv6AZUyNQUxQhP16wt5PnYeTXjO8NmJEH2OEkiBDcETYH2MQOP0Q9z0wWoruiOk0rmo-V", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 211.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.71g2qymec6v9" - }, - "kix.7ner1pebor2s": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/AJt9j7mlt8mdfcmrWFKUNz0Iu62KjaVGhTOq50LBfV53whWlucahFizqKHqrLyKXZ13L1DtwW6ZCvmh-1C2WYweSUKMrl6JjKGwd2TlXuAkvkhH3JpNBcrGblvLckAHiuAdlpddah5bEfhH4m5qBXwVaFYliNWFy", - "cropProperties": { - "offsetBottom": 0.0011998167, - "offsetTop": 0.0011998167 - } - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 185.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.7ner1pebor2s" - }, - "kix.8jh32bs85q1q": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/RRrhD4fj-bCq57qL1WHwICaBoIf4ouSBRdN2XAGEUwj-Ohd-lHg-fymdYBSBaPCdwVbrEv6C6-PFhcMPJRgunpPOmI2yi1NGRstUuQrnbwbX1pEnU6FI0-I3LYFUfA2wx9OJl3Lo3Buzh9WiOB61_qoNTNbgHjm0", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 370.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.8jh32bs85q1q" - }, - "kix.8o06if5zrj4p": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/f_A2bGTS4sKFKZCfHsJ5FJREdgGAIMW4_WMKmsvvpCqkH4eN6okvUCswptTbscwoVPiYf_zN315JxSwJ2eWuMG-W6r2N9pF-wHu5g11MIxlNyAoK0YLCQpdDHEGeA6YEMdlzjqgjOOsCZSoniNDq0BWT9by5rHTR", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 189.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.8o06if5zrj4p" - }, - "kix.9einmm88jss2": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/LMb47Tlc2E8AdDII3pymd7ntKYM9dQOpoW3UvSdGYyIx0WaK-GBGgyjJt_YsnmeZ98YBHeUCVvzZFV3rdgtFZrDe9LMsi0K1qmkn5Cs3elNLBPyG95lD1IjAe5nAU9g3FRUiryA8nv7uME3dHWIjvzUc_ZVaWayI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 188.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.9einmm88jss2" - }, - "kix.9fz92ja09nmf": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/on2O04HkDI5ycXN-TXgpRhxaGL8_mWNyQC2TyQsgSJFR30T9Ea5yEOff7g6BfbRvyjrBUaGFFZz742ng5830jDj4gzIGzX9njjymBVSCazpZV63jXL9uf-N-_wImpZPpR1oXC5cQR8yae8ES4EZCs1PKwMNA78OG", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 27.08653846153846, - "unit": "PT" - }, - "width": { - "magnitude": 352.125, - "unit": "PT" - } - } - } - }, - "objectId": "kix.9fz92ja09nmf" - }, - "kix.9qju374jwmgw": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/fPIxPvqx-3I2rd2-wcmhqFhKY4-4HuU8L1s3Q6hI2LY9m_yo2_MVsCBRoJLdHm7K1LXK5cmZBKJKy-3bIUb8YqDyPelL0cdrjaysvz3Vz3TCS46qqWzW3y2UbE4zyDICVDWMx2DBIQ7y216EmOULYfkN38HrLTIl", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 328.125, - "unit": "PT" - }, - "width": { - "magnitude": 151.37936408977558, - "unit": "PT" - } - } - } - }, - "objectId": "kix.9qju374jwmgw" - }, - "kix.bezjpjdxf6ua": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/EDI-h8bg8qVmsu2xo48XNm2edRHonB77ZtZ7on58G7c1nrcAQqwBqeJPma71SSYkUmpzmPgf2H8pQMUCd4pb1cPdbwkUQDmEoOP0hBY-BXABSS2NY3N_J-f_VKa2yEBQxkqDH_0Ruj0O3rgo-K5Hzj36WMyGfwew", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 228.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.bezjpjdxf6ua" - }, - "kix.bqwp3g2c0vyr": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/4haCPCqT31DzpQ6gfh9irYUCLJ_7dJijwhX70oCYbtTUUbTkN2WuPh1cFBplqNmd_c8p-FP9Zx1Bu-PfY-qmmvca6waZkncpZtYp_OM-G7awcBfXuNJSbufwtNV_9vqc70sszxBeTVXYNcIBFl2Lwtlzz_ALPOUr", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 112.52163461538463, - "unit": "PT" - }, - "width": { - "magnitude": 278.625, - "unit": "PT" - } - } - } - }, - "objectId": "kix.bqwp3g2c0vyr" - }, - "kix.chh2m1xhxh1i": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/mJxKitjSBPCwd-50IX-RRkKU4Mv9QIK744SJLM2BgoMSIIW2sW910T3jskJNrALWMyuvj6GbVGvYRO_gBdu0ilVNj_TAn_nt7iBfcbq5c7qGTQeV5QWGLbzZ6eeuOxqtmJvwJgGqy8f96rR0ycqKx9U_zqK7i6fN", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 235.25000000000003, - "unit": "PT" - }, - "width": { - "magnitude": 352.875, - "unit": "PT" - } - } - } - }, - "objectId": "kix.chh2m1xhxh1i" - }, - "kix.ed6mdmveygi3": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/xvb5MH--bMcNyad14OnrwPdzq31LdthZnIuF5rrtsdGAzXGcH2R237yKbKwEjHwQyjMu2bJPlHf0tMdBaAh_58jsz8pkrkmwfzVfvKAqpenWSiI54uuAMOetkoHpDVLARVMjFTlJzg7jDP8CtOd2X8JDzQDQnI4C", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 247.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ed6mdmveygi3" - }, - "kix.esxpknacoi32": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/igZ_LMxgYrCjOUwBJCKXWNCH388dOh5rWTeusZqXLNX6ABqNgslYOm_RScyrcOFtc9CXcfqXAIKqEFTUlvvNhy2TuEYsZJZFdkTs8VKdoGdbexImXU0Y4ERTykYn_i7Ez366lyXrQqshIgcEGy1nSmTEdBVpMTlx", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 182.86778846153848, - "unit": "PT" - }, - "width": { - "magnitude": 224.625, - "unit": "PT" - } - } - } - }, - "objectId": "kix.esxpknacoi32" - }, - "kix.fqpy0mh0yer0": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/PQ3wB_qA2NLDb3b7UvVctxvPml9zKeUTMbWlbtdE4JdMADJw7pu8BfTYupr5yt_B4e7dj29LiR4CnHpMgzF9As0BiTY5sXFod6cLAqYPedflCoW5DtngYYZVMrf6zA-hc8JQV6JcGtbZmUh6VztJudTsuYzzZ_Xn", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 415.875, - "unit": "PT" - }, - "width": { - "magnitude": 415.875, - "unit": "PT" - } - } - } - }, - "objectId": "kix.fqpy0mh0yer0" - }, - "kix.gc7gqme3obux": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/jaSkZPCsf4BPv3viZr29deQbA8K-B3H_QzgwsmHxopdF2iwSP_L27H87Lyrx6li-vMwERYlMwyEvDUf4pDB_oO-kR_RqczKldMCDcEHHb_8FkalKdfvDQWKlbVzHg7oaCRneEb_sWyXD6-QuLPQzRwgP_I449sRy", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 62.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.gc7gqme3obux" - }, - "kix.gmjri93sum2k": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/Y2i-crFbcCCr2OIpEbjRMMpFh1rjwjurSaWR1f-M0Cc7y0u_lKTay6QesaxybZz3pIEOr5ABTmLeL0ZpI5bCXtg9iQi6RAgyp3n1Ngs9ENpXuoL4VNoehrbi5Q6N-HSrixmQnbLCdBySLSqxX-oiravme-XKhdoK", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 104.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.gmjri93sum2k" - }, - "kix.h0phbrfzr2hj": { - "inlineObjectProperties": { - "embeddedObject": { - "description": "android_studio_folder.png", - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/HgICZf7oes42UgsvRGsjM-QhzKEwhg-wJKy93VxhuY7PlTy5aS4O-8ZV9MYRDOVHSd-fx_L585MLSOoXxJ_VPX_qi9OOnnPbygApE1FbuAZXsl9SPUGxtPZJyesONM2ShaX68OpjRm3udedxZwugd3D05ipoQFhK", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 24.0, - "unit": "PT" - }, - "width": { - "magnitude": 24.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.h0phbrfzr2hj" - }, - "kix.i1nagngzzitk": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/UOU3QmfK0CDN3soEi0gkz9lY-bA8xmpB-qY4RmIRkP-PuxuafB-CZonXWfPnDNngQk_8jpBoDtW7JH8xVqwi1uy-EUFpi19M4tnKMmldIVU6YYHatWJimbCFvKkRbZYOCu6Vn6urI9sORg8A8BH__uLEMfX7dxv8", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 88.09055459272098, - "unit": "PT" - }, - "width": { - "magnitude": 416.625, - "unit": "PT" - } - } - } - }, - "objectId": "kix.i1nagngzzitk" - }, - "kix.icoz7xengcze": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/pCwdZCcl2H3-0NhhDIhBi1ADLhhzeDqQI1DeUs-yECGm92QmCJmWgHbpZf4EhSDhdSUxyJ6endn65HsH3PMxEgqgQcGXi9DvsCLSXbf3I5DxYfIXOInPSv119WDvXU0GSXVR6yHj5iViYcLcVw5_nvLgNmC8Ob97", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 130.96192052980135, - "unit": "PT" - }, - "width": { - "magnitude": 193.875, - "unit": "PT" - } - } - } - }, - "objectId": "kix.icoz7xengcze" - }, - "kix.icspy8xsx7cc": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/SJ3Mmdn357TWSdr3hBGyIBxV-liomR05D7JSs9mFC_6k-7eNjr0QO1gw-GXz2GCGDMSTO_3XFiej00uvShrpVyAYt1lqn4SqQ3gyf1giBfooi5N4VF9IuKxWy7-N2ihhZKHl9_fCTosgue11kRKKuuQxLtw3wA3W", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 281.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.icspy8xsx7cc" - }, - "kix.k2jqdsuz2fno": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/5fDi9mVjFmqsbCL1F8mV5ka9xGznU90nGDRnyb-iHPgwpk4fqCivtrSDxvp0qZFEUfr-9JZQcr95G42MCqdNh-1AEUbWn85_liFkEPpDZwe1PqQEeuNq_vCmsSEe_aQMavb6wWm7EPS2bTWivb0MsVECYUXWH2JM", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 130.12920673076925, - "unit": "PT" - }, - "width": { - "magnitude": 238.125, - "unit": "PT" - } - } - } - }, - "objectId": "kix.k2jqdsuz2fno" - }, - "kix.k80ohjcbndwt": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/R_khItEsfpKvw7HiCePFa5VzyzP66Ca_qPXjLNBuzku_hzVe8BCz_FZagYpyHkTL5S3WpFPbfhA-gW9_G19ZOyH18cYmSo9VBmYjuM4Xc_MRfCM_Lz-9QqUfNdi_dcIsY4XrYNjWFSpXkYOtn-xYHjPpNsxXDpyI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 200.15625, - "unit": "PT" - }, - "width": { - "magnitude": 297.375, - "unit": "PT" - } - } - } - }, - "objectId": "kix.k80ohjcbndwt" - }, - "kix.lkvls8vsrau2": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/ZgWs0vGwRLYbZ2c8GNjZUxWzJJH3ChUVQMzfWwlH471tztRt3ZKo0OwcLEsen5dUkomqr-54S3f2WRcQliNzuiY7ylybyuhi4bpLqMUxlJsqvdlGD6HAQyDZ5K0vci4uLqVCiIspPZdFrlUPcOSmffX-_3Bpa1-N", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 112.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.lkvls8vsrau2" - }, - "kix.ln0fxrlkwddc": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/TxiQWLhtkcbsa9JydAs1umFixNjWMD--_ZzbaD1EWzz3k-9g49a2a5zVifiIzXR9tecFRNazLf386g61_eWN9nzUOlmfbeyRAX-6c-gC6p3KnHqm___OgC6TLUi8skk4Q3RHbyhnGtLyBzfVBWygQBe6aVT1NzF8", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 120.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ln0fxrlkwddc" - }, - "kix.m510bdgwtm2c": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/j7ucH8boMW65vllzkEQs1NOxR2lv2kUFx5FuUyQNJxhp1EurpHY-LUJ-qtHs2s_KEJoXHD-ZkUrclVZEU39sOd06gUMbH5slgkSIPlGNenc_Ai5hqUccZlK-ym5R31INtJf-osyJD-5VxnOE0kn04jRaKyRr2Yw4", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 219.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.m510bdgwtm2c" - }, - "kix.mz7oj06j8ynp": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/ajH_rUkVXIvSEp_At4yGyW25TCPFTrm9EpixG9L45ipstxKus0eAsp3TycWg7vSPMK4q9xby1N-Kf6oqCJRj0OW_77qguUSMmKyRRvVB0RBVmhl1mYaW81T9Zo7sUvH8eHcgLvJH2OWTz8MoiqK6YH2w66Y3HfkU", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 146.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.mz7oj06j8ynp" - }, - "kix.oob851rr5dpx": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/UgAJ1zg-IDv5vjtGzs-wtHr4o5Ejq_Yjm69rUz8Mmo4syFFmAcG1y--6IERkxAPg8R8FAFPtib5FjuW-SF_CQvQTPzohppXFshXIFAkwsOmgFJPOZcmd7av7ugtPmNHxRP-FVsMqm8IwXx0Rcl1UaBMozq-JjSmy", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 277.125, - "unit": "PT" - }, - "width": { - "magnitude": 127.90384615384616, - "unit": "PT" - } - } - } - }, - "objectId": "kix.oob851rr5dpx" - }, - "kix.pji8h4xda4e1": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/a8yCaCNvRAndkRS0IGap3QZxakHRKBzpGAmmIt4GRF6nmLvrly4MDASCurbJ2hGz0hxciBn1OXb4ZX_l1wS1ZS4iyhkjvCHCejWzlbVgtBv2gEGx2lLE0RzzkhL2tDZqPlIBPzdfmi3jy9BqdoIqys_T4qmArzIY", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 169.04807339449545, - "unit": "PT" - }, - "width": { - "magnitude": 329.04, - "unit": "PT" - } - } - } - }, - "objectId": "kix.pji8h4xda4e1" - }, - "kix.q6qr0div57d4": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/xe1HFMxrKWhUiyo9q8P5WywX64LUigjdWWs31jgvtpQTfnTFzP7-6q6ttcIqQvE1qpbMLGLFXDvkWSwu_-q4-iQGFPv7UIkO2ANVtE5bga-1DfsQHMRlt68HjeY-dNFjwuGN8RxBBFdtmk_LKpk3y84pVGAdPTQn", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 280.5600961538462, - "unit": "PT" - }, - "width": { - "magnitude": 344.625, - "unit": "PT" - } - } - } - }, - "objectId": "kix.q6qr0div57d4" - }, - "kix.qdwextc6ysh": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/CUmhl45oMGODTW1esArR5c8t2wHpErROHvYS6hhomdydxG7fJReL4pq-ETpBqYs_n3jfjyRPCv2eTvzpAZY7qZE9mpNmnJg8CA8PoRRKqWoW0Pt5Iz7LdtRJgXF8OEHFH0Kmsaoe3glRb4EjzJCceLFy0PAvZ_1P", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 189.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qdwextc6ysh" - }, - "kix.qmpm4klwgkv8": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/EnYr0PGkpxRsv5u2FrjD6Ni1ssW7ftY3RmS8vZAbLdQdtT1RU0cO-ttpQG-1n_iyS3o2KS03AIbBlZViqojW_sMFPnb-u-iG2XjTpV5pBUvgtWuSoSNSfVf9ASFsnkBk7eNnZYUXHf_9TfliAV2ZBZ9WnqVMfi0n", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 103.13839285714286, - "unit": "PT" - }, - "width": { - "magnitude": 169.875, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qmpm4klwgkv8" - }, - "kix.qp719ylpm6v9": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/6s75wNPJEalDqpxOg9lw0dEii0c--kU7vJu_PaQvIPnZeYPk6_834WvKZ1GxUwrgxSNw9WhRlTD6X54u6-lHUgwtqzPAmSeFnd23JniaxJGwGVsPux7Takhc1c1tHT89nBv37SfAKNf1TkFQ4T5xlkFec4k1Xt6d", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 324.0, - "unit": "PT" - }, - "width": { - "magnitude": 149.85000000000002, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qp719ylpm6v9" - }, - "kix.qu1stbpqly5r": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/opy3GJLUXtVv7dvKte4LPIRFIdgATHTdiJ6K2P48h2o4ZzXCI0LIn_DnsPpUy4yvGk24Oa_Go80KUEwzj4FPOK0imcSGbBQOARpRKo7469f0gedLVuJh1AitT3w76K0qMFUIt3e04mBlLq6Ff1e-dBIwsHqAu-_W", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 191.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qu1stbpqly5r" - }, - "kix.qu7litrheizj": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/tH7eBejcg7BLYLNk7jYZK9Th0GqEZl3oAIYHc9viuqj_29r40al5uAwlMKpy2C3clnI2kR3oB04zQb9SGThBoz7hold-qq7nI_tZNWo7krA6n2j28l1o8UHkHpQGNwLYn862FJmMzAojJaT1SLKUs_jqyOqnb_8o", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 324.0, - "unit": "PT" - }, - "width": { - "magnitude": 149.3217391304348, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qu7litrheizj" - }, - "kix.s4pnpsjksset": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/Byl_OzK5flu0HoRaZ7DrEf7qJVwvKY8GDoxzGm45sv67ic3IjlVgbbcNx4AVSdiIYvXa1HVeSGPOODSN734ZCJZPHZq4USx0g2XPjH10Oqe-tSbF69Obu7h_unnPBYhdJkn50eIJOrtfgaa_W25eWoTptSBKlNSV", - "cropProperties": { - "offsetBottom": 0.0002119093, - "offsetTop": 0.0002119093 - } - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 235.82451923076925, - "unit": "PT" - }, - "width": { - "magnitude": 231.375, - "unit": "PT" - } - } - } - }, - "objectId": "kix.s4pnpsjksset" - }, - "kix.u8d6iv97bzy1": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/8pUBv0V78TAbkyjOxevldfjuOcKZwNSgifENC9B8q5jKc_l78lng5Uebv0ZxSuk_fVDGgFITLhjiU3hwv5fWu16Oo5Wwu67INxBzgHKv1QnSunvM_7dLUxd1r79qr5g7SmOqEJV36PiaE50FLlO1Xj903BgdZVhh", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 277.2, - "unit": "PT" - }, - "width": { - "magnitude": 127.65789473684211, - "unit": "PT" - } - } - } - }, - "objectId": "kix.u8d6iv97bzy1" - }, - "kix.uca4yzl4krz9": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/sQVYkXFN-gl5BXB9y4UUbz9gZyzvs_TqKjJ6wOtR56h4KbGfbhVoAtJOnMksHL1XgIv_x68x1NJ4Sq4YSqaY3ZNj1TjC_5V25bjW0vXF0uk8eFkmBOQgG_ZqKGmsaAqGjtM6LjZKds2mP3VTWCD3YW1xsEaqMaq-", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 142.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.uca4yzl4krz9" - }, - "kix.v4watl264rvd": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/HRmgOQKEwilFuan7dYQGsqOfyxl2nnzD-rQVnYwXncqLl0GkB30mCr3gBw8NbsphlQI3o08K5WFZd7XAxYycLfZo5sDvgAeTXugSRDk-28K-Aqoj4a-zUqaXY16SX6-jQ5bTF8K1jvscTGvT4KdOtcSFebDCvbpl", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 168.01021634615387, - "unit": "PT" - }, - "width": { - "magnitude": 398.625, - "unit": "PT" - } - } - } - }, - "objectId": "kix.v4watl264rvd" - }, - "kix.vsyt8x9u450c": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/ldAZkq2iNmk5dbsUTpsj4pWR6BipkOi0CWUeiMfyGty9Z9RwyV5955ARY12HUoQNUsqHA27aPjJpXLktmnBxqm6jPTg5SAG1u0V24eRe0ndpTeajGG1uPN_-RXlh8DfDqidfTrf_5PL08b5XT52gVvQUXSUFmq96", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 57.88637695312718, - "unit": "PT" - }, - "width": { - "magnitude": 222.63991135818148, - "unit": "PT" - } - } - } - }, - "objectId": "kix.vsyt8x9u450c" - }, - "kix.vxc4y3subwbz": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/Q2KQrbx8TbIlWG2cekRoy80yfFuRQLV63xDC0QnpVUjKMpxEDbbFR_X_O6ZViuWhxWtT8DmGwSk96eK1sk3tNkHqfDNoJMoK4EOJZ4RSUf7CNN_fJBlPITEyNmGfH3OC4LmYnJe7PO8DncQtO9ws8wnWYydqgtna", - "cropProperties": { - "offsetLeft": 0.0011463414, - "offsetRight": 0.0011463414 - } - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 105.76005859375073, - "unit": "PT" - }, - "width": { - "magnitude": 191.42570605468882, - "unit": "PT" - } - } - } - }, - "objectId": "kix.vxc4y3subwbz" - }, - "kix.wwxo1r4c7v0g": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/7Nc4Uswj7fzBwXTzcSGgab_U0YiQU9GRlgDmXNzzxoeeWvxnkE0weto2uyabJSMSRC8t3AMbwllZ2e2vbP4zfGlSpriczXVzMy2YK-UWgUxrwmbJK2c40B6A2vdR3fK16LM3Ea46besVXbe8ldSD0yVkHzjT2Zjw", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 83.10737304687427, - "unit": "PT" - }, - "width": { - "magnitude": 247.43331520773933, - "unit": "PT" - } - } - } - }, - "objectId": "kix.wwxo1r4c7v0g" - }, - "kix.wz46ijx4irp7": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/rfV5vj2StrNJNqnreQXzmfKPtB452SE58S17jzWkEJeWdEN5xcWjJbQKrTjutUC9wXX82uC2UCaOOj9koEu-T24H1vg9cr9HhOWOBGr2WV7to7jyR2bhDzRfCqdpn8cTLhVRvb9Fto2XSIFiTMVUytE9At-1B2Gs", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 341.625, - "unit": "PT" - }, - "width": { - "magnitude": 296.6614806866953, - "unit": "PT" - } - } - } - }, - "objectId": "kix.wz46ijx4irp7" - }, - "kix.x8fkh4sa1hxv": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/eHPEIILF67nbkoM1QjJTx_xls8Zh34C46kGMqdWCkLGHg6Lp6Sl_SojvxwVIfCkq1qDVP_654CYLqDvi6MGyZ8Cr9sD_T0lSW59vvhvrMjU3svyaqA0KDXybD0GqdzbpY1TMA4OGrQAu3hmz8SWx78txiw4dVJJc", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 53.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.x8fkh4sa1hxv" - }, - "kix.xhbjqrseo000": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/6TEKwbvtEVqjDW5kloZS8AcnzKFM23PgkyQ52zWM3orQT1DzDayE6Yn-sl-7e7fgReHx-x72qARedOBX6Bvg2-E9b-s14YajUTARZu5nO1LuJPYth6KSAQ-K2vvR7DsJfHZT4GYoFNLc-ESf004oYizuoR38ViLb", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 360.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.xhbjqrseo000" - }, - "kix.y56zhtc6tete": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/TX7mYjF1myvh7SZNnQvoIOLV7YYPxGj_E7yebGD9cSSTgH_QqJWACM1ukD_vGcKuezyr7oh7ZCqTx1R_AEDWs7YXzxZcFdA_FZAyL5blk5P1chhEgUIR3B9ZCmLMyPf_0i5Oac3ElryG52E8WlABdhYDYBhmj4_Y", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 277.2, - "unit": "PT" - }, - "width": { - "magnitude": 127.65789473684211, - "unit": "PT" - } - } - } - }, - "objectId": "kix.y56zhtc6tete" - }, - "kix.ybkauijvqfm": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/IX3f7bHhcgOp4IyDgjV0w0mlJQs4SfHUzlqAieov7yqiE5u5PSzGRDGZOghRPzu8aoJhTkgUCmPGme3TQLJEccCT7IPCxdUsg_KxP6Z1Tx2U4BngZ5Sf4xjc74DCM-thAoY8lEcmw-_bWBjEWXivwid6c7kO20zO", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 89.14182692307692, - "unit": "PT" - }, - "width": { - "magnitude": 295.875, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ybkauijvqfm" - }, - "kix.yg4ec5m6jurg": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/rmkwBhxuiG0jlFP1FlzgBrzvxtbWKHSUfdGi4KU7vtcl8JiSMNC8PCnTCmYNxirQ5BOjcXkXIt203AiFZkO-lHXripzSrgYRXZ0AS2eikKFrtCw1xrVmSlUpkzeP71iCLv3SjFd5Q0OMAPl4U3q7H1nIHmyVLiK4", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 334.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.yg4ec5m6jurg" - } - }, - "lists": { - "kix.1uilxai3pj4c": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.273gbycvqbpv": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2zlpnbfk4wvt": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3knqjs5j3c0a": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3oxmeviaenmj": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.427ii03mgly7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.48iczhtzcs3b": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6o706gv3wzlk": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7lxk6cj2wia5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7mxsheck861c": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.8ez3h4yz39jw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.8vyn4hgvahf0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9134weqz4412": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9n48gbutqkqj": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.a0afkqdhia6w": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ai6cqz99fg9d": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.bqjvm8ayuf6j": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cchm97rrif4y": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.csj6uf7em3c1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2509804, - "red": 0.23529412 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.d576od65k8ms": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.dd74uwq4xsf7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.dvi16evrie1w": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fhl8uuuumoyx": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jp9pn1kn09ii": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kic1o5ute4a9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l6dfwvhprcyp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2509804, - "red": 0.23529412 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.m6p9bvttqrj7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.m7b3lhbn68t8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.mu523fs8cham": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.nbt6hoj127n1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.36078432, - "green": 0.36078432, - "red": 0.36078432 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.nvpgk8rs848i": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.pltqaannoum0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ptpqb595bvtz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qhr2vepoqj4a": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qly88kcrr56l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qn42jvni1ee0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.swaau9ft1off": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ueq2r24kq7ie": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wd2x8hdc8yp6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wd5tola2twcj": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "-", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.x5b9lhuyy497": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.x6zo8jl3cnpv": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.y1airoxi6fpx": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.y1tmgniuwb75": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ait8gx84hw5v", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.d2tafm78btb1", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6e7xev3x8hg1", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 14.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7sa4zxkhmsum", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "TITLE", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "fontSize": { - "magnitude": 21.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 15.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - ] - }, - "revisionId": "ANeT5PSZCp-s8kajClx80zHmYb93nUiWQUSvyYR-jZyo3P0gGIPUwHD2BYMRlnfgT1KhFJig_pYHyfck2T37Lw", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "title": "In-App Purchase codelab (dart server)" -} \ No newline at end of file diff --git a/tooling/claat_export_images/test/data/exports/1MfCrv1w6aK7SLq9gmjJwXCJFQ-AX9NWJit2gq-v2Xx8.json b/tooling/claat_export_images/test/data/exports/1MfCrv1w6aK7SLq9gmjJwXCJFQ-AX9NWJit2gq-v2Xx8.json deleted file mode 100644 index 6e646c2390..0000000000 --- a/tooling/claat_export_images/test/data/exports/1MfCrv1w6aK7SLq9gmjJwXCJFQ-AX9NWJit2gq-v2Xx8.json +++ /dev/null @@ -1,60288 +0,0 @@ -{ - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 27, - "paragraph": { - "elements": [ - { - "endIndex": 27, - "startIndex": 1, - "textRun": { - "content": "How to test a Flutter app\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7sa4zxkhmsum", - "namedStyleType": "TITLE", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1 - }, - { - "endIndex": 28, - "paragraph": { - "elements": [ - { - "endIndex": 28, - "startIndex": 27, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 27 - }, - { - "endIndex": 58, - "paragraph": { - "elements": [ - { - "endIndex": 57, - "startIndex": 28, - "textRun": { - "content": "Last update: 5/20/2021, abd99", - "textStyle": { - "fontSize": { - "magnitude": 8.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 58, - "startIndex": 57, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "END", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 28 - }, - { - "endIndex": 343, - "startIndex": 58, - "table": { - "columns": 2, - "rows": 7, - "tableRows": [ - { - "endIndex": 131, - "startIndex": 59, - "tableCells": [ - { - "content": [ - { - "endIndex": 69, - "paragraph": { - "elements": [ - { - "endIndex": 69, - "startIndex": 61, - "textRun": { - "content": "Summary\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 61 - } - ], - "endIndex": 69, - "startIndex": 60, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 131, - "paragraph": { - "elements": [ - { - "endIndex": 131, - "startIndex": 70, - "textRun": { - "content": "In this codelab, you’ll build and test a simple Flutter app.\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 70 - } - ], - "endIndex": 131, - "startIndex": 69, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 167, - "startIndex": 131, - "tableCells": [ - { - "content": [ - { - "endIndex": 137, - "paragraph": { - "elements": [ - { - "endIndex": 137, - "startIndex": 133, - "textRun": { - "content": "URL\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 133 - } - ], - "endIndex": 137, - "startIndex": 132, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 167, - "paragraph": { - "elements": [ - { - "endIndex": 167, - "startIndex": 138, - "textRun": { - "content": "codelabs/flutter-app-testing\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 138 - } - ], - "endIndex": 167, - "startIndex": 137, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 187, - "startIndex": 167, - "tableCells": [ - { - "content": [ - { - "endIndex": 178, - "paragraph": { - "elements": [ - { - "endIndex": 178, - "startIndex": 169, - "textRun": { - "content": "Category\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 169 - } - ], - "endIndex": 178, - "startIndex": 168, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 187, - "paragraph": { - "elements": [ - { - "endIndex": 187, - "startIndex": 179, - "textRun": { - "content": "Flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 179 - } - ], - "endIndex": 187, - "startIndex": 178, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 226, - "startIndex": 187, - "tableCells": [ - { - "content": [ - { - "endIndex": 201, - "paragraph": { - "elements": [ - { - "endIndex": 201, - "startIndex": 189, - "textRun": { - "content": "Environment\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 189 - } - ], - "endIndex": 201, - "startIndex": 188, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 226, - "paragraph": { - "elements": [ - { - "endIndex": 226, - "startIndex": 202, - "textRun": { - "content": "web, kiosk, tag-flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 202 - } - ], - "endIndex": 226, - "startIndex": 201, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 241, - "startIndex": 226, - "tableCells": [ - { - "content": [ - { - "endIndex": 235, - "paragraph": { - "elements": [ - { - "endIndex": 235, - "startIndex": 228, - "textRun": { - "content": "Status\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 228 - } - ], - "endIndex": 235, - "startIndex": 227, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 241, - "paragraph": { - "elements": [ - { - "endIndex": 241, - "startIndex": 236, - "textRun": { - "content": "Live\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 236 - } - ], - "endIndex": 241, - "startIndex": 235, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 300, - "startIndex": 241, - "tableCells": [ - { - "content": [ - { - "endIndex": 257, - "paragraph": { - "elements": [ - { - "endIndex": 257, - "startIndex": 243, - "textRun": { - "content": "Feedback Link\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 243 - } - ], - "endIndex": 257, - "startIndex": 242, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 300, - "paragraph": { - "elements": [ - { - "endIndex": 300, - "startIndex": 258, - "textRun": { - "content": "https://github.com/flutter/website/issues\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 258 - } - ], - "endIndex": 300, - "startIndex": 257, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 342, - "startIndex": 300, - "tableCells": [ - { - "content": [ - { - "endIndex": 309, - "paragraph": { - "elements": [ - { - "endIndex": 309, - "startIndex": 302, - "textRun": { - "content": "Author\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 302 - } - ], - "endIndex": 309, - "startIndex": 301, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 342, - "paragraph": { - "elements": [ - { - "endIndex": 342, - "startIndex": 310, - "textRun": { - "content": "Abdullah Deshmukh, Brett Morgan\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 310 - } - ], - "endIndex": 342, - "startIndex": 309, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "width": { - "magnitude": 101.25, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - }, - { - "width": { - "magnitude": 366.75, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - } - ] - } - } - }, - { - "endIndex": 344, - "paragraph": { - "elements": [ - { - "endIndex": 344, - "startIndex": 343, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 343 - }, - { - "endIndex": 345, - "paragraph": { - "elements": [ - { - "endIndex": 345, - "startIndex": 344, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 344 - }, - { - "endIndex": 1451, - "startIndex": 345, - "tableOfContents": { - "content": [ - { - "endIndex": 359, - "paragraph": { - "elements": [ - { - "endIndex": 358, - "startIndex": 346, - "textRun": { - "content": "Introduction", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ok7k5uux6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 359, - "startIndex": 358, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 4.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 346 - }, - { - "endIndex": 377, - "paragraph": { - "elements": [ - { - "endIndex": 376, - "startIndex": 359, - "textRun": { - "content": "What you’ll learn", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.dbb1hnfdd0wt" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 377, - "startIndex": 376, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 359 - }, - { - "endIndex": 395, - "paragraph": { - "elements": [ - { - "endIndex": 394, - "startIndex": 377, - "textRun": { - "content": "What you’ll build", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.vf85pbg1fgn7" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 395, - "startIndex": 394, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 377 - }, - { - "endIndex": 443, - "paragraph": { - "elements": [ - { - "endIndex": 442, - "startIndex": 395, - "textRun": { - "content": "What would you like to learn from this codelab?", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.b7nxsg514qu3" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 443, - "startIndex": 442, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 395 - }, - { - "endIndex": 487, - "paragraph": { - "elements": [ - { - "endIndex": 486, - "startIndex": 443, - "textRun": { - "content": "Set up your Flutter development environment", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.m0ycdyje7e1p" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 487, - "startIndex": 486, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 443 - }, - { - "endIndex": 503, - "paragraph": { - "elements": [ - { - "endIndex": 502, - "startIndex": 487, - "textRun": { - "content": "Getting started", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.bwo0af2iwk90" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 503, - "startIndex": 502, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 487 - }, - { - "endIndex": 550, - "paragraph": { - "elements": [ - { - "endIndex": 549, - "startIndex": 503, - "textRun": { - "content": "Create a new Flutter app & update dependencies", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.fzmj764jk1it" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 550, - "startIndex": 549, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 503 - }, - { - "endIndex": 564, - "paragraph": { - "elements": [ - { - "endIndex": 563, - "startIndex": 550, - "textRun": { - "content": "Build the app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.btmxwf909kks" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 564, - "startIndex": 563, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 550 - }, - { - "endIndex": 627, - "paragraph": { - "elements": [ - { - "endIndex": 626, - "startIndex": 564, - "textRun": { - "content": "First, create the Favorites model in lib/models/favorites.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.vhrv5dclm5vw" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 627, - "startIndex": 626, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 564 - }, - { - "endIndex": 653, - "paragraph": { - "elements": [ - { - "endIndex": 652, - "startIndex": 627, - "textRun": { - "content": "lib/models/favorites.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.lsviuhkhdr2" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 653, - "startIndex": 652, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 627 - }, - { - "endIndex": 706, - "paragraph": { - "elements": [ - { - "endIndex": 705, - "startIndex": 653, - "textRun": { - "content": "Add the Favorites page in lib/screens/favorites.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.qzgctyugqfot" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 706, - "startIndex": 705, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 653 - }, - { - "endIndex": 733, - "paragraph": { - "elements": [ - { - "endIndex": 732, - "startIndex": 706, - "textRun": { - "content": "lib/screens/favorites.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.sgii43wa0h80" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 733, - "startIndex": 732, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 706 - }, - { - "endIndex": 776, - "paragraph": { - "elements": [ - { - "endIndex": 775, - "startIndex": 733, - "textRun": { - "content": "Add the Home page in lib/screens/home.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.lmxxfjfy7j9r" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 776, - "startIndex": 775, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 733 - }, - { - "endIndex": 798, - "paragraph": { - "elements": [ - { - "endIndex": 797, - "startIndex": 776, - "textRun": { - "content": "lib/screens/home.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.gdhfwytw20p7" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 798, - "startIndex": 797, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 776 - }, - { - "endIndex": 836, - "paragraph": { - "elements": [ - { - "endIndex": 835, - "startIndex": 798, - "textRun": { - "content": "Replace the contents of lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.2jmtlwdbzpsw" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 836, - "startIndex": 835, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 798 - }, - { - "endIndex": 850, - "paragraph": { - "elements": [ - { - "endIndex": 849, - "startIndex": 836, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.xzhg8e14tk08" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 850, - "startIndex": 849, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 836 - }, - { - "endIndex": 876, - "paragraph": { - "elements": [ - { - "endIndex": 875, - "startIndex": 850, - "textRun": { - "content": "Unit testing the provider", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.o7wkpp16ivz9" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 876, - "startIndex": 875, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 850 - }, - { - "endIndex": 905, - "paragraph": { - "elements": [ - { - "endIndex": 904, - "startIndex": 876, - "textRun": { - "content": "Remove test/widget_test.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ozej4uql1crf" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 905, - "startIndex": 904, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 876 - }, - { - "endIndex": 928, - "paragraph": { - "elements": [ - { - "endIndex": 927, - "startIndex": 905, - "textRun": { - "content": "Create a new test file", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ju260rdqj548" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 928, - "startIndex": 927, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 905 - }, - { - "endIndex": 960, - "paragraph": { - "elements": [ - { - "endIndex": 959, - "startIndex": 928, - "textRun": { - "content": "test/models/favorites_test.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.1wzi16ibjujt" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 960, - "startIndex": 959, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 928 - }, - { - "endIndex": 992, - "paragraph": { - "elements": [ - { - "endIndex": 991, - "startIndex": 960, - "textRun": { - "content": "test/models/favorites_test.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.84z4hkcjsaif" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 992, - "startIndex": 991, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 960 - }, - { - "endIndex": 1005, - "paragraph": { - "elements": [ - { - "endIndex": 1004, - "startIndex": 992, - "textRun": { - "content": "Run the test", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.6yxrv73h3a0x" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1005, - "startIndex": 1004, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 992 - }, - { - "endIndex": 1020, - "paragraph": { - "elements": [ - { - "endIndex": 1019, - "startIndex": 1005, - "textRun": { - "content": "Widget testing", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.7a0ktremdsrl" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1020, - "startIndex": 1019, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1005 - }, - { - "endIndex": 1043, - "paragraph": { - "elements": [ - { - "endIndex": 1042, - "startIndex": 1020, - "textRun": { - "content": "Create a new test file", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.yy7mc2b5no56" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1043, - "startIndex": 1042, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1020 - }, - { - "endIndex": 1063, - "paragraph": { - "elements": [ - { - "endIndex": 1062, - "startIndex": 1043, - "textRun": { - "content": "test/home_test.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.fuoyhtqb1e7n" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1063, - "startIndex": 1062, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1043 - }, - { - "endIndex": 1083, - "paragraph": { - "elements": [ - { - "endIndex": 1082, - "startIndex": 1063, - "textRun": { - "content": "test/home_test.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.rfgwtui5w6q9" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1083, - "startIndex": 1082, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1063 - }, - { - "endIndex": 1096, - "paragraph": { - "elements": [ - { - "endIndex": 1095, - "startIndex": 1083, - "textRun": { - "content": "Run the test", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.911yu4qzr38v" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1096, - "startIndex": 1095, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1083 - }, - { - "endIndex": 1116, - "paragraph": { - "elements": [ - { - "endIndex": 1115, - "startIndex": 1096, - "textRun": { - "content": "test/home_test.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.hitrp1fahwcs" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1116, - "startIndex": 1115, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1096 - }, - { - "endIndex": 1141, - "paragraph": { - "elements": [ - { - "endIndex": 1140, - "startIndex": 1116, - "textRun": { - "content": "test/favorites_test.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.4bn147hqux75" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1141, - "startIndex": 1140, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1116 - }, - { - "endIndex": 1179, - "paragraph": { - "elements": [ - { - "endIndex": 1178, - "startIndex": 1141, - "textRun": { - "content": "Testing app UI with integration tests", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.lb4oolapswgl" - }, - "underline": true - } - } - }, - { - "endIndex": 1179, - "startIndex": 1178, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1141 - }, - { - "endIndex": 1194, - "paragraph": { - "elements": [ - { - "endIndex": 1193, - "startIndex": 1179, - "textRun": { - "content": "Write the test", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.tvwf13ue5p6g" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1194, - "startIndex": 1193, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1179 - }, - { - "endIndex": 1225, - "paragraph": { - "elements": [ - { - "endIndex": 1224, - "startIndex": 1194, - "textRun": { - "content": "integration_test/app_test.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.chovoorugncs" - }, - "underline": true - } - } - }, - { - "endIndex": 1225, - "startIndex": 1224, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1194 - }, - { - "endIndex": 1238, - "paragraph": { - "elements": [ - { - "endIndex": 1237, - "startIndex": 1225, - "textRun": { - "content": "Run the test", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.1lqalhwb26sl" - }, - "underline": true - } - } - }, - { - "endIndex": 1238, - "startIndex": 1237, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1225 - }, - { - "endIndex": 1282, - "paragraph": { - "elements": [ - { - "endIndex": 1281, - "startIndex": 1238, - "textRun": { - "content": "Testing app performance with Flutter Driver", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.taqgmwcoaqg" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1282, - "startIndex": 1281, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1238 - }, - { - "endIndex": 1307, - "paragraph": { - "elements": [ - { - "endIndex": 1306, - "startIndex": 1282, - "textRun": { - "content": "Write a performance test", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.2bdo8691h79t" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1307, - "startIndex": 1306, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1282 - }, - { - "endIndex": 1339, - "paragraph": { - "elements": [ - { - "endIndex": 1338, - "startIndex": 1307, - "textRun": { - "content": "integration_test/perf_test.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.926ood5ssvbr" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1339, - "startIndex": 1338, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1307 - }, - { - "endIndex": 1371, - "paragraph": { - "elements": [ - { - "endIndex": 1370, - "startIndex": 1339, - "textRun": { - "content": "Capture the performance results", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.k9x9lpdpqq14" - }, - "underline": true - } - } - }, - { - "endIndex": 1371, - "startIndex": 1370, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1339 - }, - { - "endIndex": 1400, - "paragraph": { - "elements": [ - { - "endIndex": 1399, - "startIndex": 1371, - "textRun": { - "content": "test_driver/perf_driver.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.u5xt3q47y9fk" - }, - "underline": true - } - } - }, - { - "endIndex": 1400, - "startIndex": 1399, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1371 - }, - { - "endIndex": 1413, - "paragraph": { - "elements": [ - { - "endIndex": 1412, - "startIndex": 1400, - "textRun": { - "content": "Run the test", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.deav4oq6epb2" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1413, - "startIndex": 1412, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1400 - }, - { - "endIndex": 1430, - "paragraph": { - "elements": [ - { - "endIndex": 1429, - "startIndex": 1413, - "textRun": { - "content": "Congratulations!", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.wyjmgdlwi2kp" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1430, - "startIndex": 1429, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1413 - }, - { - "endIndex": 1450, - "paragraph": { - "elements": [ - { - "endIndex": 1449, - "startIndex": 1430, - "textRun": { - "content": "What you’ve learned", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.1hcibaejjgkm" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1450, - "startIndex": 1449, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1430 - } - ] - } - }, - { - "endIndex": 1452, - "paragraph": { - "elements": [ - { - "endIndex": 1452, - "startIndex": 1451, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1451 - }, - { - "endIndex": 1454, - "paragraph": { - "elements": [ - { - "endIndex": 1453, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 1452 - }, - { - "endIndex": 1454, - "startIndex": 1453, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1452 - }, - { - "endIndex": 1455, - "paragraph": { - "elements": [ - { - "endIndex": 1455, - "startIndex": 1454, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Verdana", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1454 - }, - { - "endIndex": 1468, - "paragraph": { - "elements": [ - { - "endIndex": 1468, - "startIndex": 1455, - "textRun": { - "content": "Introduction\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ok7k5uux6", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1455 - }, - { - "endIndex": 1469, - "paragraph": { - "elements": [ - { - "endIndex": 1469, - "startIndex": 1468, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1468 - }, - { - "endIndex": 1609, - "paragraph": { - "elements": [ - { - "endIndex": 1609, - "startIndex": 1469, - "textRun": { - "content": "Flutter is Google's UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase. \n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1469 - }, - { - "endIndex": 1610, - "paragraph": { - "elements": [ - { - "endIndex": 1610, - "startIndex": 1609, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1609 - }, - { - "endIndex": 1729, - "paragraph": { - "elements": [ - { - "endIndex": 1692, - "startIndex": 1610, - "textRun": { - "content": "In this codelab, you’ll build and test a simple Flutter app. The app will use the ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1700, - "startIndex": 1692, - "textRun": { - "content": "Provider", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/provider" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1728, - "startIndex": 1700, - "textRun": { - "content": " package for managing state.", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1729, - "startIndex": 1728, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1610 - }, - { - "endIndex": 1747, - "paragraph": { - "elements": [ - { - "endIndex": 1747, - "startIndex": 1729, - "textRun": { - "content": "What you’ll learn\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.dbb1hnfdd0wt", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 1729 - }, - { - "endIndex": 1748, - "paragraph": { - "elements": [ - { - "endIndex": 1748, - "startIndex": 1747, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1747 - }, - { - "endIndex": 1810, - "paragraph": { - "bullet": { - "listId": "kix.qx7bo6w9dag0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 1810, - "startIndex": 1748, - "textRun": { - "content": "How to create widget tests using the widget testing framework\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 1748 - }, - { - "endIndex": 1916, - "paragraph": { - "bullet": { - "listId": "kix.qx7bo6w9dag0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 1891, - "startIndex": 1810, - "textRun": { - "content": "How to create an integration test to test the app’s UI and performance using the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1907, - "startIndex": 1891, - "textRun": { - "content": "integration_test", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 1916, - "startIndex": 1907, - "textRun": { - "content": " library\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 1810 - }, - { - "endIndex": 1981, - "paragraph": { - "bullet": { - "listId": "kix.qx7bo6w9dag0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 1981, - "startIndex": 1916, - "textRun": { - "content": "How to test data classes (providers) with the help of unit tests\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 1916 - }, - { - "endIndex": 1999, - "paragraph": { - "elements": [ - { - "endIndex": 1999, - "startIndex": 1981, - "textRun": { - "content": "What you’ll build\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.vf85pbg1fgn7", - "lineSpacing": 100.0, - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - } - } - }, - "startIndex": 1981 - }, - { - "endIndex": 2199, - "paragraph": { - "elements": [ - { - "endIndex": 2199, - "startIndex": 1999, - "textRun": { - "content": "In this codelab, you’ll start by building a simple application with a list of items. We provide the source code for you so you can get right to the testing. The app supports the following operations:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - } - } - }, - "startIndex": 1999 - }, - { - "endIndex": 2229, - "paragraph": { - "bullet": { - "listId": "kix.k0g7fgw2pxb9", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2229, - "startIndex": 2199, - "textRun": { - "content": "Adding the items to favorites\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2199 - }, - { - "endIndex": 2259, - "paragraph": { - "bullet": { - "listId": "kix.k0g7fgw2pxb9", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2259, - "startIndex": 2229, - "textRun": { - "content": "Viewing the list of favorites\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2229 - }, - { - "endIndex": 2298, - "paragraph": { - "bullet": { - "listId": "kix.k0g7fgw2pxb9", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2297, - "startIndex": 2259, - "textRun": { - "content": "Removing items from the favorites list", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2298, - "startIndex": 2297, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2259 - }, - { - "endIndex": 2299, - "paragraph": { - "elements": [ - { - "endIndex": 2299, - "startIndex": 2298, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2298 - }, - { - "endIndex": 2570, - "startIndex": 2299, - "table": { - "columns": 2, - "rows": 1, - "tableRows": [ - { - "endIndex": 2569, - "startIndex": 2300, - "tableCells": [ - { - "content": [ - { - "endIndex": 2364, - "paragraph": { - "elements": [ - { - "endIndex": 2364, - "startIndex": 2302, - "textRun": { - "content": "Once the app is complete, you will write the following tests:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2302 - }, - { - "endIndex": 2417, - "paragraph": { - "bullet": { - "listId": "kix.m93cb198q22r", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2417, - "startIndex": 2364, - "textRun": { - "content": "Unit tests to validate the add and remove operations\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2364 - }, - { - "endIndex": 2464, - "paragraph": { - "bullet": { - "listId": "kix.m93cb198q22r", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2464, - "startIndex": 2417, - "textRun": { - "content": "Widgets tests for the home and favorites pages\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2417 - }, - { - "endIndex": 2532, - "paragraph": { - "bullet": { - "listId": "kix.m93cb198q22r", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2531, - "startIndex": 2464, - "textRun": { - "content": "UI and performance tests for the entire app using integration tests", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2532, - "startIndex": 2531, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2464 - } - ], - "endIndex": 2532, - "startIndex": 2301, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 2535, - "paragraph": { - "elements": [ - { - "endIndex": 2534, - "inlineObjectElement": { - "inlineObjectId": "kix.gg3gr5sijdnh", - "textStyle": {} - }, - "startIndex": 2533 - }, - { - "endIndex": 2535, - "startIndex": 2534, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2533 - }, - { - "endIndex": 2569, - "paragraph": { - "elements": [ - { - "endIndex": 2569, - "startIndex": 2535, - "textRun": { - "content": "GIF of the app running on Android\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2535 - } - ], - "endIndex": 2569, - "startIndex": 2532, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 2571, - "paragraph": { - "elements": [ - { - "endIndex": 2571, - "startIndex": 2570, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2570 - }, - { - "endIndex": 2572, - "paragraph": { - "elements": [ - { - "endIndex": 2572, - "startIndex": 2571, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2571 - }, - { - "endIndex": 2573, - "paragraph": { - "elements": [ - { - "endIndex": 2573, - "startIndex": 2572, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 115.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2572 - }, - { - "endIndex": 2842, - "startIndex": 2573, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 2841, - "startIndex": 2574, - "tableCells": [ - { - "content": [ - { - "endIndex": 2624, - "paragraph": { - "elements": [ - { - "endIndex": 2624, - "startIndex": 2576, - "textRun": { - "content": "What would you like to learn from this codelab?\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.b7nxsg514qu3", - "namedStyleType": "HEADING_4", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 14.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - } - }, - "startIndex": 2576 - }, - { - "endIndex": 2674, - "paragraph": { - "bullet": { - "listId": "kix.lwtrs6k81vg0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2674, - "startIndex": 2624, - "textRun": { - "content": "I'm new to the topic, and I want a good overview.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2624 - }, - { - "endIndex": 2733, - "paragraph": { - "bullet": { - "listId": "kix.lwtrs6k81vg0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2733, - "startIndex": 2674, - "textRun": { - "content": "I know something about this topic, but I want a refresher.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2674 - }, - { - "endIndex": 2787, - "paragraph": { - "bullet": { - "listId": "kix.lwtrs6k81vg0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2787, - "startIndex": 2733, - "textRun": { - "content": "I'm looking for an example code to use in my project.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2733 - }, - { - "endIndex": 2841, - "paragraph": { - "bullet": { - "listId": "kix.lwtrs6k81vg0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2841, - "startIndex": 2787, - "textRun": { - "content": "I'm looking for an explanation of something specific.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2787 - } - ], - "endIndex": 2841, - "startIndex": 2575, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.8862745, - "red": 0.8117647 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 2843, - "paragraph": { - "elements": [ - { - "endIndex": 2843, - "startIndex": 2842, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 2842 - }, - { - "endIndex": 2845, - "paragraph": { - "elements": [ - { - "endIndex": 2844, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 2843 - }, - { - "endIndex": 2845, - "startIndex": 2844, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 2843 - }, - { - "endIndex": 2890, - "paragraph": { - "elements": [ - { - "endIndex": 2890, - "startIndex": 2845, - "textRun": { - "content": "Set up your Flutter development environment \n", - "textStyle": { - "fontSize": { - "magnitude": 20.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.m0ycdyje7e1p", - "namedStyleType": "HEADING_1", - "spaceAbove": { - "magnitude": 20.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6.0, - "unit": "PT" - } - } - }, - "startIndex": 2845 - }, - { - "endIndex": 2906, - "paragraph": { - "elements": [ - { - "endIndex": 2906, - "startIndex": 2890, - "textRun": { - "content": "Duration: 10:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2890 - }, - { - "endIndex": 2923, - "paragraph": { - "elements": [ - { - "endIndex": 2923, - "startIndex": 2906, - "textRun": { - "content": "Environment: web\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2906 - }, - { - "endIndex": 2924, - "paragraph": { - "elements": [ - { - "endIndex": 2924, - "startIndex": 2923, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2923 - }, - { - "endIndex": 2975, - "paragraph": { - "elements": [ - { - "endIndex": 2926, - "startIndex": 2924, - "textRun": { - "content": "[[", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2932, - "startIndex": 2926, - "textRun": { - "content": "import", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2933, - "startIndex": 2932, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2972, - "startIndex": 2933, - "textRun": { - "content": "Flutter Codelab Development Environment", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.google.com/document/d/148aYaNSKNQDGNt7WVd10KS29HHSR4YRfiRJpZCnlwGs" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2974, - "startIndex": 2972, - "textRun": { - "content": "]]", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2975, - "startIndex": 2974, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 2924 - }, - { - "endIndex": 2976, - "paragraph": { - "elements": [ - { - "endIndex": 2976, - "startIndex": 2975, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 2975 - }, - { - "endIndex": 2992, - "paragraph": { - "elements": [ - { - "endIndex": 2992, - "startIndex": 2976, - "textRun": { - "content": "Getting started\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.bwo0af2iwk90", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 2976 - }, - { - "endIndex": 3007, - "paragraph": { - "elements": [ - { - "endIndex": 3006, - "startIndex": 2992, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3007, - "startIndex": 3006, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2992 - }, - { - "endIndex": 3054, - "paragraph": { - "elements": [ - { - "endIndex": 3054, - "startIndex": 3007, - "textRun": { - "content": "Create a new Flutter app & update dependencies\n", - "textStyle": { - "fontSize": { - "magnitude": 15.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.fzmj764jk1it", - "lineSpacing": 100.0, - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 15.0, - "unit": "PT" - } - } - }, - "startIndex": 3007 - }, - { - "endIndex": 3055, - "paragraph": { - "elements": [ - { - "endIndex": 3055, - "startIndex": 3054, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3054 - }, - { - "endIndex": 3275, - "paragraph": { - "elements": [ - { - "endIndex": 3274, - "startIndex": 3055, - "textRun": { - "content": "This codelab focuses on testing a Flutter mobile app. You will quickly create the app to be tested using source files that you copy and paste. The rest of the codelab then focuses on learning different kinds of testing.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3275, - "startIndex": 3274, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3055 - }, - { - "endIndex": 3276, - "paragraph": { - "elements": [ - { - "endIndex": 3276, - "startIndex": 3275, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3275 - }, - { - "endIndex": 3429, - "paragraph": { - "elements": [ - { - "endIndex": 3277, - "inlineObjectElement": { - "inlineObjectId": "kix.t1po0vh8s85t", - "textStyle": {} - }, - "startIndex": 3276 - }, - { - "endIndex": 3349, - "startIndex": 3277, - "textRun": { - "content": "Create a simple templated Flutter app, either using the instructions in ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 3392, - "startIndex": 3349, - "textRun": { - "content": "Getting Started with your first Flutter app", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.9098039, - "green": 0.4509804, - "red": 0.101960786 - } - } - }, - "link": { - "url": "https://flutter.dev/get-started/test-drive/" - } - } - } - }, - { - "endIndex": 3427, - "startIndex": 3392, - "textRun": { - "content": ", or on the command line as follows", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 3428, - "startIndex": 3427, - "textRun": { - "content": ".", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 3429, - "startIndex": 3428, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3276 - }, - { - "endIndex": 3430, - "paragraph": { - "elements": [ - { - "endIndex": 3430, - "startIndex": 3429, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3429 - }, - { - "endIndex": 3463, - "startIndex": 3430, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 3462, - "startIndex": 3431, - "tableCells": [ - { - "content": [ - { - "endIndex": 3462, - "paragraph": { - "elements": [ - { - "endIndex": 3462, - "startIndex": 3433, - "textRun": { - "content": "$ flutter create testing_app\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3433 - } - ], - "endIndex": 3462, - "startIndex": 3432, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 24.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 3464, - "paragraph": { - "elements": [ - { - "endIndex": 3464, - "startIndex": 3463, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3463 - }, - { - "endIndex": 3548, - "paragraph": { - "elements": [ - { - "endIndex": 3465, - "inlineObjectElement": { - "inlineObjectId": "kix.1a8yopvgl1v3", - "textStyle": {} - }, - "startIndex": 3464 - }, - { - "endIndex": 3538, - "startIndex": 3465, - "textRun": { - "content": "Add pub dependencies on the command line. For easy state management, add ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 3546, - "startIndex": 3538, - "textRun": { - "content": "provider", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/provider" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 3547, - "startIndex": 3546, - "textRun": { - "content": ":", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 3548, - "startIndex": 3547, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 3464 - }, - { - "endIndex": 3883, - "startIndex": 3548, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 3882, - "startIndex": 3549, - "tableCells": [ - { - "content": [ - { - "endIndex": 3568, - "paragraph": { - "elements": [ - { - "endIndex": 3568, - "startIndex": 3551, - "textRun": { - "content": "$ cd testing_app\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3551 - }, - { - "endIndex": 3595, - "paragraph": { - "elements": [ - { - "endIndex": 3595, - "startIndex": 3568, - "textRun": { - "content": "$ flutter pub add provider\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3568 - }, - { - "endIndex": 3621, - "paragraph": { - "elements": [ - { - "endIndex": 3621, - "startIndex": 3595, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3595 - }, - { - "endIndex": 3660, - "paragraph": { - "elements": [ - { - "endIndex": 3660, - "startIndex": 3621, - "textRun": { - "content": " collection 1.17.0 (1.17.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3621 - }, - { - "endIndex": 3689, - "paragraph": { - "elements": [ - { - "endIndex": 3689, - "startIndex": 3660, - "textRun": { - "content": " js 0.6.5 (0.6.7 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3660 - }, - { - "endIndex": 3727, - "paragraph": { - "elements": [ - { - "endIndex": 3727, - "startIndex": 3689, - "textRun": { - "content": " matcher 0.12.13 (0.12.14 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3689 - }, - { - "endIndex": 3758, - "paragraph": { - "elements": [ - { - "endIndex": 3758, - "startIndex": 3727, - "textRun": { - "content": " meta 1.8.0 (1.9.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3727 - }, - { - "endIndex": 3773, - "paragraph": { - "elements": [ - { - "endIndex": 3773, - "startIndex": 3758, - "textRun": { - "content": "+ nested 1.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3758 - }, - { - "endIndex": 3804, - "paragraph": { - "elements": [ - { - "endIndex": 3804, - "startIndex": 3773, - "textRun": { - "content": " path 1.8.2 (1.8.3 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3773 - }, - { - "endIndex": 3821, - "paragraph": { - "elements": [ - { - "endIndex": 3821, - "startIndex": 3804, - "textRun": { - "content": "+ provider 6.0.5\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3804 - }, - { - "endIndex": 3858, - "paragraph": { - "elements": [ - { - "endIndex": 3858, - "startIndex": 3821, - "textRun": { - "content": " test_api 0.4.16 (0.4.18 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3821 - }, - { - "endIndex": 3882, - "paragraph": { - "elements": [ - { - "endIndex": 3882, - "startIndex": 3858, - "textRun": { - "content": "Changed 2 dependencies!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3858 - } - ], - "endIndex": 3882, - "startIndex": 3550, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 3884, - "paragraph": { - "elements": [ - { - "endIndex": 3884, - "startIndex": 3883, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 3883 - }, - { - "endIndex": 3973, - "paragraph": { - "elements": [ - { - "endIndex": 3955, - "startIndex": 3884, - "textRun": { - "content": "For self-driving testing of Flutter code on devices and emulators, add ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 3971, - "startIndex": 3955, - "textRun": { - "content": "integration_test", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/flutter/tree/main/packages/integration_test" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 3972, - "startIndex": 3971, - "textRun": { - "content": ":", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 3973, - "startIndex": 3972, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 3884 - }, - { - "endIndex": 4631, - "startIndex": 3973, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4630, - "startIndex": 3974, - "tableCells": [ - { - "content": [ - { - "endIndex": 4031, - "paragraph": { - "elements": [ - { - "endIndex": 4031, - "startIndex": 3976, - "textRun": { - "content": "$ flutter pub add --dev --sdk=flutter integration_test\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3976 - }, - { - "endIndex": 4057, - "paragraph": { - "elements": [ - { - "endIndex": 4057, - "startIndex": 4031, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4031 - }, - { - "endIndex": 4091, - "paragraph": { - "elements": [ - { - "endIndex": 4091, - "startIndex": 4057, - "textRun": { - "content": "+ archive 3.3.2 (3.3.6 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4057 - }, - { - "endIndex": 4130, - "paragraph": { - "elements": [ - { - "endIndex": 4130, - "startIndex": 4091, - "textRun": { - "content": " collection 1.17.0 (1.17.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4091 - }, - { - "endIndex": 4145, - "paragraph": { - "elements": [ - { - "endIndex": 4145, - "startIndex": 4130, - "textRun": { - "content": "+ crypto 3.0.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4130 - }, - { - "endIndex": 4158, - "paragraph": { - "elements": [ - { - "endIndex": 4158, - "startIndex": 4145, - "textRun": { - "content": "+ file 6.1.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4145 - }, - { - "endIndex": 4198, - "paragraph": { - "elements": [ - { - "endIndex": 4198, - "startIndex": 4158, - "textRun": { - "content": "+ flutter_driver 0.0.0 from sdk flutter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4158 - }, - { - "endIndex": 4253, - "paragraph": { - "elements": [ - { - "endIndex": 4253, - "startIndex": 4198, - "textRun": { - "content": "+ fuchsia_remote_debug_protocol 0.0.0 from sdk flutter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4198 - }, - { - "endIndex": 4295, - "paragraph": { - "elements": [ - { - "endIndex": 4295, - "startIndex": 4253, - "textRun": { - "content": "+ integration_test 0.0.0 from sdk flutter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4253 - }, - { - "endIndex": 4324, - "paragraph": { - "elements": [ - { - "endIndex": 4324, - "startIndex": 4295, - "textRun": { - "content": " js 0.6.5 (0.6.7 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4295 - }, - { - "endIndex": 4362, - "paragraph": { - "elements": [ - { - "endIndex": 4362, - "startIndex": 4324, - "textRun": { - "content": " matcher 0.12.13 (0.12.14 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4324 - }, - { - "endIndex": 4393, - "paragraph": { - "elements": [ - { - "endIndex": 4393, - "startIndex": 4362, - "textRun": { - "content": " meta 1.8.0 (1.9.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4362 - }, - { - "endIndex": 4424, - "paragraph": { - "elements": [ - { - "endIndex": 4424, - "startIndex": 4393, - "textRun": { - "content": " path 1.8.2 (1.8.3 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4393 - }, - { - "endIndex": 4441, - "paragraph": { - "elements": [ - { - "endIndex": 4441, - "startIndex": 4424, - "textRun": { - "content": "+ platform 3.1.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4424 - }, - { - "endIndex": 4457, - "paragraph": { - "elements": [ - { - "endIndex": 4457, - "startIndex": 4441, - "textRun": { - "content": "+ process 4.2.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4441 - }, - { - "endIndex": 4475, - "paragraph": { - "elements": [ - { - "endIndex": 4475, - "startIndex": 4457, - "textRun": { - "content": "+ sync_http 0.3.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4457 - }, - { - "endIndex": 4512, - "paragraph": { - "elements": [ - { - "endIndex": 4512, - "startIndex": 4475, - "textRun": { - "content": " test_api 0.4.16 (0.4.18 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4475 - }, - { - "endIndex": 4531, - "paragraph": { - "elements": [ - { - "endIndex": 4531, - "startIndex": 4512, - "textRun": { - "content": "+ typed_data 1.3.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4512 - }, - { - "endIndex": 4569, - "paragraph": { - "elements": [ - { - "endIndex": 4569, - "startIndex": 4531, - "textRun": { - "content": "+ vm_service 9.4.0 (11.0.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4531 - }, - { - "endIndex": 4605, - "paragraph": { - "elements": [ - { - "endIndex": 4605, - "startIndex": 4569, - "textRun": { - "content": "+ webdriver 3.0.1 (3.0.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4569 - }, - { - "endIndex": 4630, - "paragraph": { - "elements": [ - { - "endIndex": 4630, - "startIndex": 4605, - "textRun": { - "content": "Changed 12 dependencies!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4605 - } - ], - "endIndex": 4630, - "startIndex": 3975, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4632, - "paragraph": { - "elements": [ - { - "endIndex": 4632, - "startIndex": 4631, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4631 - }, - { - "endIndex": 4741, - "paragraph": { - "elements": [ - { - "endIndex": 4725, - "startIndex": 4632, - "textRun": { - "content": "For an advanced API to test Flutter applications that run on real devices and emulators, add ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 4739, - "startIndex": 4725, - "textRun": { - "content": "flutter_driver", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.flutter.dev/flutter/flutter_driver/flutter_driver-library.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4740, - "startIndex": 4739, - "textRun": { - "content": ":", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 4741, - "startIndex": 4740, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 4632 - }, - { - "endIndex": 5155, - "startIndex": 4741, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 5154, - "startIndex": 4742, - "tableCells": [ - { - "content": [ - { - "endIndex": 4797, - "paragraph": { - "elements": [ - { - "endIndex": 4797, - "startIndex": 4744, - "textRun": { - "content": "$ flutter pub add --dev --sdk=flutter flutter_driver\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4744 - }, - { - "endIndex": 4823, - "paragraph": { - "elements": [ - { - "endIndex": 4823, - "startIndex": 4797, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4797 - }, - { - "endIndex": 4857, - "paragraph": { - "elements": [ - { - "endIndex": 4857, - "startIndex": 4823, - "textRun": { - "content": " archive 3.3.2 (3.3.6 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4823 - }, - { - "endIndex": 4896, - "paragraph": { - "elements": [ - { - "endIndex": 4896, - "startIndex": 4857, - "textRun": { - "content": " collection 1.17.0 (1.17.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4857 - }, - { - "endIndex": 4925, - "paragraph": { - "elements": [ - { - "endIndex": 4925, - "startIndex": 4896, - "textRun": { - "content": " js 0.6.5 (0.6.7 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4896 - }, - { - "endIndex": 4963, - "paragraph": { - "elements": [ - { - "endIndex": 4963, - "startIndex": 4925, - "textRun": { - "content": " matcher 0.12.13 (0.12.14 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4925 - }, - { - "endIndex": 4994, - "paragraph": { - "elements": [ - { - "endIndex": 4994, - "startIndex": 4963, - "textRun": { - "content": " meta 1.8.0 (1.9.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4963 - }, - { - "endIndex": 5025, - "paragraph": { - "elements": [ - { - "endIndex": 5025, - "startIndex": 4994, - "textRun": { - "content": " path 1.8.2 (1.8.3 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4994 - }, - { - "endIndex": 5062, - "paragraph": { - "elements": [ - { - "endIndex": 5062, - "startIndex": 5025, - "textRun": { - "content": " test_api 0.4.16 (0.4.18 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5025 - }, - { - "endIndex": 5100, - "paragraph": { - "elements": [ - { - "endIndex": 5100, - "startIndex": 5062, - "textRun": { - "content": " vm_service 9.4.0 (11.0.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5062 - }, - { - "endIndex": 5136, - "paragraph": { - "elements": [ - { - "endIndex": 5136, - "startIndex": 5100, - "textRun": { - "content": " webdriver 3.0.1 (3.0.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5100 - }, - { - "endIndex": 5154, - "paragraph": { - "elements": [ - { - "endIndex": 5154, - "startIndex": 5136, - "textRun": { - "content": "Got dependencies!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5136 - } - ], - "endIndex": 5154, - "startIndex": 4743, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 5156, - "paragraph": { - "elements": [ - { - "endIndex": 5156, - "startIndex": 5155, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5155 - }, - { - "endIndex": 5192, - "paragraph": { - "elements": [ - { - "endIndex": 5186, - "startIndex": 5156, - "textRun": { - "content": "For general test tooling, add ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 5190, - "startIndex": 5186, - "textRun": { - "content": "test", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/test" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 5191, - "startIndex": 5190, - "textRun": { - "content": ":", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 5192, - "startIndex": 5191, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 5156 - }, - { - "endIndex": 6194, - "startIndex": 5192, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 6193, - "startIndex": 5193, - "tableCells": [ - { - "content": [ - { - "endIndex": 5224, - "paragraph": { - "elements": [ - { - "endIndex": 5224, - "startIndex": 5195, - "textRun": { - "content": "$ flutter pub add --dev test\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5195 - }, - { - "endIndex": 5250, - "paragraph": { - "elements": [ - { - "endIndex": 5250, - "startIndex": 5224, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5224 - }, - { - "endIndex": 5279, - "paragraph": { - "elements": [ - { - "endIndex": 5279, - "startIndex": 5250, - "textRun": { - "content": "+ _fe_analyzer_shared 52.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5250 - }, - { - "endIndex": 5296, - "paragraph": { - "elements": [ - { - "endIndex": 5296, - "startIndex": 5279, - "textRun": { - "content": "+ analyzer 5.4.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5279 - }, - { - "endIndex": 5330, - "paragraph": { - "elements": [ - { - "endIndex": 5330, - "startIndex": 5296, - "textRun": { - "content": " archive 3.3.2 (3.3.6 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5296 - }, - { - "endIndex": 5343, - "paragraph": { - "elements": [ - { - "endIndex": 5343, - "startIndex": 5330, - "textRun": { - "content": "+ args 2.3.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5330 - }, - { - "endIndex": 5382, - "paragraph": { - "elements": [ - { - "endIndex": 5382, - "startIndex": 5343, - "textRun": { - "content": " collection 1.17.0 (1.17.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5343 - }, - { - "endIndex": 5398, - "paragraph": { - "elements": [ - { - "endIndex": 5398, - "startIndex": 5382, - "textRun": { - "content": "+ convert 3.1.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5382 - }, - { - "endIndex": 5415, - "paragraph": { - "elements": [ - { - "endIndex": 5415, - "startIndex": 5398, - "textRun": { - "content": "+ coverage 1.6.3\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5398 - }, - { - "endIndex": 5446, - "paragraph": { - "elements": [ - { - "endIndex": 5446, - "startIndex": 5415, - "textRun": { - "content": "+ frontend_server_client 3.2.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5415 - }, - { - "endIndex": 5459, - "paragraph": { - "elements": [ - { - "endIndex": 5459, - "startIndex": 5446, - "textRun": { - "content": "+ glob 2.1.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5446 - }, - { - "endIndex": 5485, - "paragraph": { - "elements": [ - { - "endIndex": 5485, - "startIndex": 5459, - "textRun": { - "content": "+ http_multi_server 3.2.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5459 - }, - { - "endIndex": 5505, - "paragraph": { - "elements": [ - { - "endIndex": 5505, - "startIndex": 5485, - "textRun": { - "content": "+ http_parser 4.0.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5485 - }, - { - "endIndex": 5516, - "paragraph": { - "elements": [ - { - "endIndex": 5516, - "startIndex": 5505, - "textRun": { - "content": "+ io 1.0.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5505 - }, - { - "endIndex": 5545, - "paragraph": { - "elements": [ - { - "endIndex": 5545, - "startIndex": 5516, - "textRun": { - "content": " js 0.6.5 (0.6.7 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5516 - }, - { - "endIndex": 5561, - "paragraph": { - "elements": [ - { - "endIndex": 5561, - "startIndex": 5545, - "textRun": { - "content": "+ logging 1.1.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5545 - }, - { - "endIndex": 5599, - "paragraph": { - "elements": [ - { - "endIndex": 5599, - "startIndex": 5561, - "textRun": { - "content": " matcher 0.12.13 (0.12.14 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5561 - }, - { - "endIndex": 5630, - "paragraph": { - "elements": [ - { - "endIndex": 5630, - "startIndex": 5599, - "textRun": { - "content": " meta 1.8.0 (1.9.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5599 - }, - { - "endIndex": 5643, - "paragraph": { - "elements": [ - { - "endIndex": 5643, - "startIndex": 5630, - "textRun": { - "content": "+ mime 1.0.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5630 - }, - { - "endIndex": 5665, - "paragraph": { - "elements": [ - { - "endIndex": 5665, - "startIndex": 5643, - "textRun": { - "content": "+ node_preamble 2.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5643 - }, - { - "endIndex": 5688, - "paragraph": { - "elements": [ - { - "endIndex": 5688, - "startIndex": 5665, - "textRun": { - "content": "+ package_config 2.1.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5665 - }, - { - "endIndex": 5719, - "paragraph": { - "elements": [ - { - "endIndex": 5719, - "startIndex": 5688, - "textRun": { - "content": " path 1.8.2 (1.8.3 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5688 - }, - { - "endIndex": 5732, - "paragraph": { - "elements": [ - { - "endIndex": 5732, - "startIndex": 5719, - "textRun": { - "content": "+ pool 1.5.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5719 - }, - { - "endIndex": 5751, - "paragraph": { - "elements": [ - { - "endIndex": 5751, - "startIndex": 5732, - "textRun": { - "content": "+ pub_semver 2.1.3\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5732 - }, - { - "endIndex": 5765, - "paragraph": { - "elements": [ - { - "endIndex": 5765, - "startIndex": 5751, - "textRun": { - "content": "+ shelf 1.4.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5751 - }, - { - "endIndex": 5796, - "paragraph": { - "elements": [ - { - "endIndex": 5796, - "startIndex": 5765, - "textRun": { - "content": "+ shelf_packages_handler 3.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5765 - }, - { - "endIndex": 5817, - "paragraph": { - "elements": [ - { - "endIndex": 5817, - "startIndex": 5796, - "textRun": { - "content": "+ shelf_static 1.1.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5796 - }, - { - "endIndex": 5842, - "paragraph": { - "elements": [ - { - "endIndex": 5842, - "startIndex": 5817, - "textRun": { - "content": "+ shelf_web_socket 1.0.3\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5817 - }, - { - "endIndex": 5873, - "paragraph": { - "elements": [ - { - "endIndex": 5873, - "startIndex": 5842, - "textRun": { - "content": "+ source_map_stack_trace 2.1.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5842 - }, - { - "endIndex": 5895, - "paragraph": { - "elements": [ - { - "endIndex": 5895, - "startIndex": 5873, - "textRun": { - "content": "+ source_maps 0.10.11\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5873 - }, - { - "endIndex": 5928, - "paragraph": { - "elements": [ - { - "endIndex": 5928, - "startIndex": 5895, - "textRun": { - "content": "+ test 1.22.0 (1.23.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5895 - }, - { - "endIndex": 5965, - "paragraph": { - "elements": [ - { - "endIndex": 5965, - "startIndex": 5928, - "textRun": { - "content": " test_api 0.4.16 (0.4.18 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5928 - }, - { - "endIndex": 6003, - "paragraph": { - "elements": [ - { - "endIndex": 6003, - "startIndex": 5965, - "textRun": { - "content": "+ test_core 0.4.20 (0.4.23 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5965 - }, - { - "endIndex": 6041, - "paragraph": { - "elements": [ - { - "endIndex": 6041, - "startIndex": 6003, - "textRun": { - "content": " vm_service 9.4.0 (11.0.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6003 - }, - { - "endIndex": 6057, - "paragraph": { - "elements": [ - { - "endIndex": 6057, - "startIndex": 6041, - "textRun": { - "content": "+ watcher 1.0.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6041 - }, - { - "endIndex": 6084, - "paragraph": { - "elements": [ - { - "endIndex": 6084, - "startIndex": 6057, - "textRun": { - "content": "+ web_socket_channel 2.3.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6057 - }, - { - "endIndex": 6120, - "paragraph": { - "elements": [ - { - "endIndex": 6120, - "startIndex": 6084, - "textRun": { - "content": " webdriver 3.0.1 (3.0.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6084 - }, - { - "endIndex": 6155, - "paragraph": { - "elements": [ - { - "endIndex": 6155, - "startIndex": 6120, - "textRun": { - "content": "+ webkit_inspection_protocol 1.2.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6120 - }, - { - "endIndex": 6168, - "paragraph": { - "elements": [ - { - "endIndex": 6168, - "startIndex": 6155, - "textRun": { - "content": "+ yaml 3.1.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6155 - }, - { - "endIndex": 6193, - "paragraph": { - "elements": [ - { - "endIndex": 6193, - "startIndex": 6168, - "textRun": { - "content": "Changed 28 dependencies!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6168 - } - ], - "endIndex": 6193, - "startIndex": 5194, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6195, - "paragraph": { - "elements": [ - { - "endIndex": 6195, - "startIndex": 6194, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6194 - }, - { - "endIndex": 6239, - "paragraph": { - "elements": [ - { - "endIndex": 6228, - "startIndex": 6195, - "textRun": { - "content": "For handling app navigation, add ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 6237, - "startIndex": 6228, - "textRun": { - "content": "go_router", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/go_router" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 6239, - "startIndex": 6237, - "textRun": { - "content": ":\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6195 - }, - { - "endIndex": 6240, - "paragraph": { - "elements": [ - { - "endIndex": 6240, - "startIndex": 6239, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6239 - }, - { - "endIndex": 6769, - "startIndex": 6240, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 6768, - "startIndex": 6241, - "tableCells": [ - { - "content": [ - { - "endIndex": 6271, - "paragraph": { - "elements": [ - { - "endIndex": 6271, - "startIndex": 6243, - "textRun": { - "content": "$ flutter pub add go_router\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6243 - }, - { - "endIndex": 6297, - "paragraph": { - "elements": [ - { - "endIndex": 6297, - "startIndex": 6271, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6271 - }, - { - "endIndex": 6331, - "paragraph": { - "elements": [ - { - "endIndex": 6331, - "startIndex": 6297, - "textRun": { - "content": " archive 3.3.2 (3.3.6 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6297 - }, - { - "endIndex": 6370, - "paragraph": { - "elements": [ - { - "endIndex": 6370, - "startIndex": 6331, - "textRun": { - "content": " collection 1.17.0 (1.17.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6331 - }, - { - "endIndex": 6415, - "paragraph": { - "elements": [ - { - "endIndex": 6415, - "startIndex": 6370, - "textRun": { - "content": "+ flutter_web_plugins 0.0.0 from sdk flutter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6370 - }, - { - "endIndex": 6433, - "paragraph": { - "elements": [ - { - "endIndex": 6433, - "startIndex": 6415, - "textRun": { - "content": "+ go_router 6.0.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6415 - }, - { - "endIndex": 6462, - "paragraph": { - "elements": [ - { - "endIndex": 6462, - "startIndex": 6433, - "textRun": { - "content": " js 0.6.5 (0.6.7 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6433 - }, - { - "endIndex": 6500, - "paragraph": { - "elements": [ - { - "endIndex": 6500, - "startIndex": 6462, - "textRun": { - "content": " matcher 0.12.13 (0.12.14 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6462 - }, - { - "endIndex": 6531, - "paragraph": { - "elements": [ - { - "endIndex": 6531, - "startIndex": 6500, - "textRun": { - "content": " meta 1.8.0 (1.9.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6500 - }, - { - "endIndex": 6562, - "paragraph": { - "elements": [ - { - "endIndex": 6562, - "startIndex": 6531, - "textRun": { - "content": " path 1.8.2 (1.8.3 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6531 - }, - { - "endIndex": 6595, - "paragraph": { - "elements": [ - { - "endIndex": 6595, - "startIndex": 6562, - "textRun": { - "content": " test 1.22.0 (1.23.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6562 - }, - { - "endIndex": 6632, - "paragraph": { - "elements": [ - { - "endIndex": 6632, - "startIndex": 6595, - "textRun": { - "content": " test_api 0.4.16 (0.4.18 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6595 - }, - { - "endIndex": 6670, - "paragraph": { - "elements": [ - { - "endIndex": 6670, - "startIndex": 6632, - "textRun": { - "content": " test_core 0.4.20 (0.4.23 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6632 - }, - { - "endIndex": 6708, - "paragraph": { - "elements": [ - { - "endIndex": 6708, - "startIndex": 6670, - "textRun": { - "content": " vm_service 9.4.0 (11.0.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6670 - }, - { - "endIndex": 6744, - "paragraph": { - "elements": [ - { - "endIndex": 6744, - "startIndex": 6708, - "textRun": { - "content": " webdriver 3.0.1 (3.0.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6708 - }, - { - "endIndex": 6768, - "paragraph": { - "elements": [ - { - "endIndex": 6768, - "startIndex": 6744, - "textRun": { - "content": "Changed 2 dependencies!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6744 - } - ], - "endIndex": 6768, - "startIndex": 6242, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6770, - "paragraph": { - "elements": [ - { - "endIndex": 6770, - "startIndex": 6769, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6769 - }, - { - "endIndex": 6842, - "paragraph": { - "elements": [ - { - "endIndex": 6828, - "startIndex": 6770, - "textRun": { - "content": "The following dependencies should have been added to your ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 6840, - "startIndex": 6828, - "textRun": { - "content": "pubspec.yaml", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_03/pubspec.yaml" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 6842, - "startIndex": 6840, - "textRun": { - "content": ":\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6770 - }, - { - "endIndex": 6862, - "paragraph": { - "elements": [ - { - "endIndex": 6848, - "startIndex": 6842, - "textRun": { - "content": "Under ", - "textStyle": {} - } - }, - { - "endIndex": 6860, - "startIndex": 6848, - "textRun": { - "content": "dependencies", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6862, - "startIndex": 6860, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 6842 - }, - { - "endIndex": 6919, - "startIndex": 6862, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 6918, - "startIndex": 6863, - "tableCells": [ - { - "content": [ - { - "endIndex": 6879, - "paragraph": { - "elements": [ - { - "endIndex": 6879, - "startIndex": 6865, - "textRun": { - "content": "dependencies:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6865 - }, - { - "endIndex": 6898, - "paragraph": { - "elements": [ - { - "endIndex": 6898, - "startIndex": 6879, - "textRun": { - "content": " provider: ^6.0.5\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6879 - }, - { - "endIndex": 6918, - "paragraph": { - "elements": [ - { - "endIndex": 6918, - "startIndex": 6898, - "textRun": { - "content": " go_router: ^6.0.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6898 - } - ], - "endIndex": 6918, - "startIndex": 6864, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6920, - "paragraph": { - "elements": [ - { - "endIndex": 6920, - "startIndex": 6919, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6919 - }, - { - "endIndex": 6944, - "paragraph": { - "elements": [ - { - "endIndex": 6926, - "startIndex": 6920, - "textRun": { - "content": "Under ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 6942, - "startIndex": 6926, - "textRun": { - "content": "dev_dependencies", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6944, - "startIndex": 6942, - "textRun": { - "content": ":\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6920 - }, - { - "endIndex": 6945, - "paragraph": { - "elements": [ - { - "endIndex": 6945, - "startIndex": 6944, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6944 - }, - { - "endIndex": 7055, - "startIndex": 6945, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 7054, - "startIndex": 6946, - "tableCells": [ - { - "content": [ - { - "endIndex": 6966, - "paragraph": { - "elements": [ - { - "endIndex": 6966, - "startIndex": 6948, - "textRun": { - "content": "dev_dependencies:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6948 - }, - { - "endIndex": 6986, - "paragraph": { - "elements": [ - { - "endIndex": 6986, - "startIndex": 6966, - "textRun": { - "content": " integration_test:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6966 - }, - { - "endIndex": 7003, - "paragraph": { - "elements": [ - { - "endIndex": 7003, - "startIndex": 6986, - "textRun": { - "content": " sdk: flutter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6986 - }, - { - "endIndex": 7021, - "paragraph": { - "elements": [ - { - "endIndex": 7021, - "startIndex": 7003, - "textRun": { - "content": " flutter_driver:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7003 - }, - { - "endIndex": 7038, - "paragraph": { - "elements": [ - { - "endIndex": 7038, - "startIndex": 7021, - "textRun": { - "content": " sdk: flutter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7021 - }, - { - "endIndex": 7054, - "paragraph": { - "elements": [ - { - "endIndex": 7054, - "startIndex": 7038, - "textRun": { - "content": " test: ^1.22.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7038 - } - ], - "endIndex": 7054, - "startIndex": 6947, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 7056, - "paragraph": { - "elements": [ - { - "endIndex": 7056, - "startIndex": 7055, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7055 - }, - { - "endIndex": 7057, - "paragraph": { - "elements": [ - { - "endIndex": 7057, - "startIndex": 7056, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7056 - }, - { - "endIndex": 7177, - "paragraph": { - "elements": [ - { - "endIndex": 7058, - "inlineObjectElement": { - "inlineObjectId": "kix.r3zi00euxfm9", - "textStyle": {} - }, - "startIndex": 7057 - }, - { - "endIndex": 7083, - "startIndex": 7058, - "textRun": { - "content": "Open the project in your ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 7094, - "startIndex": 7083, - "textRun": { - "content": "code editor", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/editor" - }, - "underline": true - } - } - }, - { - "endIndex": 7176, - "startIndex": 7094, - "textRun": { - "content": " of choice, and run the app. Alternatively, run it on the command line as follows.", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 7177, - "startIndex": 7176, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7057 - }, - { - "endIndex": 7178, - "paragraph": { - "elements": [ - { - "endIndex": 7178, - "startIndex": 7177, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7177 - }, - { - "endIndex": 7196, - "startIndex": 7178, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 7195, - "startIndex": 7179, - "tableCells": [ - { - "content": [ - { - "endIndex": 7195, - "paragraph": { - "elements": [ - { - "endIndex": 7195, - "startIndex": 7181, - "textRun": { - "content": "$ flutter run\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7181 - } - ], - "endIndex": 7195, - "startIndex": 7180, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 24.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 7197, - "paragraph": { - "elements": [ - { - "endIndex": 7197, - "startIndex": 7196, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7196 - }, - { - "endIndex": 7198, - "paragraph": { - "elements": [ - { - "endIndex": 7198, - "startIndex": 7197, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7197 - }, - { - "endIndex": 7212, - "paragraph": { - "elements": [ - { - "endIndex": 7212, - "startIndex": 7198, - "textRun": { - "content": "Build the app\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.btmxwf909kks", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 7198 - }, - { - "endIndex": 7228, - "paragraph": { - "elements": [ - { - "endIndex": 7227, - "startIndex": 7212, - "textRun": { - "content": "Duration: 10:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7228, - "startIndex": 7227, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7212 - }, - { - "endIndex": 7229, - "paragraph": { - "elements": [ - { - "endIndex": 7229, - "startIndex": 7228, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7228 - }, - { - "endIndex": 7323, - "paragraph": { - "elements": [ - { - "endIndex": 7323, - "startIndex": 7229, - "textRun": { - "content": "Next, you’ll build out the app so that you can test it. The app contains the following files:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7229 - }, - { - "endIndex": 7394, - "paragraph": { - "bullet": { - "listId": "kix.5u3z80370s2t", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 7348, - "startIndex": 7323, - "textRun": { - "content": "lib/models/favorites.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7394, - "startIndex": 7348, - "textRun": { - "content": " - creates the model class for favorites list\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7323 - }, - { - "endIndex": 7465, - "paragraph": { - "bullet": { - "listId": "kix.5u3z80370s2t", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 7420, - "startIndex": 7394, - "textRun": { - "content": "lib/screens/favorites.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7465, - "startIndex": 7420, - "textRun": { - "content": " - creates the layout for the favorites list\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7394 - }, - { - "endIndex": 7513, - "paragraph": { - "bullet": { - "listId": "kix.5u3z80370s2t", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 7486, - "startIndex": 7465, - "textRun": { - "content": "lib/screens/home.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7513, - "startIndex": 7486, - "textRun": { - "content": " - creates a list of items\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7465 - }, - { - "endIndex": 7564, - "paragraph": { - "bullet": { - "listId": "kix.5u3z80370s2t", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 7526, - "startIndex": 7513, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7564, - "startIndex": 7526, - "textRun": { - "content": " - the main file where the app starts\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7513 - }, - { - "endIndex": 7565, - "paragraph": { - "elements": [ - { - "endIndex": 7565, - "startIndex": 7564, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7564 - }, - { - "endIndex": 7628, - "paragraph": { - "elements": [ - { - "endIndex": 7583, - "startIndex": 7565, - "textRun": { - "content": "First, create the ", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7592, - "startIndex": 7583, - "textRun": { - "content": "Favorites", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7602, - "startIndex": 7592, - "textRun": { - "content": " model in ", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7628, - "startIndex": 7602, - "textRun": { - "content": "lib/models/favorites.dart\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.vhrv5dclm5vw", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 7565 - }, - { - "endIndex": 7629, - "paragraph": { - "elements": [ - { - "endIndex": 7629, - "startIndex": 7628, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7628 - }, - { - "endIndex": 7775, - "paragraph": { - "elements": [ - { - "endIndex": 7630, - "inlineObjectElement": { - "inlineObjectId": "kix.1bbevp73nnto", - "textStyle": {} - }, - "startIndex": 7629 - }, - { - "endIndex": 7660, - "startIndex": 7630, - "textRun": { - "content": "Create a new directory named ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 7666, - "startIndex": 7660, - "textRun": { - "content": "models", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7674, - "startIndex": 7666, - "textRun": { - "content": " in the ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 7677, - "startIndex": 7674, - "textRun": { - "content": "lib", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7722, - "startIndex": 7677, - "textRun": { - "content": " directory, and then create a new file named ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 7736, - "startIndex": 7722, - "textRun": { - "content": "favorites.dart", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7774, - "startIndex": 7736, - "textRun": { - "content": ". In that file add the following code:", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7775, - "startIndex": 7774, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7629 - }, - { - "endIndex": 7776, - "paragraph": { - "elements": [ - { - "endIndex": 7776, - "startIndex": 7775, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7775 - }, - { - "endIndex": 7802, - "paragraph": { - "elements": [ - { - "endIndex": 7801, - "startIndex": 7776, - "textRun": { - "content": "lib/models/favorites.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_04/lib/models/favorites.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 7802, - "startIndex": 7801, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.lsviuhkhdr2", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 7776 - }, - { - "endIndex": 8223, - "startIndex": 7802, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 8222, - "startIndex": 7803, - "tableCells": [ - { - "content": [ - { - "endIndex": 7845, - "paragraph": { - "elements": [ - { - "endIndex": 7845, - "startIndex": 7805, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7805 - }, - { - "endIndex": 7846, - "paragraph": { - "elements": [ - { - "endIndex": 7846, - "startIndex": 7845, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7845 - }, - { - "endIndex": 7922, - "paragraph": { - "elements": [ - { - "endIndex": 7922, - "startIndex": 7846, - "textRun": { - "content": "/// The [Favorites] class holds a list of favorite items saved by the user.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7846 - }, - { - "endIndex": 7963, - "paragraph": { - "elements": [ - { - "endIndex": 7963, - "startIndex": 7922, - "textRun": { - "content": "class Favorites extends ChangeNotifier {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7922 - }, - { - "endIndex": 8002, - "paragraph": { - "elements": [ - { - "endIndex": 8002, - "startIndex": 7963, - "textRun": { - "content": " final List _favoriteItems = [];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7963 - }, - { - "endIndex": 8003, - "paragraph": { - "elements": [ - { - "endIndex": 8003, - "startIndex": 8002, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8002 - }, - { - "endIndex": 8044, - "paragraph": { - "elements": [ - { - "endIndex": 8044, - "startIndex": 8003, - "textRun": { - "content": " List get items => _favoriteItems;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8003 - }, - { - "endIndex": 8045, - "paragraph": { - "elements": [ - { - "endIndex": 8045, - "startIndex": 8044, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8044 - }, - { - "endIndex": 8070, - "paragraph": { - "elements": [ - { - "endIndex": 8070, - "startIndex": 8045, - "textRun": { - "content": " void add(int itemNo) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8045 - }, - { - "endIndex": 8102, - "paragraph": { - "elements": [ - { - "endIndex": 8102, - "startIndex": 8070, - "textRun": { - "content": " _favoriteItems.add(itemNo);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8070 - }, - { - "endIndex": 8125, - "paragraph": { - "elements": [ - { - "endIndex": 8125, - "startIndex": 8102, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8102 - }, - { - "endIndex": 8129, - "paragraph": { - "elements": [ - { - "endIndex": 8129, - "startIndex": 8125, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8125 - }, - { - "endIndex": 8130, - "paragraph": { - "elements": [ - { - "endIndex": 8130, - "startIndex": 8129, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8129 - }, - { - "endIndex": 8158, - "paragraph": { - "elements": [ - { - "endIndex": 8158, - "startIndex": 8130, - "textRun": { - "content": " void remove(int itemNo) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8130 - }, - { - "endIndex": 8193, - "paragraph": { - "elements": [ - { - "endIndex": 8193, - "startIndex": 8158, - "textRun": { - "content": " _favoriteItems.remove(itemNo);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8158 - }, - { - "endIndex": 8216, - "paragraph": { - "elements": [ - { - "endIndex": 8216, - "startIndex": 8193, - "textRun": { - "content": " notifyListeners();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8193 - }, - { - "endIndex": 8220, - "paragraph": { - "elements": [ - { - "endIndex": 8220, - "startIndex": 8216, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8216 - }, - { - "endIndex": 8222, - "paragraph": { - "elements": [ - { - "endIndex": 8222, - "startIndex": 8220, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8220 - } - ], - "endIndex": 8222, - "startIndex": 7804, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 8224, - "paragraph": { - "elements": [ - { - "endIndex": 8224, - "startIndex": 8223, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8223 - }, - { - "endIndex": 8277, - "paragraph": { - "elements": [ - { - "endIndex": 8232, - "startIndex": 8224, - "textRun": { - "content": "Add the ", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8241, - "startIndex": 8232, - "textRun": { - "content": "Favorites", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8250, - "startIndex": 8241, - "textRun": { - "content": " page in ", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8276, - "startIndex": 8250, - "textRun": { - "content": "lib/screens/favorites.dart", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8277, - "startIndex": 8276, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.qzgctyugqfot", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 8224 - }, - { - "endIndex": 8278, - "paragraph": { - "elements": [ - { - "endIndex": 8278, - "startIndex": 8277, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8277 - }, - { - "endIndex": 8437, - "paragraph": { - "elements": [ - { - "endIndex": 8279, - "inlineObjectElement": { - "inlineObjectId": "kix.m7tljkfuu9rn", - "textStyle": {} - }, - "startIndex": 8278 - }, - { - "endIndex": 8308, - "startIndex": 8279, - "textRun": { - "content": "Create a new directory named ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 8315, - "startIndex": 8308, - "textRun": { - "content": "screens", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8323, - "startIndex": 8315, - "textRun": { - "content": " in the ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 8326, - "startIndex": 8323, - "textRun": { - "content": "lib", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8384, - "startIndex": 8326, - "textRun": { - "content": " directory, and in that directory create a new file named ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 8398, - "startIndex": 8384, - "textRun": { - "content": "favorites.dart", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8437, - "startIndex": 8398, - "textRun": { - "content": ". In that file add the following code:\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8278 - }, - { - "endIndex": 8438, - "paragraph": { - "elements": [ - { - "endIndex": 8438, - "startIndex": 8437, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8437 - }, - { - "endIndex": 8465, - "paragraph": { - "elements": [ - { - "endIndex": 8464, - "startIndex": 8438, - "textRun": { - "content": "lib/screens/favorites.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_04/lib/screens/favorites.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 8465, - "startIndex": 8464, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.sgii43wa0h80", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 8438 - }, - { - "endIndex": 10141, - "startIndex": 8465, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 10140, - "startIndex": 8466, - "tableCells": [ - { - "content": [ - { - "endIndex": 8508, - "paragraph": { - "elements": [ - { - "endIndex": 8508, - "startIndex": 8468, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8468 - }, - { - "endIndex": 8549, - "paragraph": { - "elements": [ - { - "endIndex": 8549, - "startIndex": 8508, - "textRun": { - "content": "import 'package:provider/provider.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8508 - }, - { - "endIndex": 8550, - "paragraph": { - "elements": [ - { - "endIndex": 8550, - "startIndex": 8549, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8549 - }, - { - "endIndex": 8585, - "paragraph": { - "elements": [ - { - "endIndex": 8585, - "startIndex": 8550, - "textRun": { - "content": "import '../models/favorites.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8550 - }, - { - "endIndex": 8586, - "paragraph": { - "elements": [ - { - "endIndex": 8586, - "startIndex": 8585, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8585 - }, - { - "endIndex": 8632, - "paragraph": { - "elements": [ - { - "endIndex": 8632, - "startIndex": 8586, - "textRun": { - "content": "class FavoritesPage extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8586 - }, - { - "endIndex": 8668, - "paragraph": { - "elements": [ - { - "endIndex": 8668, - "startIndex": 8632, - "textRun": { - "content": " const FavoritesPage({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8632 - }, - { - "endIndex": 8669, - "paragraph": { - "elements": [ - { - "endIndex": 8669, - "startIndex": 8668, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8668 - }, - { - "endIndex": 8715, - "paragraph": { - "elements": [ - { - "endIndex": 8715, - "startIndex": 8669, - "textRun": { - "content": " static String routeName = 'favorites_page';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8669 - }, - { - "endIndex": 8716, - "paragraph": { - "elements": [ - { - "endIndex": 8716, - "startIndex": 8715, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8715 - }, - { - "endIndex": 8728, - "paragraph": { - "elements": [ - { - "endIndex": 8728, - "startIndex": 8716, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8716 - }, - { - "endIndex": 8767, - "paragraph": { - "elements": [ - { - "endIndex": 8767, - "startIndex": 8728, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8728 - }, - { - "endIndex": 8788, - "paragraph": { - "elements": [ - { - "endIndex": 8788, - "startIndex": 8767, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8767 - }, - { - "endIndex": 8810, - "paragraph": { - "elements": [ - { - "endIndex": 8810, - "startIndex": 8788, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8788 - }, - { - "endIndex": 8850, - "paragraph": { - "elements": [ - { - "endIndex": 8850, - "startIndex": 8810, - "textRun": { - "content": " title: const Text('Favorites'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8810 - }, - { - "endIndex": 8859, - "paragraph": { - "elements": [ - { - "endIndex": 8859, - "startIndex": 8850, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8850 - }, - { - "endIndex": 8892, - "paragraph": { - "elements": [ - { - "endIndex": 8892, - "startIndex": 8859, - "textRun": { - "content": " body: Consumer(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8859 - }, - { - "endIndex": 8954, - "paragraph": { - "elements": [ - { - "endIndex": 8954, - "startIndex": 8892, - "textRun": { - "content": " builder: (context, value, child) => ListView.builder(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8892 - }, - { - "endIndex": 8995, - "paragraph": { - "elements": [ - { - "endIndex": 8995, - "startIndex": 8954, - "textRun": { - "content": " itemCount: value.items.length,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8954 - }, - { - "endIndex": 9056, - "paragraph": { - "elements": [ - { - "endIndex": 9056, - "startIndex": 8995, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(vertical: 16),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8995 - }, - { - "endIndex": 9137, - "paragraph": { - "elements": [ - { - "endIndex": 9137, - "startIndex": 9056, - "textRun": { - "content": " itemBuilder: (context, index) => FavoriteItemTile(value.items[index]),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9056 - }, - { - "endIndex": 9148, - "paragraph": { - "elements": [ - { - "endIndex": 9148, - "startIndex": 9137, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9137 - }, - { - "endIndex": 9157, - "paragraph": { - "elements": [ - { - "endIndex": 9157, - "startIndex": 9148, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9148 - }, - { - "endIndex": 9164, - "paragraph": { - "elements": [ - { - "endIndex": 9164, - "startIndex": 9157, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9157 - }, - { - "endIndex": 9168, - "paragraph": { - "elements": [ - { - "endIndex": 9168, - "startIndex": 9164, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9164 - }, - { - "endIndex": 9170, - "paragraph": { - "elements": [ - { - "endIndex": 9170, - "startIndex": 9168, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9168 - }, - { - "endIndex": 9171, - "paragraph": { - "elements": [ - { - "endIndex": 9171, - "startIndex": 9170, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9170 - }, - { - "endIndex": 9220, - "paragraph": { - "elements": [ - { - "endIndex": 9220, - "startIndex": 9171, - "textRun": { - "content": "class FavoriteItemTile extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9171 - }, - { - "endIndex": 9272, - "paragraph": { - "elements": [ - { - "endIndex": 9272, - "startIndex": 9220, - "textRun": { - "content": " const FavoriteItemTile(this.itemNo, {super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9220 - }, - { - "endIndex": 9273, - "paragraph": { - "elements": [ - { - "endIndex": 9273, - "startIndex": 9272, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9272 - }, - { - "endIndex": 9293, - "paragraph": { - "elements": [ - { - "endIndex": 9293, - "startIndex": 9273, - "textRun": { - "content": " final int itemNo;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9273 - }, - { - "endIndex": 9294, - "paragraph": { - "elements": [ - { - "endIndex": 9294, - "startIndex": 9293, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9293 - }, - { - "endIndex": 9306, - "paragraph": { - "elements": [ - { - "endIndex": 9306, - "startIndex": 9294, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9294 - }, - { - "endIndex": 9345, - "paragraph": { - "elements": [ - { - "endIndex": 9345, - "startIndex": 9306, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9306 - }, - { - "endIndex": 9365, - "paragraph": { - "elements": [ - { - "endIndex": 9365, - "startIndex": 9345, - "textRun": { - "content": " return Padding(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9345 - }, - { - "endIndex": 9407, - "paragraph": { - "elements": [ - { - "endIndex": 9407, - "startIndex": 9365, - "textRun": { - "content": " padding: const EdgeInsets.all(8.0),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9365 - }, - { - "endIndex": 9430, - "paragraph": { - "elements": [ - { - "endIndex": 9430, - "startIndex": 9407, - "textRun": { - "content": " child: ListTile(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9407 - }, - { - "endIndex": 9461, - "paragraph": { - "elements": [ - { - "endIndex": 9461, - "startIndex": 9430, - "textRun": { - "content": " leading: CircleAvatar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9430 - }, - { - "endIndex": 9540, - "paragraph": { - "elements": [ - { - "endIndex": 9540, - "startIndex": 9461, - "textRun": { - "content": " backgroundColor: Colors.primaries[itemNo % Colors.primaries.length],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9461 - }, - { - "endIndex": 9551, - "paragraph": { - "elements": [ - { - "endIndex": 9551, - "startIndex": 9540, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9540 - }, - { - "endIndex": 9572, - "paragraph": { - "elements": [ - { - "endIndex": 9572, - "startIndex": 9551, - "textRun": { - "content": " title: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9551 - }, - { - "endIndex": 9598, - "paragraph": { - "elements": [ - { - "endIndex": 9598, - "startIndex": 9572, - "textRun": { - "content": " 'Item $itemNo',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9572 - }, - { - "endIndex": 9644, - "paragraph": { - "elements": [ - { - "endIndex": 9644, - "startIndex": 9598, - "textRun": { - "content": " key: Key('favorites_text_$itemNo'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9598 - }, - { - "endIndex": 9655, - "paragraph": { - "elements": [ - { - "endIndex": 9655, - "startIndex": 9644, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9644 - }, - { - "endIndex": 9685, - "paragraph": { - "elements": [ - { - "endIndex": 9685, - "startIndex": 9655, - "textRun": { - "content": " trailing: IconButton(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9655 - }, - { - "endIndex": 9728, - "paragraph": { - "elements": [ - { - "endIndex": 9728, - "startIndex": 9685, - "textRun": { - "content": " key: Key('remove_icon_$itemNo'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9685 - }, - { - "endIndex": 9769, - "paragraph": { - "elements": [ - { - "endIndex": 9769, - "startIndex": 9728, - "textRun": { - "content": " icon: const Icon(Icons.close),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9728 - }, - { - "endIndex": 9795, - "paragraph": { - "elements": [ - { - "endIndex": 9795, - "startIndex": 9769, - "textRun": { - "content": " onPressed: () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9769 - }, - { - "endIndex": 9870, - "paragraph": { - "elements": [ - { - "endIndex": 9870, - "startIndex": 9795, - "textRun": { - "content": " Provider.of(context, listen: false).remove(itemNo);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9795 - }, - { - "endIndex": 9926, - "paragraph": { - "elements": [ - { - "endIndex": 9926, - "startIndex": 9870, - "textRun": { - "content": " ScaffoldMessenger.of(context).showSnackBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9870 - }, - { - "endIndex": 9956, - "paragraph": { - "elements": [ - { - "endIndex": 9956, - "startIndex": 9926, - "textRun": { - "content": " const SnackBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9926 - }, - { - "endIndex": 10014, - "paragraph": { - "elements": [ - { - "endIndex": 10014, - "startIndex": 9956, - "textRun": { - "content": " content: Text('Removed from favorites.'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9956 - }, - { - "endIndex": 10062, - "paragraph": { - "elements": [ - { - "endIndex": 10062, - "startIndex": 10014, - "textRun": { - "content": " duration: Duration(seconds: 1),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10014 - }, - { - "endIndex": 10079, - "paragraph": { - "elements": [ - { - "endIndex": 10079, - "startIndex": 10062, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10062 - }, - { - "endIndex": 10094, - "paragraph": { - "elements": [ - { - "endIndex": 10094, - "startIndex": 10079, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10079 - }, - { - "endIndex": 10107, - "paragraph": { - "elements": [ - { - "endIndex": 10107, - "startIndex": 10094, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10094 - }, - { - "endIndex": 10118, - "paragraph": { - "elements": [ - { - "endIndex": 10118, - "startIndex": 10107, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10107 - }, - { - "endIndex": 10127, - "paragraph": { - "elements": [ - { - "endIndex": 10127, - "startIndex": 10118, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10118 - }, - { - "endIndex": 10134, - "paragraph": { - "elements": [ - { - "endIndex": 10134, - "startIndex": 10127, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10127 - }, - { - "endIndex": 10138, - "paragraph": { - "elements": [ - { - "endIndex": 10138, - "startIndex": 10134, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10134 - }, - { - "endIndex": 10140, - "paragraph": { - "elements": [ - { - "endIndex": 10140, - "startIndex": 10138, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10138 - } - ], - "endIndex": 10140, - "startIndex": 8467, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 10142, - "paragraph": { - "elements": [ - { - "endIndex": 10142, - "startIndex": 10141, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10141 - }, - { - "endIndex": 10185, - "paragraph": { - "elements": [ - { - "endIndex": 10150, - "startIndex": 10142, - "textRun": { - "content": "Add the ", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 10154, - "startIndex": 10150, - "textRun": { - "content": "Home", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 10163, - "startIndex": 10154, - "textRun": { - "content": " page in ", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 10184, - "startIndex": 10163, - "textRun": { - "content": "lib/screens/home.dart", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10185, - "startIndex": 10184, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.lmxxfjfy7j9r", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 10142 - }, - { - "endIndex": 10186, - "paragraph": { - "elements": [ - { - "endIndex": 10186, - "startIndex": 10185, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10185 - }, - { - "endIndex": 10306, - "paragraph": { - "elements": [ - { - "endIndex": 10187, - "inlineObjectElement": { - "inlineObjectId": "kix.p6jnzf8drcum", - "textStyle": {} - }, - "startIndex": 10186 - }, - { - "endIndex": 10194, - "startIndex": 10187, - "textRun": { - "content": "In the ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 10205, - "startIndex": 10194, - "textRun": { - "content": "lib/screens", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10246, - "startIndex": 10205, - "textRun": { - "content": " directory create another new file named ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 10255, - "startIndex": 10246, - "textRun": { - "content": "home.dart", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10260, - "startIndex": 10255, - "textRun": { - "content": ". In ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 10281, - "startIndex": 10260, - "textRun": { - "content": "lib/screens/home.dart", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10305, - "startIndex": 10281, - "textRun": { - "content": " add the following code:", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 10306, - "startIndex": 10305, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10186 - }, - { - "endIndex": 10307, - "paragraph": { - "elements": [ - { - "endIndex": 10307, - "startIndex": 10306, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10306 - }, - { - "endIndex": 10329, - "paragraph": { - "elements": [ - { - "endIndex": 10328, - "startIndex": 10307, - "textRun": { - "content": "lib/screens/home.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_04/lib/screens/home.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 10329, - "startIndex": 10328, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.gdhfwytw20p7", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 10307 - }, - { - "endIndex": 12539, - "startIndex": 10329, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 12538, - "startIndex": 10330, - "tableCells": [ - { - "content": [ - { - "endIndex": 10372, - "paragraph": { - "elements": [ - { - "endIndex": 10372, - "startIndex": 10332, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10332 - }, - { - "endIndex": 10415, - "paragraph": { - "elements": [ - { - "endIndex": 10415, - "startIndex": 10372, - "textRun": { - "content": "import 'package:go_router/go_router.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10372 - }, - { - "endIndex": 10456, - "paragraph": { - "elements": [ - { - "endIndex": 10456, - "startIndex": 10415, - "textRun": { - "content": "import 'package:provider/provider.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10415 - }, - { - "endIndex": 10491, - "paragraph": { - "elements": [ - { - "endIndex": 10491, - "startIndex": 10456, - "textRun": { - "content": "import '../models/favorites.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10456 - }, - { - "endIndex": 10516, - "paragraph": { - "elements": [ - { - "endIndex": 10516, - "startIndex": 10491, - "textRun": { - "content": "import 'favorites.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10491 - }, - { - "endIndex": 10517, - "paragraph": { - "elements": [ - { - "endIndex": 10517, - "startIndex": 10516, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10516 - }, - { - "endIndex": 10558, - "paragraph": { - "elements": [ - { - "endIndex": 10558, - "startIndex": 10517, - "textRun": { - "content": "class HomePage extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10517 - }, - { - "endIndex": 10591, - "paragraph": { - "elements": [ - { - "endIndex": 10591, - "startIndex": 10558, - "textRun": { - "content": " static String routeName = '/';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10558 - }, - { - "endIndex": 10592, - "paragraph": { - "elements": [ - { - "endIndex": 10592, - "startIndex": 10591, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10591 - }, - { - "endIndex": 10623, - "paragraph": { - "elements": [ - { - "endIndex": 10623, - "startIndex": 10592, - "textRun": { - "content": " const HomePage({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10592 - }, - { - "endIndex": 10624, - "paragraph": { - "elements": [ - { - "endIndex": 10624, - "startIndex": 10623, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10623 - }, - { - "endIndex": 10636, - "paragraph": { - "elements": [ - { - "endIndex": 10636, - "startIndex": 10624, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10624 - }, - { - "endIndex": 10675, - "paragraph": { - "elements": [ - { - "endIndex": 10675, - "startIndex": 10636, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10636 - }, - { - "endIndex": 10696, - "paragraph": { - "elements": [ - { - "endIndex": 10696, - "startIndex": 10675, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10675 - }, - { - "endIndex": 10718, - "paragraph": { - "elements": [ - { - "endIndex": 10718, - "startIndex": 10696, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10696 - }, - { - "endIndex": 10763, - "paragraph": { - "elements": [ - { - "endIndex": 10763, - "startIndex": 10718, - "textRun": { - "content": " title: const Text('Testing Sample'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10718 - }, - { - "endIndex": 10790, - "paragraph": { - "elements": [ - { - "endIndex": 10790, - "startIndex": 10763, - "textRun": { - "content": " actions: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10763 - }, - { - "endIndex": 10817, - "paragraph": { - "elements": [ - { - "endIndex": 10817, - "startIndex": 10790, - "textRun": { - "content": " TextButton.icon(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10790 - }, - { - "endIndex": 10845, - "paragraph": { - "elements": [ - { - "endIndex": 10845, - "startIndex": 10817, - "textRun": { - "content": " onPressed: () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10817 - }, - { - "endIndex": 10902, - "paragraph": { - "elements": [ - { - "endIndex": 10902, - "startIndex": 10845, - "textRun": { - "content": " context.go('/${FavoritesPage.routeName}');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10845 - }, - { - "endIndex": 10917, - "paragraph": { - "elements": [ - { - "endIndex": 10917, - "startIndex": 10902, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10902 - }, - { - "endIndex": 10970, - "paragraph": { - "elements": [ - { - "endIndex": 10970, - "startIndex": 10917, - "textRun": { - "content": " icon: const Icon(Icons.favorite_border),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10917 - }, - { - "endIndex": 11014, - "paragraph": { - "elements": [ - { - "endIndex": 11014, - "startIndex": 10970, - "textRun": { - "content": " label: const Text('Favorites'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10970 - }, - { - "endIndex": 11027, - "paragraph": { - "elements": [ - { - "endIndex": 11027, - "startIndex": 11014, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11014 - }, - { - "endIndex": 11038, - "paragraph": { - "elements": [ - { - "endIndex": 11038, - "startIndex": 11027, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11027 - }, - { - "endIndex": 11047, - "paragraph": { - "elements": [ - { - "endIndex": 11047, - "startIndex": 11038, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11038 - }, - { - "endIndex": 11077, - "paragraph": { - "elements": [ - { - "endIndex": 11077, - "startIndex": 11047, - "textRun": { - "content": " body: ListView.builder(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11047 - }, - { - "endIndex": 11101, - "paragraph": { - "elements": [ - { - "endIndex": 11101, - "startIndex": 11077, - "textRun": { - "content": " itemCount: 100,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11077 - }, - { - "endIndex": 11128, - "paragraph": { - "elements": [ - { - "endIndex": 11128, - "startIndex": 11101, - "textRun": { - "content": " cacheExtent: 20.0,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11101 - }, - { - "endIndex": 11187, - "paragraph": { - "elements": [ - { - "endIndex": 11187, - "startIndex": 11128, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(vertical: 16),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11128 - }, - { - "endIndex": 11245, - "paragraph": { - "elements": [ - { - "endIndex": 11245, - "startIndex": 11187, - "textRun": { - "content": " itemBuilder: (context, index) => ItemTile(index),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11187 - }, - { - "endIndex": 11254, - "paragraph": { - "elements": [ - { - "endIndex": 11254, - "startIndex": 11245, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11245 - }, - { - "endIndex": 11261, - "paragraph": { - "elements": [ - { - "endIndex": 11261, - "startIndex": 11254, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11254 - }, - { - "endIndex": 11265, - "paragraph": { - "elements": [ - { - "endIndex": 11265, - "startIndex": 11261, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11261 - }, - { - "endIndex": 11267, - "paragraph": { - "elements": [ - { - "endIndex": 11267, - "startIndex": 11265, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11265 - }, - { - "endIndex": 11268, - "paragraph": { - "elements": [ - { - "endIndex": 11268, - "startIndex": 11267, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11267 - }, - { - "endIndex": 11309, - "paragraph": { - "elements": [ - { - "endIndex": 11309, - "startIndex": 11268, - "textRun": { - "content": "class ItemTile extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11268 - }, - { - "endIndex": 11329, - "paragraph": { - "elements": [ - { - "endIndex": 11329, - "startIndex": 11309, - "textRun": { - "content": " final int itemNo;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11309 - }, - { - "endIndex": 11330, - "paragraph": { - "elements": [ - { - "endIndex": 11330, - "startIndex": 11329, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11329 - }, - { - "endIndex": 11374, - "paragraph": { - "elements": [ - { - "endIndex": 11374, - "startIndex": 11330, - "textRun": { - "content": " const ItemTile(this.itemNo, {super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11330 - }, - { - "endIndex": 11375, - "paragraph": { - "elements": [ - { - "endIndex": 11375, - "startIndex": 11374, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11374 - }, - { - "endIndex": 11387, - "paragraph": { - "elements": [ - { - "endIndex": 11387, - "startIndex": 11375, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11375 - }, - { - "endIndex": 11426, - "paragraph": { - "elements": [ - { - "endIndex": 11426, - "startIndex": 11387, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11387 - }, - { - "endIndex": 11483, - "paragraph": { - "elements": [ - { - "endIndex": 11483, - "startIndex": 11426, - "textRun": { - "content": " var favoritesList = Provider.of(context);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11426 - }, - { - "endIndex": 11484, - "paragraph": { - "elements": [ - { - "endIndex": 11484, - "startIndex": 11483, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11483 - }, - { - "endIndex": 11504, - "paragraph": { - "elements": [ - { - "endIndex": 11504, - "startIndex": 11484, - "textRun": { - "content": " return Padding(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11484 - }, - { - "endIndex": 11546, - "paragraph": { - "elements": [ - { - "endIndex": 11546, - "startIndex": 11504, - "textRun": { - "content": " padding: const EdgeInsets.all(8.0),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11504 - }, - { - "endIndex": 11569, - "paragraph": { - "elements": [ - { - "endIndex": 11569, - "startIndex": 11546, - "textRun": { - "content": " child: ListTile(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11546 - }, - { - "endIndex": 11600, - "paragraph": { - "elements": [ - { - "endIndex": 11600, - "startIndex": 11569, - "textRun": { - "content": " leading: CircleAvatar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11569 - }, - { - "endIndex": 11679, - "paragraph": { - "elements": [ - { - "endIndex": 11679, - "startIndex": 11600, - "textRun": { - "content": " backgroundColor: Colors.primaries[itemNo % Colors.primaries.length],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11600 - }, - { - "endIndex": 11690, - "paragraph": { - "elements": [ - { - "endIndex": 11690, - "startIndex": 11679, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11679 - }, - { - "endIndex": 11711, - "paragraph": { - "elements": [ - { - "endIndex": 11711, - "startIndex": 11690, - "textRun": { - "content": " title: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11690 - }, - { - "endIndex": 11737, - "paragraph": { - "elements": [ - { - "endIndex": 11737, - "startIndex": 11711, - "textRun": { - "content": " 'Item $itemNo',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11711 - }, - { - "endIndex": 11773, - "paragraph": { - "elements": [ - { - "endIndex": 11773, - "startIndex": 11737, - "textRun": { - "content": " key: Key('text_$itemNo'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11737 - }, - { - "endIndex": 11784, - "paragraph": { - "elements": [ - { - "endIndex": 11784, - "startIndex": 11773, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11773 - }, - { - "endIndex": 11814, - "paragraph": { - "elements": [ - { - "endIndex": 11814, - "startIndex": 11784, - "textRun": { - "content": " trailing: IconButton(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11784 - }, - { - "endIndex": 11850, - "paragraph": { - "elements": [ - { - "endIndex": 11850, - "startIndex": 11814, - "textRun": { - "content": " key: Key('icon_$itemNo'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11814 - }, - { - "endIndex": 11903, - "paragraph": { - "elements": [ - { - "endIndex": 11903, - "startIndex": 11850, - "textRun": { - "content": " icon: favoritesList.items.contains(itemNo)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11850 - }, - { - "endIndex": 11946, - "paragraph": { - "elements": [ - { - "endIndex": 11946, - "startIndex": 11903, - "textRun": { - "content": " ? const Icon(Icons.favorite)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11903 - }, - { - "endIndex": 11997, - "paragraph": { - "elements": [ - { - "endIndex": 11997, - "startIndex": 11946, - "textRun": { - "content": " : const Icon(Icons.favorite_border),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11946 - }, - { - "endIndex": 12023, - "paragraph": { - "elements": [ - { - "endIndex": 12023, - "startIndex": 11997, - "textRun": { - "content": " onPressed: () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11997 - }, - { - "endIndex": 12073, - "paragraph": { - "elements": [ - { - "endIndex": 12073, - "startIndex": 12023, - "textRun": { - "content": " !favoritesList.items.contains(itemNo)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12023 - }, - { - "endIndex": 12117, - "paragraph": { - "elements": [ - { - "endIndex": 12117, - "startIndex": 12073, - "textRun": { - "content": " ? favoritesList.add(itemNo)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12073 - }, - { - "endIndex": 12165, - "paragraph": { - "elements": [ - { - "endIndex": 12165, - "startIndex": 12117, - "textRun": { - "content": " : favoritesList.remove(itemNo);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12117 - }, - { - "endIndex": 12221, - "paragraph": { - "elements": [ - { - "endIndex": 12221, - "startIndex": 12165, - "textRun": { - "content": " ScaffoldMessenger.of(context).showSnackBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12165 - }, - { - "endIndex": 12245, - "paragraph": { - "elements": [ - { - "endIndex": 12245, - "startIndex": 12221, - "textRun": { - "content": " SnackBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12221 - }, - { - "endIndex": 12312, - "paragraph": { - "elements": [ - { - "endIndex": 12312, - "startIndex": 12245, - "textRun": { - "content": " content: Text(favoritesList.items.contains(itemNo)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12245 - }, - { - "endIndex": 12356, - "paragraph": { - "elements": [ - { - "endIndex": 12356, - "startIndex": 12312, - "textRun": { - "content": " ? 'Added to favorites.'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12312 - }, - { - "endIndex": 12406, - "paragraph": { - "elements": [ - { - "endIndex": 12406, - "startIndex": 12356, - "textRun": { - "content": " : 'Removed from favorites.'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12356 - }, - { - "endIndex": 12460, - "paragraph": { - "elements": [ - { - "endIndex": 12460, - "startIndex": 12406, - "textRun": { - "content": " duration: const Duration(seconds: 1),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12406 - }, - { - "endIndex": 12477, - "paragraph": { - "elements": [ - { - "endIndex": 12477, - "startIndex": 12460, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12460 - }, - { - "endIndex": 12492, - "paragraph": { - "elements": [ - { - "endIndex": 12492, - "startIndex": 12477, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12477 - }, - { - "endIndex": 12505, - "paragraph": { - "elements": [ - { - "endIndex": 12505, - "startIndex": 12492, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12492 - }, - { - "endIndex": 12516, - "paragraph": { - "elements": [ - { - "endIndex": 12516, - "startIndex": 12505, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12505 - }, - { - "endIndex": 12525, - "paragraph": { - "elements": [ - { - "endIndex": 12525, - "startIndex": 12516, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12516 - }, - { - "endIndex": 12532, - "paragraph": { - "elements": [ - { - "endIndex": 12532, - "startIndex": 12525, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12525 - }, - { - "endIndex": 12536, - "paragraph": { - "elements": [ - { - "endIndex": 12536, - "startIndex": 12532, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12532 - }, - { - "endIndex": 12538, - "paragraph": { - "elements": [ - { - "endIndex": 12538, - "startIndex": 12536, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12536 - } - ], - "endIndex": 12538, - "startIndex": 10331, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 12540, - "paragraph": { - "elements": [ - { - "endIndex": 12540, - "startIndex": 12539, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12539 - }, - { - "endIndex": 12578, - "paragraph": { - "elements": [ - { - "endIndex": 12564, - "startIndex": 12540, - "textRun": { - "content": "Replace the contents of ", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 12578, - "startIndex": 12564, - "textRun": { - "content": "lib/main.dart\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.2jmtlwdbzpsw", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 12540 - }, - { - "endIndex": 12579, - "paragraph": { - "elements": [ - { - "endIndex": 12579, - "startIndex": 12578, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12578 - }, - { - "endIndex": 12643, - "paragraph": { - "elements": [ - { - "endIndex": 12580, - "inlineObjectElement": { - "inlineObjectId": "kix.j4cw023q65fe", - "textStyle": {} - }, - "startIndex": 12579 - }, - { - "endIndex": 12604, - "startIndex": 12580, - "textRun": { - "content": "Replace the contents of ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 12617, - "startIndex": 12604, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12643, - "startIndex": 12617, - "textRun": { - "content": " with the following code:\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12579 - }, - { - "endIndex": 12644, - "paragraph": { - "elements": [ - { - "endIndex": 12644, - "startIndex": 12643, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12643 - }, - { - "endIndex": 12658, - "paragraph": { - "elements": [ - { - "endIndex": 12657, - "startIndex": 12644, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_04/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 12658, - "startIndex": 12657, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.xzhg8e14tk08", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 12644 - }, - { - "endIndex": 13727, - "startIndex": 12658, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 13726, - "startIndex": 12659, - "tableCells": [ - { - "content": [ - { - "endIndex": 12701, - "paragraph": { - "elements": [ - { - "endIndex": 12701, - "startIndex": 12661, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12661 - }, - { - "endIndex": 12744, - "paragraph": { - "elements": [ - { - "endIndex": 12744, - "startIndex": 12701, - "textRun": { - "content": "import 'package:go_router/go_router.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12701 - }, - { - "endIndex": 12785, - "paragraph": { - "elements": [ - { - "endIndex": 12785, - "startIndex": 12744, - "textRun": { - "content": "import 'package:provider/provider.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12744 - }, - { - "endIndex": 12817, - "paragraph": { - "elements": [ - { - "endIndex": 12817, - "startIndex": 12785, - "textRun": { - "content": "import 'models/favorites.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12785 - }, - { - "endIndex": 12850, - "paragraph": { - "elements": [ - { - "endIndex": 12850, - "startIndex": 12817, - "textRun": { - "content": "import 'screens/favorites.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12817 - }, - { - "endIndex": 12878, - "paragraph": { - "elements": [ - { - "endIndex": 12878, - "startIndex": 12850, - "textRun": { - "content": "import 'screens/home.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12850 - }, - { - "endIndex": 12879, - "paragraph": { - "elements": [ - { - "endIndex": 12879, - "startIndex": 12878, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12878 - }, - { - "endIndex": 12893, - "paragraph": { - "elements": [ - { - "endIndex": 12893, - "startIndex": 12879, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12879 - }, - { - "endIndex": 12923, - "paragraph": { - "elements": [ - { - "endIndex": 12923, - "startIndex": 12893, - "textRun": { - "content": " runApp(const TestingApp());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12893 - }, - { - "endIndex": 12925, - "paragraph": { - "elements": [ - { - "endIndex": 12925, - "startIndex": 12923, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12923 - }, - { - "endIndex": 12926, - "paragraph": { - "elements": [ - { - "endIndex": 12926, - "startIndex": 12925, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12925 - }, - { - "endIndex": 12952, - "paragraph": { - "elements": [ - { - "endIndex": 12952, - "startIndex": 12926, - "textRun": { - "content": "final _router = GoRouter(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12926 - }, - { - "endIndex": 12964, - "paragraph": { - "elements": [ - { - "endIndex": 12964, - "startIndex": 12952, - "textRun": { - "content": " routes: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12952 - }, - { - "endIndex": 12977, - "paragraph": { - "elements": [ - { - "endIndex": 12977, - "startIndex": 12964, - "textRun": { - "content": " GoRoute(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12964 - }, - { - "endIndex": 13009, - "paragraph": { - "elements": [ - { - "endIndex": 13009, - "startIndex": 12977, - "textRun": { - "content": " path: HomePage.routeName,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12977 - }, - { - "endIndex": 13043, - "paragraph": { - "elements": [ - { - "endIndex": 13043, - "startIndex": 13009, - "textRun": { - "content": " builder: (context, state) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13009 - }, - { - "endIndex": 13076, - "paragraph": { - "elements": [ - { - "endIndex": 13076, - "startIndex": 13043, - "textRun": { - "content": " return const HomePage();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13043 - }, - { - "endIndex": 13085, - "paragraph": { - "elements": [ - { - "endIndex": 13085, - "startIndex": 13076, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13076 - }, - { - "endIndex": 13101, - "paragraph": { - "elements": [ - { - "endIndex": 13101, - "startIndex": 13085, - "textRun": { - "content": " routes: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13085 - }, - { - "endIndex": 13118, - "paragraph": { - "elements": [ - { - "endIndex": 13118, - "startIndex": 13101, - "textRun": { - "content": " GoRoute(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13101 - }, - { - "endIndex": 13159, - "paragraph": { - "elements": [ - { - "endIndex": 13159, - "startIndex": 13118, - "textRun": { - "content": " path: FavoritesPage.routeName,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13118 - }, - { - "endIndex": 13197, - "paragraph": { - "elements": [ - { - "endIndex": 13197, - "startIndex": 13159, - "textRun": { - "content": " builder: (context, state) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13159 - }, - { - "endIndex": 13239, - "paragraph": { - "elements": [ - { - "endIndex": 13239, - "startIndex": 13197, - "textRun": { - "content": " return const FavoritesPage();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13197 - }, - { - "endIndex": 13252, - "paragraph": { - "elements": [ - { - "endIndex": 13252, - "startIndex": 13239, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13239 - }, - { - "endIndex": 13263, - "paragraph": { - "elements": [ - { - "endIndex": 13263, - "startIndex": 13252, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13252 - }, - { - "endIndex": 13272, - "paragraph": { - "elements": [ - { - "endIndex": 13272, - "startIndex": 13263, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13263 - }, - { - "endIndex": 13279, - "paragraph": { - "elements": [ - { - "endIndex": 13279, - "startIndex": 13272, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13272 - }, - { - "endIndex": 13284, - "paragraph": { - "elements": [ - { - "endIndex": 13284, - "startIndex": 13279, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13279 - }, - { - "endIndex": 13287, - "paragraph": { - "elements": [ - { - "endIndex": 13287, - "startIndex": 13284, - "textRun": { - "content": ");\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13284 - }, - { - "endIndex": 13288, - "paragraph": { - "elements": [ - { - "endIndex": 13288, - "startIndex": 13287, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13287 - }, - { - "endIndex": 13331, - "paragraph": { - "elements": [ - { - "endIndex": 13331, - "startIndex": 13288, - "textRun": { - "content": "class TestingApp extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13288 - }, - { - "endIndex": 13364, - "paragraph": { - "elements": [ - { - "endIndex": 13364, - "startIndex": 13331, - "textRun": { - "content": " const TestingApp({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13331 - }, - { - "endIndex": 13365, - "paragraph": { - "elements": [ - { - "endIndex": 13365, - "startIndex": 13364, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13364 - }, - { - "endIndex": 13377, - "paragraph": { - "elements": [ - { - "endIndex": 13377, - "startIndex": 13365, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13365 - }, - { - "endIndex": 13416, - "paragraph": { - "elements": [ - { - "endIndex": 13416, - "startIndex": 13377, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13377 - }, - { - "endIndex": 13462, - "paragraph": { - "elements": [ - { - "endIndex": 13462, - "startIndex": 13416, - "textRun": { - "content": " return ChangeNotifierProvider(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13416 - }, - { - "endIndex": 13502, - "paragraph": { - "elements": [ - { - "endIndex": 13502, - "startIndex": 13462, - "textRun": { - "content": " create: (context) => Favorites(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13462 - }, - { - "endIndex": 13535, - "paragraph": { - "elements": [ - { - "endIndex": 13535, - "startIndex": 13502, - "textRun": { - "content": " child: MaterialApp.router(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13502 - }, - { - "endIndex": 13568, - "paragraph": { - "elements": [ - { - "endIndex": 13568, - "startIndex": 13535, - "textRun": { - "content": " title: 'Testing Sample',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13535 - }, - { - "endIndex": 13594, - "paragraph": { - "elements": [ - { - "endIndex": 13594, - "startIndex": 13568, - "textRun": { - "content": " theme: ThemeData(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13568 - }, - { - "endIndex": 13632, - "paragraph": { - "elements": [ - { - "endIndex": 13632, - "startIndex": 13594, - "textRun": { - "content": " primarySwatch: Colors.blue,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13594 - }, - { - "endIndex": 13662, - "paragraph": { - "elements": [ - { - "endIndex": 13662, - "startIndex": 13632, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13632 - }, - { - "endIndex": 13673, - "paragraph": { - "elements": [ - { - "endIndex": 13673, - "startIndex": 13662, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13662 - }, - { - "endIndex": 13704, - "paragraph": { - "elements": [ - { - "endIndex": 13704, - "startIndex": 13673, - "textRun": { - "content": " routerConfig: _router,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13673 - }, - { - "endIndex": 13713, - "paragraph": { - "elements": [ - { - "endIndex": 13713, - "startIndex": 13704, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13704 - }, - { - "endIndex": 13720, - "paragraph": { - "elements": [ - { - "endIndex": 13720, - "startIndex": 13713, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13713 - }, - { - "endIndex": 13724, - "paragraph": { - "elements": [ - { - "endIndex": 13724, - "startIndex": 13720, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13720 - }, - { - "endIndex": 13726, - "paragraph": { - "elements": [ - { - "endIndex": 13725, - "startIndex": 13724, - "textRun": { - "content": "}", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13726, - "startIndex": 13725, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13724 - } - ], - "endIndex": 13726, - "startIndex": 12660, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 13728, - "paragraph": { - "elements": [ - { - "endIndex": 13728, - "startIndex": 13727, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13727 - }, - { - "endIndex": 13767, - "paragraph": { - "elements": [ - { - "endIndex": 13766, - "startIndex": 13728, - "textRun": { - "content": "The app is now complete, but untested.", - "textStyle": {} - } - }, - { - "endIndex": 13767, - "startIndex": 13766, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13728 - }, - { - "endIndex": 13768, - "paragraph": { - "elements": [ - { - "endIndex": 13768, - "startIndex": 13767, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13767 - }, - { - "endIndex": 13828, - "paragraph": { - "elements": [ - { - "endIndex": 13769, - "inlineObjectElement": { - "inlineObjectId": "kix.rs7d47iay6n6", - "textStyle": {} - }, - "startIndex": 13768 - }, - { - "endIndex": 13828, - "startIndex": 13769, - "textRun": { - "content": "Run the app. It should look like the following screenshot:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13768 - }, - { - "endIndex": 13829, - "paragraph": { - "elements": [ - { - "endIndex": 13829, - "startIndex": 13828, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13828 - }, - { - "endIndex": 13831, - "paragraph": { - "elements": [ - { - "endIndex": 13830, - "inlineObjectElement": { - "inlineObjectId": "kix.bq782xjqvdjv", - "textStyle": {} - }, - "startIndex": 13829 - }, - { - "endIndex": 13831, - "startIndex": 13830, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13829 - }, - { - "endIndex": 13832, - "paragraph": { - "elements": [ - { - "endIndex": 13832, - "startIndex": 13831, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13831 - }, - { - "endIndex": 14056, - "paragraph": { - "elements": [ - { - "endIndex": 13884, - "startIndex": 13832, - "textRun": { - "content": "The app shows a list of items. Tap the heart-shaped ", - "textStyle": {} - } - }, - { - "endIndex": 13888, - "startIndex": 13884, - "textRun": { - "content": "icon", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13945, - "startIndex": 13888, - "textRun": { - "content": " on any row to fill in the heart and add the item to the ", - "textStyle": {} - } - }, - { - "endIndex": 13959, - "startIndex": 13945, - "textRun": { - "content": "favorites list", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13965, - "startIndex": 13959, - "textRun": { - "content": ". The ", - "textStyle": {} - } - }, - { - "endIndex": 13974, - "startIndex": 13965, - "textRun": { - "content": "Favorites", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13981, - "startIndex": 13974, - "textRun": { - "content": " button", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13989, - "startIndex": 13981, - "textRun": { - "content": " on the ", - "textStyle": {} - } - }, - { - "endIndex": 13995, - "startIndex": 13989, - "textRun": { - "content": "AppBar", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14040, - "startIndex": 13995, - "textRun": { - "content": " takes you to a second screen containing the ", - "textStyle": {} - } - }, - { - "endIndex": 14056, - "startIndex": 14040, - "textRun": { - "content": "favorites list.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13832 - }, - { - "endIndex": 14057, - "paragraph": { - "elements": [ - { - "endIndex": 14057, - "startIndex": 14056, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14056 - }, - { - "endIndex": 14139, - "paragraph": { - "elements": [ - { - "endIndex": 14139, - "startIndex": 14057, - "textRun": { - "content": "The app is now ready for testing. You’ll start testing the app in the next step.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14057 - }, - { - "endIndex": 14165, - "paragraph": { - "elements": [ - { - "endIndex": 14165, - "startIndex": 14139, - "textRun": { - "content": "Unit testing the provider\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.o7wkpp16ivz9", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 14139 - }, - { - "endIndex": 14180, - "paragraph": { - "elements": [ - { - "endIndex": 14179, - "startIndex": 14165, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 14180, - "startIndex": 14179, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14165 - }, - { - "endIndex": 14181, - "paragraph": { - "elements": [ - { - "endIndex": 14181, - "startIndex": 14180, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14180 - }, - { - "endIndex": 14390, - "paragraph": { - "elements": [ - { - "endIndex": 14214, - "startIndex": 14181, - "textRun": { - "content": "You’ll start by unit testing the ", - "textStyle": {} - } - }, - { - "endIndex": 14223, - "startIndex": 14214, - "textRun": { - "content": "favorites", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14231, - "startIndex": 14223, - "textRun": { - "content": " model. ", - "textStyle": {} - } - }, - { - "endIndex": 14232, - "startIndex": 14231, - "textRun": { - "content": "W", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - } - } - }, - { - "endIndex": 14251, - "startIndex": 14232, - "textRun": { - "content": "hat is a unit test?", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - } - } - }, - { - "endIndex": 14252, - "startIndex": 14251, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2509804, - "red": 0.23529412 - } - } - } - } - } - }, - { - "endIndex": 14295, - "startIndex": 14252, - "textRun": { - "content": "A unit test verifies that every individual ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - } - } - }, - { - "endIndex": 14299, - "startIndex": 14295, - "textRun": { - "content": "unit", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "italic": true - } - } - }, - { - "endIndex": 14390, - "startIndex": 14299, - "textRun": { - "content": " of software, be it a function, object or a widget, performs its intended task correctly.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14181 - }, - { - "endIndex": 14391, - "paragraph": { - "elements": [ - { - "endIndex": 14391, - "startIndex": 14390, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14390 - }, - { - "endIndex": 14492, - "paragraph": { - "elements": [ - { - "endIndex": 14476, - "startIndex": 14391, - "textRun": { - "content": "All the test files in a Flutter app, except for integration tests, are placed in the ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - } - } - }, - { - "endIndex": 14480, - "startIndex": 14476, - "textRun": { - "content": "test", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14491, - "startIndex": 14480, - "textRun": { - "content": " directory.", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - } - } - }, - { - "endIndex": 14492, - "startIndex": 14491, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14391 - }, - { - "endIndex": 14493, - "paragraph": { - "elements": [ - { - "endIndex": 14493, - "startIndex": 14492, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14492 - }, - { - "endIndex": 14693, - "startIndex": 14493, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 14692, - "startIndex": 14494, - "tableCells": [ - { - "content": [ - { - "endIndex": 14692, - "paragraph": { - "elements": [ - { - "endIndex": 14502, - "startIndex": 14496, - "textRun": { - "content": "Note: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 14529, - "startIndex": 14502, - "textRun": { - "content": "These instructions use the ", - "textStyle": {} - } - }, - { - "endIndex": 14541, - "startIndex": 14529, - "textRun": { - "content": "command line", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 14692, - "startIndex": 14541, - "textRun": { - "content": " to run the tests. However, you can also use the options provided by VS Code and Android Studio for running unit and widget tests on your application.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14496 - } - ], - "endIndex": 14692, - "startIndex": 14495, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 14694, - "paragraph": { - "elements": [ - { - "endIndex": 14694, - "startIndex": 14693, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14693 - }, - { - "endIndex": 14723, - "paragraph": { - "elements": [ - { - "endIndex": 14700, - "startIndex": 14694, - "textRun": { - "content": "Remove", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - } - } - } - }, - { - "endIndex": 14701, - "startIndex": 14700, - "textRun": { - "content": " ", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - } - } - } - }, - { - "endIndex": 14723, - "startIndex": 14701, - "textRun": { - "content": "test/widget_test.dart\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ozej4uql1crf", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 14694 - }, - { - "endIndex": 14724, - "paragraph": { - "elements": [ - { - "endIndex": 14724, - "startIndex": 14723, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14723 - }, - { - "endIndex": 14823, - "paragraph": { - "elements": [ - { - "endIndex": 14725, - "inlineObjectElement": { - "inlineObjectId": "kix.msx029net7f", - "textStyle": {} - }, - "startIndex": 14724 - }, - { - "endIndex": 14752, - "startIndex": 14725, - "textRun": { - "content": "Before you begin testing, d", - "textStyle": {} - } - }, - { - "endIndex": 14762, - "startIndex": 14752, - "textRun": { - "content": "elete the ", - "textStyle": {} - } - }, - { - "endIndex": 14778, - "startIndex": 14762, - "textRun": { - "content": "widget_test.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14822, - "startIndex": 14778, - "textRun": { - "content": " file. You’ll be adding your own test files.", - "textStyle": {} - } - }, - { - "endIndex": 14823, - "startIndex": 14822, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14724 - }, - { - "endIndex": 14846, - "paragraph": { - "elements": [ - { - "endIndex": 14846, - "startIndex": 14823, - "textRun": { - "content": "Create a new test file\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ju260rdqj548", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 14823 - }, - { - "endIndex": 15148, - "paragraph": { - "elements": [ - { - "endIndex": 14869, - "startIndex": 14846, - "textRun": { - "content": "First, you’ll test the ", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 14874, - "startIndex": 14869, - "textRun": { - "content": "add()", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14889, - "startIndex": 14874, - "textRun": { - "content": " method in the ", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 14898, - "startIndex": 14889, - "textRun": { - "content": "Favorites", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15040, - "startIndex": 14898, - "textRun": { - "content": " model to verify that a new item gets added to the list, and that the list reflects the change. By convention, the directory structure in the ", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 15044, - "startIndex": 15040, - "textRun": { - "content": "test", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15074, - "startIndex": 15044, - "textRun": { - "content": " directory mimics that in the ", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 15077, - "startIndex": 15074, - "textRun": { - "content": "lib", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15131, - "startIndex": 15077, - "textRun": { - "content": " directory and the Dart files have the same name with ", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 15137, - "startIndex": 15131, - "textRun": { - "content": "_test ", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15146, - "startIndex": 15137, - "textRun": { - "content": " appended", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 15147, - "startIndex": 15146, - "textRun": { - "content": ".", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 15148, - "startIndex": 15147, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 11.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 14846 - }, - { - "endIndex": 15283, - "paragraph": { - "elements": [ - { - "endIndex": 15149, - "inlineObjectElement": { - "inlineObjectId": "kix.d4vz5dd90gaz", - "textStyle": {} - }, - "startIndex": 15148 - }, - { - "endIndex": 15158, - "startIndex": 15149, - "textRun": { - "content": "Create a ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 15164, - "startIndex": 15158, - "textRun": { - "content": "models", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15182, - "startIndex": 15164, - "textRun": { - "content": " directory in the ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 15186, - "startIndex": 15182, - "textRun": { - "content": "test", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15230, - "startIndex": 15186, - "textRun": { - "content": " directory. In this new directory, create a ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 15249, - "startIndex": 15230, - "textRun": { - "content": "favorites_test.dart", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15282, - "startIndex": 15249, - "textRun": { - "content": " file with the following content:", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 15283, - "startIndex": 15282, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15148 - }, - { - "endIndex": 15284, - "paragraph": { - "elements": [ - { - "endIndex": 15284, - "startIndex": 15283, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15283 - }, - { - "endIndex": 15316, - "paragraph": { - "elements": [ - { - "endIndex": 15315, - "startIndex": 15284, - "textRun": { - "content": "test/models/favorites_test.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_05/test/models/favorites_test.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 15316, - "startIndex": 15315, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.1wzi16ibjujt", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 15284 - }, - { - "endIndex": 15661, - "startIndex": 15316, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 15660, - "startIndex": 15317, - "tableCells": [ - { - "content": [ - { - "endIndex": 15352, - "paragraph": { - "elements": [ - { - "endIndex": 15352, - "startIndex": 15319, - "textRun": { - "content": "import 'package:test/test.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15319 - }, - { - "endIndex": 15404, - "paragraph": { - "elements": [ - { - "endIndex": 15404, - "startIndex": 15352, - "textRun": { - "content": "import 'package:testing_app/models/favorites.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15352 - }, - { - "endIndex": 15405, - "paragraph": { - "elements": [ - { - "endIndex": 15405, - "startIndex": 15404, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15404 - }, - { - "endIndex": 15419, - "paragraph": { - "elements": [ - { - "endIndex": 15419, - "startIndex": 15405, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15405 - }, - { - "endIndex": 15456, - "paragraph": { - "elements": [ - { - "endIndex": 15456, - "startIndex": 15419, - "textRun": { - "content": " group('Testing App Provider', () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15419 - }, - { - "endIndex": 15489, - "paragraph": { - "elements": [ - { - "endIndex": 15489, - "startIndex": 15456, - "textRun": { - "content": " var favorites = Favorites();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15456 - }, - { - "endIndex": 15490, - "paragraph": { - "elements": [ - { - "endIndex": 15490, - "startIndex": 15489, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15489 - }, - { - "endIndex": 15534, - "paragraph": { - "elements": [ - { - "endIndex": 15534, - "startIndex": 15490, - "textRun": { - "content": " test('A new item should be added', () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15490 - }, - { - "endIndex": 15557, - "paragraph": { - "elements": [ - { - "endIndex": 15557, - "startIndex": 15534, - "textRun": { - "content": " var number = 35;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15534 - }, - { - "endIndex": 15586, - "paragraph": { - "elements": [ - { - "endIndex": 15586, - "startIndex": 15557, - "textRun": { - "content": " favorites.add(number);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15557 - }, - { - "endIndex": 15640, - "paragraph": { - "elements": [ - { - "endIndex": 15640, - "startIndex": 15586, - "textRun": { - "content": " expect(favorites.items.contains(number), true);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15586 - }, - { - "endIndex": 15652, - "paragraph": { - "elements": [ - { - "endIndex": 15652, - "startIndex": 15640, - "textRun": { - "content": " }); \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15640 - }, - { - "endIndex": 15658, - "paragraph": { - "elements": [ - { - "endIndex": 15658, - "startIndex": 15652, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15652 - }, - { - "endIndex": 15660, - "paragraph": { - "elements": [ - { - "endIndex": 15660, - "startIndex": 15658, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15658 - } - ], - "endIndex": 15660, - "startIndex": 15318, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 15662, - "paragraph": { - "elements": [ - { - "endIndex": 15662, - "startIndex": 15661, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15661 - }, - { - "endIndex": 15891, - "paragraph": { - "elements": [ - { - "endIndex": 15665, - "startIndex": 15662, - "textRun": { - "content": "The", - "textStyle": {} - } - }, - { - "endIndex": 15691, - "startIndex": 15665, - "textRun": { - "content": " Flutter testing framework", - "textStyle": {} - } - }, - { - "endIndex": 15876, - "startIndex": 15691, - "textRun": { - "content": " allows you to bind similar tests related to each other in a group. There can be multiple groups in a single test file intended to test different parts of the corresponding file in the ", - "textStyle": {} - } - }, - { - "endIndex": 15879, - "startIndex": 15876, - "textRun": { - "content": "lib", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15891, - "startIndex": 15879, - "textRun": { - "content": " directory.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15662 - }, - { - "endIndex": 15892, - "paragraph": { - "elements": [ - { - "endIndex": 15892, - "startIndex": 15891, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15891 - }, - { - "endIndex": 16023, - "paragraph": { - "elements": [ - { - "endIndex": 15896, - "startIndex": 15892, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 15902, - "startIndex": 15896, - "textRun": { - "content": "test()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15947, - "startIndex": 15902, - "textRun": { - "content": " method takes two positional parameters: the ", - "textStyle": {} - } - }, - { - "endIndex": 15958, - "startIndex": 15947, - "textRun": { - "content": "description", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15979, - "startIndex": 15958, - "textRun": { - "content": " of the test and the ", - "textStyle": {} - } - }, - { - "endIndex": 15987, - "startIndex": 15979, - "textRun": { - "content": "callback", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16023, - "startIndex": 15987, - "textRun": { - "content": " where you actually write the test.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15892 - }, - { - "endIndex": 16024, - "paragraph": { - "elements": [ - { - "endIndex": 16024, - "startIndex": 16023, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16023 - }, - { - "endIndex": 16130, - "paragraph": { - "elements": [ - { - "endIndex": 16025, - "inlineObjectElement": { - "inlineObjectId": "kix.evfxwl6jtu5p", - "textStyle": {} - }, - "startIndex": 16024 - }, - { - "endIndex": 16101, - "startIndex": 16025, - "textRun": { - "content": "Test removing an item from the list. Insert the following test in the same ", - "textStyle": {} - } - }, - { - "endIndex": 16121, - "startIndex": 16101, - "textRun": { - "content": "Testing App Provider", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16130, - "startIndex": 16121, - "textRun": { - "content": " group:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16024 - }, - { - "endIndex": 16131, - "paragraph": { - "elements": [ - { - "endIndex": 16131, - "startIndex": 16130, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16130 - }, - { - "endIndex": 16163, - "paragraph": { - "elements": [ - { - "endIndex": 16162, - "startIndex": 16131, - "textRun": { - "content": "test/models/favorites_test.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_05/test/models/favorites_test.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 16163, - "startIndex": 16162, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.84z4hkcjsaif", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 16131 - }, - { - "endIndex": 16383, - "startIndex": 16163, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16382, - "startIndex": 16164, - "tableCells": [ - { - "content": [ - { - "endIndex": 16205, - "paragraph": { - "elements": [ - { - "endIndex": 16205, - "startIndex": 16166, - "textRun": { - "content": "test('An item should be removed', () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16166 - }, - { - "endIndex": 16224, - "paragraph": { - "elements": [ - { - "endIndex": 16224, - "startIndex": 16205, - "textRun": { - "content": " var number = 45;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16205 - }, - { - "endIndex": 16249, - "paragraph": { - "elements": [ - { - "endIndex": 16249, - "startIndex": 16224, - "textRun": { - "content": " favorites.add(number);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16224 - }, - { - "endIndex": 16299, - "paragraph": { - "elements": [ - { - "endIndex": 16299, - "startIndex": 16249, - "textRun": { - "content": " expect(favorites.items.contains(number), true);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16249 - }, - { - "endIndex": 16327, - "paragraph": { - "elements": [ - { - "endIndex": 16327, - "startIndex": 16299, - "textRun": { - "content": " favorites.remove(number);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16299 - }, - { - "endIndex": 16378, - "paragraph": { - "elements": [ - { - "endIndex": 16378, - "startIndex": 16327, - "textRun": { - "content": " expect(favorites.items.contains(number), false);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16327 - }, - { - "endIndex": 16382, - "paragraph": { - "elements": [ - { - "endIndex": 16382, - "startIndex": 16378, - "textRun": { - "content": "});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16378 - } - ], - "endIndex": 16382, - "startIndex": 16165, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16384, - "paragraph": { - "elements": [ - { - "endIndex": 16384, - "startIndex": 16383, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16383 - }, - { - "endIndex": 16397, - "paragraph": { - "elements": [ - { - "endIndex": 16396, - "startIndex": 16384, - "textRun": { - "content": "Run the test", - "textStyle": {} - } - }, - { - "endIndex": 16397, - "startIndex": 16396, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6yxrv73h3a0x", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 16384 - }, - { - "endIndex": 16493, - "paragraph": { - "elements": [ - { - "endIndex": 16398, - "inlineObjectElement": { - "inlineObjectId": "kix.b9xif596w41m", - "textStyle": {} - }, - "startIndex": 16397 - }, - { - "endIndex": 16419, - "startIndex": 16398, - "textRun": { - "content": "At the command line, ", - "textStyle": {} - } - }, - { - "endIndex": 16492, - "startIndex": 16419, - "textRun": { - "content": "navigate to the project’s root directory and enter the following command:", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 16493, - "startIndex": 16492, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 16397 - }, - { - "endIndex": 16545, - "startIndex": 16493, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16544, - "startIndex": 16494, - "tableCells": [ - { - "content": [ - { - "endIndex": 16544, - "paragraph": { - "elements": [ - { - "endIndex": 16543, - "startIndex": 16496, - "textRun": { - "content": "$ flutter test test/models/favorites_test.dart ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16544, - "startIndex": 16543, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16496 - } - ], - "endIndex": 16544, - "startIndex": 16495, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16546, - "paragraph": { - "elements": [ - { - "endIndex": 16546, - "startIndex": 16545, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16545 - }, - { - "endIndex": 16618, - "paragraph": { - "elements": [ - { - "endIndex": 16618, - "startIndex": 16546, - "textRun": { - "content": "If everything works, you should see a message similar to the following:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16546 - }, - { - "endIndex": 16619, - "paragraph": { - "elements": [ - { - "endIndex": 16619, - "startIndex": 16618, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16618 - }, - { - "endIndex": 16703, - "startIndex": 16619, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16702, - "startIndex": 16620, - "tableCells": [ - { - "content": [ - { - "endIndex": 16702, - "paragraph": { - "elements": [ - { - "endIndex": 16702, - "startIndex": 16622, - "textRun": { - "content": "00:06 +2: All tests passed! \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16622 - } - ], - "endIndex": 16702, - "startIndex": 16621, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16704, - "paragraph": { - "elements": [ - { - "endIndex": 16704, - "startIndex": 16703, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16703 - }, - { - "endIndex": 16761, - "paragraph": { - "elements": [ - { - "endIndex": 16728, - "startIndex": 16704, - "textRun": { - "content": "The complete test file: ", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - } - } - } - }, - { - "endIndex": 16759, - "startIndex": 16728, - "textRun": { - "content": "test/models/favorites_test.dart", - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_05/test/models/favorites_test.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16760, - "startIndex": 16759, - "textRun": { - "content": ".", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 16761, - "startIndex": 16760, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16704 - }, - { - "endIndex": 16762, - "paragraph": { - "elements": [ - { - "endIndex": 16762, - "startIndex": 16761, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16761 - }, - { - "endIndex": 16855, - "startIndex": 16762, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16854, - "startIndex": 16763, - "tableCells": [ - { - "content": [ - { - "endIndex": 16838, - "paragraph": { - "elements": [ - { - "endIndex": 16768, - "startIndex": 16765, - "textRun": { - "content": "Tip", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 16803, - "startIndex": 16768, - "textRun": { - "content": ": You can run all the tests in the ", - "textStyle": {} - } - }, - { - "endIndex": 16807, - "startIndex": 16803, - "textRun": { - "content": "test", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16838, - "startIndex": 16807, - "textRun": { - "content": " directory at once by running:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16765 - }, - { - "endIndex": 16839, - "paragraph": { - "elements": [ - { - "endIndex": 16839, - "startIndex": 16838, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16838 - }, - { - "endIndex": 16854, - "paragraph": { - "elements": [ - { - "endIndex": 16853, - "startIndex": 16839, - "textRun": { - "content": "$ flutter test", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16854, - "startIndex": 16853, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16839 - } - ], - "endIndex": 16854, - "startIndex": 16764, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16856, - "paragraph": { - "elements": [ - { - "endIndex": 16856, - "startIndex": 16855, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16855 - }, - { - "endIndex": 16933, - "paragraph": { - "elements": [ - { - "endIndex": 16900, - "startIndex": 16856, - "textRun": { - "content": "For more information on unit testing, visit ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 16931, - "startIndex": 16900, - "textRun": { - "content": "An introduction to unit testing", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/cookbook/testing/unit/introduction" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 16933, - "startIndex": 16931, - "textRun": { - "content": ".\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16856 - }, - { - "endIndex": 16948, - "paragraph": { - "elements": [ - { - "endIndex": 16947, - "startIndex": 16933, - "textRun": { - "content": "Widget testing", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 16948, - "startIndex": 16947, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7a0ktremdsrl", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 16933 - }, - { - "endIndex": 16964, - "paragraph": { - "elements": [ - { - "endIndex": 16963, - "startIndex": 16948, - "textRun": { - "content": "Duration: 15:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 16964, - "startIndex": 16963, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16948 - }, - { - "endIndex": 16965, - "paragraph": { - "elements": [ - { - "endIndex": 16965, - "startIndex": 16964, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16964 - }, - { - "endIndex": 17172, - "paragraph": { - "elements": [ - { - "endIndex": 17123, - "startIndex": 16965, - "textRun": { - "content": "In this step you’ll add code to test widgets. Widget testing is unique to Flutter, where you can test each widget in an isolated fashion. This step tests the ", - "textStyle": {} - } - }, - { - "endIndex": 17131, - "startIndex": 17123, - "textRun": { - "content": "HomePage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17136, - "startIndex": 17131, - "textRun": { - "content": " and ", - "textStyle": {} - } - }, - { - "endIndex": 17149, - "startIndex": 17136, - "textRun": { - "content": "FavoritesPage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17172, - "startIndex": 17149, - "textRun": { - "content": " screens individually.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16965 - }, - { - "endIndex": 17173, - "paragraph": { - "elements": [ - { - "endIndex": 17173, - "startIndex": 17172, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17172 - }, - { - "endIndex": 17411, - "paragraph": { - "elements": [ - { - "endIndex": 17174, - "startIndex": 17173, - "textRun": { - "content": "W", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17197, - "startIndex": 17174, - "textRun": { - "content": "idget testing uses the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17209, - "startIndex": 17197, - "textRun": { - "content": "testWidget()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17233, - "startIndex": 17209, - "textRun": { - "content": " function instead of the", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17240, - "startIndex": 17233, - "textRun": { - "content": " test()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17259, - "startIndex": 17240, - "textRun": { - "content": " function. Like the", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17266, - "startIndex": 17259, - "textRun": { - "content": " test()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17281, - "startIndex": 17266, - "textRun": { - "content": " function, the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17293, - "startIndex": 17281, - "textRun": { - "content": "testWidget()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17325, - "startIndex": 17293, - "textRun": { - "content": " function takes two parameters: ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17337, - "startIndex": 17325, - "textRun": { - "content": "description,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17342, - "startIndex": 17337, - "textRun": { - "content": " and ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17350, - "startIndex": 17342, - "textRun": { - "content": "callback", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17381, - "startIndex": 17350, - "textRun": { - "content": ", however the callback takes a ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17393, - "startIndex": 17381, - "textRun": { - "content": "WidgetTester", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17411, - "startIndex": 17393, - "textRun": { - "content": " as its argument.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17173 - }, - { - "endIndex": 17412, - "paragraph": { - "elements": [ - { - "endIndex": 17412, - "startIndex": 17411, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17411 - }, - { - "endIndex": 17898, - "paragraph": { - "elements": [ - { - "endIndex": 17429, - "startIndex": 17412, - "textRun": { - "content": "Widget tests use ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2509804, - "red": 0.23529412 - } - } - } - } - } - }, - { - "endIndex": 17454, - "startIndex": 17429, - "textRun": { - "content": "TestFlutterWidgetsBinding", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2509804, - "red": 0.23529412 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17763, - "startIndex": 17454, - "textRun": { - "content": ", a class that provides the same resources to your widgets that they would have in a running app, e.g. information about screen size, the ability to schedule animations, but without running inside an app. Instead, a virtual environment is used to instantiate the widget, and then run tests the results. Here, ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2509804, - "red": 0.23529412 - } - } - } - } - } - }, - { - "endIndex": 17773, - "startIndex": 17763, - "textRun": { - "content": "pumpWidget", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2509804, - "red": 0.23529412 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17897, - "startIndex": 17773, - "textRun": { - "content": " kicks off the process by telling the framework to mount and measure a particular widget just as it would in an application.", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2509804, - "red": 0.23529412 - } - } - } - } - } - }, - { - "endIndex": 17898, - "startIndex": 17897, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17412 - }, - { - "endIndex": 17899, - "paragraph": { - "elements": [ - { - "endIndex": 17899, - "startIndex": 17898, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17898 - }, - { - "endIndex": 18066, - "paragraph": { - "elements": [ - { - "endIndex": 17974, - "startIndex": 17899, - "textRun": { - "content": "The widget testing framework provides finders to find widgets, for example ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17980, - "startIndex": 17974, - "textRun": { - "content": "text()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17982, - "startIndex": 17980, - "textRun": { - "content": ", ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17990, - "startIndex": 17982, - "textRun": { - "content": "byType()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17996, - "startIndex": 17990, - "textRun": { - "content": ", and ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 18005, - "startIndex": 17996, - "textRun": { - "content": "byIcon().", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18066, - "startIndex": 18005, - "textRun": { - "content": " The framework also provides matchers to verify the results.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17899 - }, - { - "endIndex": 18067, - "paragraph": { - "elements": [ - { - "endIndex": 18067, - "startIndex": 18066, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18066 - }, - { - "endIndex": 18105, - "paragraph": { - "elements": [ - { - "endIndex": 18088, - "startIndex": 18067, - "textRun": { - "content": "Start by testing the ", - "textStyle": {} - } - }, - { - "endIndex": 18096, - "startIndex": 18088, - "textRun": { - "content": "HomePage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18104, - "startIndex": 18096, - "textRun": { - "content": " widget.", - "textStyle": {} - } - }, - { - "endIndex": 18105, - "startIndex": 18104, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18067 - }, - { - "endIndex": 18128, - "paragraph": { - "elements": [ - { - "endIndex": 18128, - "startIndex": 18105, - "textRun": { - "content": "Create a new test file\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.yy7mc2b5no56", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 18105 - }, - { - "endIndex": 18129, - "paragraph": { - "elements": [ - { - "endIndex": 18129, - "startIndex": 18128, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18128 - }, - { - "endIndex": 18200, - "paragraph": { - "elements": [ - { - "endIndex": 18175, - "startIndex": 18129, - "textRun": { - "content": "The first test verifies whether scrolling the ", - "textStyle": {} - } - }, - { - "endIndex": 18183, - "startIndex": 18175, - "textRun": { - "content": "HomePage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18200, - "startIndex": 18183, - "textRun": { - "content": " works properly.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18129 - }, - { - "endIndex": 18201, - "paragraph": { - "elements": [ - { - "endIndex": 18201, - "startIndex": 18200, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18200 - }, - { - "endIndex": 18321, - "paragraph": { - "elements": [ - { - "endIndex": 18202, - "inlineObjectElement": { - "inlineObjectId": "kix.4bjxnpvmqdqw", - "textStyle": {} - }, - "startIndex": 18201 - }, - { - "endIndex": 18227, - "startIndex": 18202, - "textRun": { - "content": "Create a new file in the ", - "textStyle": {} - } - }, - { - "endIndex": 18231, - "startIndex": 18227, - "textRun": { - "content": "test", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18254, - "startIndex": 18231, - "textRun": { - "content": " directory and name it ", - "textStyle": {} - } - }, - { - "endIndex": 18268, - "startIndex": 18254, - "textRun": { - "content": "home_test.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18321, - "startIndex": 18268, - "textRun": { - "content": ". In the newly created file, add the following code:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18201 - }, - { - "endIndex": 18322, - "paragraph": { - "elements": [ - { - "endIndex": 18322, - "startIndex": 18321, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18321 - }, - { - "endIndex": 18342, - "paragraph": { - "elements": [ - { - "endIndex": 18341, - "startIndex": 18322, - "textRun": { - "content": "test/home_test.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_06/test/home_test.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 18342, - "startIndex": 18341, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.fuoyhtqb1e7n", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 18322 - }, - { - "endIndex": 19177, - "startIndex": 18342, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 19176, - "startIndex": 18343, - "tableCells": [ - { - "content": [ - { - "endIndex": 18385, - "paragraph": { - "elements": [ - { - "endIndex": 18385, - "startIndex": 18345, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18345 - }, - { - "endIndex": 18434, - "paragraph": { - "elements": [ - { - "endIndex": 18434, - "startIndex": 18385, - "textRun": { - "content": "import 'package:flutter_test/flutter_test.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18385 - }, - { - "endIndex": 18475, - "paragraph": { - "elements": [ - { - "endIndex": 18475, - "startIndex": 18434, - "textRun": { - "content": "import 'package:provider/provider.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18434 - }, - { - "endIndex": 18527, - "paragraph": { - "elements": [ - { - "endIndex": 18527, - "startIndex": 18475, - "textRun": { - "content": "import 'package:testing_app/models/favorites.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18475 - }, - { - "endIndex": 18575, - "paragraph": { - "elements": [ - { - "endIndex": 18575, - "startIndex": 18527, - "textRun": { - "content": "import 'package:testing_app/screens/home.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18527 - }, - { - "endIndex": 18576, - "paragraph": { - "elements": [ - { - "endIndex": 18576, - "startIndex": 18575, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18575 - }, - { - "endIndex": 18640, - "paragraph": { - "elements": [ - { - "endIndex": 18640, - "startIndex": 18576, - "textRun": { - "content": "Widget createHomeScreen() => ChangeNotifierProvider(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18576 - }, - { - "endIndex": 18680, - "paragraph": { - "elements": [ - { - "endIndex": 18680, - "startIndex": 18640, - "textRun": { - "content": " create: (context) => Favorites(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18640 - }, - { - "endIndex": 18712, - "paragraph": { - "elements": [ - { - "endIndex": 18712, - "startIndex": 18680, - "textRun": { - "content": " child: const MaterialApp(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18680 - }, - { - "endIndex": 18738, - "paragraph": { - "elements": [ - { - "endIndex": 18738, - "startIndex": 18712, - "textRun": { - "content": " home: HomePage(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18712 - }, - { - "endIndex": 18747, - "paragraph": { - "elements": [ - { - "endIndex": 18747, - "startIndex": 18738, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18738 - }, - { - "endIndex": 18754, - "paragraph": { - "elements": [ - { - "endIndex": 18754, - "startIndex": 18747, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18747 - }, - { - "endIndex": 18755, - "paragraph": { - "elements": [ - { - "endIndex": 18755, - "startIndex": 18754, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18754 - }, - { - "endIndex": 18769, - "paragraph": { - "elements": [ - { - "endIndex": 18769, - "startIndex": 18755, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18755 - }, - { - "endIndex": 18808, - "paragraph": { - "elements": [ - { - "endIndex": 18808, - "startIndex": 18769, - "textRun": { - "content": " group('Home Page Widget Tests', () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18769 - }, - { - "endIndex": 18862, - "paragraph": { - "elements": [ - { - "endIndex": 18862, - "startIndex": 18808, - "textRun": { - "content": " testWidgets('Testing Scrolling', (tester) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18808 - }, - { - "endIndex": 18913, - "paragraph": { - "elements": [ - { - "endIndex": 18913, - "startIndex": 18862, - "textRun": { - "content": " await tester.pumpWidget(createHomeScreen());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18862 - }, - { - "endIndex": 18964, - "paragraph": { - "elements": [ - { - "endIndex": 18964, - "startIndex": 18913, - "textRun": { - "content": " expect(find.text('Item 0'), findsOneWidget);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18913 - }, - { - "endIndex": 18990, - "paragraph": { - "elements": [ - { - "endIndex": 18990, - "startIndex": 18964, - "textRun": { - "content": " await tester.fling(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18964 - }, - { - "endIndex": 19021, - "paragraph": { - "elements": [ - { - "endIndex": 19021, - "startIndex": 18990, - "textRun": { - "content": " find.byType(ListView),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18990 - }, - { - "endIndex": 19052, - "paragraph": { - "elements": [ - { - "endIndex": 19052, - "startIndex": 19021, - "textRun": { - "content": " const Offset(0, -200),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19021 - }, - { - "endIndex": 19066, - "paragraph": { - "elements": [ - { - "endIndex": 19066, - "startIndex": 19052, - "textRun": { - "content": " 3000,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19052 - }, - { - "endIndex": 19075, - "paragraph": { - "elements": [ - { - "endIndex": 19075, - "startIndex": 19066, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19066 - }, - { - "endIndex": 19111, - "paragraph": { - "elements": [ - { - "endIndex": 19111, - "startIndex": 19075, - "textRun": { - "content": " await tester.pumpAndSettle();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19075 - }, - { - "endIndex": 19160, - "paragraph": { - "elements": [ - { - "endIndex": 19160, - "startIndex": 19111, - "textRun": { - "content": " expect(find.text('Item 0'), findsNothing);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19111 - }, - { - "endIndex": 19168, - "paragraph": { - "elements": [ - { - "endIndex": 19168, - "startIndex": 19160, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19160 - }, - { - "endIndex": 19174, - "paragraph": { - "elements": [ - { - "endIndex": 19174, - "startIndex": 19168, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19168 - }, - { - "endIndex": 19176, - "paragraph": { - "elements": [ - { - "endIndex": 19176, - "startIndex": 19174, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19174 - } - ], - "endIndex": 19176, - "startIndex": 18344, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 19178, - "paragraph": { - "elements": [ - { - "endIndex": 19178, - "startIndex": 19177, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19177 - }, - { - "endIndex": 19553, - "paragraph": { - "elements": [ - { - "endIndex": 19182, - "startIndex": 19178, - "textRun": { - "content": "The ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19200, - "startIndex": 19182, - "textRun": { - "content": "createHomeScreen()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19530, - "startIndex": 19200, - "textRun": { - "content": " function is used to create an app that loads the widget to be tested in a MaterialApp, wrapped into a ChangeNotifierProvider. The HomePage widget needs both of these widgets to be present above it in the widget tree so it can inherit from them and get access to the data they offer. This function is passed as a parameter to the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19542, - "startIndex": 19530, - "textRun": { - "content": "pumpWidget()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19553, - "startIndex": 19542, - "textRun": { - "content": " function.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19178 - }, - { - "endIndex": 19554, - "paragraph": { - "elements": [ - { - "endIndex": 19554, - "startIndex": 19553, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19553 - }, - { - "endIndex": 19633, - "paragraph": { - "elements": [ - { - "endIndex": 19598, - "startIndex": 19554, - "textRun": { - "content": "Next, test whether the framework can find a ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19606, - "startIndex": 19598, - "textRun": { - "content": "ListView", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19633, - "startIndex": 19606, - "textRun": { - "content": " rendered onto the screen.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19554 - }, - { - "endIndex": 19634, - "paragraph": { - "elements": [ - { - "endIndex": 19634, - "startIndex": 19633, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19633 - }, - { - "endIndex": 19860, - "startIndex": 19634, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 19859, - "startIndex": 19635, - "tableCells": [ - { - "content": [ - { - "endIndex": 19859, - "paragraph": { - "elements": [ - { - "endIndex": 19641, - "startIndex": 19637, - "textRun": { - "content": "Note", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19738, - "startIndex": 19641, - "textRun": { - "content": ": This test is supposed to be run before the scrolling test as you are performing actions on the ", - "textStyle": {} - } - }, - { - "endIndex": 19746, - "startIndex": 19738, - "textRun": { - "content": "ListView", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19747, - "startIndex": 19746, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19859, - "startIndex": 19747, - "textRun": { - "content": "in it. However, to give you a general idea of how widgets tests are written we wrote the scrolling test first. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19637 - } - ], - "endIndex": 19859, - "startIndex": 19636, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 19861, - "paragraph": { - "elements": [ - { - "endIndex": 19861, - "startIndex": 19860, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19860 - }, - { - "endIndex": 19912, - "paragraph": { - "elements": [ - { - "endIndex": 19862, - "inlineObjectElement": { - "inlineObjectId": "kix.v89a14d9pxx", - "textStyle": {} - }, - "startIndex": 19861 - }, - { - "endIndex": 19865, - "startIndex": 19862, - "textRun": { - "content": "Add", - "textStyle": {} - } - }, - { - "endIndex": 19896, - "startIndex": 19865, - "textRun": { - "content": " the following code snippet to ", - "textStyle": {} - } - }, - { - "endIndex": 19910, - "startIndex": 19896, - "textRun": { - "content": "home_test.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19912, - "startIndex": 19910, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19861 - }, - { - "endIndex": 19913, - "paragraph": { - "elements": [ - { - "endIndex": 19913, - "startIndex": 19912, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19912 - }, - { - "endIndex": 19933, - "paragraph": { - "elements": [ - { - "endIndex": 19932, - "startIndex": 19913, - "textRun": { - "content": "test/home_test.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_06/test/home_test.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 19933, - "startIndex": 19932, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.rfgwtui5w6q9", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 19913 - }, - { - "endIndex": 20571, - "startIndex": 19933, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 20570, - "startIndex": 19934, - "tableCells": [ - { - "content": [ - { - "endIndex": 19973, - "paragraph": { - "elements": [ - { - "endIndex": 19973, - "startIndex": 19936, - "textRun": { - "content": "group('Home Page Widget Tests', () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19936 - }, - { - "endIndex": 19974, - "paragraph": { - "elements": [ - { - "endIndex": 19974, - "startIndex": 19973, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19973 - }, - { - "endIndex": 20004, - "paragraph": { - "elements": [ - { - "endIndex": 20004, - "startIndex": 19974, - "textRun": { - "content": " // BEGINNING OF NEW CONTENT\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19974 - }, - { - "endIndex": 20069, - "paragraph": { - "elements": [ - { - "endIndex": 20069, - "startIndex": 20004, - "textRun": { - "content": " testWidgets('Testing if ListView shows up', (tester) async { \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20004 - }, - { - "endIndex": 20118, - "paragraph": { - "elements": [ - { - "endIndex": 20118, - "startIndex": 20069, - "textRun": { - "content": " await tester.pumpWidget(createHomeScreen());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20069 - }, - { - "endIndex": 20169, - "paragraph": { - "elements": [ - { - "endIndex": 20169, - "startIndex": 20118, - "textRun": { - "content": " expect(find.byType(ListView), findsOneWidget);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20118 - }, - { - "endIndex": 20181, - "paragraph": { - "elements": [ - { - "endIndex": 20181, - "startIndex": 20169, - "textRun": { - "content": " });\t\t\t\t\t\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20169 - }, - { - "endIndex": 20205, - "paragraph": { - "elements": [ - { - "endIndex": 20205, - "startIndex": 20181, - "textRun": { - "content": " // END OF NEW CONTENT\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20181 - }, - { - "endIndex": 20206, - "paragraph": { - "elements": [ - { - "endIndex": 20206, - "startIndex": 20205, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20205 - }, - { - "endIndex": 20260, - "paragraph": { - "elements": [ - { - "endIndex": 20260, - "startIndex": 20206, - "textRun": { - "content": " testWidgets('Testing Scrolling', (tester) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20206 - }, - { - "endIndex": 20311, - "paragraph": { - "elements": [ - { - "endIndex": 20311, - "startIndex": 20260, - "textRun": { - "content": " await tester.pumpWidget(createHomeScreen());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20260 - }, - { - "endIndex": 20362, - "paragraph": { - "elements": [ - { - "endIndex": 20362, - "startIndex": 20311, - "textRun": { - "content": " expect(find.text('Item 0'), findsOneWidget);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20311 - }, - { - "endIndex": 20388, - "paragraph": { - "elements": [ - { - "endIndex": 20388, - "startIndex": 20362, - "textRun": { - "content": " await tester.fling(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20362 - }, - { - "endIndex": 20419, - "paragraph": { - "elements": [ - { - "endIndex": 20419, - "startIndex": 20388, - "textRun": { - "content": " find.byType(ListView),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20388 - }, - { - "endIndex": 20450, - "paragraph": { - "elements": [ - { - "endIndex": 20450, - "startIndex": 20419, - "textRun": { - "content": " const Offset(0, -200),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20419 - }, - { - "endIndex": 20464, - "paragraph": { - "elements": [ - { - "endIndex": 20464, - "startIndex": 20450, - "textRun": { - "content": " 3000,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20450 - }, - { - "endIndex": 20473, - "paragraph": { - "elements": [ - { - "endIndex": 20473, - "startIndex": 20464, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20464 - }, - { - "endIndex": 20509, - "paragraph": { - "elements": [ - { - "endIndex": 20509, - "startIndex": 20473, - "textRun": { - "content": " await tester.pumpAndSettle();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20473 - }, - { - "endIndex": 20558, - "paragraph": { - "elements": [ - { - "endIndex": 20558, - "startIndex": 20509, - "textRun": { - "content": " expect(find.text('Item 0'), findsNothing);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20509 - }, - { - "endIndex": 20566, - "paragraph": { - "elements": [ - { - "endIndex": 20566, - "startIndex": 20558, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20558 - }, - { - "endIndex": 20570, - "paragraph": { - "elements": [ - { - "endIndex": 20570, - "startIndex": 20566, - "textRun": { - "content": "});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20566 - } - ], - "endIndex": 20570, - "startIndex": 19935, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 20572, - "paragraph": { - "elements": [ - { - "endIndex": 20572, - "startIndex": 20571, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20571 - }, - { - "endIndex": 20585, - "paragraph": { - "elements": [ - { - "endIndex": 20585, - "startIndex": 20572, - "textRun": { - "content": "Run the test\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.911yu4qzr38v", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 20572 - }, - { - "endIndex": 20666, - "paragraph": { - "elements": [ - { - "endIndex": 20665, - "startIndex": 20585, - "textRun": { - "content": "First, run the test in the same way you would run a unit test, with the command:", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 20666, - "startIndex": 20665, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 20585 - }, - { - "endIndex": 20706, - "startIndex": 20666, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 20705, - "startIndex": 20667, - "tableCells": [ - { - "content": [ - { - "endIndex": 20705, - "paragraph": { - "elements": [ - { - "endIndex": 20705, - "startIndex": 20669, - "textRun": { - "content": "$ flutter test test/home_test.dart \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20669 - } - ], - "endIndex": 20705, - "startIndex": 20668, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 20707, - "paragraph": { - "elements": [ - { - "endIndex": 20707, - "startIndex": 20706, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20706 - }, - { - "endIndex": 20780, - "paragraph": { - "elements": [ - { - "endIndex": 20780, - "startIndex": 20707, - "textRun": { - "content": "The test should run quickly, and you should see a message like this one:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20707 - }, - { - "endIndex": 20781, - "paragraph": { - "elements": [ - { - "endIndex": 20781, - "startIndex": 20780, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20780 - }, - { - "endIndex": 20865, - "startIndex": 20781, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 20864, - "startIndex": 20782, - "tableCells": [ - { - "content": [ - { - "endIndex": 20864, - "paragraph": { - "elements": [ - { - "endIndex": 20864, - "startIndex": 20784, - "textRun": { - "content": "00:02 +2: All tests passed! \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20784 - } - ], - "endIndex": 20864, - "startIndex": 20783, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 20866, - "paragraph": { - "elements": [ - { - "endIndex": 20866, - "startIndex": 20865, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 20865 - }, - { - "endIndex": 21021, - "paragraph": { - "elements": [ - { - "endIndex": 20883, - "startIndex": 20866, - "textRun": { - "content": "You can also run ", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 20895, - "startIndex": 20883, - "textRun": { - "content": "widget tests", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 21008, - "startIndex": 20895, - "textRun": { - "content": " using a device or an emulator, which allows you to watch the test running. It also gives you the ability to use ", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 21019, - "startIndex": 21008, - "textRun": { - "content": "hot restart", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 21021, - "startIndex": 21019, - "textRun": { - "content": ".\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 20866 - }, - { - "endIndex": 21118, - "paragraph": { - "elements": [ - { - "endIndex": 21022, - "inlineObjectElement": { - "inlineObjectId": "kix.lwerlpw3ks35", - "textStyle": {} - }, - "startIndex": 21021 - }, - { - "endIndex": 21118, - "startIndex": 21022, - "textRun": { - "content": "Plug-in your device or start your emulator. You can also run the test as a desktop application.\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 21021 - }, - { - "endIndex": 21216, - "paragraph": { - "elements": [ - { - "endIndex": 21119, - "inlineObjectElement": { - "inlineObjectId": "kix.8fiu045gopb0", - "textStyle": {} - }, - "startIndex": 21118 - }, - { - "endIndex": 21215, - "startIndex": 21119, - "textRun": { - "content": "From the command line, navigate to the project’s root directory and enter the following command:", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 21216, - "startIndex": 21215, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 21118 - }, - { - "endIndex": 21255, - "startIndex": 21216, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 21254, - "startIndex": 21217, - "tableCells": [ - { - "content": [ - { - "endIndex": 21254, - "paragraph": { - "elements": [ - { - "endIndex": 21254, - "startIndex": 21219, - "textRun": { - "content": "$ flutter run test/home_test.dart \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21219 - } - ], - "endIndex": 21254, - "startIndex": 21218, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 21256, - "paragraph": { - "elements": [ - { - "endIndex": 21256, - "startIndex": 21255, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21255 - }, - { - "endIndex": 21369, - "paragraph": { - "elements": [ - { - "endIndex": 21369, - "startIndex": 21256, - "textRun": { - "content": "You may need to select the device to run the test on. In that case, follow the instructions and select a device:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21256 - }, - { - "endIndex": 21370, - "paragraph": { - "elements": [ - { - "endIndex": 21370, - "startIndex": 21369, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21369 - }, - { - "endIndex": 21635, - "startIndex": 21370, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 21634, - "startIndex": 21371, - "tableCells": [ - { - "content": [ - { - "endIndex": 21397, - "paragraph": { - "elements": [ - { - "endIndex": 21397, - "startIndex": 21373, - "textRun": { - "content": "Multiple devices found:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21373 - }, - { - "endIndex": 21478, - "paragraph": { - "elements": [ - { - "endIndex": 21478, - "startIndex": 21397, - "textRun": { - "content": "Linux (desktop) • linux • linux-x64 • Ubuntu 22.04.1 LTS 5.15.0-58-generic\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21397 - }, - { - "endIndex": 21551, - "paragraph": { - "elements": [ - { - "endIndex": 21551, - "startIndex": 21478, - "textRun": { - "content": "Chrome (web) • chrome • web-javascript • Google Chrome 109.0.5414.119\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21478 - }, - { - "endIndex": 21570, - "paragraph": { - "elements": [ - { - "endIndex": 21570, - "startIndex": 21551, - "textRun": { - "content": "[1]: Linux (linux)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21551 - }, - { - "endIndex": 21591, - "paragraph": { - "elements": [ - { - "endIndex": 21591, - "startIndex": 21570, - "textRun": { - "content": "[2]: Chrome (chrome)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21570 - }, - { - "endIndex": 21634, - "paragraph": { - "elements": [ - { - "endIndex": 21634, - "startIndex": 21591, - "textRun": { - "content": "Please choose one (To quit, press \"q/Q\"): \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21591 - } - ], - "endIndex": 21634, - "startIndex": 21372, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 21636, - "paragraph": { - "elements": [ - { - "endIndex": 21636, - "startIndex": 21635, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21635 - }, - { - "endIndex": 21637, - "paragraph": { - "elements": [ - { - "endIndex": 21637, - "startIndex": 21636, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21636 - }, - { - "endIndex": 21708, - "paragraph": { - "elements": [ - { - "endIndex": 21708, - "startIndex": 21637, - "textRun": { - "content": "If everything works you should see an output similar to the following:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21637 - }, - { - "endIndex": 21709, - "paragraph": { - "elements": [ - { - "endIndex": 21709, - "startIndex": 21708, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21708 - }, - { - "endIndex": 22595, - "startIndex": 21709, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 22594, - "startIndex": 21710, - "tableCells": [ - { - "content": [ - { - "endIndex": 21768, - "paragraph": { - "elements": [ - { - "endIndex": 21768, - "startIndex": 21712, - "textRun": { - "content": "Launching test/home_test.dart on Linux in debug mode...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21712 - }, - { - "endIndex": 21841, - "paragraph": { - "elements": [ - { - "endIndex": 21841, - "startIndex": 21768, - "textRun": { - "content": "Building Linux application... \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21768 - }, - { - "endIndex": 21912, - "paragraph": { - "elements": [ - { - "endIndex": 21912, - "startIndex": 21841, - "textRun": { - "content": "flutter: 00:00 +0: Home Page Widget Tests Testing if ListView shows up\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21841 - }, - { - "endIndex": 21985, - "paragraph": { - "elements": [ - { - "endIndex": 21985, - "startIndex": 21912, - "textRun": { - "content": "Syncing files to device Linux... 62ms\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21912 - }, - { - "endIndex": 21986, - "paragraph": { - "elements": [ - { - "endIndex": 21986, - "startIndex": 21985, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21985 - }, - { - "endIndex": 22012, - "paragraph": { - "elements": [ - { - "endIndex": 22012, - "startIndex": 21986, - "textRun": { - "content": "Flutter run key commands.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21986 - }, - { - "endIndex": 22033, - "paragraph": { - "elements": [ - { - "endIndex": 22033, - "startIndex": 22012, - "textRun": { - "content": "r Hot reload. 🔥🔥🔥\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22012 - }, - { - "endIndex": 22048, - "paragraph": { - "elements": [ - { - "endIndex": 22048, - "startIndex": 22033, - "textRun": { - "content": "R Hot restart.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22033 - }, - { - "endIndex": 22091, - "paragraph": { - "elements": [ - { - "endIndex": 22091, - "startIndex": 22048, - "textRun": { - "content": "h List all available interactive commands.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22048 - }, - { - "endIndex": 22157, - "paragraph": { - "elements": [ - { - "endIndex": 22157, - "startIndex": 22091, - "textRun": { - "content": "d Detach (terminate \"flutter run\" but leave application running).\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22091 - }, - { - "endIndex": 22176, - "paragraph": { - "elements": [ - { - "endIndex": 22176, - "startIndex": 22157, - "textRun": { - "content": "c Clear the screen\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22157 - }, - { - "endIndex": 22226, - "paragraph": { - "elements": [ - { - "endIndex": 22226, - "startIndex": 22176, - "textRun": { - "content": "q Quit (terminate the application on the device).\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22176 - }, - { - "endIndex": 22227, - "paragraph": { - "elements": [ - { - "endIndex": 22227, - "startIndex": 22226, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22226 - }, - { - "endIndex": 22264, - "paragraph": { - "elements": [ - { - "endIndex": 22264, - "startIndex": 22227, - "textRun": { - "content": "💪 Running with sound null safety 💪\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22227 - }, - { - "endIndex": 22265, - "paragraph": { - "elements": [ - { - "endIndex": 22265, - "startIndex": 22264, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22264 - }, - { - "endIndex": 22365, - "paragraph": { - "elements": [ - { - "endIndex": 22365, - "startIndex": 22265, - "textRun": { - "content": "An Observatory debugger and profiler on Linux is available at: http://127.0.0.1:35583/GCpdLBqf2UI=/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22265 - }, - { - "endIndex": 22425, - "paragraph": { - "elements": [ - { - "endIndex": 22425, - "startIndex": 22365, - "textRun": { - "content": "flutter: 00:00 +1: Home Page Widget Tests Testing Scrolling\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22365 - }, - { - "endIndex": 22494, - "paragraph": { - "elements": [ - { - "endIndex": 22494, - "startIndex": 22425, - "textRun": { - "content": "The Flutter DevTools debugger and profiler on Linux is available at:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22425 - }, - { - "endIndex": 22557, - "paragraph": { - "elements": [ - { - "endIndex": 22557, - "startIndex": 22494, - "textRun": { - "content": "http://127.0.0.1:9100?uri=http://127.0.0.1:35583/GCpdLBqf2UI=/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22494 - }, - { - "endIndex": 22594, - "paragraph": { - "elements": [ - { - "endIndex": 22594, - "startIndex": 22557, - "textRun": { - "content": "flutter: 00:02 +2: All tests passed!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22557 - } - ], - "endIndex": 22594, - "startIndex": 21711, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 22596, - "paragraph": { - "elements": [ - { - "endIndex": 22596, - "startIndex": 22595, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22595 - }, - { - "endIndex": 22737, - "paragraph": { - "elements": [ - { - "endIndex": 22649, - "startIndex": 22596, - "textRun": { - "content": "Next, you’ll make changes to the test file and press ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 22658, - "startIndex": 22649, - "textRun": { - "content": "Shift + R", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22737, - "startIndex": 22658, - "textRun": { - "content": " to hot restart the app and re-run all the tests. Do not stop the application.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22596 - }, - { - "endIndex": 22738, - "paragraph": { - "elements": [ - { - "endIndex": 22738, - "startIndex": 22737, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22737 - }, - { - "endIndex": 22838, - "paragraph": { - "elements": [ - { - "endIndex": 22739, - "inlineObjectElement": { - "inlineObjectId": "kix.gqfd0f5er86o", - "textStyle": {} - }, - "startIndex": 22738 - }, - { - "endIndex": 22772, - "startIndex": 22739, - "textRun": { - "content": "Add more tests to the group that ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 22799, - "startIndex": 22772, - "textRun": { - "content": "tests the HomePage widgets.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 22838, - "startIndex": 22799, - "textRun": { - "content": " Copy the following test to your file:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22738 - }, - { - "endIndex": 22839, - "paragraph": { - "elements": [ - { - "endIndex": 22839, - "startIndex": 22838, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22838 - }, - { - "endIndex": 22859, - "paragraph": { - "elements": [ - { - "endIndex": 22858, - "startIndex": 22839, - "textRun": { - "content": "test/home_test.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_06/test/home_test.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 22859, - "startIndex": 22858, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hitrp1fahwcs", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 22839 - }, - { - "endIndex": 23482, - "startIndex": 22859, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 23481, - "startIndex": 22860, - "tableCells": [ - { - "content": [ - { - "endIndex": 22914, - "paragraph": { - "elements": [ - { - "endIndex": 22914, - "startIndex": 22862, - "textRun": { - "content": "testWidgets('Testing IconButtons', (tester) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22862 - }, - { - "endIndex": 22961, - "paragraph": { - "elements": [ - { - "endIndex": 22961, - "startIndex": 22914, - "textRun": { - "content": " await tester.pumpWidget(createHomeScreen());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22914 - }, - { - "endIndex": 23014, - "paragraph": { - "elements": [ - { - "endIndex": 23014, - "startIndex": 22961, - "textRun": { - "content": " expect(find.byIcon(Icons.favorite), findsNothing);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22961 - }, - { - "endIndex": 23076, - "paragraph": { - "elements": [ - { - "endIndex": 23076, - "startIndex": 23014, - "textRun": { - "content": " await tester.tap(find.byIcon(Icons.favorite_border).first);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23014 - }, - { - "endIndex": 23134, - "paragraph": { - "elements": [ - { - "endIndex": 23134, - "startIndex": 23076, - "textRun": { - "content": " await tester.pumpAndSettle(const Duration(seconds: 1));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23076 - }, - { - "endIndex": 23194, - "paragraph": { - "elements": [ - { - "endIndex": 23194, - "startIndex": 23134, - "textRun": { - "content": " expect(find.text('Added to favorites.'), findsOneWidget);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23134 - }, - { - "endIndex": 23247, - "paragraph": { - "elements": [ - { - "endIndex": 23247, - "startIndex": 23194, - "textRun": { - "content": " expect(find.byIcon(Icons.favorite), findsWidgets);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23194 - }, - { - "endIndex": 23302, - "paragraph": { - "elements": [ - { - "endIndex": 23302, - "startIndex": 23247, - "textRun": { - "content": " await tester.tap(find.byIcon(Icons.favorite).first);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23247 - }, - { - "endIndex": 23360, - "paragraph": { - "elements": [ - { - "endIndex": 23360, - "startIndex": 23302, - "textRun": { - "content": " await tester.pumpAndSettle(const Duration(seconds: 1));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23302 - }, - { - "endIndex": 23424, - "paragraph": { - "elements": [ - { - "endIndex": 23424, - "startIndex": 23360, - "textRun": { - "content": " expect(find.text('Removed from favorites.'), findsOneWidget);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23360 - }, - { - "endIndex": 23477, - "paragraph": { - "elements": [ - { - "endIndex": 23477, - "startIndex": 23424, - "textRun": { - "content": " expect(find.byIcon(Icons.favorite), findsNothing);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23424 - }, - { - "endIndex": 23481, - "paragraph": { - "elements": [ - { - "endIndex": 23481, - "startIndex": 23477, - "textRun": { - "content": "});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23477 - } - ], - "endIndex": 23481, - "startIndex": 22861, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 23483, - "paragraph": { - "elements": [ - { - "endIndex": 23483, - "startIndex": 23482, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23482 - }, - { - "endIndex": 23678, - "paragraph": { - "elements": [ - { - "endIndex": 23520, - "startIndex": 23483, - "textRun": { - "content": "This test verifies that tapping the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23530, - "startIndex": 23520, - "textRun": { - "content": "IconButton", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23544, - "startIndex": 23530, - "textRun": { - "content": " changes from ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23565, - "startIndex": 23544, - "textRun": { - "content": "Icons.favorite_border", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23585, - "startIndex": 23565, - "textRun": { - "content": " (an open heart) to ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23599, - "startIndex": 23585, - "textRun": { - "content": "Icons.favorite", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23637, - "startIndex": 23599, - "textRun": { - "content": " (a filled-in heart) and then back to ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23658, - "startIndex": 23637, - "textRun": { - "content": "Icons.favorite_border", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23678, - "startIndex": 23658, - "textRun": { - "content": " when tapped again.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23483 - }, - { - "endIndex": 23679, - "paragraph": { - "elements": [ - { - "endIndex": 23679, - "startIndex": 23678, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23678 - }, - { - "endIndex": 23750, - "paragraph": { - "elements": [ - { - "endIndex": 23680, - "inlineObjectElement": { - "inlineObjectId": "kix.eq1djvxuil7r", - "textStyle": {} - }, - "startIndex": 23679 - }, - { - "endIndex": 23686, - "startIndex": 23680, - "textRun": { - "content": "Enter ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23695, - "startIndex": 23686, - "textRun": { - "content": "Shift + R", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23750, - "startIndex": 23695, - "textRun": { - "content": ". This hot restarts the app and re-runs all the tests.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23679 - }, - { - "endIndex": 23751, - "paragraph": { - "elements": [ - { - "endIndex": 23751, - "startIndex": 23750, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23750 - }, - { - "endIndex": 23796, - "paragraph": { - "elements": [ - { - "endIndex": 23775, - "startIndex": 23751, - "textRun": { - "content": "The complete test file: ", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23794, - "startIndex": 23775, - "textRun": { - "content": "test/home_test.dart", - "textStyle": { - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_06/test/home_test.dart" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23795, - "startIndex": 23794, - "textRun": { - "content": ".", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23796, - "startIndex": 23795, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23751 - }, - { - "endIndex": 23797, - "paragraph": { - "elements": [ - { - "endIndex": 23797, - "startIndex": 23796, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23796 - }, - { - "endIndex": 23904, - "paragraph": { - "elements": [ - { - "endIndex": 23798, - "inlineObjectElement": { - "inlineObjectId": "kix.x2m11py6vbqc", - "textStyle": {} - }, - "startIndex": 23797 - }, - { - "endIndex": 23831, - "startIndex": 23798, - "textRun": { - "content": "Use the same process to test the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23844, - "startIndex": 23831, - "textRun": { - "content": "FavoritesPage", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23904, - "startIndex": 23844, - "textRun": { - "content": " with the following code. Follow the same steps and run it.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23797 - }, - { - "endIndex": 23905, - "paragraph": { - "elements": [ - { - "endIndex": 23905, - "startIndex": 23904, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23904 - }, - { - "endIndex": 23930, - "paragraph": { - "elements": [ - { - "endIndex": 23929, - "startIndex": 23905, - "textRun": { - "content": "test/favorites_test.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_06/test/favorites_test.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 23930, - "startIndex": 23929, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.4bn147hqux75", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 23905 - }, - { - "endIndex": 25348, - "startIndex": 23930, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 25347, - "startIndex": 23931, - "tableCells": [ - { - "content": [ - { - "endIndex": 23973, - "paragraph": { - "elements": [ - { - "endIndex": 23973, - "startIndex": 23933, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23933 - }, - { - "endIndex": 24022, - "paragraph": { - "elements": [ - { - "endIndex": 24022, - "startIndex": 23973, - "textRun": { - "content": "import 'package:flutter_test/flutter_test.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23973 - }, - { - "endIndex": 24063, - "paragraph": { - "elements": [ - { - "endIndex": 24063, - "startIndex": 24022, - "textRun": { - "content": "import 'package:provider/provider.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24022 - }, - { - "endIndex": 24115, - "paragraph": { - "elements": [ - { - "endIndex": 24115, - "startIndex": 24063, - "textRun": { - "content": "import 'package:testing_app/models/favorites.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24063 - }, - { - "endIndex": 24168, - "paragraph": { - "elements": [ - { - "endIndex": 24168, - "startIndex": 24115, - "textRun": { - "content": "import 'package:testing_app/screens/favorites.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24115 - }, - { - "endIndex": 24169, - "paragraph": { - "elements": [ - { - "endIndex": 24169, - "startIndex": 24168, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24168 - }, - { - "endIndex": 24199, - "paragraph": { - "elements": [ - { - "endIndex": 24199, - "startIndex": 24169, - "textRun": { - "content": "late Favorites favoritesList;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24169 - }, - { - "endIndex": 24200, - "paragraph": { - "elements": [ - { - "endIndex": 24200, - "startIndex": 24199, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24199 - }, - { - "endIndex": 24269, - "paragraph": { - "elements": [ - { - "endIndex": 24269, - "startIndex": 24200, - "textRun": { - "content": "Widget createFavoritesScreen() => ChangeNotifierProvider(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24200 - }, - { - "endIndex": 24295, - "paragraph": { - "elements": [ - { - "endIndex": 24295, - "startIndex": 24269, - "textRun": { - "content": " create: (context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24269 - }, - { - "endIndex": 24332, - "paragraph": { - "elements": [ - { - "endIndex": 24332, - "startIndex": 24295, - "textRun": { - "content": " favoritesList = Favorites();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24295 - }, - { - "endIndex": 24362, - "paragraph": { - "elements": [ - { - "endIndex": 24362, - "startIndex": 24332, - "textRun": { - "content": " return favoritesList;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24332 - }, - { - "endIndex": 24371, - "paragraph": { - "elements": [ - { - "endIndex": 24371, - "startIndex": 24362, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24362 - }, - { - "endIndex": 24403, - "paragraph": { - "elements": [ - { - "endIndex": 24403, - "startIndex": 24371, - "textRun": { - "content": " child: const MaterialApp(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24371 - }, - { - "endIndex": 24434, - "paragraph": { - "elements": [ - { - "endIndex": 24434, - "startIndex": 24403, - "textRun": { - "content": " home: FavoritesPage(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24403 - }, - { - "endIndex": 24443, - "paragraph": { - "elements": [ - { - "endIndex": 24443, - "startIndex": 24434, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24434 - }, - { - "endIndex": 24450, - "paragraph": { - "elements": [ - { - "endIndex": 24450, - "startIndex": 24443, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24443 - }, - { - "endIndex": 24451, - "paragraph": { - "elements": [ - { - "endIndex": 24451, - "startIndex": 24450, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24450 - }, - { - "endIndex": 24469, - "paragraph": { - "elements": [ - { - "endIndex": 24469, - "startIndex": 24451, - "textRun": { - "content": "void addItems() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24451 - }, - { - "endIndex": 24505, - "paragraph": { - "elements": [ - { - "endIndex": 24505, - "startIndex": 24469, - "textRun": { - "content": " for (var i = 0; i < 10; i += 2) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24469 - }, - { - "endIndex": 24531, - "paragraph": { - "elements": [ - { - "endIndex": 24531, - "startIndex": 24505, - "textRun": { - "content": " favoritesList.add(i);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24505 - }, - { - "endIndex": 24535, - "paragraph": { - "elements": [ - { - "endIndex": 24535, - "startIndex": 24531, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24531 - }, - { - "endIndex": 24537, - "paragraph": { - "elements": [ - { - "endIndex": 24537, - "startIndex": 24535, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24535 - }, - { - "endIndex": 24538, - "paragraph": { - "elements": [ - { - "endIndex": 24538, - "startIndex": 24537, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24537 - }, - { - "endIndex": 24552, - "paragraph": { - "elements": [ - { - "endIndex": 24552, - "startIndex": 24538, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24538 - }, - { - "endIndex": 24596, - "paragraph": { - "elements": [ - { - "endIndex": 24596, - "startIndex": 24552, - "textRun": { - "content": " group('Favorites Page Widget Tests', () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24552 - }, - { - "endIndex": 24658, - "paragraph": { - "elements": [ - { - "endIndex": 24658, - "startIndex": 24596, - "textRun": { - "content": " testWidgets('Test if ListView shows up', (tester) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24596 - }, - { - "endIndex": 24714, - "paragraph": { - "elements": [ - { - "endIndex": 24714, - "startIndex": 24658, - "textRun": { - "content": " await tester.pumpWidget(createFavoritesScreen());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24658 - }, - { - "endIndex": 24732, - "paragraph": { - "elements": [ - { - "endIndex": 24732, - "startIndex": 24714, - "textRun": { - "content": " addItems();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24714 - }, - { - "endIndex": 24768, - "paragraph": { - "elements": [ - { - "endIndex": 24768, - "startIndex": 24732, - "textRun": { - "content": " await tester.pumpAndSettle();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24732 - }, - { - "endIndex": 24821, - "paragraph": { - "elements": [ - { - "endIndex": 24821, - "startIndex": 24768, - "textRun": { - "content": " expect(find.byType(ListView), findsOneWidget);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24768 - }, - { - "endIndex": 24829, - "paragraph": { - "elements": [ - { - "endIndex": 24829, - "startIndex": 24821, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24821 - }, - { - "endIndex": 24830, - "paragraph": { - "elements": [ - { - "endIndex": 24830, - "startIndex": 24829, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24829 - }, - { - "endIndex": 24888, - "paragraph": { - "elements": [ - { - "endIndex": 24888, - "startIndex": 24830, - "textRun": { - "content": " testWidgets('Testing Remove Button', (tester) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24830 - }, - { - "endIndex": 24944, - "paragraph": { - "elements": [ - { - "endIndex": 24944, - "startIndex": 24888, - "textRun": { - "content": " await tester.pumpWidget(createFavoritesScreen());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24888 - }, - { - "endIndex": 24962, - "paragraph": { - "elements": [ - { - "endIndex": 24962, - "startIndex": 24944, - "textRun": { - "content": " addItems();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24944 - }, - { - "endIndex": 24998, - "paragraph": { - "elements": [ - { - "endIndex": 24998, - "startIndex": 24962, - "textRun": { - "content": " await tester.pumpAndSettle();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24962 - }, - { - "endIndex": 25073, - "paragraph": { - "elements": [ - { - "endIndex": 25073, - "startIndex": 24998, - "textRun": { - "content": " var totalItems = tester.widgetList(find.byIcon(Icons.close)).length;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24998 - }, - { - "endIndex": 25129, - "paragraph": { - "elements": [ - { - "endIndex": 25129, - "startIndex": 25073, - "textRun": { - "content": " await tester.tap(find.byIcon(Icons.close).first);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25073 - }, - { - "endIndex": 25165, - "paragraph": { - "elements": [ - { - "endIndex": 25165, - "startIndex": 25129, - "textRun": { - "content": " await tester.pumpAndSettle();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25129 - }, - { - "endIndex": 25230, - "paragraph": { - "elements": [ - { - "endIndex": 25230, - "startIndex": 25165, - "textRun": { - "content": " expect(tester.widgetList(find.byIcon(Icons.close)).length,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25165 - }, - { - "endIndex": 25263, - "paragraph": { - "elements": [ - { - "endIndex": 25263, - "startIndex": 25230, - "textRun": { - "content": " lessThan(totalItems));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25230 - }, - { - "endIndex": 25331, - "paragraph": { - "elements": [ - { - "endIndex": 25331, - "startIndex": 25263, - "textRun": { - "content": " expect(find.text('Removed from favorites.'), findsOneWidget);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25263 - }, - { - "endIndex": 25339, - "paragraph": { - "elements": [ - { - "endIndex": 25339, - "startIndex": 25331, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25331 - }, - { - "endIndex": 25345, - "paragraph": { - "elements": [ - { - "endIndex": 25345, - "startIndex": 25339, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25339 - }, - { - "endIndex": 25347, - "paragraph": { - "elements": [ - { - "endIndex": 25347, - "startIndex": 25345, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25345 - } - ], - "endIndex": 25347, - "startIndex": 23932, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 25349, - "paragraph": { - "elements": [ - { - "endIndex": 25349, - "startIndex": 25348, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25348 - }, - { - "endIndex": 25438, - "paragraph": { - "elements": [ - { - "endIndex": 25438, - "startIndex": 25349, - "textRun": { - "content": "This test verifies whether an item disappears when the close (remove) button is pressed.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25349 - }, - { - "endIndex": 25439, - "paragraph": { - "elements": [ - { - "endIndex": 25439, - "startIndex": 25438, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25438 - }, - { - "endIndex": 25486, - "paragraph": { - "elements": [ - { - "endIndex": 25486, - "startIndex": 25439, - "textRun": { - "content": "For more information on widget testing, visit:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25439 - }, - { - "endIndex": 25487, - "paragraph": { - "elements": [ - { - "endIndex": 25487, - "startIndex": 25486, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25486 - }, - { - "endIndex": 25521, - "paragraph": { - "bullet": { - "listId": "kix.vnpt9crrt431", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 25520, - "startIndex": 25487, - "textRun": { - "content": "An introduction to widget testing", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/cookbook/testing/widget/introduction" - }, - "underline": true - } - } - }, - { - "endIndex": 25521, - "startIndex": 25520, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25487 - }, - { - "endIndex": 25534, - "paragraph": { - "bullet": { - "listId": "kix.vnpt9crrt431", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 25533, - "startIndex": 25521, - "textRun": { - "content": "Find widgets", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/cookbook/testing/widget/finders" - }, - "underline": true - } - } - }, - { - "endIndex": 25534, - "startIndex": 25533, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25521 - }, - { - "endIndex": 25560, - "paragraph": { - "bullet": { - "listId": "kix.vnpt9crrt431", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 25559, - "startIndex": 25534, - "textRun": { - "content": "Tap, drag, and enter text", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/cookbook/testing/widget/tap-drag" - }, - "underline": true - } - } - }, - { - "endIndex": 25560, - "startIndex": 25559, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25534 - }, - { - "endIndex": 25585, - "paragraph": { - "bullet": { - "listId": "kix.vnpt9crrt431", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 25564, - "startIndex": 25560, - "textRun": { - "content": "The ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 25576, - "startIndex": 25564, - "textRun": { - "content": "flutter_test", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.flutter.dev/flutter/flutter_test/flutter_test-library.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25577, - "startIndex": 25576, - "textRun": { - "content": " ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.flutter.dev/flutter/flutter_test/flutter_test-library.html" - }, - "underline": true - } - } - }, - { - "endIndex": 25584, - "startIndex": 25577, - "textRun": { - "content": "library", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.flutter.dev/flutter/flutter_test/flutter_test-library.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 25585, - "startIndex": 25584, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25560 - }, - { - "endIndex": 25608, - "paragraph": { - "bullet": { - "listId": "kix.vnpt9crrt431", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 25589, - "startIndex": 25585, - "textRun": { - "content": "The ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 25601, - "startIndex": 25589, - "textRun": { - "content": "WidgetTester", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.flutter.dev/flutter/flutter_test/WidgetTester-class.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25607, - "startIndex": 25601, - "textRun": { - "content": " class", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.flutter.dev/flutter/flutter_test/WidgetTester-class.html" - }, - "underline": true - } - } - }, - { - "endIndex": 25608, - "startIndex": 25607, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25585 - }, - { - "endIndex": 25646, - "paragraph": { - "elements": [ - { - "endIndex": 25646, - "startIndex": 25608, - "textRun": { - "content": "Testing app UI with integration tests\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.lb4oolapswgl", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 25608 - }, - { - "endIndex": 25662, - "paragraph": { - "elements": [ - { - "endIndex": 25661, - "startIndex": 25646, - "textRun": { - "content": "Duration: 05:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 25662, - "startIndex": 25661, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25646 - }, - { - "endIndex": 25663, - "paragraph": { - "elements": [ - { - "endIndex": 25663, - "startIndex": 25662, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25662 - }, - { - "endIndex": 25997, - "paragraph": { - "elements": [ - { - "endIndex": 25764, - "startIndex": 25663, - "textRun": { - "content": "Integration tests are used to test how the individual pieces of an app work together as a whole. The ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - } - } - }, - { - "endIndex": 25780, - "startIndex": 25764, - "textRun": { - "content": "integration_test", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/flutter/tree/master/packages/integration_test#integration_test" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25838, - "startIndex": 25780, - "textRun": { - "content": " library is used to perform integration tests in Flutter. ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - } - } - }, - { - "endIndex": 25940, - "startIndex": 25838, - "textRun": { - "content": "This is Flutter's version of Selenium WebDriver, Protractor, Espresso, or Earl Gray. The package uses ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - } - } - } - }, - { - "endIndex": 25954, - "startIndex": 25940, - "textRun": { - "content": "flutter_driver", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.flutter.dev/flutter/flutter_driver/flutter_driver-library.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25996, - "startIndex": 25954, - "textRun": { - "content": " internally to drive the test on a device.", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 25997, - "startIndex": 25996, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25663 - }, - { - "endIndex": 25998, - "paragraph": { - "elements": [ - { - "endIndex": 25998, - "startIndex": 25997, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25997 - }, - { - "endIndex": 26196, - "paragraph": { - "elements": [ - { - "endIndex": 26195, - "startIndex": 25998, - "textRun": { - "content": "Writing integration tests in Flutter is similar to writing widget tests, with the exception that integration tests run on a mobile device, browser, or desktop application, called the target device.", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.06666667, - "green": 0.06666667, - "red": 0.06666667 - } - } - } - } - } - }, - { - "endIndex": 26196, - "startIndex": 26195, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25998 - }, - { - "endIndex": 26211, - "paragraph": { - "elements": [ - { - "endIndex": 26210, - "startIndex": 26196, - "textRun": { - "content": "Write the test", - "textStyle": {} - } - }, - { - "endIndex": 26211, - "startIndex": 26210, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.tvwf13ue5p6g", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 26196 - }, - { - "endIndex": 26349, - "paragraph": { - "elements": [ - { - "endIndex": 26212, - "inlineObjectElement": { - "inlineObjectId": "kix.lnhdx8vi6eyr", - "textStyle": {} - }, - "startIndex": 26211 - }, - { - "endIndex": 26238, - "startIndex": 26212, - "textRun": { - "content": "Create a directory called ", - "textStyle": {} - } - }, - { - "endIndex": 26254, - "startIndex": 26238, - "textRun": { - "content": "integration_test", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 26310, - "startIndex": 26254, - "textRun": { - "content": " in the project’s root directory, and in that directory ", - "textStyle": {} - } - }, - { - "endIndex": 26334, - "startIndex": 26310, - "textRun": { - "content": "create a new file named ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 26347, - "startIndex": 26334, - "textRun": { - "content": "app_test.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 26349, - "startIndex": 26347, - "textRun": { - "content": ".\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26211 - }, - { - "endIndex": 26380, - "paragraph": { - "elements": [ - { - "endIndex": 26379, - "startIndex": 26349, - "textRun": { - "content": "integration_test/app_test.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/testing_codelab/step_07/integration_test/app_test.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 26380, - "startIndex": 26379, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.chovoorugncs", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 26349 - }, - { - "endIndex": 27451, - "startIndex": 26380, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 27450, - "startIndex": 26381, - "tableCells": [ - { - "content": [ - { - "endIndex": 26423, - "paragraph": { - "elements": [ - { - "endIndex": 26423, - "startIndex": 26383, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26383 - }, - { - "endIndex": 26472, - "paragraph": { - "elements": [ - { - "endIndex": 26472, - "startIndex": 26423, - "textRun": { - "content": "import 'package:flutter_test/flutter_test.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26423 - }, - { - "endIndex": 26512, - "paragraph": { - "elements": [ - { - "endIndex": 26512, - "startIndex": 26472, - "textRun": { - "content": "import 'package:testing_app/main.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26472 - }, - { - "endIndex": 26513, - "paragraph": { - "elements": [ - { - "endIndex": 26513, - "startIndex": 26512, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26512 - }, - { - "endIndex": 26527, - "paragraph": { - "elements": [ - { - "endIndex": 26527, - "startIndex": 26513, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26513 - }, - { - "endIndex": 26555, - "paragraph": { - "elements": [ - { - "endIndex": 26555, - "startIndex": 26527, - "textRun": { - "content": " group('Testing App', () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26527 - }, - { - "endIndex": 26617, - "paragraph": { - "elements": [ - { - "endIndex": 26617, - "startIndex": 26555, - "textRun": { - "content": " testWidgets('Favorites operations test', (tester) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26555 - }, - { - "endIndex": 26668, - "paragraph": { - "elements": [ - { - "endIndex": 26668, - "startIndex": 26617, - "textRun": { - "content": " await tester.pumpWidget(const TestingApp());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26617 - }, - { - "endIndex": 26669, - "paragraph": { - "elements": [ - { - "endIndex": 26669, - "startIndex": 26668, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26668 - }, - { - "endIndex": 26694, - "paragraph": { - "elements": [ - { - "endIndex": 26694, - "startIndex": 26669, - "textRun": { - "content": " final iconKeys = [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26669 - }, - { - "endIndex": 26712, - "paragraph": { - "elements": [ - { - "endIndex": 26712, - "startIndex": 26694, - "textRun": { - "content": " 'icon_0',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26694 - }, - { - "endIndex": 26730, - "paragraph": { - "elements": [ - { - "endIndex": 26730, - "startIndex": 26712, - "textRun": { - "content": " 'icon_1',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26712 - }, - { - "endIndex": 26748, - "paragraph": { - "elements": [ - { - "endIndex": 26748, - "startIndex": 26730, - "textRun": { - "content": " 'icon_2',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26730 - }, - { - "endIndex": 26757, - "paragraph": { - "elements": [ - { - "endIndex": 26757, - "startIndex": 26748, - "textRun": { - "content": " ];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26748 - }, - { - "endIndex": 26758, - "paragraph": { - "elements": [ - { - "endIndex": 26758, - "startIndex": 26757, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26757 - }, - { - "endIndex": 26793, - "paragraph": { - "elements": [ - { - "endIndex": 26793, - "startIndex": 26758, - "textRun": { - "content": " for (var icon in iconKeys) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26758 - }, - { - "endIndex": 26847, - "paragraph": { - "elements": [ - { - "endIndex": 26847, - "startIndex": 26793, - "textRun": { - "content": " await tester.tap(find.byKey(ValueKey(icon)));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26793 - }, - { - "endIndex": 26911, - "paragraph": { - "elements": [ - { - "endIndex": 26911, - "startIndex": 26847, - "textRun": { - "content": " await tester.pumpAndSettle(const Duration(seconds: 1));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26847 - }, - { - "endIndex": 26912, - "paragraph": { - "elements": [ - { - "endIndex": 26912, - "startIndex": 26911, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26911 - }, - { - "endIndex": 26978, - "paragraph": { - "elements": [ - { - "endIndex": 26978, - "startIndex": 26912, - "textRun": { - "content": " expect(find.text('Added to favorites.'), findsOneWidget);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26912 - }, - { - "endIndex": 26986, - "paragraph": { - "elements": [ - { - "endIndex": 26986, - "startIndex": 26978, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26978 - }, - { - "endIndex": 26987, - "paragraph": { - "elements": [ - { - "endIndex": 26987, - "startIndex": 26986, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26986 - }, - { - "endIndex": 27035, - "paragraph": { - "elements": [ - { - "endIndex": 27035, - "startIndex": 26987, - "textRun": { - "content": " await tester.tap(find.text('Favorites'));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26987 - }, - { - "endIndex": 27071, - "paragraph": { - "elements": [ - { - "endIndex": 27071, - "startIndex": 27035, - "textRun": { - "content": " await tester.pumpAndSettle();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27035 - }, - { - "endIndex": 27072, - "paragraph": { - "elements": [ - { - "endIndex": 27072, - "startIndex": 27071, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27071 - }, - { - "endIndex": 27103, - "paragraph": { - "elements": [ - { - "endIndex": 27103, - "startIndex": 27072, - "textRun": { - "content": " final removeIconKeys = [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27072 - }, - { - "endIndex": 27128, - "paragraph": { - "elements": [ - { - "endIndex": 27128, - "startIndex": 27103, - "textRun": { - "content": " 'remove_icon_0',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27103 - }, - { - "endIndex": 27153, - "paragraph": { - "elements": [ - { - "endIndex": 27153, - "startIndex": 27128, - "textRun": { - "content": " 'remove_icon_1',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27128 - }, - { - "endIndex": 27178, - "paragraph": { - "elements": [ - { - "endIndex": 27178, - "startIndex": 27153, - "textRun": { - "content": " 'remove_icon_2',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27153 - }, - { - "endIndex": 27187, - "paragraph": { - "elements": [ - { - "endIndex": 27187, - "startIndex": 27178, - "textRun": { - "content": " ];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27178 - }, - { - "endIndex": 27188, - "paragraph": { - "elements": [ - { - "endIndex": 27188, - "startIndex": 27187, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27187 - }, - { - "endIndex": 27234, - "paragraph": { - "elements": [ - { - "endIndex": 27234, - "startIndex": 27188, - "textRun": { - "content": " for (final iconKey in removeIconKeys) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27188 - }, - { - "endIndex": 27291, - "paragraph": { - "elements": [ - { - "endIndex": 27291, - "startIndex": 27234, - "textRun": { - "content": " await tester.tap(find.byKey(ValueKey(iconKey)));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27234 - }, - { - "endIndex": 27355, - "paragraph": { - "elements": [ - { - "endIndex": 27355, - "startIndex": 27291, - "textRun": { - "content": " await tester.pumpAndSettle(const Duration(seconds: 1));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27291 - }, - { - "endIndex": 27356, - "paragraph": { - "elements": [ - { - "endIndex": 27356, - "startIndex": 27355, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27355 - }, - { - "endIndex": 27426, - "paragraph": { - "elements": [ - { - "endIndex": 27426, - "startIndex": 27356, - "textRun": { - "content": " expect(find.text('Removed from favorites.'), findsOneWidget);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27356 - }, - { - "endIndex": 27434, - "paragraph": { - "elements": [ - { - "endIndex": 27434, - "startIndex": 27426, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27426 - }, - { - "endIndex": 27442, - "paragraph": { - "elements": [ - { - "endIndex": 27442, - "startIndex": 27434, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27434 - }, - { - "endIndex": 27448, - "paragraph": { - "elements": [ - { - "endIndex": 27448, - "startIndex": 27442, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27442 - }, - { - "endIndex": 27450, - "paragraph": { - "elements": [ - { - "endIndex": 27450, - "startIndex": 27448, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27448 - } - ], - "endIndex": 27450, - "startIndex": 26382, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 27452, - "paragraph": { - "elements": [ - { - "endIndex": 27452, - "startIndex": 27451, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27451 - }, - { - "endIndex": 27465, - "paragraph": { - "elements": [ - { - "endIndex": 27465, - "startIndex": 27452, - "textRun": { - "content": "Run the test\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.1lqalhwb26sl", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 27452 - }, - { - "endIndex": 27563, - "paragraph": { - "elements": [ - { - "endIndex": 27466, - "inlineObjectElement": { - "inlineObjectId": "kix.vw1cipbmkp8e", - "textStyle": {} - }, - "startIndex": 27465 - }, - { - "endIndex": 27563, - "startIndex": 27466, - "textRun": { - "content": "Plug-in your device or start your emulator. You can also run the test as a desktop application.\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 27465 - }, - { - "endIndex": 27659, - "paragraph": { - "elements": [ - { - "endIndex": 27564, - "inlineObjectElement": { - "inlineObjectId": "kix.c1qm4t30t535", - "textStyle": {} - }, - "startIndex": 27563 - }, - { - "endIndex": 27586, - "startIndex": 27564, - "textRun": { - "content": "At the command line, n", - "textStyle": {} - } - }, - { - "endIndex": 27658, - "startIndex": 27586, - "textRun": { - "content": "avigate to the project’s root directory and enter the following command:", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 27659, - "startIndex": 27658, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 27563 - }, - { - "endIndex": 27709, - "startIndex": 27659, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 27708, - "startIndex": 27660, - "tableCells": [ - { - "content": [ - { - "endIndex": 27708, - "paragraph": { - "elements": [ - { - "endIndex": 27708, - "startIndex": 27662, - "textRun": { - "content": "$ flutter test integration_test/app_test.dart\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27662 - } - ], - "endIndex": 27708, - "startIndex": 27661, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 27710, - "paragraph": { - "elements": [ - { - "endIndex": 27710, - "startIndex": 27709, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27709 - }, - { - "endIndex": 27782, - "paragraph": { - "elements": [ - { - "endIndex": 27782, - "startIndex": 27710, - "textRun": { - "content": "If everything works, you should see an output similar to the following:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27710 - }, - { - "endIndex": 27783, - "paragraph": { - "elements": [ - { - "endIndex": 27783, - "startIndex": 27782, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27782 - }, - { - "endIndex": 28329, - "startIndex": 27783, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 28328, - "startIndex": 27784, - "tableCells": [ - { - "content": [ - { - "endIndex": 27810, - "paragraph": { - "elements": [ - { - "endIndex": 27810, - "startIndex": 27786, - "textRun": { - "content": "Multiple devices found:\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27786 - }, - { - "endIndex": 27891, - "paragraph": { - "elements": [ - { - "endIndex": 27891, - "startIndex": 27810, - "textRun": { - "content": "Linux (desktop) • linux • linux-x64 • Ubuntu 22.04.1 LTS 5.15.0-58-generic\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27810 - }, - { - "endIndex": 27964, - "paragraph": { - "elements": [ - { - "endIndex": 27964, - "startIndex": 27891, - "textRun": { - "content": "Chrome (web) • chrome • web-javascript • Google Chrome 109.0.5414.119\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27891 - }, - { - "endIndex": 27983, - "paragraph": { - "elements": [ - { - "endIndex": 27983, - "startIndex": 27964, - "textRun": { - "content": "[1]: Linux (linux)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27964 - }, - { - "endIndex": 28004, - "paragraph": { - "elements": [ - { - "endIndex": 28004, - "startIndex": 27983, - "textRun": { - "content": "[2]: Chrome (chrome)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27983 - }, - { - "endIndex": 28048, - "paragraph": { - "elements": [ - { - "endIndex": 28048, - "startIndex": 28004, - "textRun": { - "content": "Please choose one (To quit, press \"q/Q\"): 1\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28004 - }, - { - "endIndex": 28300, - "paragraph": { - "elements": [ - { - "endIndex": 28300, - "startIndex": 28048, - "textRun": { - "content": "00:00 +0: loading /home/miquel/tmp/testing_app/integration_test/app_test.dart B00:08 +0: loading /home/miquel/tmp/testing_app/integration_test/app_test.dart \n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28048 - }, - { - "endIndex": 28328, - "paragraph": { - "elements": [ - { - "endIndex": 28328, - "startIndex": 28300, - "textRun": { - "content": "00:26 +1: All tests passed!\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28300 - } - ], - "endIndex": 28328, - "startIndex": 27785, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 28330, - "paragraph": { - "elements": [ - { - "endIndex": 28330, - "startIndex": 28329, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 28329 - }, - { - "endIndex": 28331, - "paragraph": { - "elements": [ - { - "endIndex": 28331, - "startIndex": 28330, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28330 - }, - { - "endIndex": 28466, - "startIndex": 28331, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 28465, - "startIndex": 28332, - "tableCells": [ - { - "content": [ - { - "endIndex": 28465, - "paragraph": { - "elements": [ - { - "endIndex": 28340, - "startIndex": 28334, - "textRun": { - "content": "Note: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 28430, - "startIndex": 28340, - "textRun": { - "content": "Running integration tests on Chrome requires a different setup, which can be found in the ", - "textStyle": {} - } - }, - { - "endIndex": 28463, - "startIndex": 28430, - "textRun": { - "content": "integration testing documentation", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/testing/integration-tests" - }, - "underline": true - } - } - }, - { - "endIndex": 28465, - "startIndex": 28463, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28334 - } - ], - "endIndex": 28465, - "startIndex": 28333, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 28467, - "paragraph": { - "elements": [ - { - "endIndex": 28467, - "startIndex": 28466, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28466 - }, - { - "endIndex": 28468, - "paragraph": { - "elements": [ - { - "endIndex": 28468, - "startIndex": 28467, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 28467 - }, - { - "endIndex": 28512, - "paragraph": { - "elements": [ - { - "endIndex": 28512, - "startIndex": 28468, - "textRun": { - "content": "Testing app performance with Flutter Driver\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.taqgmwcoaqg", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 28468 - }, - { - "endIndex": 28528, - "paragraph": { - "elements": [ - { - "endIndex": 28527, - "startIndex": 28512, - "textRun": { - "content": "Duration: 05:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 28528, - "startIndex": 28527, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28512 - }, - { - "endIndex": 28553, - "paragraph": { - "elements": [ - { - "endIndex": 28553, - "startIndex": 28528, - "textRun": { - "content": "Write a performance test\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.2bdo8691h79t", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 28528 - }, - { - "endIndex": 28554, - "paragraph": { - "elements": [ - { - "endIndex": 28554, - "startIndex": 28553, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28553 - }, - { - "endIndex": 28657, - "paragraph": { - "elements": [ - { - "endIndex": 28656, - "startIndex": 28554, - "textRun": { - "content": "Create a new test file named perf_test.dart in the integration_test folder with the following content:", - "textStyle": {} - } - }, - { - "endIndex": 28657, - "startIndex": 28656, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28554 - }, - { - "endIndex": 28689, - "paragraph": { - "elements": [ - { - "endIndex": 28688, - "startIndex": 28657, - "textRun": { - "content": "integration_test/perf_test.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_08/integration_test/perf_test.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 28689, - "startIndex": 28688, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.926ood5ssvbr", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 28657 - }, - { - "endIndex": 29560, - "startIndex": 28689, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 29559, - "startIndex": 28690, - "tableCells": [ - { - "content": [ - { - "endIndex": 28732, - "paragraph": { - "elements": [ - { - "endIndex": 28732, - "startIndex": 28692, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28692 - }, - { - "endIndex": 28781, - "paragraph": { - "elements": [ - { - "endIndex": 28781, - "startIndex": 28732, - "textRun": { - "content": "import 'package:flutter_test/flutter_test.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28732 - }, - { - "endIndex": 28838, - "paragraph": { - "elements": [ - { - "endIndex": 28838, - "startIndex": 28781, - "textRun": { - "content": "import 'package:integration_test/integration_test.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28781 - }, - { - "endIndex": 28878, - "paragraph": { - "elements": [ - { - "endIndex": 28878, - "startIndex": 28838, - "textRun": { - "content": "import 'package:testing_app/main.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28838 - }, - { - "endIndex": 28879, - "paragraph": { - "elements": [ - { - "endIndex": 28879, - "startIndex": 28878, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28878 - }, - { - "endIndex": 28893, - "paragraph": { - "elements": [ - { - "endIndex": 28893, - "startIndex": 28879, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28879 - }, - { - "endIndex": 28933, - "paragraph": { - "elements": [ - { - "endIndex": 28933, - "startIndex": 28893, - "textRun": { - "content": " group('Testing App Performance', () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28893 - }, - { - "endIndex": 29011, - "paragraph": { - "elements": [ - { - "endIndex": 29011, - "startIndex": 28933, - "textRun": { - "content": " final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28933 - }, - { - "endIndex": 29089, - "paragraph": { - "elements": [ - { - "endIndex": 29089, - "startIndex": 29011, - "textRun": { - "content": " binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.fullyLive;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29011 - }, - { - "endIndex": 29090, - "paragraph": { - "elements": [ - { - "endIndex": 29090, - "startIndex": 29089, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29089 - }, - { - "endIndex": 29141, - "paragraph": { - "elements": [ - { - "endIndex": 29141, - "startIndex": 29090, - "textRun": { - "content": " testWidgets('Scrolling test', (tester) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29090 - }, - { - "endIndex": 29192, - "paragraph": { - "elements": [ - { - "endIndex": 29192, - "startIndex": 29141, - "textRun": { - "content": " await tester.pumpWidget(const TestingApp());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29141 - }, - { - "endIndex": 29193, - "paragraph": { - "elements": [ - { - "endIndex": 29193, - "startIndex": 29192, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29192 - }, - { - "endIndex": 29241, - "paragraph": { - "elements": [ - { - "endIndex": 29241, - "startIndex": 29193, - "textRun": { - "content": " final listFinder = find.byType(ListView);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29193 - }, - { - "endIndex": 29242, - "paragraph": { - "elements": [ - { - "endIndex": 29242, - "startIndex": 29241, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29241 - }, - { - "endIndex": 29285, - "paragraph": { - "elements": [ - { - "endIndex": 29285, - "startIndex": 29242, - "textRun": { - "content": " await binding.traceAction(() async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29242 - }, - { - "endIndex": 29355, - "paragraph": { - "elements": [ - { - "endIndex": 29355, - "startIndex": 29285, - "textRun": { - "content": " await tester.fling(listFinder, const Offset(0, -500), 10000);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29285 - }, - { - "endIndex": 29393, - "paragraph": { - "elements": [ - { - "endIndex": 29393, - "startIndex": 29355, - "textRun": { - "content": " await tester.pumpAndSettle();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29355 - }, - { - "endIndex": 29394, - "paragraph": { - "elements": [ - { - "endIndex": 29394, - "startIndex": 29393, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29393 - }, - { - "endIndex": 29463, - "paragraph": { - "elements": [ - { - "endIndex": 29463, - "startIndex": 29394, - "textRun": { - "content": " await tester.fling(listFinder, const Offset(0, 500), 10000);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29394 - }, - { - "endIndex": 29501, - "paragraph": { - "elements": [ - { - "endIndex": 29501, - "startIndex": 29463, - "textRun": { - "content": " await tester.pumpAndSettle();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29463 - }, - { - "endIndex": 29543, - "paragraph": { - "elements": [ - { - "endIndex": 29543, - "startIndex": 29501, - "textRun": { - "content": " }, reportKey: 'scrolling_summary');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29501 - }, - { - "endIndex": 29551, - "paragraph": { - "elements": [ - { - "endIndex": 29551, - "startIndex": 29543, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29543 - }, - { - "endIndex": 29557, - "paragraph": { - "elements": [ - { - "endIndex": 29557, - "startIndex": 29551, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29551 - }, - { - "endIndex": 29559, - "paragraph": { - "elements": [ - { - "endIndex": 29559, - "startIndex": 29557, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29557 - } - ], - "endIndex": 29559, - "startIndex": 28691, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 29561, - "paragraph": { - "elements": [ - { - "endIndex": 29561, - "startIndex": 29560, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 29560 - }, - { - "endIndex": 29749, - "paragraph": { - "elements": [ - { - "endIndex": 29565, - "startIndex": 29561, - "textRun": { - "content": "The ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 29584, - "startIndex": 29565, - "textRun": { - "content": "ensureInitialized()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29689, - "startIndex": 29584, - "textRun": { - "content": " function verifies if the integration test driver is initialized, reinitializing it if required. Setting ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 29700, - "startIndex": 29689, - "textRun": { - "content": "framePolicy", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29704, - "startIndex": 29700, - "textRun": { - "content": " to ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 29713, - "startIndex": 29704, - "textRun": { - "content": "fullyLive", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29734, - "startIndex": 29713, - "textRun": { - "content": " is good for testing ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 29748, - "startIndex": 29734, - "textRun": { - "content": "animated code.", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - }, - "fontSize": { - "magnitude": 11.5, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.12941177, - "green": 0.12941177, - "red": 0.12941177 - } - } - } - } - } - }, - { - "endIndex": 29749, - "startIndex": 29748, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 29561 - }, - { - "endIndex": 29750, - "paragraph": { - "elements": [ - { - "endIndex": 29750, - "startIndex": 29749, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 29749 - }, - { - "endIndex": 29920, - "paragraph": { - "elements": [ - { - "endIndex": 29843, - "startIndex": 29750, - "textRun": { - "content": "This test scrolls through the list of items really fast and then scrolls all the way up. The ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 29856, - "startIndex": 29843, - "textRun": { - "content": "traceAction()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 29920, - "startIndex": 29856, - "textRun": { - "content": " function records the actions and generates a timeline summary.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 29750 - }, - { - "endIndex": 29921, - "paragraph": { - "elements": [ - { - "endIndex": 29921, - "startIndex": 29920, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 29920 - }, - { - "endIndex": 29953, - "paragraph": { - "elements": [ - { - "endIndex": 29953, - "startIndex": 29921, - "textRun": { - "content": "Capture the performance results\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.k9x9lpdpqq14", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 29921 - }, - { - "endIndex": 29954, - "paragraph": { - "elements": [ - { - "endIndex": 29954, - "startIndex": 29953, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 29953 - }, - { - "endIndex": 30076, - "paragraph": { - "elements": [ - { - "endIndex": 30000, - "startIndex": 29954, - "textRun": { - "content": "To capture the results, create a folder named ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 30011, - "startIndex": 30000, - "textRun": { - "content": "test_driver", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30030, - "startIndex": 30011, - "textRun": { - "content": " with a file named ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 30046, - "startIndex": 30030, - "textRun": { - "content": "perf_driver.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30076, - "startIndex": 30046, - "textRun": { - "content": ", and add the following code:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 29954 - }, - { - "endIndex": 30077, - "paragraph": { - "elements": [ - { - "endIndex": 30077, - "startIndex": 30076, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30076 - }, - { - "endIndex": 30106, - "paragraph": { - "elements": [ - { - "endIndex": 30105, - "startIndex": 30077, - "textRun": { - "content": "test_driver/perf_driver.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/testing_codelab/step_08/test_driver/perf_driver.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 30106, - "startIndex": 30105, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.u5xt3q47y9fk", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 30077 - }, - { - "endIndex": 30704, - "startIndex": 30106, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 30703, - "startIndex": 30107, - "tableCells": [ - { - "content": [ - { - "endIndex": 30172, - "paragraph": { - "elements": [ - { - "endIndex": 30172, - "startIndex": 30109, - "textRun": { - "content": "import 'package:flutter_driver/flutter_driver.dart' as driver;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30109 - }, - { - "endIndex": 30236, - "paragraph": { - "elements": [ - { - "endIndex": 30236, - "startIndex": 30172, - "textRun": { - "content": "import 'package:integration_test/integration_test_driver.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30172 - }, - { - "endIndex": 30237, - "paragraph": { - "elements": [ - { - "endIndex": 30237, - "startIndex": 30236, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30236 - }, - { - "endIndex": 30259, - "paragraph": { - "elements": [ - { - "endIndex": 30259, - "startIndex": 30237, - "textRun": { - "content": "Future main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30237 - }, - { - "endIndex": 30287, - "paragraph": { - "elements": [ - { - "endIndex": 30287, - "startIndex": 30259, - "textRun": { - "content": " return integrationDriver(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30259 - }, - { - "endIndex": 30328, - "paragraph": { - "elements": [ - { - "endIndex": 30328, - "startIndex": 30287, - "textRun": { - "content": " responseDataCallback: (data) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30287 - }, - { - "endIndex": 30354, - "paragraph": { - "elements": [ - { - "endIndex": 30354, - "startIndex": 30328, - "textRun": { - "content": " if (data != null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30328 - }, - { - "endIndex": 30405, - "paragraph": { - "elements": [ - { - "endIndex": 30405, - "startIndex": 30354, - "textRun": { - "content": " final timeline = driver.Timeline.fromJson(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30354 - }, - { - "endIndex": 30469, - "paragraph": { - "elements": [ - { - "endIndex": 30469, - "startIndex": 30405, - "textRun": { - "content": " data['scrolling_summary'] as Map);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30405 - }, - { - "endIndex": 30470, - "paragraph": { - "elements": [ - { - "endIndex": 30470, - "startIndex": 30469, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30469 - }, - { - "endIndex": 30538, - "paragraph": { - "elements": [ - { - "endIndex": 30538, - "startIndex": 30470, - "textRun": { - "content": " final summary = driver.TimelineSummary.summarize(timeline);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30470 - }, - { - "endIndex": 30539, - "paragraph": { - "elements": [ - { - "endIndex": 30539, - "startIndex": 30538, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30538 - }, - { - "endIndex": 30582, - "paragraph": { - "elements": [ - { - "endIndex": 30582, - "startIndex": 30539, - "textRun": { - "content": " await summary.writeTimelineToFile(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30539 - }, - { - "endIndex": 30613, - "paragraph": { - "elements": [ - { - "endIndex": 30613, - "startIndex": 30582, - "textRun": { - "content": " 'scrolling_summary',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30582 - }, - { - "endIndex": 30637, - "paragraph": { - "elements": [ - { - "endIndex": 30637, - "startIndex": 30613, - "textRun": { - "content": " pretty: true,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30613 - }, - { - "endIndex": 30669, - "paragraph": { - "elements": [ - { - "endIndex": 30669, - "startIndex": 30637, - "textRun": { - "content": " includeSummary: true,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30637 - }, - { - "endIndex": 30680, - "paragraph": { - "elements": [ - { - "endIndex": 30680, - "startIndex": 30669, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30669 - }, - { - "endIndex": 30688, - "paragraph": { - "elements": [ - { - "endIndex": 30688, - "startIndex": 30680, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30680 - }, - { - "endIndex": 30695, - "paragraph": { - "elements": [ - { - "endIndex": 30695, - "startIndex": 30688, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30688 - }, - { - "endIndex": 30700, - "paragraph": { - "elements": [ - { - "endIndex": 30700, - "startIndex": 30695, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30695 - }, - { - "endIndex": 30702, - "paragraph": { - "elements": [ - { - "endIndex": 30702, - "startIndex": 30700, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30700 - }, - { - "endIndex": 30703, - "paragraph": { - "elements": [ - { - "endIndex": 30703, - "startIndex": 30702, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30702 - } - ], - "endIndex": 30703, - "startIndex": 30108, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 30705, - "paragraph": { - "elements": [ - { - "endIndex": 30705, - "startIndex": 30704, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30704 - }, - { - "endIndex": 30706, - "paragraph": { - "elements": [ - { - "endIndex": 30706, - "startIndex": 30705, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30705 - }, - { - "endIndex": 30707, - "paragraph": { - "elements": [ - { - "endIndex": 30707, - "startIndex": 30706, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30706 - }, - { - "endIndex": 30708, - "paragraph": { - "elements": [ - { - "endIndex": 30708, - "startIndex": 30707, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30707 - }, - { - "endIndex": 30721, - "paragraph": { - "elements": [ - { - "endIndex": 30721, - "startIndex": 30708, - "textRun": { - "content": "Run the test\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.deav4oq6epb2", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 30708 - }, - { - "endIndex": 30766, - "paragraph": { - "elements": [ - { - "endIndex": 30722, - "inlineObjectElement": { - "inlineObjectId": "kix.hppjblw9dxbi", - "textStyle": {} - }, - "startIndex": 30721 - }, - { - "endIndex": 30765, - "startIndex": 30722, - "textRun": { - "content": "Plug-in your device or start your emulator.", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 30766, - "startIndex": 30765, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 30721 - }, - { - "endIndex": 30862, - "paragraph": { - "elements": [ - { - "endIndex": 30767, - "inlineObjectElement": { - "inlineObjectId": "kix.4fzvwyc0uikm", - "textStyle": {} - }, - "startIndex": 30766 - }, - { - "endIndex": 30789, - "startIndex": 30767, - "textRun": { - "content": "At the command line, n", - "textStyle": {} - } - }, - { - "endIndex": 30861, - "startIndex": 30789, - "textRun": { - "content": "avigate to the project’s root directory and enter the following command:", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 30862, - "startIndex": 30861, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - "startIndex": 30766 - }, - { - "endIndex": 30996, - "startIndex": 30862, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 30995, - "startIndex": 30863, - "tableCells": [ - { - "content": [ - { - "endIndex": 30883, - "paragraph": { - "elements": [ - { - "endIndex": 30883, - "startIndex": 30865, - "textRun": { - "content": "$ flutter drive \\\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30865 - }, - { - "endIndex": 30925, - "paragraph": { - "elements": [ - { - "endIndex": 30925, - "startIndex": 30883, - "textRun": { - "content": " --driver=test_driver/perf_driver.dart \\\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30883 - }, - { - "endIndex": 30970, - "paragraph": { - "elements": [ - { - "endIndex": 30970, - "startIndex": 30925, - "textRun": { - "content": " --target=integration_test/perf_test.dart \\\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30925 - }, - { - "endIndex": 30984, - "paragraph": { - "elements": [ - { - "endIndex": 30984, - "startIndex": 30970, - "textRun": { - "content": " --profile \\\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30970 - }, - { - "endIndex": 30995, - "paragraph": { - "elements": [ - { - "endIndex": 30995, - "startIndex": 30984, - "textRun": { - "content": " --no-dds\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30984 - } - ], - "endIndex": 30995, - "startIndex": 30864, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 30997, - "paragraph": { - "elements": [ - { - "endIndex": 30997, - "startIndex": 30996, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30996 - }, - { - "endIndex": 31069, - "paragraph": { - "elements": [ - { - "endIndex": 31069, - "startIndex": 30997, - "textRun": { - "content": "If everything works, you should see an output similar to the following:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30997 - }, - { - "endIndex": 31070, - "paragraph": { - "elements": [ - { - "endIndex": 31070, - "startIndex": 31069, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31069 - }, - { - "endIndex": 31890, - "startIndex": 31070, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 31889, - "startIndex": 31071, - "tableCells": [ - { - "content": [ - { - "endIndex": 31117, - "paragraph": { - "elements": [ - { - "endIndex": 31117, - "startIndex": 31073, - "textRun": { - "content": "Running \"flutter pub get\" in testing_app...\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31073 - }, - { - "endIndex": 31144, - "paragraph": { - "elements": [ - { - "endIndex": 31144, - "startIndex": 31117, - "textRun": { - "content": "Resolving dependencies... \n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31117 - }, - { - "endIndex": 31178, - "paragraph": { - "elements": [ - { - "endIndex": 31178, - "startIndex": 31144, - "textRun": { - "content": " archive 3.3.2 (3.3.6 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31144 - }, - { - "endIndex": 31217, - "paragraph": { - "elements": [ - { - "endIndex": 31217, - "startIndex": 31178, - "textRun": { - "content": " collection 1.17.0 (1.17.1 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31178 - }, - { - "endIndex": 31246, - "paragraph": { - "elements": [ - { - "endIndex": 31246, - "startIndex": 31217, - "textRun": { - "content": " js 0.6.5 (0.6.7 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31217 - }, - { - "endIndex": 31284, - "paragraph": { - "elements": [ - { - "endIndex": 31284, - "startIndex": 31246, - "textRun": { - "content": " matcher 0.12.13 (0.12.14 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31246 - }, - { - "endIndex": 31315, - "paragraph": { - "elements": [ - { - "endIndex": 31315, - "startIndex": 31284, - "textRun": { - "content": " meta 1.8.0 (1.9.0 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31284 - }, - { - "endIndex": 31346, - "paragraph": { - "elements": [ - { - "endIndex": 31346, - "startIndex": 31315, - "textRun": { - "content": " path 1.8.2 (1.8.3 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31315 - }, - { - "endIndex": 31379, - "paragraph": { - "elements": [ - { - "endIndex": 31379, - "startIndex": 31346, - "textRun": { - "content": " test 1.22.0 (1.23.0 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31346 - }, - { - "endIndex": 31416, - "paragraph": { - "elements": [ - { - "endIndex": 31416, - "startIndex": 31379, - "textRun": { - "content": " test_api 0.4.16 (0.4.18 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31379 - }, - { - "endIndex": 31454, - "paragraph": { - "elements": [ - { - "endIndex": 31454, - "startIndex": 31416, - "textRun": { - "content": " test_core 0.4.20 (0.4.23 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31416 - }, - { - "endIndex": 31492, - "paragraph": { - "elements": [ - { - "endIndex": 31492, - "startIndex": 31454, - "textRun": { - "content": " vm_service 9.4.0 (11.0.1 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31454 - }, - { - "endIndex": 31528, - "paragraph": { - "elements": [ - { - "endIndex": 31528, - "startIndex": 31492, - "textRun": { - "content": " webdriver 3.0.1 (3.0.2 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31492 - }, - { - "endIndex": 31546, - "paragraph": { - "elements": [ - { - "endIndex": 31546, - "startIndex": 31528, - "textRun": { - "content": "Got dependencies!\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31528 - }, - { - "endIndex": 31619, - "paragraph": { - "elements": [ - { - "endIndex": 31619, - "startIndex": 31546, - "textRun": { - "content": "Running Gradle task 'assembleProfile'... 1,379ms\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31546 - }, - { - "endIndex": 31684, - "paragraph": { - "elements": [ - { - "endIndex": 31684, - "startIndex": 31619, - "textRun": { - "content": "✓ Built build/app/outputs/flutter-apk/app-profile.apk (14.9MB).\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31619 - }, - { - "endIndex": 31757, - "paragraph": { - "elements": [ - { - "endIndex": 31757, - "startIndex": 31684, - "textRun": { - "content": "Installing build/app/outputs/flutter-apk/app-profile.apk... 222ms\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31684 - }, - { - "endIndex": 31824, - "paragraph": { - "elements": [ - { - "endIndex": 31824, - "startIndex": 31757, - "textRun": { - "content": "I/flutter ( 6125): 00:04 +1: Testing App Performance (tearDownAll)\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31757 - }, - { - "endIndex": 31871, - "paragraph": { - "elements": [ - { - "endIndex": 31871, - "startIndex": 31824, - "textRun": { - "content": "I/flutter ( 6125): 00:04 +2: All tests passed!\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31824 - }, - { - "endIndex": 31889, - "paragraph": { - "elements": [ - { - "endIndex": 31889, - "startIndex": 31871, - "textRun": { - "content": "All tests passed.\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31871 - } - ], - "endIndex": 31889, - "startIndex": 31072, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 31891, - "paragraph": { - "elements": [ - { - "endIndex": 31891, - "startIndex": 31890, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 31890 - }, - { - "endIndex": 31997, - "paragraph": { - "elements": [ - { - "endIndex": 31997, - "startIndex": 31891, - "textRun": { - "content": "After the test completes successfully, the build directory at the root of the project contains two files:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 31891 - }, - { - "endIndex": 31998, - "paragraph": { - "elements": [ - { - "endIndex": 31998, - "startIndex": 31997, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 31997 - }, - { - "endIndex": 32139, - "paragraph": { - "bullet": { - "listId": "kix.4sih8svsyp", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 32037, - "startIndex": 31998, - "textRun": { - "content": "scrolling_summary.timeline_summary.json", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32139, - "startIndex": 32037, - "textRun": { - "content": " contains the summary. Open the file with any text editor to review the information contained within.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31998 - }, - { - "endIndex": 32208, - "paragraph": { - "bullet": { - "listId": "kix.4sih8svsyp", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 32170, - "startIndex": 32139, - "textRun": { - "content": "scrolling_summary.timeline.json", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32207, - "startIndex": 32170, - "textRun": { - "content": " contains the complete timeline data.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 32208, - "startIndex": 32207, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "spaceBelow": { - "magnitude": 12.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32139 - }, - { - "endIndex": 32209, - "paragraph": { - "elements": [ - { - "endIndex": 32209, - "startIndex": 32208, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32208 - }, - { - "endIndex": 32257, - "paragraph": { - "elements": [ - { - "endIndex": 32257, - "startIndex": 32209, - "textRun": { - "content": "For more details on integration testing, visit:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32209 - }, - { - "endIndex": 32258, - "paragraph": { - "elements": [ - { - "endIndex": 32258, - "startIndex": 32257, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32257 - }, - { - "endIndex": 32297, - "paragraph": { - "bullet": { - "listId": "kix.zdub7zofx4i9", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 32296, - "startIndex": 32258, - "textRun": { - "content": "An introduction to integration testing", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/cookbook/testing/integration/introduction" - }, - "underline": true - } - } - }, - { - "endIndex": 32297, - "startIndex": 32296, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32258 - }, - { - "endIndex": 32320, - "paragraph": { - "bullet": { - "listId": "kix.zdub7zofx4i9", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 32318, - "startIndex": 32297, - "textRun": { - "content": "Performance profiling", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/cookbook/testing/integration/profiling" - }, - "underline": true - } - } - }, - { - "endIndex": 32320, - "startIndex": 32318, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32297 - }, - { - "endIndex": 32350, - "paragraph": { - "bullet": { - "listId": "kix.zdub7zofx4i9", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 32336, - "startIndex": 32320, - "textRun": { - "content": "integration_test", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/documentation/integration_test/latest/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32349, - "startIndex": 32336, - "textRun": { - "content": " library docs", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/documentation/integration_test/latest/" - }, - "underline": true - } - } - }, - { - "endIndex": 32350, - "startIndex": 32349, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32320 - }, - { - "endIndex": 32351, - "paragraph": { - "elements": [ - { - "endIndex": 32351, - "startIndex": 32350, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32350 - }, - { - "endIndex": 32353, - "paragraph": { - "elements": [ - { - "endIndex": 32352, - "horizontalRule": { - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "startIndex": 32351 - }, - { - "endIndex": 32353, - "startIndex": 32352, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32351 - }, - { - "endIndex": 32354, - "paragraph": { - "elements": [ - { - "endIndex": 32354, - "startIndex": 32353, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.on2ervh3csag", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 32353 - }, - { - "endIndex": 32371, - "paragraph": { - "elements": [ - { - "endIndex": 32370, - "startIndex": 32354, - "textRun": { - "content": "Congratulations!", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 32371, - "startIndex": 32370, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 20.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.wyjmgdlwi2kp", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 32354 - }, - { - "endIndex": 32386, - "paragraph": { - "elements": [ - { - "endIndex": 32385, - "startIndex": 32371, - "textRun": { - "content": "Duration: 0:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 32386, - "startIndex": 32385, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32371 - }, - { - "endIndex": 32387, - "paragraph": { - "elements": [ - { - "endIndex": 32387, - "startIndex": 32386, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32386 - }, - { - "endIndex": 32471, - "paragraph": { - "elements": [ - { - "endIndex": 32471, - "startIndex": 32387, - "textRun": { - "content": "You’ve completed the codelab and have learned different ways to test a Flutter app.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32387 - }, - { - "endIndex": 32472, - "paragraph": { - "elements": [ - { - "endIndex": 32472, - "startIndex": 32471, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32471 - }, - { - "endIndex": 32492, - "paragraph": { - "elements": [ - { - "endIndex": 32492, - "startIndex": 32472, - "textRun": { - "content": "What you’ve learned\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.1hcibaejjgkm", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 32472 - }, - { - "endIndex": 32493, - "paragraph": { - "elements": [ - { - "endIndex": 32493, - "startIndex": 32492, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32492 - }, - { - "endIndex": 32543, - "paragraph": { - "bullet": { - "listId": "kix.a0852rs47fk1", - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 32543, - "startIndex": 32493, - "textRun": { - "content": "How to test providers with the help of unit tests\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32493 - }, - { - "endIndex": 32598, - "paragraph": { - "bullet": { - "listId": "kix.a0852rs47fk1", - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 32598, - "startIndex": 32543, - "textRun": { - "content": "How to test widgets using the widget testing framework\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32543 - }, - { - "endIndex": 32647, - "paragraph": { - "bullet": { - "listId": "kix.a0852rs47fk1", - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 32647, - "startIndex": 32598, - "textRun": { - "content": "How to test the app’s UI using integration tests\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32598 - }, - { - "endIndex": 32705, - "paragraph": { - "bullet": { - "listId": "kix.a0852rs47fk1", - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 32705, - "startIndex": 32647, - "textRun": { - "content": "How to test the app’s performance using integration tests\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32647 - }, - { - "endIndex": 32751, - "paragraph": { - "elements": [ - { - "endIndex": 32751, - "startIndex": 32705, - "textRun": { - "content": "To learn more about testing in Flutter, visit\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32705 - }, - { - "endIndex": 32752, - "paragraph": { - "elements": [ - { - "endIndex": 32752, - "startIndex": 32751, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 32751 - }, - { - "endIndex": 32773, - "paragraph": { - "bullet": { - "listId": "kix.ok1uo0sqganv", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 32772, - "startIndex": 32752, - "textRun": { - "content": "Testing Flutter apps", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/testing" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 32773, - "startIndex": 32772, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32752 - }, - { - "endIndex": 32801, - "paragraph": { - "bullet": { - "listId": "kix.ok1uo0sqganv", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 32800, - "startIndex": 32773, - "textRun": { - "content": "The app you built on GitHub", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/tree/master/testing_codelab" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 32801, - "startIndex": 32800, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32773 - } - ] - }, - "documentId": "1MfCrv1w6aK7SLq9gmjJwXCJFQ-AX9NWJit2gq-v2Xx8", - "documentStyle": { - "background": { - "color": {} - }, - "defaultHeaderId": "kix.v4g5fejzegg1", - "marginBottom": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72.0, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792.0, - "unit": "PT" - }, - "width": { - "magnitude": 612.0, - "unit": "PT" - } - } - }, - "headers": { - "kix.v4g5fejzegg1": { - "content": [ - { - "endIndex": 1, - "paragraph": { - "elements": [ - { - "endIndex": 1, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - } - } - ], - "headerId": "kix.v4g5fejzegg1" - } - }, - "inlineObjects": { - "kix.1a8yopvgl1v3": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.1a8yopvgl1v3" - }, - "kix.1bbevp73nnto": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.1bbevp73nnto" - }, - "kix.4bjxnpvmqdqw": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.4bjxnpvmqdqw" - }, - "kix.4fzvwyc0uikm": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.4fzvwyc0uikm" - }, - "kix.8fiu045gopb0": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.8fiu045gopb0" - }, - "kix.b9xif596w41m": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.b9xif596w41m" - }, - "kix.bq782xjqvdjv": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/IZqzLpXlbWjXlmihpP5EsIAPjoea9TpbWUhUa7pY3duLx80XuMHekKTTSsOe8TUih71h3n5yPboDqi8EYV8xPLotnS2e_i4MrsYpOQhehPEjnXXmNZ6rdVSClkZ1dbxfLHq7QB5Km1-qoSR2zZ7nulodAAJ4PafKcmJSLFsoZNGAsnVoRu48SR3FkK7muW5aiQttR2wO", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 562.5, - "unit": "PT" - }, - "width": { - "magnitude": 340.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.bq782xjqvdjv" - }, - "kix.c1qm4t30t535": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.c1qm4t30t535" - }, - "kix.d4vz5dd90gaz": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.d4vz5dd90gaz" - }, - "kix.eq1djvxuil7r": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.eq1djvxuil7r" - }, - "kix.evfxwl6jtu5p": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.evfxwl6jtu5p" - }, - "kix.gg3gr5sijdnh": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/uj1_cgo4YXfeAgUfLOZu1VVRXPqZYVAUiwWwxjsN0qcCjJMXOcawLzes67ynHkvD121U672KD8tMC0vK76QsVKcafhKPh-X-Ax8lo1u9PXe-g4SQDGN6i1bbjR1UZn2kr0E2BBVm6zShuwMmcxpR53TtYpFYDneYYylqieJ_SosY6-kEL2zq-lpCvCyo-D81eJf3abw", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 345.59999999999997, - "unit": "PT" - }, - "width": { - "magnitude": 158.4, - "unit": "PT" - } - } - } - }, - "objectId": "kix.gg3gr5sijdnh" - }, - "kix.gqfd0f5er86o": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.gqfd0f5er86o" - }, - "kix.hppjblw9dxbi": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.hppjblw9dxbi" - }, - "kix.j4cw023q65fe": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.j4cw023q65fe" - }, - "kix.lnhdx8vi6eyr": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.lnhdx8vi6eyr" - }, - "kix.lwerlpw3ks35": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.lwerlpw3ks35" - }, - "kix.m7tljkfuu9rn": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.m7tljkfuu9rn" - }, - "kix.msx029net7f": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.msx029net7f" - }, - "kix.p6jnzf8drcum": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.p6jnzf8drcum" - }, - "kix.r3zi00euxfm9": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.r3zi00euxfm9" - }, - "kix.rs7d47iay6n6": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.rs7d47iay6n6" - }, - "kix.t1po0vh8s85t": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.t1po0vh8s85t" - }, - "kix.v89a14d9pxx": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.v89a14d9pxx" - }, - "kix.vw1cipbmkp8e": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.vw1cipbmkp8e" - }, - "kix.x2m11py6vbqc": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/VHYPxtckub8ExoNiEbf-Xz8DSmc2GZvtzANJHUA6UKXabCcYmKY6FlEDu_RqI_g0icg5YDOd75cRP9JSTssvRWoZCVWpMRegAk8dJRT0TEAgyIlCiZDyfl2EiwJcM8ze4PHCLcFX75cqu2KGDpwoDU3BzBdmMO203g1HTquGKAwfowWXYHMb3YVWzSGPPqOI2fd-oRg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.x2m11py6vbqc" - } - }, - "lists": { - "kix.1tjhv41sn0xa": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.1ztzk92hrth8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.24nsib9zi81l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2ctr6ys6ni0e": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2jnyqucbt2t6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2whi3gkwlssd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3cjxume1ox5j": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3l2774habcsr": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4sih8svsyp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4x1zl3kbw569": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4yb7edsq6e7h": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5hb992swn8xf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5jdr984vfzt1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5q2x329ym1hh": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.26666668, - "green": 0.26666668, - "red": 0.26666668 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5u3z80370s2t": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6f05htw8422z": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6j918luqnpw7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6k967ur1ah1u": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6m37iee3p8wg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7or0vngkfvx7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7uh5pgoi33tb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.83lp1z9knfuo": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.86coc8u6ksqk": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.8bm96xhzoe5y": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.8budch7w7arn": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.98e48u1wcy7a": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.98vmteiu60y4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9u3cg917bqs8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9ueckdtpugb1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9uhh20xkbn6m": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9z83l2c17pcu": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.a0852rs47fk1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.agpmvda4vr7h": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.anq6omciu13j": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.aurhp3tf619": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.26666668, - "green": 0.4, - "red": 0.26666668 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.b1vk7rq3mqxe": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.b7qotwh7gtna": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.bmk2w9stijyg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.c7ejcv2rhol9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cbv3p81ktfkm": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cw1c2jqsuto": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ed3ilj3kkhq2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.f3mtn21egf47": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.f9bz4vrobr4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fa4ji89str8f": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fj7194xw5fjn": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g801zwj9tdo5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g846847cbhgd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g8ukrj6l25im": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.gawmxw84fbl": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.gpkppvve7lf6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.h1gbtohxox8w": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.hn7y8493y02l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 342.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 360.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.hnxe8uaki5ye": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.huc4gmkwuq3u": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.if1slz31cdfr": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ighvy8mje2ni": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 342.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 360.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 378.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 396.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 414.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 432.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.imsafi72ulmz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.j2ckn4bxfuh7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jah968f0rvh1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jkp7jly57b9l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.k0g7fgw2pxb9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kh0gu8ggzrfl": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kjyum9q5klsd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kxmmxgmyzkom": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l2nxb9cf1l7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l9tvvj4pt5te": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.lapnsvq0oh3k": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.lwtrs6k81vg0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.m93cb198q22r": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.nw9e0rbdtf2n": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.o6y9eyfrksu6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.o72pyift6jdv": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.oerq1n8ypay0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ok1uo0sqganv": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.oof1ot60ek97": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.pcizye4e9dah": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.phibiqsq7jjd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.pqvo4mshpkm2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.pvf8i7z50kj2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.q5glzqgk6j58": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.q759u59r2yjj": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qk785s5gz3e7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qn0y5v3qa3lw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qnkbj287noea": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qvkatskfprp3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qx7bo6w9dag0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qztvdbrb1co7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.r51tyrttcax1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.r8m6khspk25u": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rc6w55ji8nb9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ront1oenvgqg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rrgd3s9e8n6q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rup19lwpb96r": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rza4cz1vbnb5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.s154rj5xcbab": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.s3ytlwab2m4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.sc6u2wmq4gty": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.slxd9egkb7ci": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.sqqfdjlv2hm9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tismz98me1tb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tobmpp8mbh7q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ubwwu4244ov3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.uye62wdrnhk7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.v58qrdjinxbw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vc2fcwdxd37v": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vnpt9crrt431": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vwvs454chlx5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wa0nkis9zlxf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wvtqhihdjvtw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.x2xqmh4hm4pa": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.xj4zd89gdvlp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.y4auuiny9mus": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 342.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 360.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 378.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 396.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.y57lij9p0nfz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.yadiw4lw6xu2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.yzzhnzljrr4r": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 2, - "textStyle": { - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z1u1i7qvii2l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z25dkq3ogzpp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z2hyt12r7kc1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z46ih1vlabol": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.zdub7zofx4i9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.zgjdicbyim0z": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6fjw6cht0bf", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.1f8fwhfw59th", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.4pgk284l6s7z", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.9ujhi55jbp4b", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_4", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.yjfswb1t0sub", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_5", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.91dfhsx5n4l3", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_6", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.uvzknuxefxg9", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "TITLE", - "pageBreakBefore": false - }, - "textStyle": { - "fontSize": { - "magnitude": 21.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - ] - }, - "revisionId": "ANeT5PTkbFxWsFCCU8Qwichg1Czj-PXDC2-rr6gRE1S_qyigyBVjJ6qkx3gDNSQr2NqNgvSReJujiNOj95ZaTg", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "title": "Flutter Testing Codelab" -} \ No newline at end of file diff --git a/tooling/claat_export_images/test/data/exports/1NJq1PfV9mB2avhoM2l12DSQ8p2x6s_epXcLwCcZwpcg.json b/tooling/claat_export_images/test/data/exports/1NJq1PfV9mB2avhoM2l12DSQ8p2x6s_epXcLwCcZwpcg.json deleted file mode 100644 index 58509a6c55..0000000000 --- a/tooling/claat_export_images/test/data/exports/1NJq1PfV9mB2avhoM2l12DSQ8p2x6s_epXcLwCcZwpcg.json +++ /dev/null @@ -1,66797 +0,0 @@ -{ - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 37, - "paragraph": { - "elements": [ - { - "endIndex": 37, - "startIndex": 1, - "textRun": { - "content": "Write a Flutter desktop application\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7sa4zxkhmsum", - "namedStyleType": "TITLE", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1 - }, - { - "endIndex": 38, - "paragraph": { - "elements": [ - { - "endIndex": 38, - "startIndex": 37, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37 - }, - { - "endIndex": 73, - "paragraph": { - "elements": [ - { - "endIndex": 72, - "startIndex": 38, - "textRun": { - "content": "Last update: 2nd March 2023, brett", - "textStyle": { - "fontSize": { - "magnitude": 8.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 73, - "startIndex": 72, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "END", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 38 - }, - { - "endIndex": 383, - "startIndex": 73, - "table": { - "columns": 2, - "rows": 8, - "tableRows": [ - { - "endIndex": 155, - "startIndex": 74, - "tableCells": [ - { - "content": [ - { - "endIndex": 84, - "paragraph": { - "elements": [ - { - "endIndex": 84, - "startIndex": 76, - "textRun": { - "content": "Summary\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 76 - } - ], - "endIndex": 84, - "startIndex": 75, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 155, - "paragraph": { - "elements": [ - { - "endIndex": 155, - "startIndex": 85, - "textRun": { - "content": "In this codelab, you’ll build a GitHub client in Flutter for desktop.\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 85 - } - ], - "endIndex": 155, - "startIndex": 84, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 193, - "startIndex": 155, - "tableCells": [ - { - "content": [ - { - "endIndex": 161, - "paragraph": { - "elements": [ - { - "endIndex": 161, - "startIndex": 157, - "textRun": { - "content": "URL\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 157 - } - ], - "endIndex": 161, - "startIndex": 156, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 193, - "paragraph": { - "elements": [ - { - "endIndex": 193, - "startIndex": 162, - "textRun": { - "content": "codelabs/flutter-github-client\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 162 - } - ], - "endIndex": 193, - "startIndex": 161, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 213, - "startIndex": 193, - "tableCells": [ - { - "content": [ - { - "endIndex": 204, - "paragraph": { - "elements": [ - { - "endIndex": 204, - "startIndex": 195, - "textRun": { - "content": "Category\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 195 - } - ], - "endIndex": 204, - "startIndex": 194, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 213, - "paragraph": { - "elements": [ - { - "endIndex": 213, - "startIndex": 205, - "textRun": { - "content": "Flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 205 - } - ], - "endIndex": 213, - "startIndex": 204, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 252, - "startIndex": 213, - "tableCells": [ - { - "content": [ - { - "endIndex": 227, - "paragraph": { - "elements": [ - { - "endIndex": 227, - "startIndex": 215, - "textRun": { - "content": "Environment\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 215 - } - ], - "endIndex": 227, - "startIndex": 214, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 252, - "paragraph": { - "elements": [ - { - "endIndex": 252, - "startIndex": 228, - "textRun": { - "content": "web, kiosk, tag-flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 228 - } - ], - "endIndex": 252, - "startIndex": 227, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 272, - "startIndex": 252, - "tableCells": [ - { - "content": [ - { - "endIndex": 261, - "paragraph": { - "elements": [ - { - "endIndex": 261, - "startIndex": 254, - "textRun": { - "content": "Status\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 254 - } - ], - "endIndex": 261, - "startIndex": 253, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 272, - "paragraph": { - "elements": [ - { - "endIndex": 271, - "startIndex": 262, - "textRun": { - "content": "Published", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://codelabs.developers.google.com/codelabs/flutter-github-graphql-client/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 272, - "startIndex": 271, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 262 - } - ], - "endIndex": 272, - "startIndex": 261, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 331, - "startIndex": 272, - "tableCells": [ - { - "content": [ - { - "endIndex": 288, - "paragraph": { - "elements": [ - { - "endIndex": 288, - "startIndex": 274, - "textRun": { - "content": "Feedback Link\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 274 - } - ], - "endIndex": 288, - "startIndex": 273, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 331, - "paragraph": { - "elements": [ - { - "endIndex": 330, - "startIndex": 289, - "textRun": { - "content": "https://github.com/flutter/flutter/issues", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 331, - "startIndex": 330, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 289 - } - ], - "endIndex": 331, - "startIndex": 288, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 354, - "startIndex": 331, - "tableCells": [ - { - "content": [ - { - "endIndex": 340, - "paragraph": { - "elements": [ - { - "endIndex": 340, - "startIndex": 333, - "textRun": { - "content": "Author\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 333 - } - ], - "endIndex": 340, - "startIndex": 332, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 354, - "paragraph": { - "elements": [ - { - "endIndex": 354, - "startIndex": 341, - "textRun": { - "content": "Brett Morgan\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 341 - } - ], - "endIndex": 354, - "startIndex": 340, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 382, - "startIndex": 354, - "tableCells": [ - { - "content": [ - { - "endIndex": 368, - "paragraph": { - "elements": [ - { - "endIndex": 368, - "startIndex": 356, - "textRun": { - "content": "Author LDAP\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 356 - } - ], - "endIndex": 368, - "startIndex": 355, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 382, - "paragraph": { - "elements": [ - { - "endIndex": 382, - "startIndex": 369, - "textRun": { - "content": "brettmorgan@\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 369 - } - ], - "endIndex": 382, - "startIndex": 368, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "width": { - "magnitude": 101.25, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - }, - { - "width": { - "magnitude": 366.75, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - } - ] - } - } - }, - { - "endIndex": 384, - "paragraph": { - "elements": [ - { - "endIndex": 384, - "startIndex": 383, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 383 - }, - { - "endIndex": 385, - "paragraph": { - "elements": [ - { - "endIndex": 385, - "startIndex": 384, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 384 - }, - { - "endIndex": 1941, - "startIndex": 385, - "tableOfContents": { - "content": [ - { - "endIndex": 399, - "paragraph": { - "elements": [ - { - "endIndex": 398, - "startIndex": 386, - "textRun": { - "content": "Introduction", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ok7k5uux6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 399, - "startIndex": 398, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 386 - }, - { - "endIndex": 417, - "paragraph": { - "elements": [ - { - "endIndex": 416, - "startIndex": 399, - "textRun": { - "content": "What you’ll learn", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.kjcmdnw2uhw0" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 417, - "startIndex": 416, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 399 - }, - { - "endIndex": 465, - "paragraph": { - "elements": [ - { - "endIndex": 464, - "startIndex": 417, - "textRun": { - "content": "What would you like to learn from this codelab?", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.b7nxsg514qu3" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 465, - "startIndex": 464, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 417 - }, - { - "endIndex": 509, - "paragraph": { - "elements": [ - { - "endIndex": 508, - "startIndex": 465, - "textRun": { - "content": "Set up your Flutter development environment", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.m0ycdyje7e1p" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 509, - "startIndex": 508, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 465 - }, - { - "endIndex": 521, - "paragraph": { - "elements": [ - { - "endIndex": 520, - "startIndex": 509, - "textRun": { - "content": "Get started", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.bwo0af2iwk90" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 521, - "startIndex": 520, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 509 - }, - { - "endIndex": 578, - "paragraph": { - "elements": [ - { - "endIndex": 577, - "startIndex": 521, - "textRun": { - "content": "Get started developing desktop applications with Flutter", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.sflrq0mndtt9" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 578, - "startIndex": 577, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 521 - }, - { - "endIndex": 597, - "paragraph": { - "elements": [ - { - "endIndex": 596, - "startIndex": 578, - "textRun": { - "content": "Add authentication", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.btmxwf909kks" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 597, - "startIndex": 596, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 578 - }, - { - "endIndex": 621, - "paragraph": { - "elements": [ - { - "endIndex": 620, - "startIndex": 597, - "textRun": { - "content": "Authenticate on desktop", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.en66mhmr1ijb" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 621, - "startIndex": 620, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 597 - }, - { - "endIndex": 657, - "paragraph": { - "elements": [ - { - "endIndex": 656, - "startIndex": 621, - "textRun": { - "content": "Register a GitHub OAuth application", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.7vqm6x19piv6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 657, - "startIndex": 656, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 621 - }, - { - "endIndex": 701, - "paragraph": { - "elements": [ - { - "endIndex": 700, - "startIndex": 657, - "textRun": { - "content": "Add oauth2 and url_launcher to pubspec.yaml", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.q0rhufo5z2t7" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 701, - "startIndex": 700, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 657 - }, - { - "endIndex": 728, - "paragraph": { - "elements": [ - { - "endIndex": 727, - "startIndex": 701, - "textRun": { - "content": "Include client credentials", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.8u59l9jgbnew" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 728, - "startIndex": 727, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 701 - }, - { - "endIndex": 762, - "paragraph": { - "elements": [ - { - "endIndex": 761, - "startIndex": 728, - "textRun": { - "content": "lib/github_oauth_credentials.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.htgwfkoywwur" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 762, - "startIndex": 761, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 728 - }, - { - "endIndex": 792, - "paragraph": { - "elements": [ - { - "endIndex": 791, - "startIndex": 762, - "textRun": { - "content": "Build the desktop OAuth2 flow", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.2g3izc2yvji5" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 792, - "startIndex": 791, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 762 - }, - { - "endIndex": 818, - "paragraph": { - "elements": [ - { - "endIndex": 817, - "startIndex": 792, - "textRun": { - "content": "lib/src/github_login.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.mxk36wiuic12" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 818, - "startIndex": 817, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 792 - }, - { - "endIndex": 869, - "paragraph": { - "elements": [ - { - "endIndex": 868, - "startIndex": 818, - "textRun": { - "content": "Change client and server entitlements (macOS only)", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.j6sh1ew9czrq" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 869, - "startIndex": 868, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 818 - }, - { - "endIndex": 908, - "paragraph": { - "elements": [ - { - "endIndex": 907, - "startIndex": 869, - "textRun": { - "content": "macos/Runner/DebugProfile.entitlements", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.fxzkfghpdp3w" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 908, - "startIndex": 907, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 869 - }, - { - "endIndex": 942, - "paragraph": { - "elements": [ - { - "endIndex": 941, - "startIndex": 908, - "textRun": { - "content": "macos/Runner/Release.entitlements", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.kxtouu341cwy" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 942, - "startIndex": 941, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 908 - }, - { - "endIndex": 962, - "paragraph": { - "elements": [ - { - "endIndex": 961, - "startIndex": 942, - "textRun": { - "content": "Put it all together", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.jm4vjriq444u" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 962, - "startIndex": 961, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 942 - }, - { - "endIndex": 976, - "paragraph": { - "elements": [ - { - "endIndex": 975, - "startIndex": 962, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.hcdqgnf1x5cc" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 976, - "startIndex": 975, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 962 - }, - { - "endIndex": 990, - "paragraph": { - "elements": [ - { - "endIndex": 989, - "startIndex": 976, - "textRun": { - "content": "Access GitHub", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.o7wkpp16ivz9" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 990, - "startIndex": 989, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 976 - }, - { - "endIndex": 1011, - "paragraph": { - "elements": [ - { - "endIndex": 1010, - "startIndex": 990, - "textRun": { - "content": "Connecting to GitHub", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.gvdggzcg3rl9" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1011, - "startIndex": 1010, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 990 - }, - { - "endIndex": 1033, - "paragraph": { - "elements": [ - { - "endIndex": 1032, - "startIndex": 1011, - "textRun": { - "content": "Add more dependencies", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.4cgc2h5sgntj" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1033, - "startIndex": 1032, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1011 - }, - { - "endIndex": 1085, - "paragraph": { - "elements": [ - { - "endIndex": 1084, - "startIndex": 1033, - "textRun": { - "content": "Using the OAuth credentials with the GitHub package", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.xt1o8mni566u" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1085, - "startIndex": 1084, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1033 - }, - { - "endIndex": 1112, - "paragraph": { - "elements": [ - { - "endIndex": 1111, - "startIndex": 1085, - "textRun": { - "content": "Put it all together, again", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.48td5rausrn" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1112, - "startIndex": 1111, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1085 - }, - { - "endIndex": 1126, - "paragraph": { - "elements": [ - { - "endIndex": 1125, - "startIndex": 1112, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.3dhyu6vvv6da" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1126, - "startIndex": 1125, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1112 - }, - { - "endIndex": 1179, - "paragraph": { - "elements": [ - { - "endIndex": 1178, - "startIndex": 1126, - "textRun": { - "content": "Create a Flutter plugin for Windows, macOS and Linux", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.y4dthnd83h7y" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1179, - "startIndex": 1178, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1126 - }, - { - "endIndex": 1198, - "paragraph": { - "elements": [ - { - "endIndex": 1197, - "startIndex": 1179, - "textRun": { - "content": "Tidy up annoyances", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.x5mzhz8u9ffc" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1198, - "startIndex": 1197, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1179 - }, - { - "endIndex": 1251, - "paragraph": { - "elements": [ - { - "endIndex": 1250, - "startIndex": 1198, - "textRun": { - "content": "Create a Flutter plugin for Windows, macOS and Linux", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.7pvyiekezbx3" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1251, - "startIndex": 1250, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1198 - }, - { - "endIndex": 1283, - "paragraph": { - "elements": [ - { - "endIndex": 1282, - "startIndex": 1251, - "textRun": { - "content": "../window_to_front/pubspec.yaml", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.jzwhkyx3nv7v" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1283, - "startIndex": 1282, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1251 - }, - { - "endIndex": 1342, - "paragraph": { - "elements": [ - { - "endIndex": 1341, - "startIndex": 1283, - "textRun": { - "content": "../window_to_front/macos/Classes/WindowToFrontPlugin.swift", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.gbdp4zvacbnx" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1342, - "startIndex": 1341, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1283 - }, - { - "endIndex": 1393, - "paragraph": { - "elements": [ - { - "endIndex": 1392, - "startIndex": 1342, - "textRun": { - "content": "../window_to_front/linux/window_to_front_plugin.cc", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.gmudsp9ty2i4" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1393, - "startIndex": 1392, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1342 - }, - { - "endIndex": 1447, - "paragraph": { - "elements": [ - { - "endIndex": 1446, - "startIndex": 1393, - "textRun": { - "content": "..\\window_to_front\\windows\\window_to_front_plugin.cpp", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.v5bv9seg092z" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1447, - "startIndex": 1446, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1393 - }, - { - "endIndex": 1499, - "paragraph": { - "elements": [ - { - "endIndex": 1498, - "startIndex": 1447, - "textRun": { - "content": "..\\window_to_front\\windows\\window_to_front_plugin.h", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.t2c94s1xc1c9" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1499, - "startIndex": 1498, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1447 - }, - { - "endIndex": 1562, - "paragraph": { - "elements": [ - { - "endIndex": 1561, - "startIndex": 1499, - "textRun": { - "content": "../window_to_front/lib/window_to_front_platform_interface.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.k1mv0ddt12dk" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1562, - "startIndex": 1561, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1499 - }, - { - "endIndex": 1621, - "paragraph": { - "elements": [ - { - "endIndex": 1620, - "startIndex": 1562, - "textRun": { - "content": "../window_to_front/lib/window_to_front_method_channel.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.wwx3pmhk2p6j" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1621, - "startIndex": 1620, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1562 - }, - { - "endIndex": 1665, - "paragraph": { - "elements": [ - { - "endIndex": 1664, - "startIndex": 1621, - "textRun": { - "content": "../window_to_front/lib/window_to_front.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.256mq4cjvaas" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1665, - "startIndex": 1664, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1621 - }, - { - "endIndex": 1682, - "paragraph": { - "elements": [ - { - "endIndex": 1681, - "startIndex": 1665, - "textRun": { - "content": "Add dependencies", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.taqgmwcoaqg" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1682, - "startIndex": 1681, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1665 - }, - { - "endIndex": 1716, - "paragraph": { - "elements": [ - { - "endIndex": 1715, - "startIndex": 1682, - "textRun": { - "content": "Put it all together, again, again", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.tvwf13ue5p6g" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1716, - "startIndex": 1715, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1682 - }, - { - "endIndex": 1730, - "paragraph": { - "elements": [ - { - "endIndex": 1729, - "startIndex": 1716, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.5mn7f99pbudx" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1730, - "startIndex": 1729, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1716 - }, - { - "endIndex": 1788, - "paragraph": { - "elements": [ - { - "endIndex": 1787, - "startIndex": 1730, - "textRun": { - "content": "View the repositories, pull requests, and assigned issues", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.6cpjfqrfbd6s" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1788, - "startIndex": 1787, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1730 - }, - { - "endIndex": 1812, - "paragraph": { - "elements": [ - { - "endIndex": 1811, - "startIndex": 1788, - "textRun": { - "content": "Add one last dependency", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.1f8fwhfw59th" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1812, - "startIndex": 1811, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1788 - }, - { - "endIndex": 1852, - "paragraph": { - "elements": [ - { - "endIndex": 1851, - "startIndex": 1812, - "textRun": { - "content": "Widgets to render the results to screen", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.mix5jm9qpba1" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1852, - "startIndex": 1851, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1812 - }, - { - "endIndex": 1880, - "paragraph": { - "elements": [ - { - "endIndex": 1879, - "startIndex": 1852, - "textRun": { - "content": "lib/src/github_summary.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.1nmaf3332ru1" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1880, - "startIndex": 1879, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1852 - }, - { - "endIndex": 1915, - "paragraph": { - "elements": [ - { - "endIndex": 1914, - "startIndex": 1880, - "textRun": { - "content": "Put it all together, one last time", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.y5j48x6wjjvw" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1915, - "startIndex": 1914, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1880 - }, - { - "endIndex": 1929, - "paragraph": { - "elements": [ - { - "endIndex": 1928, - "startIndex": 1915, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.e4zstb7o43sr" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1929, - "startIndex": 1928, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1915 - }, - { - "endIndex": 1940, - "paragraph": { - "elements": [ - { - "endIndex": 1939, - "startIndex": 1929, - "textRun": { - "content": "Next steps", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.wyjmgdlwi2kp" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1940, - "startIndex": 1939, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1929 - } - ] - } - }, - { - "endIndex": 1942, - "paragraph": { - "elements": [ - { - "endIndex": 1942, - "startIndex": 1941, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1941 - }, - { - "endIndex": 1944, - "paragraph": { - "elements": [ - { - "endIndex": 1943, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 1942 - }, - { - "endIndex": 1944, - "startIndex": 1943, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1942 - }, - { - "endIndex": 1945, - "paragraph": { - "elements": [ - { - "endIndex": 1945, - "startIndex": 1944, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Verdana", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1944 - }, - { - "endIndex": 1958, - "paragraph": { - "elements": [ - { - "endIndex": 1958, - "startIndex": 1945, - "textRun": { - "content": "Introduction\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ok7k5uux6", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1945 - }, - { - "endIndex": 1959, - "paragraph": { - "elements": [ - { - "endIndex": 1959, - "startIndex": 1958, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1958 - }, - { - "endIndex": 2435, - "paragraph": { - "elements": [ - { - "endIndex": 2098, - "startIndex": 1959, - "textRun": { - "content": "Flutter is Google's UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase. ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.5, - "unit": "PT" - } - } - } - }, - { - "endIndex": 2434, - "startIndex": 2098, - "textRun": { - "content": "In this codelab, you’ll build a Flutter desktop app that accesses GitHub APIs to retrieve your repositories, assigned issues, and pull requests. In accomplishing this task, you’ll create and use plugins to interact with native APIs and desktop applications, and use code generation to build type safe client libraries for GitHub's APIs.", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.21960784, - "green": 0.19607843, - "red": 0.14901961 - } - } - } - } - } - }, - { - "endIndex": 2435, - "startIndex": 2434, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1959 - }, - { - "endIndex": 2453, - "paragraph": { - "elements": [ - { - "endIndex": 2453, - "startIndex": 2435, - "textRun": { - "content": "What you’ll learn\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.kjcmdnw2uhw0", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 2435 - }, - { - "endIndex": 2454, - "paragraph": { - "elements": [ - { - "endIndex": 2454, - "startIndex": 2453, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2453 - }, - { - "endIndex": 2498, - "paragraph": { - "bullet": { - "listId": "kix.qx7bo6w9dag0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2498, - "startIndex": 2454, - "textRun": { - "content": "How to create a Flutter desktop application\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2454 - }, - { - "endIndex": 2542, - "paragraph": { - "bullet": { - "listId": "kix.qx7bo6w9dag0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2542, - "startIndex": 2498, - "textRun": { - "content": "How to authenticate using OAuth2 on desktop\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2498 - }, - { - "endIndex": 2577, - "paragraph": { - "bullet": { - "listId": "kix.qx7bo6w9dag0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2577, - "startIndex": 2542, - "textRun": { - "content": "How to use the Dart GitHub package\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2542 - }, - { - "endIndex": 2638, - "paragraph": { - "bullet": { - "listId": "kix.qx7bo6w9dag0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2637, - "startIndex": 2577, - "textRun": { - "content": "How to create a Flutter plugin to integrate with native APIs", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2638, - "startIndex": 2637, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2577 - }, - { - "endIndex": 2656, - "paragraph": { - "elements": [ - { - "endIndex": 2646, - "startIndex": 2638, - "textRun": { - "content": "What you", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 2649, - "startIndex": 2646, - "textRun": { - "content": "’ll", - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 2655, - "startIndex": 2649, - "textRun": { - "content": " build", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 2656, - "startIndex": 2655, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - } - } - }, - "startIndex": 2638 - }, - { - "endIndex": 2799, - "paragraph": { - "elements": [ - { - "endIndex": 2799, - "startIndex": 2656, - "textRun": { - "content": "In this codelab, you’ll build a desktop application featuring a GitHub integration using the Flutter SDK. Your app will perform the following:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - } - } - }, - "startIndex": 2656 - }, - { - "endIndex": 2823, - "paragraph": { - "bullet": { - "listId": "kix.k0g7fgw2pxb9", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2823, - "startIndex": 2799, - "textRun": { - "content": "Authenticate to GitHub \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2799 - }, - { - "endIndex": 2849, - "paragraph": { - "bullet": { - "listId": "kix.k0g7fgw2pxb9", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2849, - "startIndex": 2823, - "textRun": { - "content": "Retrieve data from GitHub\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2823 - }, - { - "endIndex": 2906, - "paragraph": { - "bullet": { - "listId": "kix.k0g7fgw2pxb9", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2906, - "startIndex": 2849, - "textRun": { - "content": "Create a Flutter plugin for Windows, macOS, and/or Linux\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2849 - }, - { - "endIndex": 2975, - "paragraph": { - "bullet": { - "listId": "kix.k0g7fgw2pxb9", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 2974, - "startIndex": 2906, - "textRun": { - "content": "Develop a Flutter UI hot reloading into a native desktop application", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2975, - "startIndex": 2974, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2906 - }, - { - "endIndex": 2976, - "paragraph": { - "elements": [ - { - "endIndex": 2976, - "startIndex": 2975, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2975 - }, - { - "endIndex": 3065, - "paragraph": { - "elements": [ - { - "endIndex": 3065, - "startIndex": 2976, - "textRun": { - "content": "Here is a screenshot of the desktop application that you will build, running on Windows.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2976 - }, - { - "endIndex": 3066, - "paragraph": { - "elements": [ - { - "endIndex": 3066, - "startIndex": 3065, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3065 - }, - { - "endIndex": 3068, - "paragraph": { - "elements": [ - { - "endIndex": 3067, - "inlineObjectElement": { - "inlineObjectId": "kix.2jbn21auh2tu", - "textStyle": {} - }, - "startIndex": 3066 - }, - { - "endIndex": 3068, - "startIndex": 3067, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3066 - }, - { - "endIndex": 3069, - "paragraph": { - "elements": [ - { - "endIndex": 3069, - "startIndex": 3068, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3068 - }, - { - "endIndex": 3271, - "paragraph": { - "elements": [ - { - "endIndex": 3271, - "startIndex": 3069, - "textRun": { - "content": "This codelab focuses on adding OAuth2 and GitHub access capabilities to a Flutter desktop app. Non-relevant concepts and code blocks are glossed over, and are provided for you to simply copy and paste.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 115.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 3069 - }, - { - "endIndex": 3272, - "paragraph": { - "elements": [ - { - "endIndex": 3272, - "startIndex": 3271, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 115.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3271 - }, - { - "endIndex": 3538, - "startIndex": 3272, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 3537, - "startIndex": 3273, - "tableCells": [ - { - "content": [ - { - "endIndex": 3323, - "paragraph": { - "elements": [ - { - "endIndex": 3323, - "startIndex": 3275, - "textRun": { - "content": "What would you like to learn from this codelab?\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.b7nxsg514qu3", - "namedStyleType": "HEADING_4", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 14.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - } - }, - "startIndex": 3275 - }, - { - "endIndex": 3373, - "paragraph": { - "bullet": { - "listId": "kix.lwtrs6k81vg0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3373, - "startIndex": 3323, - "textRun": { - "content": "I'm new to the topic, and I want a good overview.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3323 - }, - { - "endIndex": 3432, - "paragraph": { - "bullet": { - "listId": "kix.lwtrs6k81vg0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3432, - "startIndex": 3373, - "textRun": { - "content": "I know something about this topic, but I want a refresher.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3373 - }, - { - "endIndex": 3483, - "paragraph": { - "bullet": { - "listId": "kix.lwtrs6k81vg0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3483, - "startIndex": 3432, - "textRun": { - "content": "I'm looking for example code to use in my project.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3432 - }, - { - "endIndex": 3537, - "paragraph": { - "bullet": { - "listId": "kix.lwtrs6k81vg0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3537, - "startIndex": 3483, - "textRun": { - "content": "I'm looking for an explanation of something specific.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3483 - } - ], - "endIndex": 3537, - "startIndex": 3274, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.8862745, - "red": 0.8117647 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 3539, - "paragraph": { - "elements": [ - { - "endIndex": 3539, - "startIndex": 3538, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 3538 - }, - { - "endIndex": 3541, - "paragraph": { - "elements": [ - { - "endIndex": 3540, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 3539 - }, - { - "endIndex": 3541, - "startIndex": 3540, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 3539 - }, - { - "endIndex": 3586, - "paragraph": { - "elements": [ - { - "endIndex": 3586, - "startIndex": 3541, - "textRun": { - "content": "Set up your Flutter development environment \n", - "textStyle": { - "fontSize": { - "magnitude": 20.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.m0ycdyje7e1p", - "namedStyleType": "HEADING_1", - "spaceAbove": { - "magnitude": 20.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6.0, - "unit": "PT" - } - } - }, - "startIndex": 3541 - }, - { - "endIndex": 3602, - "paragraph": { - "elements": [ - { - "endIndex": 3602, - "startIndex": 3586, - "textRun": { - "content": "Duration: 10:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3586 - }, - { - "endIndex": 3619, - "paragraph": { - "elements": [ - { - "endIndex": 3619, - "startIndex": 3602, - "textRun": { - "content": "Environment: web\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3602 - }, - { - "endIndex": 3620, - "paragraph": { - "elements": [ - { - "endIndex": 3620, - "startIndex": 3619, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3619 - }, - { - "endIndex": 3770, - "paragraph": { - "elements": [ - { - "endIndex": 3679, - "startIndex": 3620, - "textRun": { - "content": "You need three pieces of software to complete this lab—the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3690, - "startIndex": 3679, - "textRun": { - "content": "Flutter SDK", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/install" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3691, - "startIndex": 3690, - "textRun": { - "content": ",", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3692, - "startIndex": 3691, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3701, - "startIndex": 3692, - "textRun": { - "content": "an editor", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/editor" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3769, - "startIndex": 3701, - "textRun": { - "content": ", and the appropriate build chain for your desktop operating system.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3770, - "startIndex": 3769, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3620 - }, - { - "endIndex": 3771, - "paragraph": { - "elements": [ - { - "endIndex": 3771, - "startIndex": 3770, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3770 - }, - { - "endIndex": 4141, - "paragraph": { - "elements": [ - { - "endIndex": 3800, - "startIndex": 3771, - "textRun": { - "content": "You can run the codelab as a ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3807, - "startIndex": 3800, - "textRun": { - "content": "Windows", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/install/windows#windows-setup" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3809, - "startIndex": 3807, - "textRun": { - "content": ", ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3814, - "startIndex": 3809, - "textRun": { - "content": "Linux", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/install/linux#linux-setup" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3819, - "startIndex": 3814, - "textRun": { - "content": ", or ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3824, - "startIndex": 3819, - "textRun": { - "content": "macOS", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/install/macos#macos-setup" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 4115, - "startIndex": 3824, - "textRun": { - "content": " desktop application. For Flutter on desktop, must develop on the platform where you plan to deploy. So, if you want to develop a Windows desktop app, you must develop on Windows to access the appropriate build chain. The operating system-specific requirements that are covered in detail on ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 4139, - "startIndex": 4115, - "textRun": { - "content": "docs.flutter.dev/desktop", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/desktop" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 4141, - "startIndex": 4139, - "textRun": { - "content": ".\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3771 - }, - { - "endIndex": 4142, - "paragraph": { - "elements": [ - { - "endIndex": 4142, - "startIndex": 4141, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4141 - }, - { - "endIndex": 4143, - "paragraph": { - "elements": [ - { - "endIndex": 4143, - "startIndex": 4142, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4142 - }, - { - "endIndex": 4155, - "paragraph": { - "elements": [ - { - "endIndex": 4155, - "startIndex": 4143, - "textRun": { - "content": "Get started\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.bwo0af2iwk90", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4143 - }, - { - "endIndex": 4170, - "paragraph": { - "elements": [ - { - "endIndex": 4169, - "startIndex": 4155, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 4170, - "startIndex": 4169, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4155 - }, - { - "endIndex": 4171, - "paragraph": { - "elements": [ - { - "endIndex": 4171, - "startIndex": 4170, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4170 - }, - { - "endIndex": 4228, - "paragraph": { - "elements": [ - { - "endIndex": 4228, - "startIndex": 4171, - "textRun": { - "content": "Get started developing desktop applications with Flutter\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.sflrq0mndtt9", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4171 - }, - { - "endIndex": 4229, - "paragraph": { - "elements": [ - { - "endIndex": 4229, - "startIndex": 4228, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4228 - }, - { - "endIndex": 4304, - "paragraph": { - "elements": [ - { - "endIndex": 4304, - "startIndex": 4229, - "textRun": { - "content": "To confirm that Flutter for desktop is enabled, run the following command.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4229 - }, - { - "endIndex": 4305, - "paragraph": { - "elements": [ - { - "endIndex": 4305, - "startIndex": 4304, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4304 - }, - { - "endIndex": 4577, - "startIndex": 4305, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4576, - "startIndex": 4306, - "tableCells": [ - { - "content": [ - { - "endIndex": 4326, - "paragraph": { - "elements": [ - { - "endIndex": 4326, - "startIndex": 4308, - "textRun": { - "content": "$ flutter devices\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4308 - }, - { - "endIndex": 4346, - "paragraph": { - "elements": [ - { - "endIndex": 4346, - "startIndex": 4326, - "textRun": { - "content": "1 connected device:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4326 - }, - { - "endIndex": 4347, - "paragraph": { - "elements": [ - { - "endIndex": 4347, - "startIndex": 4346, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4346 - }, - { - "endIndex": 4440, - "paragraph": { - "elements": [ - { - "endIndex": 4440, - "startIndex": 4347, - "textRun": { - "content": "Windows (desktop) • windows • windows-x64 • Microsoft Windows [Version 10.0.19041.508]\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4347 - }, - { - "endIndex": 4520, - "paragraph": { - "elements": [ - { - "endIndex": 4520, - "startIndex": 4440, - "textRun": { - "content": "macOS (desktop) • macos • darwin-x64 • macOS 11.2.3 20D91 darwin-x64\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4440 - }, - { - "endIndex": 4576, - "paragraph": { - "elements": [ - { - "endIndex": 4576, - "startIndex": 4520, - "textRun": { - "content": "Linux (desktop) • linux • linux-x64 • Linux\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4520 - } - ], - "endIndex": 4576, - "startIndex": 4307, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4578, - "paragraph": { - "elements": [ - { - "endIndex": 4578, - "startIndex": 4577, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4577 - }, - { - "endIndex": 4680, - "paragraph": { - "elements": [ - { - "endIndex": 4680, - "startIndex": 4578, - "textRun": { - "content": "If you do not see the appropriate desktop line shown in the preceding output, consider the following:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4578 - }, - { - "endIndex": 4681, - "paragraph": { - "elements": [ - { - "endIndex": 4681, - "startIndex": 4680, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4680 - }, - { - "endIndex": 4741, - "paragraph": { - "bullet": { - "listId": "kix.qztvdbrb1co7", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 4741, - "startIndex": 4681, - "textRun": { - "content": "Are you developing on the platform you are developing for? \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4681 - }, - { - "endIndex": 4846, - "paragraph": { - "bullet": { - "listId": "kix.qztvdbrb1co7", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 4846, - "startIndex": 4741, - "textRun": { - "content": "Are you using Flutter 3? Prior to Flutter 3, you had to specifically enable desktop for macOS and Linux.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4741 - }, - { - "endIndex": 4847, - "paragraph": { - "elements": [ - { - "endIndex": 4847, - "startIndex": 4846, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4846 - }, - { - "endIndex": 4977, - "paragraph": { - "elements": [ - { - "endIndex": 4977, - "startIndex": 4847, - "textRun": { - "content": "An easy way to get started writing Flutter for desktop apps is to use the Flutter command-line tool to create a Flutter project. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4847 - }, - { - "endIndex": 4978, - "paragraph": { - "elements": [ - { - "endIndex": 4978, - "startIndex": 4977, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4977 - }, - { - "endIndex": 5556, - "startIndex": 4978, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 5555, - "startIndex": 4979, - "tableCells": [ - { - "content": [ - { - "endIndex": 5044, - "paragraph": { - "elements": [ - { - "endIndex": 5044, - "startIndex": 4981, - "textRun": { - "content": "$ flutter create github_client --platforms=windows,macos,linux\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4981 - }, - { - "endIndex": 5078, - "paragraph": { - "elements": [ - { - "endIndex": 5078, - "startIndex": 5044, - "textRun": { - "content": "Creating project github_client...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5044 - }, - { - "endIndex": 5128, - "paragraph": { - "elements": [ - { - "endIndex": 5128, - "startIndex": 5078, - "textRun": { - "content": "Resolving dependencies in github_client... (1.4s)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5078 - }, - { - "endIndex": 5163, - "paragraph": { - "elements": [ - { - "endIndex": 5163, - "startIndex": 5128, - "textRun": { - "content": "Got dependencies in github_client.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5128 - }, - { - "endIndex": 5179, - "paragraph": { - "elements": [ - { - "endIndex": 5179, - "startIndex": 5163, - "textRun": { - "content": "Wrote 60 files.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5163 - }, - { - "endIndex": 5180, - "paragraph": { - "elements": [ - { - "endIndex": 5180, - "startIndex": 5179, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5179 - }, - { - "endIndex": 5190, - "paragraph": { - "elements": [ - { - "endIndex": 5190, - "startIndex": 5180, - "textRun": { - "content": "All done!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5180 - }, - { - "endIndex": 5267, - "paragraph": { - "elements": [ - { - "endIndex": 5267, - "startIndex": 5190, - "textRun": { - "content": "You can find general documentation for Flutter at: https://docs.flutter.dev/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5190 - }, - { - "endIndex": 5336, - "paragraph": { - "elements": [ - { - "endIndex": 5336, - "startIndex": 5267, - "textRun": { - "content": "Detailed API documentation is available at: https://api.flutter.dev/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5267 - }, - { - "endIndex": 5418, - "paragraph": { - "elements": [ - { - "endIndex": 5418, - "startIndex": 5336, - "textRun": { - "content": "If you prefer video documentation, consider: https://www.youtube.com/c/flutterdev\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5336 - }, - { - "endIndex": 5419, - "paragraph": { - "elements": [ - { - "endIndex": 5419, - "startIndex": 5418, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5418 - }, - { - "endIndex": 5459, - "paragraph": { - "elements": [ - { - "endIndex": 5459, - "startIndex": 5419, - "textRun": { - "content": "In order to run your application, type:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5419 - }, - { - "endIndex": 5460, - "paragraph": { - "elements": [ - { - "endIndex": 5460, - "startIndex": 5459, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5459 - }, - { - "endIndex": 5481, - "paragraph": { - "elements": [ - { - "endIndex": 5481, - "startIndex": 5460, - "textRun": { - "content": " $ cd github_client\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5460 - }, - { - "endIndex": 5497, - "paragraph": { - "elements": [ - { - "endIndex": 5497, - "startIndex": 5481, - "textRun": { - "content": " $ flutter run\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5481 - }, - { - "endIndex": 5498, - "paragraph": { - "elements": [ - { - "endIndex": 5498, - "startIndex": 5497, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5497 - }, - { - "endIndex": 5555, - "paragraph": { - "elements": [ - { - "endIndex": 5555, - "startIndex": 5498, - "textRun": { - "content": "Your application code is in github_client/lib/main.dart.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5498 - } - ], - "endIndex": 5555, - "startIndex": 4980, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 5557, - "paragraph": { - "elements": [ - { - "endIndex": 5557, - "startIndex": 5556, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5556 - }, - { - "endIndex": 5863, - "paragraph": { - "elements": [ - { - "endIndex": 5863, - "startIndex": 5557, - "textRun": { - "content": "To make sure everything is working, run the boilerplate Flutter application as a desktop application as shown below. Alternatively, open this project in your IDE, and use its tooling to run the application. Thanks to the previous step, running as a desktop application should be the only available option.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5557 - }, - { - "endIndex": 5864, - "paragraph": { - "elements": [ - { - "endIndex": 5864, - "startIndex": 5863, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5863 - }, - { - "endIndex": 6555, - "startIndex": 5864, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 6554, - "startIndex": 5865, - "tableCells": [ - { - "content": [ - { - "endIndex": 5881, - "paragraph": { - "elements": [ - { - "endIndex": 5881, - "startIndex": 5867, - "textRun": { - "content": "$ flutter run\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5867 - }, - { - "endIndex": 5933, - "paragraph": { - "elements": [ - { - "endIndex": 5933, - "startIndex": 5881, - "textRun": { - "content": "Launching lib\\main.dart on Windows in debug mode...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5881 - }, - { - "endIndex": 5965, - "paragraph": { - "elements": [ - { - "endIndex": 5965, - "startIndex": 5933, - "textRun": { - "content": "Building Windows application...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5933 - }, - { - "endIndex": 6038, - "paragraph": { - "elements": [ - { - "endIndex": 6038, - "startIndex": 5965, - "textRun": { - "content": "Syncing files to device Windows... 56ms\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5965 - }, - { - "endIndex": 6039, - "paragraph": { - "elements": [ - { - "endIndex": 6039, - "startIndex": 6038, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6038 - }, - { - "endIndex": 6065, - "paragraph": { - "elements": [ - { - "endIndex": 6065, - "startIndex": 6039, - "textRun": { - "content": "Flutter run key commands.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6039 - }, - { - "endIndex": 6086, - "paragraph": { - "elements": [ - { - "endIndex": 6086, - "startIndex": 6065, - "textRun": { - "content": "r Hot reload. 🔥🔥🔥\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6065 - }, - { - "endIndex": 6101, - "paragraph": { - "elements": [ - { - "endIndex": 6101, - "startIndex": 6086, - "textRun": { - "content": "R Hot restart.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6086 - }, - { - "endIndex": 6144, - "paragraph": { - "elements": [ - { - "endIndex": 6144, - "startIndex": 6101, - "textRun": { - "content": "h List all available interactive commands.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6101 - }, - { - "endIndex": 6210, - "paragraph": { - "elements": [ - { - "endIndex": 6210, - "startIndex": 6144, - "textRun": { - "content": "d Detach (terminate \"flutter run\" but leave application running).\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6144 - }, - { - "endIndex": 6229, - "paragraph": { - "elements": [ - { - "endIndex": 6229, - "startIndex": 6210, - "textRun": { - "content": "c Clear the screen\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6210 - }, - { - "endIndex": 6279, - "paragraph": { - "elements": [ - { - "endIndex": 6279, - "startIndex": 6229, - "textRun": { - "content": "q Quit (terminate the application on the device).\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6229 - }, - { - "endIndex": 6280, - "paragraph": { - "elements": [ - { - "endIndex": 6280, - "startIndex": 6279, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6279 - }, - { - "endIndex": 6317, - "paragraph": { - "elements": [ - { - "endIndex": 6317, - "startIndex": 6280, - "textRun": { - "content": "💪 Running with sound null safety 💪\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6280 - }, - { - "endIndex": 6318, - "paragraph": { - "elements": [ - { - "endIndex": 6318, - "startIndex": 6317, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6317 - }, - { - "endIndex": 6420, - "paragraph": { - "elements": [ - { - "endIndex": 6420, - "startIndex": 6318, - "textRun": { - "content": "An Observatory debugger and profiler on Windows is available at: http://127.0.0.1:61920/OHTnly7_TMk=/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6318 - }, - { - "endIndex": 6554, - "paragraph": { - "elements": [ - { - "endIndex": 6554, - "startIndex": 6420, - "textRun": { - "content": "The Flutter DevTools debugger and profiler on Windows is available at: http://127.0.0.1:9101?uri=http://127.0.0.1:61920/OHTnly7_TMk=/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6420 - } - ], - "endIndex": 6554, - "startIndex": 5866, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6556, - "paragraph": { - "elements": [ - { - "endIndex": 6556, - "startIndex": 6555, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6555 - }, - { - "endIndex": 6858, - "paragraph": { - "elements": [ - { - "endIndex": 6799, - "startIndex": 6556, - "textRun": { - "content": "You should now see the following application window on your screen. Go ahead and click the floating action button to make sure that the incrementer works as expected. You can also try hot reload by changing the theme color by or altering the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 6807, - "startIndex": 6799, - "textRun": { - "content": "behavior", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 6814, - "startIndex": 6807, - "textRun": { - "content": " of the", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 6815, - "startIndex": 6814, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 6832, - "startIndex": 6815, - "textRun": { - "content": "_incrementCounter", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6833, - "startIndex": 6832, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 6842, - "startIndex": 6833, - "textRun": { - "content": "method in", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 6843, - "startIndex": 6842, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 6856, - "startIndex": 6843, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6858, - "startIndex": 6856, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6556 - }, - { - "endIndex": 6859, - "paragraph": { - "elements": [ - { - "endIndex": 6859, - "startIndex": 6858, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6858 - }, - { - "endIndex": 6903, - "paragraph": { - "elements": [ - { - "endIndex": 6894, - "startIndex": 6859, - "textRun": { - "content": "Here is the application running on ", - "textStyle": {} - } - }, - { - "endIndex": 6903, - "startIndex": 6894, - "textRun": { - "content": "Windows.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6859 - }, - { - "endIndex": 6904, - "paragraph": { - "elements": [ - { - "endIndex": 6904, - "startIndex": 6903, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6903 - }, - { - "endIndex": 6906, - "paragraph": { - "elements": [ - { - "endIndex": 6905, - "inlineObjectElement": { - "inlineObjectId": "kix.dsz4kv8xlc1j", - "textStyle": {} - }, - "startIndex": 6904 - }, - { - "endIndex": 6906, - "startIndex": 6905, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6904 - }, - { - "endIndex": 6907, - "paragraph": { - "elements": [ - { - "endIndex": 6907, - "startIndex": 6906, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6906 - }, - { - "endIndex": 6971, - "paragraph": { - "elements": [ - { - "endIndex": 6970, - "startIndex": 6907, - "textRun": { - "content": "In the next section you’ll authenticate on GitHub using OAuth2.", - "textStyle": {} - } - }, - { - "endIndex": 6971, - "startIndex": 6970, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6907 - }, - { - "endIndex": 6990, - "paragraph": { - "elements": [ - { - "endIndex": 6990, - "startIndex": 6971, - "textRun": { - "content": "Add authentication\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.btmxwf909kks", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 6971 - }, - { - "endIndex": 7006, - "paragraph": { - "elements": [ - { - "endIndex": 7005, - "startIndex": 6990, - "textRun": { - "content": "Duration: 10:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7006, - "startIndex": 7005, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6990 - }, - { - "endIndex": 7030, - "paragraph": { - "elements": [ - { - "endIndex": 7030, - "startIndex": 7006, - "textRun": { - "content": "Authenticate on desktop\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.en66mhmr1ijb", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 7006 - }, - { - "endIndex": 7350, - "paragraph": { - "elements": [ - { - "endIndex": 7089, - "startIndex": 7030, - "textRun": { - "content": "If you use Flutter on Android, iOS, or the web, you have a ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7108, - "startIndex": 7089, - "textRun": { - "content": "plethora of options", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages?q=authentication" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7223, - "startIndex": 7108, - "textRun": { - "content": " with regard to authentication packages. Developing for desktop, however, changes the equation. Currently, you must", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7224, - "startIndex": 7223, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 7350, - "startIndex": 7224, - "textRun": { - "content": "build authentication integration from scratch, but this will change as package authors implement Flutter for desktop support.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7030 - }, - { - "endIndex": 7386, - "paragraph": { - "elements": [ - { - "endIndex": 7386, - "startIndex": 7350, - "textRun": { - "content": "Register a GitHub OAuth application\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7vqm6x19piv6", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 7350 - }, - { - "endIndex": 7716, - "paragraph": { - "elements": [ - { - "endIndex": 7716, - "startIndex": 7386, - "textRun": { - "content": "To build a desktop application that uses GitHub’s APIs, first you need to authenticate. There are multiple options available, but the best user experience is to direct the user through GitHub’s OAuth2 login flow in their browser. This enables handling of two-factor authentication and effortless integration of password managers.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7386 - }, - { - "endIndex": 7717, - "paragraph": { - "elements": [ - { - "endIndex": 7717, - "startIndex": 7716, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7716 - }, - { - "endIndex": 7983, - "paragraph": { - "elements": [ - { - "endIndex": 7778, - "startIndex": 7717, - "textRun": { - "content": "To register an application for GitHub’s OAuth2 flow, surf to ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7788, - "startIndex": 7778, - "textRun": { - "content": "github.com", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7852, - "startIndex": 7788, - "textRun": { - "content": " and follow the instructions in only the first step of GitHub’s ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7871, - "startIndex": 7852, - "textRun": { - "content": "Building OAuth Apps", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.github.com/en/developers/apps/building-oauth-apps" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7980, - "startIndex": 7871, - "textRun": { - "content": ". The following steps are important for when you have an application to launch, but not while doing a codelab", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7983, - "startIndex": 7980, - "textRun": { - "content": ". \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7717 - }, - { - "endIndex": 7984, - "paragraph": { - "elements": [ - { - "endIndex": 7984, - "startIndex": 7983, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7983 - }, - { - "endIndex": 7985, - "paragraph": { - "elements": [ - { - "endIndex": 7985, - "startIndex": 7984, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7984 - }, - { - "endIndex": 8045, - "startIndex": 7985, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 8044, - "startIndex": 7986, - "tableCells": [ - { - "content": [ - { - "endIndex": 8044, - "paragraph": { - "elements": [ - { - "endIndex": 7998, - "startIndex": 7988, - "textRun": { - "content": "Important:", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.13333334, - "green": 0.13333334, - "red": 0.13333334 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8015, - "startIndex": 7998, - "textRun": { - "content": " Create a GitHub ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.13333334, - "green": 0.13333334, - "red": 0.13333334 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8024, - "startIndex": 8015, - "textRun": { - "content": "OAuth app", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "bold": true, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.13333334, - "green": 0.13333334, - "red": 0.13333334 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8043, - "startIndex": 8024, - "textRun": { - "content": ", not a GitHub app.", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.13333334, - "green": 0.13333334, - "red": 0.13333334 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8044, - "startIndex": 8043, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7988 - } - ], - "endIndex": 8044, - "startIndex": 7987, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.8039216, - "green": 0.8980392, - "red": 0.9882353 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 8046, - "paragraph": { - "elements": [ - { - "endIndex": 8046, - "startIndex": 8045, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8045 - }, - { - "endIndex": 8047, - "paragraph": { - "elements": [ - { - "endIndex": 8047, - "startIndex": 8046, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8046 - }, - { - "endIndex": 8481, - "paragraph": { - "elements": [ - { - "endIndex": 8061, - "startIndex": 8047, - "textRun": { - "content": "In completing ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8082, - "startIndex": 8061, - "textRun": { - "content": "Creating an OAuth App", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.github.com/en/developers/apps/creating-an-oauth-app" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8168, - "startIndex": 8082, - "textRun": { - "content": ", Step 8 asks you to provide the Authorization callback URL. For a desktop app, enter ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8185, - "startIndex": 8168, - "textRun": { - "content": "http://localhost/", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "http://localhost/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8205, - "startIndex": 8185, - "textRun": { - "content": " as the callback URL", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8206, - "startIndex": 8205, - "textRun": { - "content": ".", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8481, - "startIndex": 8206, - "textRun": { - "content": " GitHub’s OAuth2 flow was set up such that defining a localhost callback URL allows any port, enabling you to stand up a web server on an ephemeral local high port. This avoids asking the user to copy the OAuth code token into the application as part of the OAuth process..\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8047 - }, - { - "endIndex": 8482, - "paragraph": { - "elements": [ - { - "endIndex": 8482, - "startIndex": 8481, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8481 - }, - { - "endIndex": 8579, - "paragraph": { - "elements": [ - { - "endIndex": 8579, - "startIndex": 8482, - "textRun": { - "content": "Here’s an example screenshot of how to fill in the form for creating a GitHub OAuth application:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8482 - }, - { - "endIndex": 8581, - "paragraph": { - "elements": [ - { - "endIndex": 8580, - "inlineObjectElement": { - "inlineObjectId": "kix.wd9z5m1h3mib", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "startIndex": 8579 - }, - { - "endIndex": 8581, - "startIndex": 8580, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8579 - }, - { - "endIndex": 8582, - "paragraph": { - "elements": [ - { - "endIndex": 8582, - "startIndex": 8581, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8581 - }, - { - "endIndex": 8583, - "paragraph": { - "elements": [ - { - "endIndex": 8583, - "startIndex": 8582, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8582 - }, - { - "endIndex": 9040, - "paragraph": { - "elements": [ - { - "endIndex": 8664, - "startIndex": 8583, - "textRun": { - "content": "After you register an OAuth app in the GitHub admin interface you will receive a ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8673, - "startIndex": 8664, - "textRun": { - "content": "client ID", - "textStyle": { - "italic": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8680, - "startIndex": 8673, - "textRun": { - "content": " and a ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8693, - "startIndex": 8680, - "textRun": { - "content": "client secret", - "textStyle": { - "italic": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8742, - "startIndex": 8693, - "textRun": { - "content": ". If you need these values at a later time, you c", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8764, - "startIndex": 8742, - "textRun": { - "content": "an retrieve them from ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8791, - "startIndex": 8764, - "textRun": { - "content": "GitHub's developer settings", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/settings/developers" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8792, - "startIndex": 8791, - "textRun": { - "content": ".", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8913, - "startIndex": 8792, - "textRun": { - "content": " You need these credentials in your application in order to construct a valid OAuth2 authorization URL. You will use the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8919, - "startIndex": 8913, - "textRun": { - "content": "oauth2", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/oauth2" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8968, - "startIndex": 8919, - "textRun": { - "content": " Dart package to handle the OAuth2 flow, and the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 8980, - "startIndex": 8968, - "textRun": { - "content": "url_launcher", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/url_launcher" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8981, - "startIndex": 8980, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 9040, - "startIndex": 8981, - "textRun": { - "content": "Flutter plugin to enable launching the user’s web browser.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8583 - }, - { - "endIndex": 9085, - "paragraph": { - "elements": [ - { - "endIndex": 9083, - "startIndex": 9040, - "textRun": { - "content": "Add oauth2 and url_launcher to pubspec.yaml", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 9085, - "startIndex": 9083, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.q0rhufo5z2t7", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 9040 - }, - { - "endIndex": 9174, - "paragraph": { - "elements": [ - { - "endIndex": 9089, - "startIndex": 9085, - "textRun": { - "content": "You ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 9146, - "startIndex": 9089, - "textRun": { - "content": "add package dependencies for your application by running ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 9161, - "startIndex": 9146, - "textRun": { - "content": "flutter pub add", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9174, - "startIndex": 9161, - "textRun": { - "content": " as follows:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9085 - }, - { - "endIndex": 9175, - "paragraph": { - "elements": [ - { - "endIndex": 9175, - "startIndex": 9174, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9174 - }, - { - "endIndex": 9787, - "startIndex": 9175, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 9786, - "startIndex": 9176, - "tableCells": [ - { - "content": [ - { - "endIndex": 9221, - "paragraph": { - "elements": [ - { - "endIndex": 9221, - "startIndex": 9178, - "textRun": { - "content": "$ flutter pub add http oauth2 url_launcher\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9178 - }, - { - "endIndex": 9248, - "paragraph": { - "elements": [ - { - "endIndex": 9248, - "startIndex": 9221, - "textRun": { - "content": "Resolving dependencies... \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9221 - }, - { - "endIndex": 9263, - "paragraph": { - "elements": [ - { - "endIndex": 9263, - "startIndex": 9248, - "textRun": { - "content": "+ crypto 3.0.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9248 - }, - { - "endIndex": 9308, - "paragraph": { - "elements": [ - { - "endIndex": 9308, - "startIndex": 9263, - "textRun": { - "content": "+ flutter_web_plugins 0.0.0 from sdk flutter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9263 - }, - { - "endIndex": 9322, - "paragraph": { - "elements": [ - { - "endIndex": 9322, - "startIndex": 9308, - "textRun": { - "content": "+ http 0.13.5\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9308 - }, - { - "endIndex": 9342, - "paragraph": { - "elements": [ - { - "endIndex": 9342, - "startIndex": 9322, - "textRun": { - "content": "+ http_parser 4.0.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9322 - }, - { - "endIndex": 9393, - "paragraph": { - "elements": [ - { - "endIndex": 9393, - "startIndex": 9342, - "textRun": { - "content": " material_color_utilities 0.2.0 (0.3.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9342 - }, - { - "endIndex": 9408, - "paragraph": { - "elements": [ - { - "endIndex": 9408, - "startIndex": 9393, - "textRun": { - "content": "+ oauth2 2.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9393 - }, - { - "endIndex": 9442, - "paragraph": { - "elements": [ - { - "endIndex": 9442, - "startIndex": 9408, - "textRun": { - "content": "+ plugin_platform_interface 2.1.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9408 - }, - { - "endIndex": 9481, - "paragraph": { - "elements": [ - { - "endIndex": 9481, - "startIndex": 9442, - "textRun": { - "content": " source_span 1.9.1 (1.10.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9442 - }, - { - "endIndex": 9516, - "paragraph": { - "elements": [ - { - "endIndex": 9516, - "startIndex": 9481, - "textRun": { - "content": " test_api 0.5.1 (0.5.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9481 - }, - { - "endIndex": 9535, - "paragraph": { - "elements": [ - { - "endIndex": 9535, - "startIndex": 9516, - "textRun": { - "content": "+ typed_data 1.3.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9516 - }, - { - "endIndex": 9557, - "paragraph": { - "elements": [ - { - "endIndex": 9557, - "startIndex": 9535, - "textRun": { - "content": "+ url_launcher 6.1.10\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9535 - }, - { - "endIndex": 9587, - "paragraph": { - "elements": [ - { - "endIndex": 9587, - "startIndex": 9557, - "textRun": { - "content": "+ url_launcher_android 6.0.31\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9557 - }, - { - "endIndex": 9612, - "paragraph": { - "elements": [ - { - "endIndex": 9612, - "startIndex": 9587, - "textRun": { - "content": "+ url_launcher_ios 6.1.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9587 - }, - { - "endIndex": 9639, - "paragraph": { - "elements": [ - { - "endIndex": 9639, - "startIndex": 9612, - "textRun": { - "content": "+ url_launcher_linux 3.0.5\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9612 - }, - { - "endIndex": 9666, - "paragraph": { - "elements": [ - { - "endIndex": 9666, - "startIndex": 9639, - "textRun": { - "content": "+ url_launcher_macos 3.0.5\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9639 - }, - { - "endIndex": 9706, - "paragraph": { - "elements": [ - { - "endIndex": 9706, - "startIndex": 9666, - "textRun": { - "content": "+ url_launcher_platform_interface 2.1.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9666 - }, - { - "endIndex": 9732, - "paragraph": { - "elements": [ - { - "endIndex": 9732, - "startIndex": 9706, - "textRun": { - "content": "+ url_launcher_web 2.0.16\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9706 - }, - { - "endIndex": 9761, - "paragraph": { - "elements": [ - { - "endIndex": 9761, - "startIndex": 9732, - "textRun": { - "content": "+ url_launcher_windows 3.0.6\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9732 - }, - { - "endIndex": 9786, - "paragraph": { - "elements": [ - { - "endIndex": 9785, - "startIndex": 9761, - "textRun": { - "content": "Changed 15 dependencies!", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 9786, - "startIndex": 9785, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9761 - } - ], - "endIndex": 9786, - "startIndex": 9177, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 9788, - "paragraph": { - "elements": [ - { - "endIndex": 9788, - "startIndex": 9787, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9787 - }, - { - "endIndex": 9808, - "paragraph": { - "elements": [ - { - "endIndex": 9808, - "startIndex": 9788, - "textRun": { - "content": "This command adds: \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9788 - }, - { - "endIndex": 9883, - "paragraph": { - "bullet": { - "listId": "kix.cicpotiggtwi", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 9812, - "startIndex": 9808, - "textRun": { - "content": "the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 9816, - "startIndex": 9812, - "textRun": { - "content": "http", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/http" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9883, - "startIndex": 9816, - "textRun": { - "content": " package for making HTTP calls in a cross platform consistent way,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9808 - }, - { - "endIndex": 9917, - "paragraph": { - "bullet": { - "listId": "kix.cicpotiggtwi", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 9887, - "startIndex": 9883, - "textRun": { - "content": "the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 9893, - "startIndex": 9887, - "textRun": { - "content": "oauth2", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/oauth2" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9917, - "startIndex": 9893, - "textRun": { - "content": " package for OAuth, and\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9883 - }, - { - "endIndex": 9943, - "paragraph": { - "bullet": { - "listId": "kix.cicpotiggtwi", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 9921, - "startIndex": 9917, - "textRun": { - "content": "the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 9933, - "startIndex": 9921, - "textRun": { - "content": "url_launcher", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/url_launcher" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9943, - "startIndex": 9933, - "textRun": { - "content": " package.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9917 - }, - { - "endIndex": 9944, - "paragraph": { - "elements": [ - { - "endIndex": 9944, - "startIndex": 9943, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9943 - }, - { - "endIndex": 10057, - "startIndex": 9944, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 10056, - "startIndex": 9945, - "tableCells": [ - { - "content": [ - { - "endIndex": 10056, - "paragraph": { - "elements": [ - { - "endIndex": 9951, - "startIndex": 9947, - "textRun": { - "content": "Tip:", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 10056, - "startIndex": 9951, - "textRun": { - "content": " Adding, or removing, package dependencies to an application requires a full restart of the application.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9947 - } - ], - "endIndex": 10056, - "startIndex": 9946, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 10058, - "paragraph": { - "elements": [ - { - "endIndex": 10058, - "startIndex": 10057, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10057 - }, - { - "endIndex": 10059, - "paragraph": { - "elements": [ - { - "endIndex": 10059, - "startIndex": 10058, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10058 - }, - { - "endIndex": 10086, - "paragraph": { - "elements": [ - { - "endIndex": 10086, - "startIndex": 10059, - "textRun": { - "content": "Include client credentials\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.8u59l9jgbnew", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 10059 - }, - { - "endIndex": 10171, - "paragraph": { - "elements": [ - { - "endIndex": 10123, - "startIndex": 10086, - "textRun": { - "content": "Add client credentials to a new file,", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 10124, - "startIndex": 10123, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 10157, - "startIndex": 10124, - "textRun": { - "content": "lib/github_oauth_credentials.dart", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10171, - "startIndex": 10157, - "textRun": { - "content": ", as follows:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10086 - }, - { - "endIndex": 10205, - "paragraph": { - "elements": [ - { - "endIndex": 10204, - "startIndex": 10171, - "textRun": { - "content": "lib/github_oauth_credentials.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/step_04/lib/github_oauth_credentials.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 10205, - "startIndex": 10204, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.htgwfkoywwur", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 10171 - }, - { - "endIndex": 10461, - "startIndex": 10205, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 10460, - "startIndex": 10206, - "tableCells": [ - { - "content": [ - { - "endIndex": 10250, - "paragraph": { - "elements": [ - { - "endIndex": 10250, - "startIndex": 10208, - "textRun": { - "content": "// TODO(CodelabUser): Create an OAuth App\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10208 - }, - { - "endIndex": 10303, - "paragraph": { - "elements": [ - { - "endIndex": 10303, - "startIndex": 10250, - "textRun": { - "content": "const githubClientId = 'YOUR_GITHUB_CLIENT_ID_HERE';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10250 - }, - { - "endIndex": 10364, - "paragraph": { - "elements": [ - { - "endIndex": 10364, - "startIndex": 10303, - "textRun": { - "content": "const githubClientSecret = 'YOUR_GITHUB_CLIENT_SECRET_HERE';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10303 - }, - { - "endIndex": 10365, - "paragraph": { - "elements": [ - { - "endIndex": 10365, - "startIndex": 10364, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10364 - }, - { - "endIndex": 10417, - "paragraph": { - "elements": [ - { - "endIndex": 10417, - "startIndex": 10365, - "textRun": { - "content": "// OAuth scopes for repository and user information\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10365 - }, - { - "endIndex": 10460, - "paragraph": { - "elements": [ - { - "endIndex": 10459, - "startIndex": 10417, - "textRun": { - "content": "const githubScopes = ['repo', 'read:org'];", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10460, - "startIndex": 10459, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10417 - } - ], - "endIndex": 10460, - "startIndex": 10207, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 10462, - "paragraph": { - "elements": [ - { - "endIndex": 10462, - "startIndex": 10461, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10461 - }, - { - "endIndex": 10540, - "paragraph": { - "elements": [ - { - "endIndex": 10540, - "startIndex": 10462, - "textRun": { - "content": "Copy and paste your client credentials from the previous step into this file.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10462 - }, - { - "endIndex": 10541, - "paragraph": { - "elements": [ - { - "endIndex": 10541, - "startIndex": 10540, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10540 - }, - { - "endIndex": 10571, - "paragraph": { - "elements": [ - { - "endIndex": 10571, - "startIndex": 10541, - "textRun": { - "content": "Build the desktop OAuth2 flow\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.2g3izc2yvji5", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 10541 - }, - { - "endIndex": 11016, - "paragraph": { - "elements": [ - { - "endIndex": 11016, - "startIndex": 10571, - "textRun": { - "content": "Build a widget to contain the desktop OAuth2 flow. This is a reasonably complicated chunk of logic, because you must run up a temporary web server, redirect the user to an endpoint on GitHub in their web browser, wait for the user to complete the authorization flow in their browser, and handle a redirect call from GitHub that contains code (which then needs to be converted into an OAuth2 token with a separate call to GitHub’s API servers). \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10571 - }, - { - "endIndex": 11017, - "paragraph": { - "elements": [ - { - "endIndex": 11017, - "startIndex": 11016, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11016 - }, - { - "endIndex": 11184, - "startIndex": 11017, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 11183, - "startIndex": 11018, - "tableCells": [ - { - "content": [ - { - "endIndex": 11183, - "paragraph": { - "elements": [ - { - "endIndex": 11025, - "startIndex": 11020, - "textRun": { - "content": "Tip: ", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 11092, - "startIndex": 11025, - "textRun": { - "content": "It’s good practice to place implementation-specific code under the ", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 11099, - "startIndex": 11092, - "textRun": { - "content": "lib/src", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11125, - "startIndex": 11099, - "textRun": { - "content": " directory. The top-level ", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 11128, - "startIndex": 11125, - "textRun": { - "content": "lib", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11182, - "startIndex": 11128, - "textRun": { - "content": " directory is for the external interface of a package.", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 11183, - "startIndex": 11182, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11020 - } - ], - "endIndex": 11183, - "startIndex": 11019, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 7.2, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 7.2, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 7.2, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 7.2, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "width": { - "magnitude": 397.5, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - } - ] - } - } - }, - { - "endIndex": 11185, - "paragraph": { - "elements": [ - { - "endIndex": 11185, - "startIndex": 11184, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11184 - }, - { - "endIndex": 11186, - "paragraph": { - "elements": [ - { - "endIndex": 11186, - "startIndex": 11185, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11185 - }, - { - "endIndex": 11212, - "paragraph": { - "elements": [ - { - "endIndex": 11211, - "startIndex": 11186, - "textRun": { - "content": "lib/src/github_login.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/step_04/lib/src/github_login.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 11212, - "startIndex": 11211, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.mxk36wiuic12", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 11186 - }, - { - "endIndex": 15058, - "startIndex": 11212, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 15057, - "startIndex": 11213, - "tableCells": [ - { - "content": [ - { - "endIndex": 11233, - "paragraph": { - "elements": [ - { - "endIndex": 11233, - "startIndex": 11215, - "textRun": { - "content": "import 'dart:io';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11215 - }, - { - "endIndex": 11234, - "paragraph": { - "elements": [ - { - "endIndex": 11234, - "startIndex": 11233, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11233 - }, - { - "endIndex": 11274, - "paragraph": { - "elements": [ - { - "endIndex": 11274, - "startIndex": 11234, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11234 - }, - { - "endIndex": 11315, - "paragraph": { - "elements": [ - { - "endIndex": 11315, - "startIndex": 11274, - "textRun": { - "content": "import 'package:http/http.dart' as http;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11274 - }, - { - "endIndex": 11362, - "paragraph": { - "elements": [ - { - "endIndex": 11362, - "startIndex": 11315, - "textRun": { - "content": "import 'package:oauth2/oauth2.dart' as oauth2;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11315 - }, - { - "endIndex": 11411, - "paragraph": { - "elements": [ - { - "endIndex": 11411, - "startIndex": 11362, - "textRun": { - "content": "import 'package:url_launcher/url_launcher.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11362 - }, - { - "endIndex": 11412, - "paragraph": { - "elements": [ - { - "endIndex": 11412, - "startIndex": 11411, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11411 - }, - { - "endIndex": 11443, - "paragraph": { - "elements": [ - { - "endIndex": 11443, - "startIndex": 11412, - "textRun": { - "content": "final _authorizationEndpoint =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11412 - }, - { - "endIndex": 11502, - "paragraph": { - "elements": [ - { - "endIndex": 11502, - "startIndex": 11443, - "textRun": { - "content": " Uri.parse('https://github.com/login/oauth/authorize');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11443 - }, - { - "endIndex": 11583, - "paragraph": { - "elements": [ - { - "endIndex": 11583, - "startIndex": 11502, - "textRun": { - "content": "final _tokenEndpoint = Uri.parse('https://github.com/login/oauth/access_token');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11502 - }, - { - "endIndex": 11584, - "paragraph": { - "elements": [ - { - "endIndex": 11584, - "startIndex": 11583, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11583 - }, - { - "endIndex": 11633, - "paragraph": { - "elements": [ - { - "endIndex": 11633, - "startIndex": 11584, - "textRun": { - "content": "class GithubLoginWidget extends StatefulWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11584 - }, - { - "endIndex": 11661, - "paragraph": { - "elements": [ - { - "endIndex": 11661, - "startIndex": 11633, - "textRun": { - "content": " const GithubLoginWidget({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11633 - }, - { - "endIndex": 11688, - "paragraph": { - "elements": [ - { - "endIndex": 11688, - "startIndex": 11661, - "textRun": { - "content": " required this.builder,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11661 - }, - { - "endIndex": 11722, - "paragraph": { - "elements": [ - { - "endIndex": 11722, - "startIndex": 11688, - "textRun": { - "content": " required this.githubClientId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11688 - }, - { - "endIndex": 11760, - "paragraph": { - "elements": [ - { - "endIndex": 11760, - "startIndex": 11722, - "textRun": { - "content": " required this.githubClientSecret,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11722 - }, - { - "endIndex": 11792, - "paragraph": { - "elements": [ - { - "endIndex": 11792, - "startIndex": 11760, - "textRun": { - "content": " required this.githubScopes,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11760 - }, - { - "endIndex": 11807, - "paragraph": { - "elements": [ - { - "endIndex": 11807, - "startIndex": 11792, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11792 - }, - { - "endIndex": 11813, - "paragraph": { - "elements": [ - { - "endIndex": 11813, - "startIndex": 11807, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11807 - }, - { - "endIndex": 11851, - "paragraph": { - "elements": [ - { - "endIndex": 11851, - "startIndex": 11813, - "textRun": { - "content": " final AuthenticatedBuilder builder;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11813 - }, - { - "endIndex": 11882, - "paragraph": { - "elements": [ - { - "endIndex": 11882, - "startIndex": 11851, - "textRun": { - "content": " final String githubClientId;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11851 - }, - { - "endIndex": 11917, - "paragraph": { - "elements": [ - { - "endIndex": 11917, - "startIndex": 11882, - "textRun": { - "content": " final String githubClientSecret;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11882 - }, - { - "endIndex": 11952, - "paragraph": { - "elements": [ - { - "endIndex": 11952, - "startIndex": 11917, - "textRun": { - "content": " final List githubScopes;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11917 - }, - { - "endIndex": 11953, - "paragraph": { - "elements": [ - { - "endIndex": 11953, - "startIndex": 11952, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11952 - }, - { - "endIndex": 11965, - "paragraph": { - "elements": [ - { - "endIndex": 11965, - "startIndex": 11953, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11953 - }, - { - "endIndex": 12030, - "paragraph": { - "elements": [ - { - "endIndex": 12030, - "startIndex": 11965, - "textRun": { - "content": " State createState() => _GithubLoginState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11965 - }, - { - "endIndex": 12032, - "paragraph": { - "elements": [ - { - "endIndex": 12032, - "startIndex": 12030, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12030 - }, - { - "endIndex": 12033, - "paragraph": { - "elements": [ - { - "endIndex": 12033, - "startIndex": 12032, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12032 - }, - { - "endIndex": 12081, - "paragraph": { - "elements": [ - { - "endIndex": 12081, - "startIndex": 12033, - "textRun": { - "content": "typedef AuthenticatedBuilder = Widget Function(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12033 - }, - { - "endIndex": 12130, - "paragraph": { - "elements": [ - { - "endIndex": 12130, - "startIndex": 12081, - "textRun": { - "content": " BuildContext context, oauth2.Client client);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12081 - }, - { - "endIndex": 12131, - "paragraph": { - "elements": [ - { - "endIndex": 12131, - "startIndex": 12130, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12130 - }, - { - "endIndex": 12190, - "paragraph": { - "elements": [ - { - "endIndex": 12190, - "startIndex": 12131, - "textRun": { - "content": "class _GithubLoginState extends State {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12131 - }, - { - "endIndex": 12221, - "paragraph": { - "elements": [ - { - "endIndex": 12221, - "startIndex": 12190, - "textRun": { - "content": " HttpServer? _redirectServer;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12190 - }, - { - "endIndex": 12247, - "paragraph": { - "elements": [ - { - "endIndex": 12247, - "startIndex": 12221, - "textRun": { - "content": " oauth2.Client? _client;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12221 - }, - { - "endIndex": 12248, - "paragraph": { - "elements": [ - { - "endIndex": 12248, - "startIndex": 12247, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12247 - }, - { - "endIndex": 12260, - "paragraph": { - "elements": [ - { - "endIndex": 12260, - "startIndex": 12248, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12248 - }, - { - "endIndex": 12299, - "paragraph": { - "elements": [ - { - "endIndex": 12299, - "startIndex": 12260, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12260 - }, - { - "endIndex": 12327, - "paragraph": { - "elements": [ - { - "endIndex": 12327, - "startIndex": 12299, - "textRun": { - "content": " final client = _client;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12299 - }, - { - "endIndex": 12353, - "paragraph": { - "elements": [ - { - "endIndex": 12353, - "startIndex": 12327, - "textRun": { - "content": " if (client != null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12327 - }, - { - "endIndex": 12399, - "paragraph": { - "elements": [ - { - "endIndex": 12399, - "startIndex": 12353, - "textRun": { - "content": " return widget.builder(context, client);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12353 - }, - { - "endIndex": 12405, - "paragraph": { - "elements": [ - { - "endIndex": 12405, - "startIndex": 12399, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12399 - }, - { - "endIndex": 12406, - "paragraph": { - "elements": [ - { - "endIndex": 12406, - "startIndex": 12405, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12405 - }, - { - "endIndex": 12427, - "paragraph": { - "elements": [ - { - "endIndex": 12427, - "startIndex": 12406, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12406 - }, - { - "endIndex": 12449, - "paragraph": { - "elements": [ - { - "endIndex": 12449, - "startIndex": 12427, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12427 - }, - { - "endIndex": 12492, - "paragraph": { - "elements": [ - { - "endIndex": 12492, - "startIndex": 12449, - "textRun": { - "content": " title: const Text('Github Login'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12449 - }, - { - "endIndex": 12501, - "paragraph": { - "elements": [ - { - "endIndex": 12501, - "startIndex": 12492, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12492 - }, - { - "endIndex": 12521, - "paragraph": { - "elements": [ - { - "endIndex": 12521, - "startIndex": 12501, - "textRun": { - "content": " body: Center(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12501 - }, - { - "endIndex": 12552, - "paragraph": { - "elements": [ - { - "endIndex": 12552, - "startIndex": 12521, - "textRun": { - "content": " child: ElevatedButton(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12521 - }, - { - "endIndex": 12584, - "paragraph": { - "elements": [ - { - "endIndex": 12584, - "startIndex": 12552, - "textRun": { - "content": " onPressed: () async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12552 - }, - { - "endIndex": 12628, - "paragraph": { - "elements": [ - { - "endIndex": 12628, - "startIndex": 12584, - "textRun": { - "content": " await _redirectServer?.close();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12584 - }, - { - "endIndex": 12682, - "paragraph": { - "elements": [ - { - "endIndex": 12682, - "startIndex": 12628, - "textRun": { - "content": " // Bind to an ephemeral port on localhost\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12628 - }, - { - "endIndex": 12751, - "paragraph": { - "elements": [ - { - "endIndex": 12751, - "startIndex": 12682, - "textRun": { - "content": " _redirectServer = await HttpServer.bind('localhost', 0);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12682 - }, - { - "endIndex": 12817, - "paragraph": { - "elements": [ - { - "endIndex": 12817, - "startIndex": 12751, - "textRun": { - "content": " var authenticatedHttpClient = await _getOAuth2Client(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12751 - }, - { - "endIndex": 12895, - "paragraph": { - "elements": [ - { - "endIndex": 12895, - "startIndex": 12817, - "textRun": { - "content": " Uri.parse('http://localhost:${_redirectServer!.port}/auth'));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12817 - }, - { - "endIndex": 12921, - "paragraph": { - "elements": [ - { - "endIndex": 12921, - "startIndex": 12895, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12895 - }, - { - "endIndex": 12970, - "paragraph": { - "elements": [ - { - "endIndex": 12970, - "startIndex": 12921, - "textRun": { - "content": " _client = authenticatedHttpClient;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12921 - }, - { - "endIndex": 12986, - "paragraph": { - "elements": [ - { - "endIndex": 12986, - "startIndex": 12970, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12970 - }, - { - "endIndex": 12999, - "paragraph": { - "elements": [ - { - "endIndex": 12999, - "startIndex": 12986, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12986 - }, - { - "endIndex": 13047, - "paragraph": { - "elements": [ - { - "endIndex": 13047, - "startIndex": 12999, - "textRun": { - "content": " child: const Text('Login to Github'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12999 - }, - { - "endIndex": 13058, - "paragraph": { - "elements": [ - { - "endIndex": 13058, - "startIndex": 13047, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13047 - }, - { - "endIndex": 13067, - "paragraph": { - "elements": [ - { - "endIndex": 13067, - "startIndex": 13058, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13058 - }, - { - "endIndex": 13074, - "paragraph": { - "elements": [ - { - "endIndex": 13074, - "startIndex": 13067, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13067 - }, - { - "endIndex": 13078, - "paragraph": { - "elements": [ - { - "endIndex": 13078, - "startIndex": 13074, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13074 - }, - { - "endIndex": 13079, - "paragraph": { - "elements": [ - { - "endIndex": 13079, - "startIndex": 13078, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13078 - }, - { - "endIndex": 13145, - "paragraph": { - "elements": [ - { - "endIndex": 13145, - "startIndex": 13079, - "textRun": { - "content": " Future _getOAuth2Client(Uri redirectUrl) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13079 - }, - { - "endIndex": 13223, - "paragraph": { - "elements": [ - { - "endIndex": 13223, - "startIndex": 13145, - "textRun": { - "content": " if (widget.githubClientId.isEmpty || widget.githubClientSecret.isEmpty) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13145 - }, - { - "endIndex": 13263, - "paragraph": { - "elements": [ - { - "endIndex": 13263, - "startIndex": 13223, - "textRun": { - "content": " throw const GithubLoginException(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13223 - }, - { - "endIndex": 13333, - "paragraph": { - "elements": [ - { - "endIndex": 13333, - "startIndex": 13263, - "textRun": { - "content": " 'githubClientId and githubClientSecret must be not empty. '\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13263 - }, - { - "endIndex": 13404, - "paragraph": { - "elements": [ - { - "endIndex": 13404, - "startIndex": 13333, - "textRun": { - "content": " 'See `lib/github_oauth_credentials.dart` for more detail.');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13333 - }, - { - "endIndex": 13410, - "paragraph": { - "elements": [ - { - "endIndex": 13410, - "startIndex": 13404, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13404 - }, - { - "endIndex": 13457, - "paragraph": { - "elements": [ - { - "endIndex": 13457, - "startIndex": 13410, - "textRun": { - "content": " var grant = oauth2.AuthorizationCodeGrant(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13410 - }, - { - "endIndex": 13486, - "paragraph": { - "elements": [ - { - "endIndex": 13486, - "startIndex": 13457, - "textRun": { - "content": " widget.githubClientId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13457 - }, - { - "endIndex": 13516, - "paragraph": { - "elements": [ - { - "endIndex": 13516, - "startIndex": 13486, - "textRun": { - "content": " _authorizationEndpoint,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13486 - }, - { - "endIndex": 13538, - "paragraph": { - "elements": [ - { - "endIndex": 13538, - "startIndex": 13516, - "textRun": { - "content": " _tokenEndpoint,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13516 - }, - { - "endIndex": 13579, - "paragraph": { - "elements": [ - { - "endIndex": 13579, - "startIndex": 13538, - "textRun": { - "content": " secret: widget.githubClientSecret,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13538 - }, - { - "endIndex": 13625, - "paragraph": { - "elements": [ - { - "endIndex": 13625, - "startIndex": 13579, - "textRun": { - "content": " httpClient: _JsonAcceptingHttpClient(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13579 - }, - { - "endIndex": 13632, - "paragraph": { - "elements": [ - { - "endIndex": 13632, - "startIndex": 13625, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13625 - }, - { - "endIndex": 13659, - "paragraph": { - "elements": [ - { - "endIndex": 13659, - "startIndex": 13632, - "textRun": { - "content": " var authorizationUrl =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13632 - }, - { - "endIndex": 13736, - "paragraph": { - "elements": [ - { - "endIndex": 13736, - "startIndex": 13659, - "textRun": { - "content": " grant.getAuthorizationUrl(redirectUrl, scopes: widget.githubScopes);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13659 - }, - { - "endIndex": 13737, - "paragraph": { - "elements": [ - { - "endIndex": 13737, - "startIndex": 13736, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13736 - }, - { - "endIndex": 13776, - "paragraph": { - "elements": [ - { - "endIndex": 13776, - "startIndex": 13737, - "textRun": { - "content": " await _redirect(authorizationUrl);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13737 - }, - { - "endIndex": 13827, - "paragraph": { - "elements": [ - { - "endIndex": 13827, - "startIndex": 13776, - "textRun": { - "content": " var responseQueryParameters = await _listen();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13776 - }, - { - "endIndex": 13844, - "paragraph": { - "elements": [ - { - "endIndex": 13844, - "startIndex": 13827, - "textRun": { - "content": " var client =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13827 - }, - { - "endIndex": 13918, - "paragraph": { - "elements": [ - { - "endIndex": 13918, - "startIndex": 13844, - "textRun": { - "content": " await grant.handleAuthorizationResponse(responseQueryParameters);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13844 - }, - { - "endIndex": 13937, - "paragraph": { - "elements": [ - { - "endIndex": 13937, - "startIndex": 13918, - "textRun": { - "content": " return client;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13918 - }, - { - "endIndex": 13941, - "paragraph": { - "elements": [ - { - "endIndex": 13941, - "startIndex": 13937, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13937 - }, - { - "endIndex": 13942, - "paragraph": { - "elements": [ - { - "endIndex": 13942, - "startIndex": 13941, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13941 - }, - { - "endIndex": 13997, - "paragraph": { - "elements": [ - { - "endIndex": 13997, - "startIndex": 13942, - "textRun": { - "content": " Future _redirect(Uri authorizationUrl) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13942 - }, - { - "endIndex": 14045, - "paragraph": { - "elements": [ - { - "endIndex": 14045, - "startIndex": 13997, - "textRun": { - "content": " if (await canLaunchUrl(authorizationUrl)) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13997 - }, - { - "endIndex": 14086, - "paragraph": { - "elements": [ - { - "endIndex": 14086, - "startIndex": 14045, - "textRun": { - "content": " await launchUrl(authorizationUrl);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14045 - }, - { - "endIndex": 14099, - "paragraph": { - "elements": [ - { - "endIndex": 14099, - "startIndex": 14086, - "textRun": { - "content": " } else {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14086 - }, - { - "endIndex": 14171, - "paragraph": { - "elements": [ - { - "endIndex": 14171, - "startIndex": 14099, - "textRun": { - "content": " throw GithubLoginException('Could not launch $authorizationUrl');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14099 - }, - { - "endIndex": 14177, - "paragraph": { - "elements": [ - { - "endIndex": 14177, - "startIndex": 14171, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14171 - }, - { - "endIndex": 14181, - "paragraph": { - "elements": [ - { - "endIndex": 14181, - "startIndex": 14177, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14177 - }, - { - "endIndex": 14182, - "paragraph": { - "elements": [ - { - "endIndex": 14182, - "startIndex": 14181, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14181 - }, - { - "endIndex": 14230, - "paragraph": { - "elements": [ - { - "endIndex": 14230, - "startIndex": 14182, - "textRun": { - "content": " Future> _listen() async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14182 - }, - { - "endIndex": 14278, - "paragraph": { - "elements": [ - { - "endIndex": 14278, - "startIndex": 14230, - "textRun": { - "content": " var request = await _redirectServer!.first;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14230 - }, - { - "endIndex": 14324, - "paragraph": { - "elements": [ - { - "endIndex": 14324, - "startIndex": 14278, - "textRun": { - "content": " var params = request.uri.queryParameters;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14278 - }, - { - "endIndex": 14363, - "paragraph": { - "elements": [ - { - "endIndex": 14363, - "startIndex": 14324, - "textRun": { - "content": " request.response.statusCode = 200;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14324 - }, - { - "endIndex": 14427, - "paragraph": { - "elements": [ - { - "endIndex": 14427, - "startIndex": 14363, - "textRun": { - "content": " request.response.headers.set('content-type', 'text/plain');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14363 - }, - { - "endIndex": 14499, - "paragraph": { - "elements": [ - { - "endIndex": 14499, - "startIndex": 14427, - "textRun": { - "content": " request.response.writeln('Authenticated! You can close this tab.');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14427 - }, - { - "endIndex": 14535, - "paragraph": { - "elements": [ - { - "endIndex": 14535, - "startIndex": 14499, - "textRun": { - "content": " await request.response.close();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14499 - }, - { - "endIndex": 14571, - "paragraph": { - "elements": [ - { - "endIndex": 14571, - "startIndex": 14535, - "textRun": { - "content": " await _redirectServer!.close();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14535 - }, - { - "endIndex": 14599, - "paragraph": { - "elements": [ - { - "endIndex": 14599, - "startIndex": 14571, - "textRun": { - "content": " _redirectServer = null;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14571 - }, - { - "endIndex": 14618, - "paragraph": { - "elements": [ - { - "endIndex": 14618, - "startIndex": 14599, - "textRun": { - "content": " return params;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14599 - }, - { - "endIndex": 14622, - "paragraph": { - "elements": [ - { - "endIndex": 14622, - "startIndex": 14618, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14618 - }, - { - "endIndex": 14624, - "paragraph": { - "elements": [ - { - "endIndex": 14624, - "startIndex": 14622, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14622 - }, - { - "endIndex": 14625, - "paragraph": { - "elements": [ - { - "endIndex": 14625, - "startIndex": 14624, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14624 - }, - { - "endIndex": 14682, - "paragraph": { - "elements": [ - { - "endIndex": 14682, - "startIndex": 14625, - "textRun": { - "content": "class _JsonAcceptingHttpClient extends http.BaseClient {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14625 - }, - { - "endIndex": 14719, - "paragraph": { - "elements": [ - { - "endIndex": 14719, - "startIndex": 14682, - "textRun": { - "content": " final _httpClient = http.Client();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14682 - }, - { - "endIndex": 14731, - "paragraph": { - "elements": [ - { - "endIndex": 14731, - "startIndex": 14719, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14719 - }, - { - "endIndex": 14796, - "paragraph": { - "elements": [ - { - "endIndex": 14796, - "startIndex": 14731, - "textRun": { - "content": " Future send(http.BaseRequest request) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14731 - }, - { - "endIndex": 14848, - "paragraph": { - "elements": [ - { - "endIndex": 14848, - "startIndex": 14796, - "textRun": { - "content": " request.headers['Accept'] = 'application/json';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14796 - }, - { - "endIndex": 14886, - "paragraph": { - "elements": [ - { - "endIndex": 14886, - "startIndex": 14848, - "textRun": { - "content": " return _httpClient.send(request);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14848 - }, - { - "endIndex": 14890, - "paragraph": { - "elements": [ - { - "endIndex": 14890, - "startIndex": 14886, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14886 - }, - { - "endIndex": 14892, - "paragraph": { - "elements": [ - { - "endIndex": 14892, - "startIndex": 14890, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14890 - }, - { - "endIndex": 14893, - "paragraph": { - "elements": [ - { - "endIndex": 14893, - "startIndex": 14892, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14892 - }, - { - "endIndex": 14943, - "paragraph": { - "elements": [ - { - "endIndex": 14943, - "startIndex": 14893, - "textRun": { - "content": "class GithubLoginException implements Exception {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14893 - }, - { - "endIndex": 14987, - "paragraph": { - "elements": [ - { - "endIndex": 14987, - "startIndex": 14943, - "textRun": { - "content": " const GithubLoginException(this.message);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14943 - }, - { - "endIndex": 15011, - "paragraph": { - "elements": [ - { - "endIndex": 15011, - "startIndex": 14987, - "textRun": { - "content": " final String message;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14987 - }, - { - "endIndex": 15023, - "paragraph": { - "elements": [ - { - "endIndex": 15023, - "startIndex": 15011, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15011 - }, - { - "endIndex": 15055, - "paragraph": { - "elements": [ - { - "endIndex": 15055, - "startIndex": 15023, - "textRun": { - "content": " String toString() => message;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15023 - }, - { - "endIndex": 15057, - "paragraph": { - "elements": [ - { - "endIndex": 15057, - "startIndex": 15055, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15055 - } - ], - "endIndex": 15057, - "startIndex": 11214, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 15059, - "paragraph": { - "elements": [ - { - "endIndex": 15059, - "startIndex": 15058, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15058 - }, - { - "endIndex": 15316, - "paragraph": { - "elements": [ - { - "endIndex": 15316, - "startIndex": 15059, - "textRun": { - "content": "It’s worth spending some time working through this code because it demonstrates some of the capabilities of using Flutter and Dart on the desktop. Yes, the code is complicated, but a lot of functionality is encapsulated in a relatively easy-to-use widget. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15059 - }, - { - "endIndex": 15317, - "paragraph": { - "elements": [ - { - "endIndex": 15317, - "startIndex": 15316, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15316 - }, - { - "endIndex": 15478, - "paragraph": { - "elements": [ - { - "endIndex": 15478, - "startIndex": 15317, - "textRun": { - "content": "This widget exposes a temporary web server and makes secure HTTP requests. On macOS, both of these capabilities need to be requested through entitlements files.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15317 - }, - { - "endIndex": 15529, - "paragraph": { - "elements": [ - { - "endIndex": 15486, - "startIndex": 15478, - "textRun": { - "content": "Change c", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 15529, - "startIndex": 15486, - "textRun": { - "content": "lient and server entitlements (macOS only)\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.j6sh1ew9czrq", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 15478 - }, - { - "endIndex": 15715, - "paragraph": { - "elements": [ - { - "endIndex": 15681, - "startIndex": 15529, - "textRun": { - "content": "Making web requests and running a web server as a macOS desktop app requires changes to the entitlements for the application. For more information, see ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 15713, - "startIndex": 15681, - "textRun": { - "content": "Entitlements and the App Sandbox", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/desktop#entitlements-and-the-app-sandbox" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 15714, - "startIndex": 15713, - "textRun": { - "content": ".", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 15715, - "startIndex": 15714, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15529 - }, - { - "endIndex": 15754, - "paragraph": { - "elements": [ - { - "endIndex": 15753, - "startIndex": 15715, - "textRun": { - "content": "macos/Runner/DebugProfile.entitlements", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/step_04/macos/Runner/DebugProfile.entitlements" - }, - "underline": true - } - } - }, - { - "endIndex": 15754, - "startIndex": 15753, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.fxzkfghpdp3w", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 15715 - }, - { - "endIndex": 16186, - "startIndex": 15754, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16185, - "startIndex": 15755, - "tableCells": [ - { - "content": [ - { - "endIndex": 15796, - "paragraph": { - "elements": [ - { - "endIndex": 15796, - "startIndex": 15757, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15757 - }, - { - "endIndex": 15899, - "paragraph": { - "elements": [ - { - "endIndex": 15899, - "startIndex": 15796, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15796 - }, - { - "endIndex": 15921, - "paragraph": { - "elements": [ - { - "endIndex": 15921, - "startIndex": 15899, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15899 - }, - { - "endIndex": 15928, - "paragraph": { - "elements": [ - { - "endIndex": 15928, - "startIndex": 15921, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15921 - }, - { - "endIndex": 15971, - "paragraph": { - "elements": [ - { - "endIndex": 15971, - "startIndex": 15928, - "textRun": { - "content": "\tcom.apple.security.app-sandbox\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15928 - }, - { - "endIndex": 15980, - "paragraph": { - "elements": [ - { - "endIndex": 15980, - "startIndex": 15971, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15971 - }, - { - "endIndex": 16024, - "paragraph": { - "elements": [ - { - "endIndex": 16024, - "startIndex": 15980, - "textRun": { - "content": "\tcom.apple.security.cs.allow-jit\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15980 - }, - { - "endIndex": 16033, - "paragraph": { - "elements": [ - { - "endIndex": 16033, - "startIndex": 16024, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16024 - }, - { - "endIndex": 16079, - "paragraph": { - "elements": [ - { - "endIndex": 16079, - "startIndex": 16033, - "textRun": { - "content": "\tcom.apple.security.network.server\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16033 - }, - { - "endIndex": 16088, - "paragraph": { - "elements": [ - { - "endIndex": 16088, - "startIndex": 16079, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16079 - }, - { - "endIndex": 16113, - "paragraph": { - "elements": [ - { - "endIndex": 16089, - "startIndex": 16088, - "textRun": { - "content": "\t", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16113, - "startIndex": 16089, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16088 - }, - { - "endIndex": 16159, - "paragraph": { - "elements": [ - { - "endIndex": 16159, - "startIndex": 16113, - "textRun": { - "content": "\tcom.apple.security.network.client\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16113 - }, - { - "endIndex": 16168, - "paragraph": { - "elements": [ - { - "endIndex": 16168, - "startIndex": 16159, - "textRun": { - "content": "\t\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16159 - }, - { - "endIndex": 16176, - "paragraph": { - "elements": [ - { - "endIndex": 16176, - "startIndex": 16168, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16168 - }, - { - "endIndex": 16185, - "paragraph": { - "elements": [ - { - "endIndex": 16185, - "startIndex": 16176, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16176 - } - ], - "endIndex": 16185, - "startIndex": 15756, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16187, - "paragraph": { - "elements": [ - { - "endIndex": 16187, - "startIndex": 16186, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16186 - }, - { - "endIndex": 16259, - "paragraph": { - "elements": [ - { - "endIndex": 16190, - "startIndex": 16187, - "textRun": { - "content": "You", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 16259, - "startIndex": 16190, - "textRun": { - "content": " also need to modify the Release entitlements for production builds.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16187 - }, - { - "endIndex": 16293, - "paragraph": { - "elements": [ - { - "endIndex": 16292, - "startIndex": 16259, - "textRun": { - "content": "macos/Runner/Release.entitlements", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/step_04/macos/Runner/Release.entitlements" - }, - "underline": true - } - } - }, - { - "endIndex": 16293, - "startIndex": 16292, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.kxtouu341cwy", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 16259 - }, - { - "endIndex": 16687, - "startIndex": 16293, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16686, - "startIndex": 16294, - "tableCells": [ - { - "content": [ - { - "endIndex": 16335, - "paragraph": { - "elements": [ - { - "endIndex": 16335, - "startIndex": 16296, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16296 - }, - { - "endIndex": 16438, - "paragraph": { - "elements": [ - { - "endIndex": 16438, - "startIndex": 16335, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16335 - }, - { - "endIndex": 16460, - "paragraph": { - "elements": [ - { - "endIndex": 16460, - "startIndex": 16438, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16438 - }, - { - "endIndex": 16467, - "paragraph": { - "elements": [ - { - "endIndex": 16467, - "startIndex": 16460, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16460 - }, - { - "endIndex": 16510, - "paragraph": { - "elements": [ - { - "endIndex": 16510, - "startIndex": 16467, - "textRun": { - "content": "\tcom.apple.security.app-sandbox\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16467 - }, - { - "endIndex": 16519, - "paragraph": { - "elements": [ - { - "endIndex": 16519, - "startIndex": 16510, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16510 - }, - { - "endIndex": 16559, - "paragraph": { - "elements": [ - { - "endIndex": 16520, - "startIndex": 16519, - "textRun": { - "content": "\t", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16559, - "startIndex": 16520, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16519 - }, - { - "endIndex": 16605, - "paragraph": { - "elements": [ - { - "endIndex": 16605, - "startIndex": 16559, - "textRun": { - "content": "\tcom.apple.security.network.server\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16559 - }, - { - "endIndex": 16614, - "paragraph": { - "elements": [ - { - "endIndex": 16614, - "startIndex": 16605, - "textRun": { - "content": "\t\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16605 - }, - { - "endIndex": 16660, - "paragraph": { - "elements": [ - { - "endIndex": 16660, - "startIndex": 16614, - "textRun": { - "content": "\tcom.apple.security.network.client\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16614 - }, - { - "endIndex": 16669, - "paragraph": { - "elements": [ - { - "endIndex": 16669, - "startIndex": 16660, - "textRun": { - "content": "\t\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16660 - }, - { - "endIndex": 16677, - "paragraph": { - "elements": [ - { - "endIndex": 16677, - "startIndex": 16669, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16669 - }, - { - "endIndex": 16686, - "paragraph": { - "elements": [ - { - "endIndex": 16686, - "startIndex": 16677, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16677 - } - ], - "endIndex": 16686, - "startIndex": 16295, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16688, - "paragraph": { - "elements": [ - { - "endIndex": 16688, - "startIndex": 16687, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16687 - }, - { - "endIndex": 16708, - "paragraph": { - "elements": [ - { - "endIndex": 16708, - "startIndex": 16688, - "textRun": { - "content": "Put it all together\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.jm4vjriq444u", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 16688 - }, - { - "endIndex": 17091, - "paragraph": { - "elements": [ - { - "endIndex": 16709, - "startIndex": 16708, - "textRun": { - "content": "Y", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17070, - "startIndex": 16709, - "textRun": { - "content": "ou’ve configured a new OAuth app, the project is configured with the required packages and plugins, you’ve authored a widget to encapsulate the OAuth authentication flow, and you’ve enabled the app to act as both a network client and server on macOS through entitlements. With all of these required building blocks in place, you can bring it all together in the", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17071, - "startIndex": 17070, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 17084, - "startIndex": 17071, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17091, - "startIndex": 17084, - "textRun": { - "content": " file.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16708 - }, - { - "endIndex": 17105, - "paragraph": { - "elements": [ - { - "endIndex": 17104, - "startIndex": 17091, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/step_04/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 17105, - "startIndex": 17104, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hcdqgnf1x5cc", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 17091 - }, - { - "endIndex": 18305, - "startIndex": 17105, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 18304, - "startIndex": 17106, - "tableCells": [ - { - "content": [ - { - "endIndex": 17148, - "paragraph": { - "elements": [ - { - "endIndex": 17148, - "startIndex": 17108, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17108 - }, - { - "endIndex": 17188, - "paragraph": { - "elements": [ - { - "endIndex": 17188, - "startIndex": 17148, - "textRun": { - "content": "import 'github_oauth_credentials.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17148 - }, - { - "endIndex": 17220, - "paragraph": { - "elements": [ - { - "endIndex": 17220, - "startIndex": 17188, - "textRun": { - "content": "import 'src/github_login.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17188 - }, - { - "endIndex": 17221, - "paragraph": { - "elements": [ - { - "endIndex": 17221, - "startIndex": 17220, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17220 - }, - { - "endIndex": 17235, - "paragraph": { - "elements": [ - { - "endIndex": 17235, - "startIndex": 17221, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17221 - }, - { - "endIndex": 17260, - "paragraph": { - "elements": [ - { - "endIndex": 17260, - "startIndex": 17235, - "textRun": { - "content": " runApp(const MyApp());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17235 - }, - { - "endIndex": 17262, - "paragraph": { - "elements": [ - { - "endIndex": 17262, - "startIndex": 17260, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17260 - }, - { - "endIndex": 17263, - "paragraph": { - "elements": [ - { - "endIndex": 17263, - "startIndex": 17262, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17262 - }, - { - "endIndex": 17301, - "paragraph": { - "elements": [ - { - "endIndex": 17301, - "startIndex": 17263, - "textRun": { - "content": "class MyApp extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17263 - }, - { - "endIndex": 17329, - "paragraph": { - "elements": [ - { - "endIndex": 17329, - "startIndex": 17301, - "textRun": { - "content": " const MyApp({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17301 - }, - { - "endIndex": 17330, - "paragraph": { - "elements": [ - { - "endIndex": 17330, - "startIndex": 17329, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17329 - }, - { - "endIndex": 17342, - "paragraph": { - "elements": [ - { - "endIndex": 17342, - "startIndex": 17330, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17330 - }, - { - "endIndex": 17381, - "paragraph": { - "elements": [ - { - "endIndex": 17381, - "startIndex": 17342, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17342 - }, - { - "endIndex": 17405, - "paragraph": { - "elements": [ - { - "endIndex": 17405, - "startIndex": 17381, - "textRun": { - "content": " return MaterialApp(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17381 - }, - { - "endIndex": 17435, - "paragraph": { - "elements": [ - { - "endIndex": 17435, - "startIndex": 17405, - "textRun": { - "content": " title: 'GitHub Client',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17405 - }, - { - "endIndex": 17459, - "paragraph": { - "elements": [ - { - "endIndex": 17459, - "startIndex": 17435, - "textRun": { - "content": " theme: ThemeData(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17435 - }, - { - "endIndex": 17495, - "paragraph": { - "elements": [ - { - "endIndex": 17495, - "startIndex": 17459, - "textRun": { - "content": " primarySwatch: Colors.blue,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17459 - }, - { - "endIndex": 17557, - "paragraph": { - "elements": [ - { - "endIndex": 17557, - "startIndex": 17495, - "textRun": { - "content": " visualDensity: VisualDensity.adaptivePlatformDensity,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17495 - }, - { - "endIndex": 17585, - "paragraph": { - "elements": [ - { - "endIndex": 17585, - "startIndex": 17557, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17557 - }, - { - "endIndex": 17594, - "paragraph": { - "elements": [ - { - "endIndex": 17594, - "startIndex": 17585, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17585 - }, - { - "endIndex": 17648, - "paragraph": { - "elements": [ - { - "endIndex": 17648, - "startIndex": 17594, - "textRun": { - "content": " home: const MyHomePage(title: 'GitHub Client'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17594 - }, - { - "endIndex": 17655, - "paragraph": { - "elements": [ - { - "endIndex": 17655, - "startIndex": 17648, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17648 - }, - { - "endIndex": 17659, - "paragraph": { - "elements": [ - { - "endIndex": 17659, - "startIndex": 17655, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17655 - }, - { - "endIndex": 17661, - "paragraph": { - "elements": [ - { - "endIndex": 17661, - "startIndex": 17659, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17659 - }, - { - "endIndex": 17662, - "paragraph": { - "elements": [ - { - "endIndex": 17662, - "startIndex": 17661, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17661 - }, - { - "endIndex": 17705, - "paragraph": { - "elements": [ - { - "endIndex": 17705, - "startIndex": 17662, - "textRun": { - "content": "class MyHomePage extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17662 - }, - { - "endIndex": 17759, - "paragraph": { - "elements": [ - { - "endIndex": 17759, - "startIndex": 17705, - "textRun": { - "content": " const MyHomePage({super.key, required this.title});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17705 - }, - { - "endIndex": 17781, - "paragraph": { - "elements": [ - { - "endIndex": 17781, - "startIndex": 17759, - "textRun": { - "content": " final String title;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17759 - }, - { - "endIndex": 17782, - "paragraph": { - "elements": [ - { - "endIndex": 17782, - "startIndex": 17781, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17781 - }, - { - "endIndex": 17794, - "paragraph": { - "elements": [ - { - "endIndex": 17794, - "startIndex": 17782, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17782 - }, - { - "endIndex": 17833, - "paragraph": { - "elements": [ - { - "endIndex": 17833, - "startIndex": 17794, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17794 - }, - { - "endIndex": 17863, - "paragraph": { - "elements": [ - { - "endIndex": 17863, - "startIndex": 17833, - "textRun": { - "content": " return GithubLoginWidget(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17833 - }, - { - "endIndex": 17902, - "paragraph": { - "elements": [ - { - "endIndex": 17902, - "startIndex": 17863, - "textRun": { - "content": " builder: (context, httpClient) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17863 - }, - { - "endIndex": 17927, - "paragraph": { - "elements": [ - { - "endIndex": 17927, - "startIndex": 17902, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17902 - }, - { - "endIndex": 17953, - "paragraph": { - "elements": [ - { - "endIndex": 17953, - "startIndex": 17927, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17927 - }, - { - "endIndex": 17985, - "paragraph": { - "elements": [ - { - "endIndex": 17985, - "startIndex": 17953, - "textRun": { - "content": " title: Text(title),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17953 - }, - { - "endIndex": 18011, - "paragraph": { - "elements": [ - { - "endIndex": 18011, - "startIndex": 17985, - "textRun": { - "content": " elevation: 2,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17985 - }, - { - "endIndex": 18024, - "paragraph": { - "elements": [ - { - "endIndex": 18024, - "startIndex": 18011, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18011 - }, - { - "endIndex": 18054, - "paragraph": { - "elements": [ - { - "endIndex": 18054, - "startIndex": 18024, - "textRun": { - "content": " body: const Center(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18024 - }, - { - "endIndex": 18079, - "paragraph": { - "elements": [ - { - "endIndex": 18079, - "startIndex": 18054, - "textRun": { - "content": " child: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18054 - }, - { - "endIndex": 18125, - "paragraph": { - "elements": [ - { - "endIndex": 18125, - "startIndex": 18079, - "textRun": { - "content": " 'You are logged in to GitHub!',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18079 - }, - { - "endIndex": 18140, - "paragraph": { - "elements": [ - { - "endIndex": 18140, - "startIndex": 18125, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18125 - }, - { - "endIndex": 18153, - "paragraph": { - "elements": [ - { - "endIndex": 18153, - "startIndex": 18140, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18140 - }, - { - "endIndex": 18164, - "paragraph": { - "elements": [ - { - "endIndex": 18164, - "startIndex": 18153, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18153 - }, - { - "endIndex": 18173, - "paragraph": { - "elements": [ - { - "endIndex": 18173, - "startIndex": 18164, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18164 - }, - { - "endIndex": 18211, - "paragraph": { - "elements": [ - { - "endIndex": 18211, - "startIndex": 18173, - "textRun": { - "content": " githubClientId: githubClientId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18173 - }, - { - "endIndex": 18257, - "paragraph": { - "elements": [ - { - "endIndex": 18257, - "startIndex": 18211, - "textRun": { - "content": " githubClientSecret: githubClientSecret,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18211 - }, - { - "endIndex": 18291, - "paragraph": { - "elements": [ - { - "endIndex": 18291, - "startIndex": 18257, - "textRun": { - "content": " githubScopes: githubScopes,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18257 - }, - { - "endIndex": 18298, - "paragraph": { - "elements": [ - { - "endIndex": 18298, - "startIndex": 18291, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18291 - }, - { - "endIndex": 18302, - "paragraph": { - "elements": [ - { - "endIndex": 18302, - "startIndex": 18298, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18298 - }, - { - "endIndex": 18304, - "paragraph": { - "elements": [ - { - "endIndex": 18304, - "startIndex": 18302, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18302 - } - ], - "endIndex": 18304, - "startIndex": 17107, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 18306, - "paragraph": { - "elements": [ - { - "endIndex": 18306, - "startIndex": 18305, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18305 - }, - { - "endIndex": 18538, - "paragraph": { - "elements": [ - { - "endIndex": 18538, - "startIndex": 18306, - "textRun": { - "content": "When you run this Flutter application, you are initially presented with a button to initiate the GitHub OAuth login flow. After clicking the button, complete the login flow in your web browser, to see that the app is now logged in.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18306 - }, - { - "endIndex": 18539, - "paragraph": { - "elements": [ - { - "endIndex": 18539, - "startIndex": 18538, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18538 - }, - { - "endIndex": 18540, - "paragraph": { - "elements": [ - { - "endIndex": 18540, - "startIndex": 18539, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18539 - }, - { - "endIndex": 18549, - "startIndex": 18540, - "table": { - "columns": 2, - "rows": 1, - "tableRows": [ - { - "endIndex": 18548, - "startIndex": 18541, - "tableCells": [ - { - "content": [ - { - "endIndex": 18545, - "paragraph": { - "elements": [ - { - "endIndex": 18544, - "inlineObjectElement": { - "inlineObjectId": "kix.jul1ydybrquv", - "textStyle": {} - }, - "startIndex": 18543 - }, - { - "endIndex": 18545, - "startIndex": 18544, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18543 - } - ], - "endIndex": 18545, - "startIndex": 18542, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 18548, - "paragraph": { - "elements": [ - { - "endIndex": 18547, - "inlineObjectElement": { - "inlineObjectId": "kix.svvovjnm2z78", - "textStyle": {} - }, - "startIndex": 18546 - }, - { - "endIndex": 18548, - "startIndex": 18547, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18546 - } - ], - "endIndex": 18548, - "startIndex": 18545, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 18550, - "paragraph": { - "elements": [ - { - "endIndex": 18550, - "startIndex": 18549, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18549 - }, - { - "endIndex": 18641, - "paragraph": { - "elements": [ - { - "endIndex": 18641, - "startIndex": 18550, - "textRun": { - "content": "Now that you conquered OAuth authentication, you can get started using the GitHub package.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18550 - }, - { - "endIndex": 18642, - "paragraph": { - "elements": [ - { - "endIndex": 18642, - "startIndex": 18641, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18641 - }, - { - "endIndex": 18658, - "paragraph": { - "elements": [ - { - "endIndex": 18658, - "startIndex": 18642, - "textRun": { - "content": "Access GitHub \n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.o7wkpp16ivz9", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 18642 - }, - { - "endIndex": 18673, - "paragraph": { - "elements": [ - { - "endIndex": 18672, - "startIndex": 18658, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 18673, - "startIndex": 18672, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18658 - }, - { - "endIndex": 18694, - "paragraph": { - "elements": [ - { - "endIndex": 18693, - "startIndex": 18673, - "textRun": { - "content": "Connecting to GitHub", - "textStyle": {} - } - }, - { - "endIndex": 18694, - "startIndex": 18693, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.gvdggzcg3rl9", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 18673 - }, - { - "endIndex": 18887, - "paragraph": { - "elements": [ - { - "endIndex": 18857, - "startIndex": 18694, - "textRun": { - "content": "With the OAuth authentication flow, you have obtained the necessary token to access your data on GitHub. To facilitate this task, you are going to use the package ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 18863, - "startIndex": 18857, - "textRun": { - "content": "github", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/github" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18886, - "startIndex": 18863, - "textRun": { - "content": ", available on pub.dev.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 18887, - "startIndex": 18886, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18694 - }, - { - "endIndex": 18888, - "paragraph": { - "elements": [ - { - "endIndex": 18888, - "startIndex": 18887, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18887 - }, - { - "endIndex": 18910, - "paragraph": { - "elements": [ - { - "endIndex": 18910, - "startIndex": 18888, - "textRun": { - "content": "Add more dependencies\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.4cgc2h5sgntj", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 18888 - }, - { - "endIndex": 18937, - "paragraph": { - "elements": [ - { - "endIndex": 18937, - "startIndex": 18910, - "textRun": { - "content": "Run the following command:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18910 - }, - { - "endIndex": 18938, - "paragraph": { - "elements": [ - { - "endIndex": 18938, - "startIndex": 18937, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18937 - }, - { - "endIndex": 19183, - "startIndex": 18938, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 19182, - "startIndex": 18939, - "tableCells": [ - { - "content": [ - { - "endIndex": 18966, - "paragraph": { - "elements": [ - { - "endIndex": 18966, - "startIndex": 18941, - "textRun": { - "content": "$ flutter pub add github\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18941 - }, - { - "endIndex": 18993, - "paragraph": { - "elements": [ - { - "endIndex": 18993, - "startIndex": 18966, - "textRun": { - "content": "Resolving dependencies... \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18966 - }, - { - "endIndex": 19009, - "paragraph": { - "elements": [ - { - "endIndex": 19009, - "startIndex": 18993, - "textRun": { - "content": "+ github 9.12.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18993 - }, - { - "endIndex": 19033, - "paragraph": { - "elements": [ - { - "endIndex": 19033, - "startIndex": 19009, - "textRun": { - "content": "+ json_annotation 4.8.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19009 - }, - { - "endIndex": 19084, - "paragraph": { - "elements": [ - { - "endIndex": 19084, - "startIndex": 19033, - "textRun": { - "content": " material_color_utilities 0.2.0 (0.3.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19033 - }, - { - "endIndex": 19123, - "paragraph": { - "elements": [ - { - "endIndex": 19123, - "startIndex": 19084, - "textRun": { - "content": " source_span 1.9.1 (1.10.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19084 - }, - { - "endIndex": 19158, - "paragraph": { - "elements": [ - { - "endIndex": 19158, - "startIndex": 19123, - "textRun": { - "content": " test_api 0.5.1 (0.5.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19123 - }, - { - "endIndex": 19182, - "paragraph": { - "elements": [ - { - "endIndex": 19182, - "startIndex": 19158, - "textRun": { - "content": "Changed 2 dependencies!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19158 - } - ], - "endIndex": 19182, - "startIndex": 18940, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 19184, - "paragraph": { - "elements": [ - { - "endIndex": 19184, - "startIndex": 19183, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19183 - }, - { - "endIndex": 19236, - "paragraph": { - "elements": [ - { - "endIndex": 19235, - "startIndex": 19184, - "textRun": { - "content": "Using the OAuth credentials with the GitHub package", - "textStyle": {} - } - }, - { - "endIndex": 19236, - "startIndex": 19235, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.xt1o8mni566u", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 19184 - }, - { - "endIndex": 19507, - "paragraph": { - "elements": [ - { - "endIndex": 19240, - "startIndex": 19236, - "textRun": { - "content": "The ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19258, - "startIndex": 19240, - "textRun": { - "content": "GithubLoginWidget ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19303, - "startIndex": 19258, - "textRun": { - "content": "you created in the previous step provides an ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19314, - "startIndex": 19303, - "textRun": { - "content": "HttpClient ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19420, - "startIndex": 19314, - "textRun": { - "content": "that can interact with the GitHub API. In this step you are going to use the credentials contained in the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19431, - "startIndex": 19420, - "textRun": { - "content": "HttpClient ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19507, - "startIndex": 19431, - "textRun": { - "content": "to to access the GitHub API using the GitHub package as demonstrated below:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19236 - }, - { - "endIndex": 19508, - "paragraph": { - "elements": [ - { - "endIndex": 19508, - "startIndex": 19507, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19507 - }, - { - "endIndex": 19636, - "startIndex": 19508, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 19635, - "startIndex": 19509, - "tableCells": [ - { - "content": [ - { - "endIndex": 19567, - "paragraph": { - "elements": [ - { - "endIndex": 19567, - "startIndex": 19511, - "textRun": { - "content": "final accessToken = httpClient.credentials.accessToken;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19511 - }, - { - "endIndex": 19635, - "paragraph": { - "elements": [ - { - "endIndex": 19635, - "startIndex": 19567, - "textRun": { - "content": "final gitHub = GitHub(auth: Authentication.withToken(accessToken));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19567 - } - ], - "endIndex": 19635, - "startIndex": 19510, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 19637, - "paragraph": { - "elements": [ - { - "endIndex": 19637, - "startIndex": 19636, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19636 - }, - { - "endIndex": 19664, - "paragraph": { - "elements": [ - { - "endIndex": 19664, - "startIndex": 19637, - "textRun": { - "content": "Put it all together, again\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.48td5rausrn", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 19637 - }, - { - "endIndex": 19735, - "paragraph": { - "elements": [ - { - "endIndex": 19669, - "startIndex": 19664, - "textRun": { - "content": "It’s ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19715, - "startIndex": 19669, - "textRun": { - "content": "time to integrate the GitHub client into your ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19728, - "startIndex": 19715, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19729, - "startIndex": 19728, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19734, - "startIndex": 19729, - "textRun": { - "content": "file.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19735, - "startIndex": 19734, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19664 - }, - { - "endIndex": 19749, - "paragraph": { - "elements": [ - { - "endIndex": 19748, - "startIndex": 19735, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/step_05/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 19749, - "startIndex": 19748, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.3dhyu6vvv6da", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 19735 - }, - { - "endIndex": 21738, - "startIndex": 19749, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 21737, - "startIndex": 19750, - "tableCells": [ - { - "content": [ - { - "endIndex": 19792, - "paragraph": { - "elements": [ - { - "endIndex": 19792, - "startIndex": 19752, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19752 - }, - { - "endIndex": 19878, - "paragraph": { - "elements": [ - { - "endIndex": 19878, - "startIndex": 19792, - "textRun": { - "content": "import 'package:github/github.dart'; // Add this import\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19792 - }, - { - "endIndex": 19879, - "paragraph": { - "elements": [ - { - "endIndex": 19879, - "startIndex": 19878, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19878 - }, - { - "endIndex": 19919, - "paragraph": { - "elements": [ - { - "endIndex": 19919, - "startIndex": 19879, - "textRun": { - "content": "import 'github_oauth_credentials.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19879 - }, - { - "endIndex": 19951, - "paragraph": { - "elements": [ - { - "endIndex": 19951, - "startIndex": 19919, - "textRun": { - "content": "import 'src/github_login.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19919 - }, - { - "endIndex": 19952, - "paragraph": { - "elements": [ - { - "endIndex": 19952, - "startIndex": 19951, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19951 - }, - { - "endIndex": 19966, - "paragraph": { - "elements": [ - { - "endIndex": 19966, - "startIndex": 19952, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19952 - }, - { - "endIndex": 19991, - "paragraph": { - "elements": [ - { - "endIndex": 19991, - "startIndex": 19966, - "textRun": { - "content": " runApp(const MyApp());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19966 - }, - { - "endIndex": 19993, - "paragraph": { - "elements": [ - { - "endIndex": 19993, - "startIndex": 19991, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19991 - }, - { - "endIndex": 19994, - "paragraph": { - "elements": [ - { - "endIndex": 19994, - "startIndex": 19993, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19993 - }, - { - "endIndex": 20032, - "paragraph": { - "elements": [ - { - "endIndex": 20032, - "startIndex": 19994, - "textRun": { - "content": "class MyApp extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19994 - }, - { - "endIndex": 20060, - "paragraph": { - "elements": [ - { - "endIndex": 20060, - "startIndex": 20032, - "textRun": { - "content": " const MyApp({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20032 - }, - { - "endIndex": 20061, - "paragraph": { - "elements": [ - { - "endIndex": 20061, - "startIndex": 20060, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20060 - }, - { - "endIndex": 20073, - "paragraph": { - "elements": [ - { - "endIndex": 20073, - "startIndex": 20061, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20061 - }, - { - "endIndex": 20112, - "paragraph": { - "elements": [ - { - "endIndex": 20112, - "startIndex": 20073, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20073 - }, - { - "endIndex": 20136, - "paragraph": { - "elements": [ - { - "endIndex": 20136, - "startIndex": 20112, - "textRun": { - "content": " return MaterialApp(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20112 - }, - { - "endIndex": 20166, - "paragraph": { - "elements": [ - { - "endIndex": 20166, - "startIndex": 20136, - "textRun": { - "content": " title: 'GitHub Client',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20136 - }, - { - "endIndex": 20190, - "paragraph": { - "elements": [ - { - "endIndex": 20190, - "startIndex": 20166, - "textRun": { - "content": " theme: ThemeData(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20166 - }, - { - "endIndex": 20226, - "paragraph": { - "elements": [ - { - "endIndex": 20226, - "startIndex": 20190, - "textRun": { - "content": " primarySwatch: Colors.blue,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20190 - }, - { - "endIndex": 20288, - "paragraph": { - "elements": [ - { - "endIndex": 20288, - "startIndex": 20226, - "textRun": { - "content": " visualDensity: VisualDensity.adaptivePlatformDensity,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20226 - }, - { - "endIndex": 20316, - "paragraph": { - "elements": [ - { - "endIndex": 20316, - "startIndex": 20288, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20288 - }, - { - "endIndex": 20325, - "paragraph": { - "elements": [ - { - "endIndex": 20325, - "startIndex": 20316, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20316 - }, - { - "endIndex": 20379, - "paragraph": { - "elements": [ - { - "endIndex": 20379, - "startIndex": 20325, - "textRun": { - "content": " home: const MyHomePage(title: 'GitHub Client'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20325 - }, - { - "endIndex": 20386, - "paragraph": { - "elements": [ - { - "endIndex": 20386, - "startIndex": 20379, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20379 - }, - { - "endIndex": 20390, - "paragraph": { - "elements": [ - { - "endIndex": 20390, - "startIndex": 20386, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20386 - }, - { - "endIndex": 20392, - "paragraph": { - "elements": [ - { - "endIndex": 20392, - "startIndex": 20390, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20390 - }, - { - "endIndex": 20393, - "paragraph": { - "elements": [ - { - "endIndex": 20393, - "startIndex": 20392, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20392 - }, - { - "endIndex": 20436, - "paragraph": { - "elements": [ - { - "endIndex": 20436, - "startIndex": 20393, - "textRun": { - "content": "class MyHomePage extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20393 - }, - { - "endIndex": 20490, - "paragraph": { - "elements": [ - { - "endIndex": 20490, - "startIndex": 20436, - "textRun": { - "content": " const MyHomePage({super.key, required this.title});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20436 - }, - { - "endIndex": 20512, - "paragraph": { - "elements": [ - { - "endIndex": 20512, - "startIndex": 20490, - "textRun": { - "content": " final String title;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20490 - }, - { - "endIndex": 20513, - "paragraph": { - "elements": [ - { - "endIndex": 20513, - "startIndex": 20512, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20512 - }, - { - "endIndex": 20525, - "paragraph": { - "elements": [ - { - "endIndex": 20525, - "startIndex": 20513, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20513 - }, - { - "endIndex": 20564, - "paragraph": { - "elements": [ - { - "endIndex": 20564, - "startIndex": 20525, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20525 - }, - { - "endIndex": 20594, - "paragraph": { - "elements": [ - { - "endIndex": 20594, - "startIndex": 20564, - "textRun": { - "content": " return GithubLoginWidget(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20564 - }, - { - "endIndex": 20633, - "paragraph": { - "elements": [ - { - "endIndex": 20633, - "startIndex": 20594, - "textRun": { - "content": " builder: (context, httpClient) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20594 - }, - { - "endIndex": 20720, - "paragraph": { - "elements": [ - { - "endIndex": 20720, - "startIndex": 20633, - "textRun": { - "content": " return FutureBuilder( // Modify from here\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20633 - }, - { - "endIndex": 20788, - "paragraph": { - "elements": [ - { - "endIndex": 20788, - "startIndex": 20720, - "textRun": { - "content": " future: viewerDetail(httpClient.credentials.accessToken),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20720 - }, - { - "endIndex": 20829, - "paragraph": { - "elements": [ - { - "endIndex": 20829, - "startIndex": 20788, - "textRun": { - "content": " builder: (context, snapshot) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20788 - }, - { - "endIndex": 20858, - "paragraph": { - "elements": [ - { - "endIndex": 20858, - "startIndex": 20829, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20829 - }, - { - "endIndex": 20888, - "paragraph": { - "elements": [ - { - "endIndex": 20888, - "startIndex": 20858, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20858 - }, - { - "endIndex": 20924, - "paragraph": { - "elements": [ - { - "endIndex": 20924, - "startIndex": 20888, - "textRun": { - "content": " title: Text(title),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20888 - }, - { - "endIndex": 20954, - "paragraph": { - "elements": [ - { - "endIndex": 20954, - "startIndex": 20924, - "textRun": { - "content": " elevation: 2,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20924 - }, - { - "endIndex": 20971, - "paragraph": { - "elements": [ - { - "endIndex": 20971, - "startIndex": 20954, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20954 - }, - { - "endIndex": 20999, - "paragraph": { - "elements": [ - { - "endIndex": 20999, - "startIndex": 20971, - "textRun": { - "content": " body: Center(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20971 - }, - { - "endIndex": 21028, - "paragraph": { - "elements": [ - { - "endIndex": 21028, - "startIndex": 20999, - "textRun": { - "content": " child: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20999 - }, - { - "endIndex": 21063, - "paragraph": { - "elements": [ - { - "endIndex": 21063, - "startIndex": 21028, - "textRun": { - "content": " snapshot.hasData\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21028 - }, - { - "endIndex": 21120, - "paragraph": { - "elements": [ - { - "endIndex": 21120, - "startIndex": 21063, - "textRun": { - "content": " ? 'Hello ${snapshot.data!.login}!'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21063 - }, - { - "endIndex": 21182, - "paragraph": { - "elements": [ - { - "endIndex": 21182, - "startIndex": 21120, - "textRun": { - "content": " : 'Retrieving viewer login details...',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21120 - }, - { - "endIndex": 21201, - "paragraph": { - "elements": [ - { - "endIndex": 21201, - "startIndex": 21182, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21182 - }, - { - "endIndex": 21218, - "paragraph": { - "elements": [ - { - "endIndex": 21218, - "startIndex": 21201, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21201 - }, - { - "endIndex": 21233, - "paragraph": { - "elements": [ - { - "endIndex": 21233, - "startIndex": 21218, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21218 - }, - { - "endIndex": 21312, - "paragraph": { - "elements": [ - { - "endIndex": 21312, - "startIndex": 21233, - "textRun": { - "content": " }, // to here.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21233 - }, - { - "endIndex": 21323, - "paragraph": { - "elements": [ - { - "endIndex": 21323, - "startIndex": 21312, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21312 - }, - { - "endIndex": 21332, - "paragraph": { - "elements": [ - { - "endIndex": 21332, - "startIndex": 21323, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21323 - }, - { - "endIndex": 21370, - "paragraph": { - "elements": [ - { - "endIndex": 21370, - "startIndex": 21332, - "textRun": { - "content": " githubClientId: githubClientId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21332 - }, - { - "endIndex": 21416, - "paragraph": { - "elements": [ - { - "endIndex": 21416, - "startIndex": 21370, - "textRun": { - "content": " githubClientSecret: githubClientSecret,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21370 - }, - { - "endIndex": 21450, - "paragraph": { - "elements": [ - { - "endIndex": 21450, - "startIndex": 21416, - "textRun": { - "content": " githubScopes: githubScopes,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21416 - }, - { - "endIndex": 21457, - "paragraph": { - "elements": [ - { - "endIndex": 21457, - "startIndex": 21450, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21450 - }, - { - "endIndex": 21461, - "paragraph": { - "elements": [ - { - "endIndex": 21461, - "startIndex": 21457, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21457 - }, - { - "endIndex": 21463, - "paragraph": { - "elements": [ - { - "endIndex": 21463, - "startIndex": 21461, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21461 - }, - { - "endIndex": 21464, - "paragraph": { - "elements": [ - { - "endIndex": 21464, - "startIndex": 21463, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21463 - }, - { - "endIndex": 21548, - "paragraph": { - "elements": [ - { - "endIndex": 21548, - "startIndex": 21464, - "textRun": { - "content": "Future viewerDetail(String accessToken) async { // Add from here\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21464 - }, - { - "endIndex": 21618, - "paragraph": { - "elements": [ - { - "endIndex": 21618, - "startIndex": 21548, - "textRun": { - "content": " final gitHub = GitHub(auth: Authentication.withToken(accessToken));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21548 - }, - { - "endIndex": 21658, - "paragraph": { - "elements": [ - { - "endIndex": 21658, - "startIndex": 21618, - "textRun": { - "content": " return gitHub.users.getCurrentUser();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21618 - }, - { - "endIndex": 21737, - "paragraph": { - "elements": [ - { - "endIndex": 21737, - "startIndex": 21658, - "textRun": { - "content": "} // to here.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21658 - } - ], - "endIndex": 21737, - "startIndex": 19751, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 21739, - "paragraph": { - "elements": [ - { - "endIndex": 21739, - "startIndex": 21738, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21738 - }, - { - "endIndex": 21952, - "paragraph": { - "elements": [ - { - "endIndex": 21745, - "startIndex": 21739, - "textRun": { - "content": "After ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 21952, - "startIndex": 21745, - "textRun": { - "content": "you run this Flutter application, a button that initiates the GitHub OAuth login flow is displayed. After you click the button, complete the login flow in your web browser. You are now logged in to the app.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21739 - }, - { - "endIndex": 21953, - "paragraph": { - "elements": [ - { - "endIndex": 21953, - "startIndex": 21952, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21952 - }, - { - "endIndex": 21954, - "paragraph": { - "elements": [ - { - "endIndex": 21954, - "startIndex": 21953, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21953 - }, - { - "endIndex": 21963, - "startIndex": 21954, - "table": { - "columns": 2, - "rows": 1, - "tableRows": [ - { - "endIndex": 21962, - "startIndex": 21955, - "tableCells": [ - { - "content": [ - { - "endIndex": 21959, - "paragraph": { - "elements": [ - { - "endIndex": 21958, - "inlineObjectElement": { - "inlineObjectId": "kix.lepm4wpxpiku", - "textStyle": {} - }, - "startIndex": 21957 - }, - { - "endIndex": 21959, - "startIndex": 21958, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21957 - } - ], - "endIndex": 21959, - "startIndex": 21956, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 21962, - "paragraph": { - "elements": [ - { - "endIndex": 21961, - "inlineObjectElement": { - "inlineObjectId": "kix.srjkotqu1mbm", - "textStyle": {} - }, - "startIndex": 21960 - }, - { - "endIndex": 21962, - "startIndex": 21961, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21960 - } - ], - "endIndex": 21962, - "startIndex": 21959, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 21964, - "paragraph": { - "elements": [ - { - "endIndex": 21964, - "startIndex": 21963, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21963 - }, - { - "endIndex": 22147, - "paragraph": { - "elements": [ - { - "endIndex": 22147, - "startIndex": 21964, - "textRun": { - "content": "In the next step, you’ll eliminate an annoyance in the current code base. You’ll bring the application back to the foreground after authenticating the application in the web browser.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21964 - }, - { - "endIndex": 22201, - "paragraph": { - "elements": [ - { - "endIndex": 22156, - "startIndex": 22147, - "textRun": { - "content": "Create a ", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 22201, - "startIndex": 22156, - "textRun": { - "content": "Flutter plugin for Windows, macOS and Linux \n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.y4dthnd83h7y", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 22147 - }, - { - "endIndex": 22216, - "paragraph": { - "elements": [ - { - "endIndex": 22215, - "startIndex": 22201, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 22216, - "startIndex": 22215, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22201 - }, - { - "endIndex": 22235, - "paragraph": { - "elements": [ - { - "endIndex": 22235, - "startIndex": 22216, - "textRun": { - "content": "Tidy up annoyances\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.x5mzhz8u9ffc", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 22216 - }, - { - "endIndex": 22541, - "paragraph": { - "elements": [ - { - "endIndex": 22540, - "startIndex": 22235, - "textRun": { - "content": "Currently, the code has an annoying aspect. After the authentication flow, when GitHub has authenticated your application, you are left staring at a web browser page. Ideally, you should automatically return to the application. Fixing this requires creating a Flutter plugin for your desktop platform(s). ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 22541, - "startIndex": 22540, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22235 - }, - { - "endIndex": 22594, - "paragraph": { - "elements": [ - { - "endIndex": 22594, - "startIndex": 22541, - "textRun": { - "content": "Create a Flutter plugin for Windows, macOS and Linux\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7pvyiekezbx3", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 22541 - }, - { - "endIndex": 23005, - "paragraph": { - "elements": [ - { - "endIndex": 22786, - "startIndex": 22594, - "textRun": { - "content": "To have the application automatically bring itself to the front of the stack of application windows after the OAuth flow completes requires some native code. For macOS, the API you need is the", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 22787, - "startIndex": 22786, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 22800, - "startIndex": 22787, - "textRun": { - "content": "NSApplication", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22802, - "startIndex": 22800, - "textRun": { - "content": "’s", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 22803, - "startIndex": 22802, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 22804, - "startIndex": 22803, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22832, - "startIndex": 22804, - "textRun": { - "content": "activate(ignoringOtherApps:)", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://developer.apple.com/documentation/appkit/nsapplication/1428468-activate" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22872, - "startIndex": 22832, - "textRun": { - "content": " instance method, for Linux we will use ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 22890, - "startIndex": 22872, - "textRun": { - "content": "gtk_window_present", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://developer.gnome.org/gtk3/stable/GtkWindow.html#gtk-window-present" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22936, - "startIndex": 22890, - "textRun": { - "content": ", and for Windows we resort to Stack Overflow.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23005, - "startIndex": 22936, - "textRun": { - "content": " To be able to call these APIs, you need to create a Flutter plugin.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22594 - }, - { - "endIndex": 23006, - "paragraph": { - "elements": [ - { - "endIndex": 23006, - "startIndex": 23005, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23005 - }, - { - "endIndex": 23058, - "paragraph": { - "elements": [ - { - "endIndex": 23018, - "startIndex": 23006, - "textRun": { - "content": "You can use ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23026, - "startIndex": 23018, - "textRun": { - "content": "flutter ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23058, - "startIndex": 23026, - "textRun": { - "content": "to create a new plugin project.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23006 - }, - { - "endIndex": 23059, - "paragraph": { - "elements": [ - { - "endIndex": 23059, - "startIndex": 23058, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23058 - }, - { - "endIndex": 23211, - "startIndex": 23059, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 23210, - "startIndex": 23060, - "tableCells": [ - { - "content": [ - { - "endIndex": 23114, - "paragraph": { - "elements": [ - { - "endIndex": 23114, - "startIndex": 23062, - "textRun": { - "content": "$ cd .. # step outside of the github_client project\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23062 - }, - { - "endIndex": 23189, - "paragraph": { - "elements": [ - { - "endIndex": 23189, - "startIndex": 23114, - "textRun": { - "content": "$ flutter create -t plugin --platforms=linux,macos,windows window_to_front\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23114 - }, - { - "endIndex": 23210, - "paragraph": { - "elements": [ - { - "endIndex": 23210, - "startIndex": 23189, - "textRun": { - "content": "$ cd window_to_front\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23189 - } - ], - "endIndex": 23210, - "startIndex": 23061, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 23212, - "paragraph": { - "elements": [ - { - "endIndex": 23212, - "startIndex": 23211, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23211 - }, - { - "endIndex": 23284, - "paragraph": { - "elements": [ - { - "endIndex": 23263, - "startIndex": 23212, - "textRun": { - "content": "Delete the example code, as you won’t be using it. ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23284, - "startIndex": 23263, - "textRun": { - "content": "For macOS and Linux:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23212 - }, - { - "endIndex": 23285, - "paragraph": { - "elements": [ - { - "endIndex": 23285, - "startIndex": 23284, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23284 - }, - { - "endIndex": 23305, - "startIndex": 23285, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 23304, - "startIndex": 23286, - "tableCells": [ - { - "content": [ - { - "endIndex": 23304, - "paragraph": { - "elements": [ - { - "endIndex": 23304, - "startIndex": 23288, - "textRun": { - "content": "$ rm -r example\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23288 - } - ], - "endIndex": 23304, - "startIndex": 23287, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 23306, - "paragraph": { - "elements": [ - { - "endIndex": 23306, - "startIndex": 23305, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23305 - }, - { - "endIndex": 23319, - "paragraph": { - "elements": [ - { - "endIndex": 23319, - "startIndex": 23306, - "textRun": { - "content": "For Windows:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23306 - }, - { - "endIndex": 23320, - "paragraph": { - "elements": [ - { - "endIndex": 23320, - "startIndex": 23319, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23319 - }, - { - "endIndex": 23363, - "startIndex": 23320, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 23362, - "startIndex": 23321, - "tableCells": [ - { - "content": [ - { - "endIndex": 23362, - "paragraph": { - "elements": [ - { - "endIndex": 23362, - "startIndex": 23323, - "textRun": { - "content": "PS C:\\src\\github_client> rmdir example\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23323 - } - ], - "endIndex": 23362, - "startIndex": 23322, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 23364, - "paragraph": { - "elements": [ - { - "endIndex": 23364, - "startIndex": 23363, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23363 - }, - { - "endIndex": 23425, - "paragraph": { - "elements": [ - { - "endIndex": 23424, - "startIndex": 23364, - "textRun": { - "content": "Confirm the generated pubspec.yaml looks like the following.", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23425, - "startIndex": 23424, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23364 - }, - { - "endIndex": 23457, - "paragraph": { - "elements": [ - { - "endIndex": 23456, - "startIndex": 23425, - "textRun": { - "content": "../window_to_front/pubspec.yaml", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/window_to_front/pubspec.yaml" - }, - "underline": true - } - } - }, - { - "endIndex": 23457, - "startIndex": 23456, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.jzwhkyx3nv7v", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 23425 - }, - { - "endIndex": 23969, - "startIndex": 23457, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 23968, - "startIndex": 23458, - "tableCells": [ - { - "content": [ - { - "endIndex": 23482, - "paragraph": { - "elements": [ - { - "endIndex": 23482, - "startIndex": 23460, - "textRun": { - "content": "name: window_to_front\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23460 - }, - { - "endIndex": 23525, - "paragraph": { - "elements": [ - { - "endIndex": 23525, - "startIndex": 23482, - "textRun": { - "content": "description: A new Flutter plugin project.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23482 - }, - { - "endIndex": 23540, - "paragraph": { - "elements": [ - { - "endIndex": 23540, - "startIndex": 23525, - "textRun": { - "content": "version: 0.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23525 - }, - { - "endIndex": 23550, - "paragraph": { - "elements": [ - { - "endIndex": 23550, - "startIndex": 23540, - "textRun": { - "content": "homepage:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23540 - }, - { - "endIndex": 23551, - "paragraph": { - "elements": [ - { - "endIndex": 23551, - "startIndex": 23550, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23550 - }, - { - "endIndex": 23564, - "paragraph": { - "elements": [ - { - "endIndex": 23564, - "startIndex": 23551, - "textRun": { - "content": "environment:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23551 - }, - { - "endIndex": 23589, - "paragraph": { - "elements": [ - { - "endIndex": 23589, - "startIndex": 23564, - "textRun": { - "content": " sdk: \">=2.17.5 <3.0.0\"\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23564 - }, - { - "endIndex": 23610, - "paragraph": { - "elements": [ - { - "endIndex": 23610, - "startIndex": 23589, - "textRun": { - "content": " flutter: \">=2.5.0\"\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23589 - }, - { - "endIndex": 23611, - "paragraph": { - "elements": [ - { - "endIndex": 23611, - "startIndex": 23610, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23610 - }, - { - "endIndex": 23625, - "paragraph": { - "elements": [ - { - "endIndex": 23625, - "startIndex": 23611, - "textRun": { - "content": "dependencies:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23611 - }, - { - "endIndex": 23636, - "paragraph": { - "elements": [ - { - "endIndex": 23636, - "startIndex": 23625, - "textRun": { - "content": " flutter:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23625 - }, - { - "endIndex": 23653, - "paragraph": { - "elements": [ - { - "endIndex": 23653, - "startIndex": 23636, - "textRun": { - "content": " sdk: flutter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23636 - }, - { - "endIndex": 23689, - "paragraph": { - "elements": [ - { - "endIndex": 23689, - "startIndex": 23653, - "textRun": { - "content": " plugin_platform_interface: ^2.0.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23653 - }, - { - "endIndex": 23690, - "paragraph": { - "elements": [ - { - "endIndex": 23690, - "startIndex": 23689, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23689 - }, - { - "endIndex": 23708, - "paragraph": { - "elements": [ - { - "endIndex": 23708, - "startIndex": 23690, - "textRun": { - "content": "dev_dependencies:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23690 - }, - { - "endIndex": 23724, - "paragraph": { - "elements": [ - { - "endIndex": 23724, - "startIndex": 23708, - "textRun": { - "content": " flutter_test:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23708 - }, - { - "endIndex": 23741, - "paragraph": { - "elements": [ - { - "endIndex": 23741, - "startIndex": 23724, - "textRun": { - "content": " sdk: flutter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23724 - }, - { - "endIndex": 23765, - "paragraph": { - "elements": [ - { - "endIndex": 23765, - "startIndex": 23741, - "textRun": { - "content": " flutter_lints: ^2.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23741 - }, - { - "endIndex": 23766, - "paragraph": { - "elements": [ - { - "endIndex": 23766, - "startIndex": 23765, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23765 - }, - { - "endIndex": 23775, - "paragraph": { - "elements": [ - { - "endIndex": 23775, - "startIndex": 23766, - "textRun": { - "content": "flutter:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23766 - }, - { - "endIndex": 23785, - "paragraph": { - "elements": [ - { - "endIndex": 23785, - "startIndex": 23775, - "textRun": { - "content": " plugin:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23775 - }, - { - "endIndex": 23800, - "paragraph": { - "elements": [ - { - "endIndex": 23800, - "startIndex": 23785, - "textRun": { - "content": " platforms:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23785 - }, - { - "endIndex": 23813, - "paragraph": { - "elements": [ - { - "endIndex": 23813, - "startIndex": 23800, - "textRun": { - "content": " linux:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23800 - }, - { - "endIndex": 23854, - "paragraph": { - "elements": [ - { - "endIndex": 23854, - "startIndex": 23813, - "textRun": { - "content": " pluginClass: WindowToFrontPlugin\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23813 - }, - { - "endIndex": 23867, - "paragraph": { - "elements": [ - { - "endIndex": 23867, - "startIndex": 23854, - "textRun": { - "content": " macos:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23854 - }, - { - "endIndex": 23908, - "paragraph": { - "elements": [ - { - "endIndex": 23908, - "startIndex": 23867, - "textRun": { - "content": " pluginClass: WindowToFrontPlugin\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23867 - }, - { - "endIndex": 23923, - "paragraph": { - "elements": [ - { - "endIndex": 23923, - "startIndex": 23908, - "textRun": { - "content": " windows:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23908 - }, - { - "endIndex": 23968, - "paragraph": { - "elements": [ - { - "endIndex": 23968, - "startIndex": 23923, - "textRun": { - "content": " pluginClass: WindowToFrontPluginCApi\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23923 - } - ], - "endIndex": 23968, - "startIndex": 23459, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 23970, - "paragraph": { - "elements": [ - { - "endIndex": 23970, - "startIndex": 23969, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23969 - }, - { - "endIndex": 24166, - "paragraph": { - "elements": [ - { - "endIndex": 23995, - "startIndex": 23970, - "textRun": { - "content": "This plugin is configured", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 24113, - "startIndex": 23995, - "textRun": { - "content": " for macOS, Linux and Windows. Now, you can add the Swift code that pops the Flutter application window forward. Edit ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 24152, - "startIndex": 24113, - "textRun": { - "content": "macos/Classes/WindowToFrontPlugin.swift", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24154, - "startIndex": 24152, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 24166, - "startIndex": 24154, - "textRun": { - "content": "as follows:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23970 - }, - { - "endIndex": 24225, - "paragraph": { - "elements": [ - { - "endIndex": 24224, - "startIndex": 24166, - "textRun": { - "content": "../window_to_front/macos/Classes/WindowToFrontPlugin.swift", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/window_to_front/macos/Classes/WindowToFrontPlugin.swift" - }, - "underline": true - } - } - }, - { - "endIndex": 24225, - "startIndex": 24224, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.gbdp4zvacbnx", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 24166 - }, - { - "endIndex": 24995, - "startIndex": 24225, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 24994, - "startIndex": 24226, - "tableCells": [ - { - "content": [ - { - "endIndex": 24241, - "paragraph": { - "elements": [ - { - "endIndex": 24241, - "startIndex": 24228, - "textRun": { - "content": "import Cocoa\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24228 - }, - { - "endIndex": 24261, - "paragraph": { - "elements": [ - { - "endIndex": 24261, - "startIndex": 24241, - "textRun": { - "content": "import FlutterMacOS\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24241 - }, - { - "endIndex": 24262, - "paragraph": { - "elements": [ - { - "endIndex": 24262, - "startIndex": 24261, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24261 - }, - { - "endIndex": 24322, - "paragraph": { - "elements": [ - { - "endIndex": 24322, - "startIndex": 24262, - "textRun": { - "content": "public class WindowToFrontPlugin: NSObject, FlutterPlugin {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24262 - }, - { - "endIndex": 24394, - "paragraph": { - "elements": [ - { - "endIndex": 24394, - "startIndex": 24322, - "textRun": { - "content": " public static func register(with registrar: FlutterPluginRegistrar) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24322 - }, - { - "endIndex": 24496, - "paragraph": { - "elements": [ - { - "endIndex": 24496, - "startIndex": 24394, - "textRun": { - "content": " let channel = FlutterMethodChannel(name: \"window_to_front\", binaryMessenger: registrar.messenger)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24394 - }, - { - "endIndex": 24537, - "paragraph": { - "elements": [ - { - "endIndex": 24537, - "startIndex": 24496, - "textRun": { - "content": " let instance = WindowToFrontPlugin()\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24496 - }, - { - "endIndex": 24601, - "paragraph": { - "elements": [ - { - "endIndex": 24601, - "startIndex": 24537, - "textRun": { - "content": " registrar.addMethodCallDelegate(instance, channel: channel)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24537 - }, - { - "endIndex": 24605, - "paragraph": { - "elements": [ - { - "endIndex": 24605, - "startIndex": 24601, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24601 - }, - { - "endIndex": 24606, - "paragraph": { - "elements": [ - { - "endIndex": 24606, - "startIndex": 24605, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24605 - }, - { - "endIndex": 24689, - "paragraph": { - "elements": [ - { - "endIndex": 24689, - "startIndex": 24606, - "textRun": { - "content": " public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24606 - }, - { - "endIndex": 24714, - "paragraph": { - "elements": [ - { - "endIndex": 24714, - "startIndex": 24689, - "textRun": { - "content": " switch call.method {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24689 - }, - { - "endIndex": 24735, - "paragraph": { - "elements": [ - { - "endIndex": 24718, - "startIndex": 24714, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24735, - "startIndex": 24718, - "textRun": { - "content": "// Add from here\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24714 - }, - { - "endIndex": 24756, - "paragraph": { - "elements": [ - { - "endIndex": 24739, - "startIndex": 24735, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24756, - "startIndex": 24739, - "textRun": { - "content": "case \"activate\":\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24735 - }, - { - "endIndex": 24817, - "paragraph": { - "elements": [ - { - "endIndex": 24817, - "startIndex": 24756, - "textRun": { - "content": " NSApplication.shared.activate(ignoringOtherApps: true)\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24756 - }, - { - "endIndex": 24835, - "paragraph": { - "elements": [ - { - "endIndex": 24835, - "startIndex": 24817, - "textRun": { - "content": " result(nil)\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24817 - }, - { - "endIndex": 24851, - "paragraph": { - "elements": [ - { - "endIndex": 24851, - "startIndex": 24835, - "textRun": { - "content": " // to here.\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24835 - }, - { - "endIndex": 24894, - "paragraph": { - "elements": [ - { - "endIndex": 24894, - "startIndex": 24851, - "textRun": { - "content": " // Delete the getPlatformVersion case,\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24851 - }, - { - "endIndex": 24927, - "paragraph": { - "elements": [ - { - "endIndex": 24927, - "startIndex": 24894, - "textRun": { - "content": " // as you won’t be using it.\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24894 - }, - { - "endIndex": 24940, - "paragraph": { - "elements": [ - { - "endIndex": 24940, - "startIndex": 24927, - "textRun": { - "content": " default:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24927 - }, - { - "endIndex": 24982, - "paragraph": { - "elements": [ - { - "endIndex": 24982, - "startIndex": 24940, - "textRun": { - "content": " result(FlutterMethodNotImplemented)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24940 - }, - { - "endIndex": 24988, - "paragraph": { - "elements": [ - { - "endIndex": 24988, - "startIndex": 24982, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24982 - }, - { - "endIndex": 24992, - "paragraph": { - "elements": [ - { - "endIndex": 24992, - "startIndex": 24988, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24988 - }, - { - "endIndex": 24994, - "paragraph": { - "elements": [ - { - "endIndex": 24994, - "startIndex": 24992, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24992 - } - ], - "endIndex": 24994, - "startIndex": 24227, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 24996, - "paragraph": { - "elements": [ - { - "endIndex": 24996, - "startIndex": 24995, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 24995 - }, - { - "endIndex": 25108, - "paragraph": { - "elements": [ - { - "endIndex": 25056, - "startIndex": 24996, - "textRun": { - "content": "To do the same in the Linux plugin, replace the contents of ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 25087, - "startIndex": 25056, - "textRun": { - "content": "linux/window_to_front_plugin.cc", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25108, - "startIndex": 25087, - "textRun": { - "content": " with the following:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 24996 - }, - { - "endIndex": 25159, - "paragraph": { - "elements": [ - { - "endIndex": 25158, - "startIndex": 25108, - "textRun": { - "content": "../window_to_front/linux/window_to_front_plugin.cc", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/window_to_front/linux/window_to_front_plugin.cc" - }, - "underline": true - } - } - }, - { - "endIndex": 25159, - "startIndex": 25158, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.gmudsp9ty2i4", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 25108 - }, - { - "endIndex": 27843, - "startIndex": 25159, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 27842, - "startIndex": 25160, - "tableCells": [ - { - "content": [ - { - "endIndex": 25222, - "paragraph": { - "elements": [ - { - "endIndex": 25222, - "startIndex": 25162, - "textRun": { - "content": "#include \"include/window_to_front/window_to_front_plugin.h\"\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25162 - }, - { - "endIndex": 25223, - "paragraph": { - "elements": [ - { - "endIndex": 25223, - "startIndex": 25222, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25222 - }, - { - "endIndex": 25264, - "paragraph": { - "elements": [ - { - "endIndex": 25264, - "startIndex": 25223, - "textRun": { - "content": "#include \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25223 - }, - { - "endIndex": 25285, - "paragraph": { - "elements": [ - { - "endIndex": 25285, - "startIndex": 25264, - "textRun": { - "content": "#include \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25264 - }, - { - "endIndex": 25310, - "paragraph": { - "elements": [ - { - "endIndex": 25310, - "startIndex": 25285, - "textRun": { - "content": "#include \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25285 - }, - { - "endIndex": 25311, - "paragraph": { - "elements": [ - { - "endIndex": 25311, - "startIndex": 25310, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25310 - }, - { - "endIndex": 25349, - "paragraph": { - "elements": [ - { - "endIndex": 25349, - "startIndex": 25311, - "textRun": { - "content": "#define WINDOW_TO_FRONT_PLUGIN(obj) \\\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25311 - }, - { - "endIndex": 25423, - "paragraph": { - "elements": [ - { - "endIndex": 25423, - "startIndex": 25349, - "textRun": { - "content": " (G_TYPE_CHECK_INSTANCE_CAST((obj), window_to_front_plugin_get_type(), \\\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25349 - }, - { - "endIndex": 25475, - "paragraph": { - "elements": [ - { - "endIndex": 25475, - "startIndex": 25423, - "textRun": { - "content": " WindowToFrontPlugin))\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25423 - }, - { - "endIndex": 25476, - "paragraph": { - "elements": [ - { - "endIndex": 25476, - "startIndex": 25475, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25475 - }, - { - "endIndex": 25506, - "paragraph": { - "elements": [ - { - "endIndex": 25506, - "startIndex": 25476, - "textRun": { - "content": "struct _WindowToFrontPlugin {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25476 - }, - { - "endIndex": 25533, - "paragraph": { - "elements": [ - { - "endIndex": 25533, - "startIndex": 25506, - "textRun": { - "content": " GObject parent_instance;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25506 - }, - { - "endIndex": 25534, - "paragraph": { - "elements": [ - { - "endIndex": 25534, - "startIndex": 25533, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25533 - }, - { - "endIndex": 25566, - "paragraph": { - "elements": [ - { - "endIndex": 25566, - "startIndex": 25534, - "textRun": { - "content": " FlPluginRegistrar* registrar;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25534 - }, - { - "endIndex": 25569, - "paragraph": { - "elements": [ - { - "endIndex": 25569, - "startIndex": 25566, - "textRun": { - "content": "};\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25566 - }, - { - "endIndex": 25570, - "paragraph": { - "elements": [ - { - "endIndex": 25570, - "startIndex": 25569, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25569 - }, - { - "endIndex": 25650, - "paragraph": { - "elements": [ - { - "endIndex": 25650, - "startIndex": 25570, - "textRun": { - "content": "G_DEFINE_TYPE(WindowToFrontPlugin, window_to_front_plugin, g_object_get_type())\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25570 - }, - { - "endIndex": 25651, - "paragraph": { - "elements": [ - { - "endIndex": 25651, - "startIndex": 25650, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25650 - }, - { - "endIndex": 25706, - "paragraph": { - "elements": [ - { - "endIndex": 25706, - "startIndex": 25651, - "textRun": { - "content": "// Called when a method call is received from Flutter.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25651 - }, - { - "endIndex": 25761, - "paragraph": { - "elements": [ - { - "endIndex": 25761, - "startIndex": 25706, - "textRun": { - "content": "static void window_to_front_plugin_handle_method_call(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25706 - }, - { - "endIndex": 25792, - "paragraph": { - "elements": [ - { - "endIndex": 25792, - "startIndex": 25761, - "textRun": { - "content": " WindowToFrontPlugin* self,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25761 - }, - { - "endIndex": 25825, - "paragraph": { - "elements": [ - { - "endIndex": 25825, - "startIndex": 25792, - "textRun": { - "content": " FlMethodCall* method_call) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25792 - }, - { - "endIndex": 25875, - "paragraph": { - "elements": [ - { - "endIndex": 25875, - "startIndex": 25825, - "textRun": { - "content": " g_autoptr(FlMethodResponse) response = nullptr;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25825 - }, - { - "endIndex": 25876, - "paragraph": { - "elements": [ - { - "endIndex": 25876, - "startIndex": 25875, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25875 - }, - { - "endIndex": 25938, - "paragraph": { - "elements": [ - { - "endIndex": 25938, - "startIndex": 25876, - "textRun": { - "content": " const gchar* method = fl_method_call_get_name(method_call);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25876 - }, - { - "endIndex": 25939, - "paragraph": { - "elements": [ - { - "endIndex": 25939, - "startIndex": 25938, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25938 - }, - { - "endIndex": 25980, - "paragraph": { - "elements": [ - { - "endIndex": 25980, - "startIndex": 25939, - "textRun": { - "content": " if (strcmp(method, \"activate\") == 0) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25939 - }, - { - "endIndex": 26046, - "paragraph": { - "elements": [ - { - "endIndex": 26046, - "startIndex": 25980, - "textRun": { - "content": " FlView* view = fl_plugin_registrar_get_view(self->registrar);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25980 - }, - { - "endIndex": 26073, - "paragraph": { - "elements": [ - { - "endIndex": 26073, - "startIndex": 26046, - "textRun": { - "content": " if (view != nullptr) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26046 - }, - { - "endIndex": 26154, - "paragraph": { - "elements": [ - { - "endIndex": 26154, - "startIndex": 26073, - "textRun": { - "content": " GtkWindow* window = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(view)));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26073 - }, - { - "endIndex": 26188, - "paragraph": { - "elements": [ - { - "endIndex": 26188, - "startIndex": 26154, - "textRun": { - "content": " gtk_window_present(window);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26154 - }, - { - "endIndex": 26194, - "paragraph": { - "elements": [ - { - "endIndex": 26194, - "startIndex": 26188, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26188 - }, - { - "endIndex": 26199, - "paragraph": { - "elements": [ - { - "endIndex": 26199, - "startIndex": 26194, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26194 - }, - { - "endIndex": 26275, - "paragraph": { - "elements": [ - { - "endIndex": 26275, - "startIndex": 26199, - "textRun": { - "content": " response = FL_METHOD_RESPONSE(fl_method_success_response_new(nullptr));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26199 - }, - { - "endIndex": 26286, - "paragraph": { - "elements": [ - { - "endIndex": 26286, - "startIndex": 26275, - "textRun": { - "content": " } else {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26275 - }, - { - "endIndex": 26363, - "paragraph": { - "elements": [ - { - "endIndex": 26363, - "startIndex": 26286, - "textRun": { - "content": " response = FL_METHOD_RESPONSE(fl_method_not_implemented_response_new());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26286 - }, - { - "endIndex": 26367, - "paragraph": { - "elements": [ - { - "endIndex": 26367, - "startIndex": 26363, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26363 - }, - { - "endIndex": 26368, - "paragraph": { - "elements": [ - { - "endIndex": 26368, - "startIndex": 26367, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26367 - }, - { - "endIndex": 26426, - "paragraph": { - "elements": [ - { - "endIndex": 26426, - "startIndex": 26368, - "textRun": { - "content": " fl_method_call_respond(method_call, response, nullptr);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26368 - }, - { - "endIndex": 26428, - "paragraph": { - "elements": [ - { - "endIndex": 26428, - "startIndex": 26426, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26426 - }, - { - "endIndex": 26429, - "paragraph": { - "elements": [ - { - "endIndex": 26429, - "startIndex": 26428, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26428 - }, - { - "endIndex": 26491, - "paragraph": { - "elements": [ - { - "endIndex": 26491, - "startIndex": 26429, - "textRun": { - "content": "static void window_to_front_plugin_dispose(GObject* object) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26429 - }, - { - "endIndex": 26563, - "paragraph": { - "elements": [ - { - "endIndex": 26563, - "startIndex": 26491, - "textRun": { - "content": " G_OBJECT_CLASS(window_to_front_plugin_parent_class)->dispose(object);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26491 - }, - { - "endIndex": 26565, - "paragraph": { - "elements": [ - { - "endIndex": 26565, - "startIndex": 26563, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26563 - }, - { - "endIndex": 26566, - "paragraph": { - "elements": [ - { - "endIndex": 26566, - "startIndex": 26565, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26565 - }, - { - "endIndex": 26647, - "paragraph": { - "elements": [ - { - "endIndex": 26647, - "startIndex": 26566, - "textRun": { - "content": "static void window_to_front_plugin_class_init(WindowToFrontPluginClass* klass) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26566 - }, - { - "endIndex": 26714, - "paragraph": { - "elements": [ - { - "endIndex": 26714, - "startIndex": 26647, - "textRun": { - "content": " G_OBJECT_CLASS(klass)->dispose = window_to_front_plugin_dispose;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26647 - }, - { - "endIndex": 26716, - "paragraph": { - "elements": [ - { - "endIndex": 26716, - "startIndex": 26714, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26714 - }, - { - "endIndex": 26717, - "paragraph": { - "elements": [ - { - "endIndex": 26717, - "startIndex": 26716, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26716 - }, - { - "endIndex": 26787, - "paragraph": { - "elements": [ - { - "endIndex": 26787, - "startIndex": 26717, - "textRun": { - "content": "static void window_to_front_plugin_init(WindowToFrontPlugin* self) {}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26717 - }, - { - "endIndex": 26788, - "paragraph": { - "elements": [ - { - "endIndex": 26788, - "startIndex": 26787, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26787 - }, - { - "endIndex": 26868, - "paragraph": { - "elements": [ - { - "endIndex": 26868, - "startIndex": 26788, - "textRun": { - "content": "static void method_call_cb(FlMethodChannel* channel, FlMethodCall* method_call,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26788 - }, - { - "endIndex": 26917, - "paragraph": { - "elements": [ - { - "endIndex": 26917, - "startIndex": 26868, - "textRun": { - "content": " gpointer user_data) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26868 - }, - { - "endIndex": 26984, - "paragraph": { - "elements": [ - { - "endIndex": 26984, - "startIndex": 26917, - "textRun": { - "content": " WindowToFrontPlugin* plugin = WINDOW_TO_FRONT_PLUGIN(user_data);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26917 - }, - { - "endIndex": 27050, - "paragraph": { - "elements": [ - { - "endIndex": 27050, - "startIndex": 26984, - "textRun": { - "content": " window_to_front_plugin_handle_method_call(plugin, method_call);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26984 - }, - { - "endIndex": 27052, - "paragraph": { - "elements": [ - { - "endIndex": 27052, - "startIndex": 27050, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27050 - }, - { - "endIndex": 27053, - "paragraph": { - "elements": [ - { - "endIndex": 27053, - "startIndex": 27052, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27052 - }, - { - "endIndex": 27137, - "paragraph": { - "elements": [ - { - "endIndex": 27137, - "startIndex": 27053, - "textRun": { - "content": "void window_to_front_plugin_register_with_registrar(FlPluginRegistrar* registrar) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27053 - }, - { - "endIndex": 27193, - "paragraph": { - "elements": [ - { - "endIndex": 27193, - "startIndex": 27137, - "textRun": { - "content": " WindowToFrontPlugin* plugin = WINDOW_TO_FRONT_PLUGIN(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27137 - }, - { - "endIndex": 27258, - "paragraph": { - "elements": [ - { - "endIndex": 27258, - "startIndex": 27193, - "textRun": { - "content": " g_object_new(window_to_front_plugin_get_type(), nullptr));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27193 - }, - { - "endIndex": 27259, - "paragraph": { - "elements": [ - { - "endIndex": 27259, - "startIndex": 27258, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27258 - }, - { - "endIndex": 27327, - "paragraph": { - "elements": [ - { - "endIndex": 27327, - "startIndex": 27259, - "textRun": { - "content": " plugin->registrar = FL_PLUGIN_REGISTRAR(g_object_ref(registrar));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27259 - }, - { - "endIndex": 27328, - "paragraph": { - "elements": [ - { - "endIndex": 27328, - "startIndex": 27327, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27327 - }, - { - "endIndex": 27403, - "paragraph": { - "elements": [ - { - "endIndex": 27403, - "startIndex": 27328, - "textRun": { - "content": " g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27328 - }, - { - "endIndex": 27442, - "paragraph": { - "elements": [ - { - "endIndex": 27442, - "startIndex": 27403, - "textRun": { - "content": " g_autoptr(FlMethodChannel) channel =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27403 - }, - { - "endIndex": 27516, - "paragraph": { - "elements": [ - { - "endIndex": 27516, - "startIndex": 27442, - "textRun": { - "content": " fl_method_channel_new(fl_plugin_registrar_get_messenger(registrar),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27442 - }, - { - "endIndex": 27563, - "paragraph": { - "elements": [ - { - "endIndex": 27563, - "startIndex": 27516, - "textRun": { - "content": " \"window_to_front\",\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27516 - }, - { - "endIndex": 27616, - "paragraph": { - "elements": [ - { - "endIndex": 27616, - "startIndex": 27563, - "textRun": { - "content": " FL_METHOD_CODEC(codec));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27563 - }, - { - "endIndex": 27685, - "paragraph": { - "elements": [ - { - "endIndex": 27685, - "startIndex": 27616, - "textRun": { - "content": " fl_method_channel_set_method_call_handler(channel, method_call_cb,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27616 - }, - { - "endIndex": 27751, - "paragraph": { - "elements": [ - { - "endIndex": 27751, - "startIndex": 27685, - "textRun": { - "content": " g_object_ref(plugin),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27685 - }, - { - "endIndex": 27812, - "paragraph": { - "elements": [ - { - "endIndex": 27812, - "startIndex": 27751, - "textRun": { - "content": " g_object_unref);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27751 - }, - { - "endIndex": 27813, - "paragraph": { - "elements": [ - { - "endIndex": 27813, - "startIndex": 27812, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27812 - }, - { - "endIndex": 27839, - "paragraph": { - "elements": [ - { - "endIndex": 27839, - "startIndex": 27813, - "textRun": { - "content": " g_object_unref(plugin);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27813 - }, - { - "endIndex": 27841, - "paragraph": { - "elements": [ - { - "endIndex": 27841, - "startIndex": 27839, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27839 - }, - { - "endIndex": 27842, - "paragraph": { - "elements": [ - { - "endIndex": 27842, - "startIndex": 27841, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 27841 - } - ], - "endIndex": 27842, - "startIndex": 25161, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 27844, - "paragraph": { - "elements": [ - { - "endIndex": 27844, - "startIndex": 27843, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 27843 - }, - { - "endIndex": 27960, - "paragraph": { - "elements": [ - { - "endIndex": 27906, - "startIndex": 27844, - "textRun": { - "content": "To do the same in the Windows plugin, replace the contents of ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 27939, - "startIndex": 27906, - "textRun": { - "content": "windows\\window_to_front_plugin.cc", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27960, - "startIndex": 27939, - "textRun": { - "content": " with the following:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 27844 - }, - { - "endIndex": 28014, - "paragraph": { - "elements": [ - { - "endIndex": 28013, - "startIndex": 27960, - "textRun": { - "content": "..\\window_to_front\\windows\\window_to_front_plugin.cpp", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/window_to_front/windows/window_to_front_plugin.cpp" - }, - "underline": true - } - } - }, - { - "endIndex": 28014, - "startIndex": 28013, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.v5bv9seg092z", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 27960 - }, - { - "endIndex": 30139, - "startIndex": 28014, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 30138, - "startIndex": 28015, - "tableCells": [ - { - "content": [ - { - "endIndex": 28053, - "paragraph": { - "elements": [ - { - "endIndex": 28053, - "startIndex": 28017, - "textRun": { - "content": "#include \"window_to_front_plugin.h\"\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28017 - }, - { - "endIndex": 28054, - "paragraph": { - "elements": [ - { - "endIndex": 28054, - "startIndex": 28053, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28053 - }, - { - "endIndex": 28114, - "paragraph": { - "elements": [ - { - "endIndex": 28114, - "startIndex": 28054, - "textRun": { - "content": "// This must be included before many other Windows headers.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28054 - }, - { - "endIndex": 28135, - "paragraph": { - "elements": [ - { - "endIndex": 28135, - "startIndex": 28114, - "textRun": { - "content": "#include \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28114 - }, - { - "endIndex": 28136, - "paragraph": { - "elements": [ - { - "endIndex": 28136, - "startIndex": 28135, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28135 - }, - { - "endIndex": 28172, - "paragraph": { - "elements": [ - { - "endIndex": 28172, - "startIndex": 28136, - "textRun": { - "content": "#include \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28136 - }, - { - "endIndex": 28218, - "paragraph": { - "elements": [ - { - "endIndex": 28218, - "startIndex": 28172, - "textRun": { - "content": "#include \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28172 - }, - { - "endIndex": 28261, - "paragraph": { - "elements": [ - { - "endIndex": 28261, - "startIndex": 28218, - "textRun": { - "content": "#include \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28218 - }, - { - "endIndex": 28262, - "paragraph": { - "elements": [ - { - "endIndex": 28262, - "startIndex": 28261, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28261 - }, - { - "endIndex": 28280, - "paragraph": { - "elements": [ - { - "endIndex": 28280, - "startIndex": 28262, - "textRun": { - "content": "#include \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28262 - }, - { - "endIndex": 28281, - "paragraph": { - "elements": [ - { - "endIndex": 28281, - "startIndex": 28280, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28280 - }, - { - "endIndex": 28309, - "paragraph": { - "elements": [ - { - "endIndex": 28309, - "startIndex": 28281, - "textRun": { - "content": "namespace window_to_front {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28281 - }, - { - "endIndex": 28310, - "paragraph": { - "elements": [ - { - "endIndex": 28310, - "startIndex": 28309, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28309 - }, - { - "endIndex": 28320, - "paragraph": { - "elements": [ - { - "endIndex": 28320, - "startIndex": 28310, - "textRun": { - "content": "// static\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28310 - }, - { - "endIndex": 28369, - "paragraph": { - "elements": [ - { - "endIndex": 28369, - "startIndex": 28320, - "textRun": { - "content": "void WindowToFrontPlugin::RegisterWithRegistrar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28320 - }, - { - "endIndex": 28419, - "paragraph": { - "elements": [ - { - "endIndex": 28419, - "startIndex": 28369, - "textRun": { - "content": " flutter::PluginRegistrarWindows *registrar) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28369 - }, - { - "endIndex": 28436, - "paragraph": { - "elements": [ - { - "endIndex": 28436, - "startIndex": 28419, - "textRun": { - "content": " auto channel =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28419 - }, - { - "endIndex": 28509, - "paragraph": { - "elements": [ - { - "endIndex": 28509, - "startIndex": 28436, - "textRun": { - "content": " std::make_unique>(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28436 - }, - { - "endIndex": 28562, - "paragraph": { - "elements": [ - { - "endIndex": 28562, - "startIndex": 28509, - "textRun": { - "content": " registrar->messenger(), \"window_to_front\",\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28509 - }, - { - "endIndex": 28619, - "paragraph": { - "elements": [ - { - "endIndex": 28619, - "startIndex": 28562, - "textRun": { - "content": " &flutter::StandardMethodCodec::GetInstance());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28562 - }, - { - "endIndex": 28620, - "paragraph": { - "elements": [ - { - "endIndex": 28620, - "startIndex": 28619, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28619 - }, - { - "endIndex": 28686, - "paragraph": { - "elements": [ - { - "endIndex": 28686, - "startIndex": 28620, - "textRun": { - "content": " auto plugin = std::make_unique(registrar);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28620 - }, - { - "endIndex": 28687, - "paragraph": { - "elements": [ - { - "endIndex": 28687, - "startIndex": 28686, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28686 - }, - { - "endIndex": 28720, - "paragraph": { - "elements": [ - { - "endIndex": 28720, - "startIndex": 28687, - "textRun": { - "content": " channel->SetMethodCallHandler(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28687 - }, - { - "endIndex": 28791, - "paragraph": { - "elements": [ - { - "endIndex": 28791, - "startIndex": 28720, - "textRun": { - "content": " [plugin_pointer = plugin.get()](const auto &call, auto result) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28720 - }, - { - "endIndex": 28858, - "paragraph": { - "elements": [ - { - "endIndex": 28858, - "startIndex": 28791, - "textRun": { - "content": " plugin_pointer->HandleMethodCall(call, std::move(result));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28791 - }, - { - "endIndex": 28868, - "paragraph": { - "elements": [ - { - "endIndex": 28868, - "startIndex": 28858, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28858 - }, - { - "endIndex": 28869, - "paragraph": { - "elements": [ - { - "endIndex": 28869, - "startIndex": 28868, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28868 - }, - { - "endIndex": 28912, - "paragraph": { - "elements": [ - { - "endIndex": 28912, - "startIndex": 28869, - "textRun": { - "content": " registrar->AddPlugin(std::move(plugin));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28869 - }, - { - "endIndex": 28914, - "paragraph": { - "elements": [ - { - "endIndex": 28914, - "startIndex": 28912, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28912 - }, - { - "endIndex": 28915, - "paragraph": { - "elements": [ - { - "endIndex": 28915, - "startIndex": 28914, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28914 - }, - { - "endIndex": 29001, - "paragraph": { - "elements": [ - { - "endIndex": 29001, - "startIndex": 28915, - "textRun": { - "content": "WindowToFrontPlugin::WindowToFrontPlugin(flutter::PluginRegistrarWindows *registrar) \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 28915 - }, - { - "endIndex": 29030, - "paragraph": { - "elements": [ - { - "endIndex": 29030, - "startIndex": 29001, - "textRun": { - "content": " : registrar_(registrar) {}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29001 - }, - { - "endIndex": 29031, - "paragraph": { - "elements": [ - { - "endIndex": 29031, - "startIndex": 29030, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29030 - }, - { - "endIndex": 29078, - "paragraph": { - "elements": [ - { - "endIndex": 29078, - "startIndex": 29031, - "textRun": { - "content": "WindowToFrontPlugin::~WindowToFrontPlugin() {}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29031 - }, - { - "endIndex": 29079, - "paragraph": { - "elements": [ - { - "endIndex": 29079, - "startIndex": 29078, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29078 - }, - { - "endIndex": 29123, - "paragraph": { - "elements": [ - { - "endIndex": 29123, - "startIndex": 29079, - "textRun": { - "content": "void WindowToFrontPlugin::HandleMethodCall(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29079 - }, - { - "endIndex": 29192, - "paragraph": { - "elements": [ - { - "endIndex": 29192, - "startIndex": 29123, - "textRun": { - "content": " const flutter::MethodCall &method_call,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29123 - }, - { - "endIndex": 29270, - "paragraph": { - "elements": [ - { - "endIndex": 29270, - "startIndex": 29192, - "textRun": { - "content": " std::unique_ptr> result) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29192 - }, - { - "endIndex": 29330, - "paragraph": { - "elements": [ - { - "endIndex": 29330, - "startIndex": 29270, - "textRun": { - "content": " if (method_call.method_name().compare(\"activate\") == 0) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29270 - }, - { - "endIndex": 29413, - "paragraph": { - "elements": [ - { - "endIndex": 29413, - "startIndex": 29330, - "textRun": { - "content": " // See https://stackoverflow.com/a/34414846/2142626 for an explanation of how \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29330 - }, - { - "endIndex": 29461, - "paragraph": { - "elements": [ - { - "endIndex": 29461, - "startIndex": 29413, - "textRun": { - "content": " // this raises a window to the foreground. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29413 - }, - { - "endIndex": 29521, - "paragraph": { - "elements": [ - { - "endIndex": 29521, - "startIndex": 29461, - "textRun": { - "content": " HWND m_hWnd = registrar_->GetView()->GetNativeWindow();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29461 - }, - { - "endIndex": 29565, - "paragraph": { - "elements": [ - { - "endIndex": 29565, - "startIndex": 29521, - "textRun": { - "content": " HWND hCurWnd = ::GetForegroundWindow();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29521 - }, - { - "endIndex": 29608, - "paragraph": { - "elements": [ - { - "endIndex": 29608, - "startIndex": 29565, - "textRun": { - "content": " DWORD dwMyID = ::GetCurrentThreadId();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29565 - }, - { - "endIndex": 29671, - "paragraph": { - "elements": [ - { - "endIndex": 29671, - "startIndex": 29608, - "textRun": { - "content": " DWORD dwCurID = ::GetWindowThreadProcessId(hCurWnd, NULL);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29608 - }, - { - "endIndex": 29719, - "paragraph": { - "elements": [ - { - "endIndex": 29719, - "startIndex": 29671, - "textRun": { - "content": " ::AttachThreadInput(dwCurID, dwMyID, TRUE);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29671 - }, - { - "endIndex": 29798, - "paragraph": { - "elements": [ - { - "endIndex": 29798, - "startIndex": 29719, - "textRun": { - "content": " ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29719 - }, - { - "endIndex": 29896, - "paragraph": { - "elements": [ - { - "endIndex": 29896, - "startIndex": 29798, - "textRun": { - "content": " ::SetWindowPos(m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29798 - }, - { - "endIndex": 29931, - "paragraph": { - "elements": [ - { - "endIndex": 29931, - "startIndex": 29896, - "textRun": { - "content": " ::SetForegroundWindow(m_hWnd);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29896 - }, - { - "endIndex": 29955, - "paragraph": { - "elements": [ - { - "endIndex": 29955, - "startIndex": 29931, - "textRun": { - "content": " ::SetFocus(m_hWnd);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29931 - }, - { - "endIndex": 29986, - "paragraph": { - "elements": [ - { - "endIndex": 29986, - "startIndex": 29955, - "textRun": { - "content": " ::SetActiveWindow(m_hWnd);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29955 - }, - { - "endIndex": 30035, - "paragraph": { - "elements": [ - { - "endIndex": 30035, - "startIndex": 29986, - "textRun": { - "content": " ::AttachThreadInput(dwCurID, dwMyID, FALSE);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 29986 - }, - { - "endIndex": 30058, - "paragraph": { - "elements": [ - { - "endIndex": 30058, - "startIndex": 30035, - "textRun": { - "content": " result->Success();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30035 - }, - { - "endIndex": 30069, - "paragraph": { - "elements": [ - { - "endIndex": 30069, - "startIndex": 30058, - "textRun": { - "content": " } else {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30058 - }, - { - "endIndex": 30099, - "paragraph": { - "elements": [ - { - "endIndex": 30099, - "startIndex": 30069, - "textRun": { - "content": " result->NotImplemented();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30069 - }, - { - "endIndex": 30103, - "paragraph": { - "elements": [ - { - "endIndex": 30103, - "startIndex": 30099, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30099 - }, - { - "endIndex": 30105, - "paragraph": { - "elements": [ - { - "endIndex": 30105, - "startIndex": 30103, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30103 - }, - { - "endIndex": 30106, - "paragraph": { - "elements": [ - { - "endIndex": 30106, - "startIndex": 30105, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30105 - }, - { - "endIndex": 30138, - "paragraph": { - "elements": [ - { - "endIndex": 30138, - "startIndex": 30106, - "textRun": { - "content": "} // namespace window_to_front\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30106 - } - ], - "endIndex": 30138, - "startIndex": 28016, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 30140, - "paragraph": { - "elements": [ - { - "endIndex": 30140, - "startIndex": 30139, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30139 - }, - { - "endIndex": 30225, - "paragraph": { - "elements": [ - { - "endIndex": 30172, - "startIndex": 30140, - "textRun": { - "content": "And the contents of contents of ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 30204, - "startIndex": 30172, - "textRun": { - "content": "windows\\window_to_front_plugin.h", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30225, - "startIndex": 30204, - "textRun": { - "content": " with the following:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 30140 - }, - { - "endIndex": 30277, - "paragraph": { - "elements": [ - { - "endIndex": 30276, - "startIndex": 30225, - "textRun": { - "content": "..\\window_to_front\\windows\\window_to_front_plugin.h", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/window_to_front/windows/window_to_front_plugin.h" - }, - "underline": true - } - } - }, - { - "endIndex": 30277, - "startIndex": 30276, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.t2c94s1xc1c9", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 30225 - }, - { - "endIndex": 31377, - "startIndex": 30277, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 31376, - "startIndex": 30278, - "tableCells": [ - { - "content": [ - { - "endIndex": 30329, - "paragraph": { - "elements": [ - { - "endIndex": 30329, - "startIndex": 30280, - "textRun": { - "content": "#ifndef FLUTTER_PLUGIN_WINDOW_TO_FRONT_PLUGIN_H_\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30280 - }, - { - "endIndex": 30378, - "paragraph": { - "elements": [ - { - "endIndex": 30378, - "startIndex": 30329, - "textRun": { - "content": "#define FLUTTER_PLUGIN_WINDOW_TO_FRONT_PLUGIN_H_\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30329 - }, - { - "endIndex": 30379, - "paragraph": { - "elements": [ - { - "endIndex": 30379, - "startIndex": 30378, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30378 - }, - { - "endIndex": 30415, - "paragraph": { - "elements": [ - { - "endIndex": 30415, - "startIndex": 30379, - "textRun": { - "content": "#include \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30379 - }, - { - "endIndex": 30461, - "paragraph": { - "elements": [ - { - "endIndex": 30461, - "startIndex": 30415, - "textRun": { - "content": "#include \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30415 - }, - { - "endIndex": 30462, - "paragraph": { - "elements": [ - { - "endIndex": 30462, - "startIndex": 30461, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30461 - }, - { - "endIndex": 30480, - "paragraph": { - "elements": [ - { - "endIndex": 30480, - "startIndex": 30462, - "textRun": { - "content": "#include \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30462 - }, - { - "endIndex": 30481, - "paragraph": { - "elements": [ - { - "endIndex": 30481, - "startIndex": 30480, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30480 - }, - { - "endIndex": 30509, - "paragraph": { - "elements": [ - { - "endIndex": 30509, - "startIndex": 30481, - "textRun": { - "content": "namespace window_to_front {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30481 - }, - { - "endIndex": 30510, - "paragraph": { - "elements": [ - { - "endIndex": 30510, - "startIndex": 30509, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30509 - }, - { - "endIndex": 30563, - "paragraph": { - "elements": [ - { - "endIndex": 30563, - "startIndex": 30510, - "textRun": { - "content": "class WindowToFrontPlugin : public flutter::Plugin {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30510 - }, - { - "endIndex": 30572, - "paragraph": { - "elements": [ - { - "endIndex": 30572, - "startIndex": 30563, - "textRun": { - "content": " public:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30563 - }, - { - "endIndex": 30653, - "paragraph": { - "elements": [ - { - "endIndex": 30653, - "startIndex": 30572, - "textRun": { - "content": " static void RegisterWithRegistrar(flutter::PluginRegistrarWindows *registrar);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30572 - }, - { - "endIndex": 30654, - "paragraph": { - "elements": [ - { - "endIndex": 30654, - "startIndex": 30653, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30653 - }, - { - "endIndex": 30721, - "paragraph": { - "elements": [ - { - "endIndex": 30721, - "startIndex": 30654, - "textRun": { - "content": " WindowToFrontPlugin(flutter::PluginRegistrarWindows *registrar);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30654 - }, - { - "endIndex": 30722, - "paragraph": { - "elements": [ - { - "endIndex": 30722, - "startIndex": 30721, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30721 - }, - { - "endIndex": 30756, - "paragraph": { - "elements": [ - { - "endIndex": 30756, - "startIndex": 30722, - "textRun": { - "content": " virtual ~WindowToFrontPlugin();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30722 - }, - { - "endIndex": 30757, - "paragraph": { - "elements": [ - { - "endIndex": 30757, - "startIndex": 30756, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30756 - }, - { - "endIndex": 30788, - "paragraph": { - "elements": [ - { - "endIndex": 30788, - "startIndex": 30757, - "textRun": { - "content": " // Disallow copy and assign.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30757 - }, - { - "endIndex": 30848, - "paragraph": { - "elements": [ - { - "endIndex": 30848, - "startIndex": 30788, - "textRun": { - "content": " WindowToFrontPlugin(const WindowToFrontPlugin&) = delete;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30788 - }, - { - "endIndex": 30919, - "paragraph": { - "elements": [ - { - "endIndex": 30919, - "startIndex": 30848, - "textRun": { - "content": " WindowToFrontPlugin& operator=(const WindowToFrontPlugin&) = delete;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30848 - }, - { - "endIndex": 30920, - "paragraph": { - "elements": [ - { - "endIndex": 30920, - "startIndex": 30919, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30919 - }, - { - "endIndex": 30930, - "paragraph": { - "elements": [ - { - "endIndex": 30930, - "startIndex": 30920, - "textRun": { - "content": " private:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30920 - }, - { - "endIndex": 31002, - "paragraph": { - "elements": [ - { - "endIndex": 31002, - "startIndex": 30930, - "textRun": { - "content": " // Called when a method is called on this plugin's channel from Dart.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 30930 - }, - { - "endIndex": 31027, - "paragraph": { - "elements": [ - { - "endIndex": 31027, - "startIndex": 31002, - "textRun": { - "content": " void HandleMethodCall(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31002 - }, - { - "endIndex": 31098, - "paragraph": { - "elements": [ - { - "endIndex": 31098, - "startIndex": 31027, - "textRun": { - "content": " const flutter::MethodCall &method_call,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31027 - }, - { - "endIndex": 31177, - "paragraph": { - "elements": [ - { - "endIndex": 31177, - "startIndex": 31098, - "textRun": { - "content": " std::unique_ptr> result);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31098 - }, - { - "endIndex": 31178, - "paragraph": { - "elements": [ - { - "endIndex": 31178, - "startIndex": 31177, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31177 - }, - { - "endIndex": 31240, - "paragraph": { - "elements": [ - { - "endIndex": 31240, - "startIndex": 31178, - "textRun": { - "content": " // The registrar for this plugin, for accessing the window.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31178 - }, - { - "endIndex": 31287, - "paragraph": { - "elements": [ - { - "endIndex": 31287, - "startIndex": 31240, - "textRun": { - "content": " flutter::PluginRegistrarWindows *registrar_;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31240 - }, - { - "endIndex": 31290, - "paragraph": { - "elements": [ - { - "endIndex": 31290, - "startIndex": 31287, - "textRun": { - "content": "};\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31287 - }, - { - "endIndex": 31291, - "paragraph": { - "elements": [ - { - "endIndex": 31291, - "startIndex": 31290, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31290 - }, - { - "endIndex": 31323, - "paragraph": { - "elements": [ - { - "endIndex": 31323, - "startIndex": 31291, - "textRun": { - "content": "} // namespace window_to_front\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31291 - }, - { - "endIndex": 31324, - "paragraph": { - "elements": [ - { - "endIndex": 31324, - "startIndex": 31323, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31323 - }, - { - "endIndex": 31376, - "paragraph": { - "elements": [ - { - "endIndex": 31376, - "startIndex": 31324, - "textRun": { - "content": "#endif // FLUTTER_PLUGIN_WINDOW_TO_FRONT_PLUGIN_H_\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31324 - } - ], - "endIndex": 31376, - "startIndex": 30279, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 31378, - "paragraph": { - "elements": [ - { - "endIndex": 31378, - "startIndex": 31377, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31377 - }, - { - "endIndex": 31592, - "paragraph": { - "elements": [ - { - "endIndex": 31382, - "startIndex": 31378, - "textRun": { - "content": "Add ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 31541, - "startIndex": 31382, - "textRun": { - "content": "the code to make the native functionality we created above available to the world of Flutter. First up, edit the window to front platform interface and add an ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 31551, - "startIndex": 31541, - "textRun": { - "content": "activate()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 31592, - "startIndex": 31551, - "textRun": { - "content": " method, with a fallback implementation.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31378 - }, - { - "endIndex": 31655, - "paragraph": { - "elements": [ - { - "endIndex": 31654, - "startIndex": 31592, - "textRun": { - "content": "../window_to_front/lib/window_to_front_platform_interface.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/window_to_front/lib/window_to_front_platform_interface.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 31655, - "startIndex": 31654, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.k1mv0ddt12dk", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 31592 - }, - { - "endIndex": 32722, - "startIndex": 31655, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 32721, - "startIndex": 31656, - "tableCells": [ - { - "content": [ - { - "endIndex": 31733, - "paragraph": { - "elements": [ - { - "endIndex": 31733, - "startIndex": 31658, - "textRun": { - "content": "import 'package:plugin_platform_interface/plugin_platform_interface.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31658 - }, - { - "endIndex": 31734, - "paragraph": { - "elements": [ - { - "endIndex": 31734, - "startIndex": 31733, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31733 - }, - { - "endIndex": 31780, - "paragraph": { - "elements": [ - { - "endIndex": 31780, - "startIndex": 31734, - "textRun": { - "content": "import 'window_to_front_method_channel.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31734 - }, - { - "endIndex": 31781, - "paragraph": { - "elements": [ - { - "endIndex": 31781, - "startIndex": 31780, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31780 - }, - { - "endIndex": 31846, - "paragraph": { - "elements": [ - { - "endIndex": 31846, - "startIndex": 31781, - "textRun": { - "content": "abstract class WindowToFrontPlatform extends PlatformInterface {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31781 - }, - { - "endIndex": 31888, - "paragraph": { - "elements": [ - { - "endIndex": 31888, - "startIndex": 31846, - "textRun": { - "content": " /// Constructs a WindowToFrontPlatform.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31846 - }, - { - "endIndex": 31938, - "paragraph": { - "elements": [ - { - "endIndex": 31938, - "startIndex": 31888, - "textRun": { - "content": " WindowToFrontPlatform() : super(token: _token);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31888 - }, - { - "endIndex": 31939, - "paragraph": { - "elements": [ - { - "endIndex": 31939, - "startIndex": 31938, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31938 - }, - { - "endIndex": 31980, - "paragraph": { - "elements": [ - { - "endIndex": 31980, - "startIndex": 31939, - "textRun": { - "content": " static final Object _token = Object();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31939 - }, - { - "endIndex": 31981, - "paragraph": { - "elements": [ - { - "endIndex": 31981, - "startIndex": 31980, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31980 - }, - { - "endIndex": 32054, - "paragraph": { - "elements": [ - { - "endIndex": 32054, - "startIndex": 31981, - "textRun": { - "content": " static WindowToFrontPlatform _instance = MethodChannelWindowToFront();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31981 - }, - { - "endIndex": 32055, - "paragraph": { - "elements": [ - { - "endIndex": 32055, - "startIndex": 32054, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32054 - }, - { - "endIndex": 32117, - "paragraph": { - "elements": [ - { - "endIndex": 32117, - "startIndex": 32055, - "textRun": { - "content": " /// The default instance of [WindowToFrontPlatform] to use.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32055 - }, - { - "endIndex": 32123, - "paragraph": { - "elements": [ - { - "endIndex": 32123, - "startIndex": 32117, - "textRun": { - "content": " ///\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32117 - }, - { - "endIndex": 32171, - "paragraph": { - "elements": [ - { - "endIndex": 32171, - "startIndex": 32123, - "textRun": { - "content": " /// Defaults to [MethodChannelWindowToFront].\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32123 - }, - { - "endIndex": 32229, - "paragraph": { - "elements": [ - { - "endIndex": 32229, - "startIndex": 32171, - "textRun": { - "content": " static WindowToFrontPlatform get instance => _instance;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32171 - }, - { - "endIndex": 32230, - "paragraph": { - "elements": [ - { - "endIndex": 32230, - "startIndex": 32229, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32229 - }, - { - "endIndex": 32301, - "paragraph": { - "elements": [ - { - "endIndex": 32301, - "startIndex": 32230, - "textRun": { - "content": " /// Platform-specific implementations should set this with their own\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32230 - }, - { - "endIndex": 32373, - "paragraph": { - "elements": [ - { - "endIndex": 32373, - "startIndex": 32301, - "textRun": { - "content": " /// platform-specific class that extends [WindowToFrontPlatform] when\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32301 - }, - { - "endIndex": 32405, - "paragraph": { - "elements": [ - { - "endIndex": 32405, - "startIndex": 32373, - "textRun": { - "content": " /// they register themselves.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32373 - }, - { - "endIndex": 32461, - "paragraph": { - "elements": [ - { - "endIndex": 32461, - "startIndex": 32405, - "textRun": { - "content": " static set instance(WindowToFrontPlatform instance) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32405 - }, - { - "endIndex": 32514, - "paragraph": { - "elements": [ - { - "endIndex": 32514, - "startIndex": 32461, - "textRun": { - "content": " PlatformInterface.verifyToken(instance, _token);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32461 - }, - { - "endIndex": 32540, - "paragraph": { - "elements": [ - { - "endIndex": 32540, - "startIndex": 32514, - "textRun": { - "content": " _instance = instance;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32514 - }, - { - "endIndex": 32544, - "paragraph": { - "elements": [ - { - "endIndex": 32544, - "startIndex": 32540, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32540 - }, - { - "endIndex": 32545, - "paragraph": { - "elements": [ - { - "endIndex": 32545, - "startIndex": 32544, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32544 - }, - { - "endIndex": 32616, - "paragraph": { - "elements": [ - { - "endIndex": 32616, - "startIndex": 32545, - "textRun": { - "content": " // Replace getPlatformVersion() with the following activate() method\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32545 - }, - { - "endIndex": 32644, - "paragraph": { - "elements": [ - { - "endIndex": 32644, - "startIndex": 32616, - "textRun": { - "content": " Future activate() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32616 - }, - { - "endIndex": 32714, - "paragraph": { - "elements": [ - { - "endIndex": 32714, - "startIndex": 32644, - "textRun": { - "content": " throw UnimplementedError('activate() has not been implemented.');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32644 - }, - { - "endIndex": 32718, - "paragraph": { - "elements": [ - { - "endIndex": 32718, - "startIndex": 32714, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32714 - }, - { - "endIndex": 32720, - "paragraph": { - "elements": [ - { - "endIndex": 32720, - "startIndex": 32718, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32718 - }, - { - "endIndex": 32721, - "paragraph": { - "elements": [ - { - "endIndex": 32721, - "startIndex": 32720, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32720 - } - ], - "endIndex": 32721, - "startIndex": 31657, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 32723, - "paragraph": { - "elements": [ - { - "endIndex": 32723, - "startIndex": 32722, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32722 - }, - { - "endIndex": 32813, - "paragraph": { - "elements": [ - { - "endIndex": 32813, - "startIndex": 32723, - "textRun": { - "content": "Next, provide a method channel implementation of the window to front platform interface. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32723 - }, - { - "endIndex": 32872, - "paragraph": { - "elements": [ - { - "endIndex": 32871, - "startIndex": 32813, - "textRun": { - "content": "../window_to_front/lib/window_to_front_method_channel.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/window_to_front/lib/window_to_front_method_channel.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 32872, - "startIndex": 32871, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.wwx3pmhk2p6j", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 32813 - }, - { - "endIndex": 33480, - "startIndex": 32872, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 33479, - "startIndex": 32873, - "tableCells": [ - { - "content": [ - { - "endIndex": 32917, - "paragraph": { - "elements": [ - { - "endIndex": 32917, - "startIndex": 32875, - "textRun": { - "content": "import 'package:flutter/foundation.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32875 - }, - { - "endIndex": 32957, - "paragraph": { - "elements": [ - { - "endIndex": 32957, - "startIndex": 32917, - "textRun": { - "content": "import 'package:flutter/services.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32917 - }, - { - "endIndex": 32958, - "paragraph": { - "elements": [ - { - "endIndex": 32958, - "startIndex": 32957, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32957 - }, - { - "endIndex": 33008, - "paragraph": { - "elements": [ - { - "endIndex": 33008, - "startIndex": 32958, - "textRun": { - "content": "import 'window_to_front_platform_interface.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32958 - }, - { - "endIndex": 33009, - "paragraph": { - "elements": [ - { - "endIndex": 33009, - "startIndex": 33008, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33008 - }, - { - "endIndex": 33085, - "paragraph": { - "elements": [ - { - "endIndex": 33085, - "startIndex": 33009, - "textRun": { - "content": "/// An implementation of [WindowToFrontPlatform] that uses method channels.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33009 - }, - { - "endIndex": 33150, - "paragraph": { - "elements": [ - { - "endIndex": 33150, - "startIndex": 33085, - "textRun": { - "content": "class MethodChannelWindowToFront extends WindowToFrontPlatform {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33085 - }, - { - "endIndex": 33218, - "paragraph": { - "elements": [ - { - "endIndex": 33218, - "startIndex": 33150, - "textRun": { - "content": " /// The method channel used to interact with the native platform.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33150 - }, - { - "endIndex": 33239, - "paragraph": { - "elements": [ - { - "endIndex": 33239, - "startIndex": 33218, - "textRun": { - "content": " @visibleForTesting\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33218 - }, - { - "endIndex": 33303, - "paragraph": { - "elements": [ - { - "endIndex": 33303, - "startIndex": 33239, - "textRun": { - "content": " final methodChannel = const MethodChannel('window_to_front');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33239 - }, - { - "endIndex": 33304, - "paragraph": { - "elements": [ - { - "endIndex": 33304, - "startIndex": 33303, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33303 - }, - { - "endIndex": 33376, - "paragraph": { - "elements": [ - { - "endIndex": 33376, - "startIndex": 33304, - "textRun": { - "content": " // Replace the getPlatformVersion() with the following implementation\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33304 - }, - { - "endIndex": 33388, - "paragraph": { - "elements": [ - { - "endIndex": 33388, - "startIndex": 33376, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33376 - }, - { - "endIndex": 33422, - "paragraph": { - "elements": [ - { - "endIndex": 33422, - "startIndex": 33388, - "textRun": { - "content": " Future activate() async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33388 - }, - { - "endIndex": 33473, - "paragraph": { - "elements": [ - { - "endIndex": 33473, - "startIndex": 33422, - "textRun": { - "content": " return methodChannel.invokeMethod('activate');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33422 - }, - { - "endIndex": 33477, - "paragraph": { - "elements": [ - { - "endIndex": 33477, - "startIndex": 33473, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33473 - }, - { - "endIndex": 33479, - "paragraph": { - "elements": [ - { - "endIndex": 33479, - "startIndex": 33477, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33477 - } - ], - "endIndex": 33479, - "startIndex": 32874, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 33481, - "paragraph": { - "elements": [ - { - "endIndex": 33481, - "startIndex": 33480, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33480 - }, - { - "endIndex": 33553, - "paragraph": { - "elements": [ - { - "endIndex": 33553, - "startIndex": 33481, - "textRun": { - "content": "Finally, expose the window to front functionality for the world to use.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33481 - }, - { - "endIndex": 33597, - "paragraph": { - "elements": [ - { - "endIndex": 33596, - "startIndex": 33553, - "textRun": { - "content": "../window_to_front/lib/window_to_front.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/window_to_front/lib/window_to_front.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 33597, - "startIndex": 33596, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.256mq4cjvaas", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 33553 - }, - { - "endIndex": 33843, - "startIndex": 33597, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 33842, - "startIndex": 33598, - "tableCells": [ - { - "content": [ - { - "endIndex": 33650, - "paragraph": { - "elements": [ - { - "endIndex": 33650, - "startIndex": 33600, - "textRun": { - "content": "import 'window_to_front_platform_interface.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33600 - }, - { - "endIndex": 33651, - "paragraph": { - "elements": [ - { - "endIndex": 33651, - "startIndex": 33650, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33650 - }, - { - "endIndex": 33673, - "paragraph": { - "elements": [ - { - "endIndex": 33673, - "startIndex": 33651, - "textRun": { - "content": "class WindowToFront {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33651 - }, - { - "endIndex": 33747, - "paragraph": { - "elements": [ - { - "endIndex": 33747, - "startIndex": 33673, - "textRun": { - "content": " // Remove the getPlatformVersion() implementation and add the following\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33673 - }, - { - "endIndex": 33782, - "paragraph": { - "elements": [ - { - "endIndex": 33782, - "startIndex": 33747, - "textRun": { - "content": " static Future activate() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33747 - }, - { - "endIndex": 33836, - "paragraph": { - "elements": [ - { - "endIndex": 33836, - "startIndex": 33782, - "textRun": { - "content": " return WindowToFrontPlatform.instance.activate();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33782 - }, - { - "endIndex": 33840, - "paragraph": { - "elements": [ - { - "endIndex": 33840, - "startIndex": 33836, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33836 - }, - { - "endIndex": 33842, - "paragraph": { - "elements": [ - { - "endIndex": 33842, - "startIndex": 33840, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33840 - } - ], - "endIndex": 33842, - "startIndex": 33599, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 33844, - "paragraph": { - "elements": [ - { - "endIndex": 33844, - "startIndex": 33843, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 33843 - }, - { - "endIndex": 33845, - "paragraph": { - "elements": [ - { - "endIndex": 33845, - "startIndex": 33844, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 33844 - }, - { - "endIndex": 33944, - "paragraph": { - "elements": [ - { - "endIndex": 33913, - "startIndex": 33845, - "textRun": { - "content": "This Flutter plugin is complete, and you can go back to editing the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 33934, - "startIndex": 33913, - "textRun": { - "content": "github_graphql_client", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 33944, - "startIndex": 33934, - "textRun": { - "content": " project.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 33845 - }, - { - "endIndex": 33945, - "paragraph": { - "elements": [ - { - "endIndex": 33945, - "startIndex": 33944, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 33944 - }, - { - "endIndex": 33971, - "startIndex": 33945, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 33970, - "startIndex": 33946, - "tableCells": [ - { - "content": [ - { - "endIndex": 33970, - "paragraph": { - "elements": [ - { - "endIndex": 33970, - "startIndex": 33948, - "textRun": { - "content": "$ cd ../github_client\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33948 - } - ], - "endIndex": 33970, - "startIndex": 33947, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 33972, - "paragraph": { - "elements": [ - { - "endIndex": 33972, - "startIndex": 33971, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 33971 - }, - { - "endIndex": 33989, - "paragraph": { - "elements": [ - { - "endIndex": 33989, - "startIndex": 33972, - "textRun": { - "content": "Add dependencies\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.taqgmwcoaqg", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 33972 - }, - { - "endIndex": 34170, - "paragraph": { - "elements": [ - { - "endIndex": 34170, - "startIndex": 33989, - "textRun": { - "content": "The Flutter plugin you just created is great, but it isn’t much use to anyone sitting by itself. You need to add it as a dependency in your Flutter application in order to use it. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 33989 - }, - { - "endIndex": 34171, - "paragraph": { - "elements": [ - { - "endIndex": 34171, - "startIndex": 34170, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 34170 - }, - { - "endIndex": 34816, - "startIndex": 34171, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 34815, - "startIndex": 34172, - "tableCells": [ - { - "content": [ - { - "endIndex": 34234, - "paragraph": { - "elements": [ - { - "endIndex": 34234, - "startIndex": 34174, - "textRun": { - "content": "$ flutter pub add --path ../window_to_front window_to_front\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34174 - }, - { - "endIndex": 34260, - "paragraph": { - "elements": [ - { - "endIndex": 34260, - "startIndex": 34234, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34234 - }, - { - "endIndex": 34292, - "paragraph": { - "elements": [ - { - "endIndex": 34292, - "startIndex": 34260, - "textRun": { - "content": " async 2.8.2 (2.9.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34260 - }, - { - "endIndex": 34329, - "paragraph": { - "elements": [ - { - "endIndex": 34329, - "startIndex": 34292, - "textRun": { - "content": " characters 1.2.0 (1.2.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34292 - }, - { - "endIndex": 34361, - "paragraph": { - "elements": [ - { - "endIndex": 34361, - "startIndex": 34329, - "textRun": { - "content": " clock 1.1.0 (1.1.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34329 - }, - { - "endIndex": 34398, - "paragraph": { - "elements": [ - { - "endIndex": 34398, - "startIndex": 34361, - "textRun": { - "content": " fake_async 1.3.0 (1.3.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34361 - }, - { - "endIndex": 34436, - "paragraph": { - "elements": [ - { - "endIndex": 34436, - "startIndex": 34398, - "textRun": { - "content": " matcher 0.12.11 (0.12.12 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34398 - }, - { - "endIndex": 34487, - "paragraph": { - "elements": [ - { - "endIndex": 34487, - "startIndex": 34436, - "textRun": { - "content": " material_color_utilities 0.1.4 (0.1.5 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34436 - }, - { - "endIndex": 34518, - "paragraph": { - "elements": [ - { - "endIndex": 34518, - "startIndex": 34487, - "textRun": { - "content": " meta 1.7.0 (1.8.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34487 - }, - { - "endIndex": 34549, - "paragraph": { - "elements": [ - { - "endIndex": 34549, - "startIndex": 34518, - "textRun": { - "content": " path 1.8.1 (1.8.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34518 - }, - { - "endIndex": 34587, - "paragraph": { - "elements": [ - { - "endIndex": 34587, - "startIndex": 34549, - "textRun": { - "content": " source_span 1.8.2 (1.9.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34549 - }, - { - "endIndex": 34628, - "paragraph": { - "elements": [ - { - "endIndex": 34628, - "startIndex": 34587, - "textRun": { - "content": " string_scanner 1.1.0 (1.1.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34587 - }, - { - "endIndex": 34665, - "paragraph": { - "elements": [ - { - "endIndex": 34665, - "startIndex": 34628, - "textRun": { - "content": " term_glyph 1.2.0 (1.2.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34628 - }, - { - "endIndex": 34701, - "paragraph": { - "elements": [ - { - "endIndex": 34701, - "startIndex": 34665, - "textRun": { - "content": " test_api 0.4.9 (0.4.12 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34665 - }, - { - "endIndex": 34740, - "paragraph": { - "elements": [ - { - "endIndex": 34740, - "startIndex": 34701, - "textRun": { - "content": " url_launcher 6.1.4 (6.1.5 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34701 - }, - { - "endIndex": 34793, - "paragraph": { - "elements": [ - { - "endIndex": 34793, - "startIndex": 34740, - "textRun": { - "content": "+ window_to_front 0.0.1 from path ../window_to_front\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34740 - }, - { - "endIndex": 34815, - "paragraph": { - "elements": [ - { - "endIndex": 34815, - "startIndex": 34793, - "textRun": { - "content": "Changed 1 dependency!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34793 - } - ], - "endIndex": 34815, - "startIndex": 34173, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 34817, - "paragraph": { - "elements": [ - { - "endIndex": 34817, - "startIndex": 34816, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 34816 - }, - { - "endIndex": 34994, - "paragraph": { - "elements": [ - { - "endIndex": 34848, - "startIndex": 34817, - "textRun": { - "content": "Note the path specified for the", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 34849, - "startIndex": 34848, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 34864, - "startIndex": 34849, - "textRun": { - "content": "window_to_front", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 34908, - "startIndex": 34864, - "textRun": { - "content": " dependency: because this is a local package", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 34909, - "startIndex": 34908, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 34937, - "startIndex": 34909, - "textRun": { - "content": "instead of one published to ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 34944, - "startIndex": 34937, - "textRun": { - "content": "pub.dev", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 34993, - "startIndex": 34944, - "textRun": { - "content": ", you specify a path instead of a version number.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 34994, - "startIndex": 34993, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 34817 - }, - { - "endIndex": 35028, - "paragraph": { - "elements": [ - { - "endIndex": 35028, - "startIndex": 34994, - "textRun": { - "content": "Put it all together, again, again\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.tvwf13ue5p6g", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 34994 - }, - { - "endIndex": 35176, - "paragraph": { - "elements": [ - { - "endIndex": 35050, - "startIndex": 35028, - "textRun": { - "content": "It’s time to integrate", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 35051, - "startIndex": 35050, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 35066, - "startIndex": 35051, - "textRun": { - "content": "window_to_front", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35067, - "startIndex": 35066, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 35077, - "startIndex": 35067, - "textRun": { - "content": "into your ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 35090, - "startIndex": 35077, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 35176, - "startIndex": 35090, - "textRun": { - "content": " file. We only need to add an import and call into the native code at the right time.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 35028 - }, - { - "endIndex": 35190, - "paragraph": { - "elements": [ - { - "endIndex": 35189, - "startIndex": 35176, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/step_06/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 35190, - "startIndex": 35189, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.5mn7f99pbudx", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 35176 - }, - { - "endIndex": 37060, - "startIndex": 35190, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 37059, - "startIndex": 35191, - "tableCells": [ - { - "content": [ - { - "endIndex": 35233, - "paragraph": { - "elements": [ - { - "endIndex": 35233, - "startIndex": 35193, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35193 - }, - { - "endIndex": 35270, - "paragraph": { - "elements": [ - { - "endIndex": 35270, - "startIndex": 35233, - "textRun": { - "content": "import 'package:github/github.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35233 - }, - { - "endIndex": 35340, - "paragraph": { - "elements": [ - { - "endIndex": 35340, - "startIndex": 35270, - "textRun": { - "content": "import 'package:window_to_front/window_to_front.dart'; // Add this\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35270 - }, - { - "endIndex": 35341, - "paragraph": { - "elements": [ - { - "endIndex": 35341, - "startIndex": 35340, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35340 - }, - { - "endIndex": 35381, - "paragraph": { - "elements": [ - { - "endIndex": 35381, - "startIndex": 35341, - "textRun": { - "content": "import 'github_oauth_credentials.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35341 - }, - { - "endIndex": 35413, - "paragraph": { - "elements": [ - { - "endIndex": 35413, - "startIndex": 35381, - "textRun": { - "content": "import 'src/github_login.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35381 - }, - { - "endIndex": 35414, - "paragraph": { - "elements": [ - { - "endIndex": 35414, - "startIndex": 35413, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35413 - }, - { - "endIndex": 35428, - "paragraph": { - "elements": [ - { - "endIndex": 35428, - "startIndex": 35414, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35414 - }, - { - "endIndex": 35453, - "paragraph": { - "elements": [ - { - "endIndex": 35453, - "startIndex": 35428, - "textRun": { - "content": " runApp(const MyApp());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35428 - }, - { - "endIndex": 35455, - "paragraph": { - "elements": [ - { - "endIndex": 35455, - "startIndex": 35453, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35453 - }, - { - "endIndex": 35456, - "paragraph": { - "elements": [ - { - "endIndex": 35456, - "startIndex": 35455, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35455 - }, - { - "endIndex": 35494, - "paragraph": { - "elements": [ - { - "endIndex": 35494, - "startIndex": 35456, - "textRun": { - "content": "class MyApp extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35456 - }, - { - "endIndex": 35522, - "paragraph": { - "elements": [ - { - "endIndex": 35522, - "startIndex": 35494, - "textRun": { - "content": " const MyApp({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35494 - }, - { - "endIndex": 35523, - "paragraph": { - "elements": [ - { - "endIndex": 35523, - "startIndex": 35522, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35522 - }, - { - "endIndex": 35535, - "paragraph": { - "elements": [ - { - "endIndex": 35535, - "startIndex": 35523, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35523 - }, - { - "endIndex": 35574, - "paragraph": { - "elements": [ - { - "endIndex": 35574, - "startIndex": 35535, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35535 - }, - { - "endIndex": 35598, - "paragraph": { - "elements": [ - { - "endIndex": 35598, - "startIndex": 35574, - "textRun": { - "content": " return MaterialApp(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35574 - }, - { - "endIndex": 35628, - "paragraph": { - "elements": [ - { - "endIndex": 35628, - "startIndex": 35598, - "textRun": { - "content": " title: 'GitHub Client',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35598 - }, - { - "endIndex": 35652, - "paragraph": { - "elements": [ - { - "endIndex": 35652, - "startIndex": 35628, - "textRun": { - "content": " theme: ThemeData(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35628 - }, - { - "endIndex": 35688, - "paragraph": { - "elements": [ - { - "endIndex": 35688, - "startIndex": 35652, - "textRun": { - "content": " primarySwatch: Colors.blue,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35652 - }, - { - "endIndex": 35750, - "paragraph": { - "elements": [ - { - "endIndex": 35750, - "startIndex": 35688, - "textRun": { - "content": " visualDensity: VisualDensity.adaptivePlatformDensity,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35688 - }, - { - "endIndex": 35778, - "paragraph": { - "elements": [ - { - "endIndex": 35778, - "startIndex": 35750, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35750 - }, - { - "endIndex": 35787, - "paragraph": { - "elements": [ - { - "endIndex": 35787, - "startIndex": 35778, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35778 - }, - { - "endIndex": 35841, - "paragraph": { - "elements": [ - { - "endIndex": 35841, - "startIndex": 35787, - "textRun": { - "content": " home: const MyHomePage(title: 'GitHub Client'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35787 - }, - { - "endIndex": 35848, - "paragraph": { - "elements": [ - { - "endIndex": 35848, - "startIndex": 35841, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35841 - }, - { - "endIndex": 35852, - "paragraph": { - "elements": [ - { - "endIndex": 35852, - "startIndex": 35848, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35848 - }, - { - "endIndex": 35854, - "paragraph": { - "elements": [ - { - "endIndex": 35854, - "startIndex": 35852, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35852 - }, - { - "endIndex": 35855, - "paragraph": { - "elements": [ - { - "endIndex": 35855, - "startIndex": 35854, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35854 - }, - { - "endIndex": 35898, - "paragraph": { - "elements": [ - { - "endIndex": 35898, - "startIndex": 35855, - "textRun": { - "content": "class MyHomePage extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35855 - }, - { - "endIndex": 35952, - "paragraph": { - "elements": [ - { - "endIndex": 35952, - "startIndex": 35898, - "textRun": { - "content": " const MyHomePage({super.key, required this.title});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35898 - }, - { - "endIndex": 35974, - "paragraph": { - "elements": [ - { - "endIndex": 35974, - "startIndex": 35952, - "textRun": { - "content": " final String title;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35952 - }, - { - "endIndex": 35975, - "paragraph": { - "elements": [ - { - "endIndex": 35975, - "startIndex": 35974, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35974 - }, - { - "endIndex": 35987, - "paragraph": { - "elements": [ - { - "endIndex": 35987, - "startIndex": 35975, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35975 - }, - { - "endIndex": 36026, - "paragraph": { - "elements": [ - { - "endIndex": 36026, - "startIndex": 35987, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35987 - }, - { - "endIndex": 36056, - "paragraph": { - "elements": [ - { - "endIndex": 36056, - "startIndex": 36026, - "textRun": { - "content": " return GithubLoginWidget(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36026 - }, - { - "endIndex": 36095, - "paragraph": { - "elements": [ - { - "endIndex": 36095, - "startIndex": 36056, - "textRun": { - "content": " builder: (context, httpClient) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36056 - }, - { - "endIndex": 36165, - "paragraph": { - "elements": [ - { - "endIndex": 36165, - "startIndex": 36095, - "textRun": { - "content": " WindowToFront.activate(); // and this.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36095 - }, - { - "endIndex": 36208, - "paragraph": { - "elements": [ - { - "endIndex": 36208, - "startIndex": 36165, - "textRun": { - "content": " return FutureBuilder(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36165 - }, - { - "endIndex": 36276, - "paragraph": { - "elements": [ - { - "endIndex": 36276, - "startIndex": 36208, - "textRun": { - "content": " future: viewerDetail(httpClient.credentials.accessToken),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36208 - }, - { - "endIndex": 36317, - "paragraph": { - "elements": [ - { - "endIndex": 36317, - "startIndex": 36276, - "textRun": { - "content": " builder: (context, snapshot) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36276 - }, - { - "endIndex": 36346, - "paragraph": { - "elements": [ - { - "endIndex": 36346, - "startIndex": 36317, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36317 - }, - { - "endIndex": 36376, - "paragraph": { - "elements": [ - { - "endIndex": 36376, - "startIndex": 36346, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36346 - }, - { - "endIndex": 36412, - "paragraph": { - "elements": [ - { - "endIndex": 36412, - "startIndex": 36376, - "textRun": { - "content": " title: Text(title),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36376 - }, - { - "endIndex": 36442, - "paragraph": { - "elements": [ - { - "endIndex": 36442, - "startIndex": 36412, - "textRun": { - "content": " elevation: 2,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36412 - }, - { - "endIndex": 36459, - "paragraph": { - "elements": [ - { - "endIndex": 36459, - "startIndex": 36442, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36442 - }, - { - "endIndex": 36487, - "paragraph": { - "elements": [ - { - "endIndex": 36487, - "startIndex": 36459, - "textRun": { - "content": " body: Center(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36459 - }, - { - "endIndex": 36516, - "paragraph": { - "elements": [ - { - "endIndex": 36516, - "startIndex": 36487, - "textRun": { - "content": " child: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36487 - }, - { - "endIndex": 36551, - "paragraph": { - "elements": [ - { - "endIndex": 36551, - "startIndex": 36516, - "textRun": { - "content": " snapshot.hasData\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36516 - }, - { - "endIndex": 36608, - "paragraph": { - "elements": [ - { - "endIndex": 36608, - "startIndex": 36551, - "textRun": { - "content": " ? 'Hello ${snapshot.data!.login}!'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36551 - }, - { - "endIndex": 36670, - "paragraph": { - "elements": [ - { - "endIndex": 36670, - "startIndex": 36608, - "textRun": { - "content": " : 'Retrieving viewer login details...',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36608 - }, - { - "endIndex": 36689, - "paragraph": { - "elements": [ - { - "endIndex": 36689, - "startIndex": 36670, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36670 - }, - { - "endIndex": 36706, - "paragraph": { - "elements": [ - { - "endIndex": 36706, - "startIndex": 36689, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36689 - }, - { - "endIndex": 36721, - "paragraph": { - "elements": [ - { - "endIndex": 36721, - "startIndex": 36706, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36706 - }, - { - "endIndex": 36734, - "paragraph": { - "elements": [ - { - "endIndex": 36734, - "startIndex": 36721, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36721 - }, - { - "endIndex": 36745, - "paragraph": { - "elements": [ - { - "endIndex": 36745, - "startIndex": 36734, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36734 - }, - { - "endIndex": 36754, - "paragraph": { - "elements": [ - { - "endIndex": 36754, - "startIndex": 36745, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36745 - }, - { - "endIndex": 36792, - "paragraph": { - "elements": [ - { - "endIndex": 36792, - "startIndex": 36754, - "textRun": { - "content": " githubClientId: githubClientId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36754 - }, - { - "endIndex": 36838, - "paragraph": { - "elements": [ - { - "endIndex": 36838, - "startIndex": 36792, - "textRun": { - "content": " githubClientSecret: githubClientSecret,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36792 - }, - { - "endIndex": 36872, - "paragraph": { - "elements": [ - { - "endIndex": 36872, - "startIndex": 36838, - "textRun": { - "content": " githubScopes: githubScopes,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36838 - }, - { - "endIndex": 36879, - "paragraph": { - "elements": [ - { - "endIndex": 36879, - "startIndex": 36872, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36872 - }, - { - "endIndex": 36883, - "paragraph": { - "elements": [ - { - "endIndex": 36883, - "startIndex": 36879, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36879 - }, - { - "endIndex": 36885, - "paragraph": { - "elements": [ - { - "endIndex": 36885, - "startIndex": 36883, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36883 - }, - { - "endIndex": 36886, - "paragraph": { - "elements": [ - { - "endIndex": 36886, - "startIndex": 36885, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36885 - }, - { - "endIndex": 36947, - "paragraph": { - "elements": [ - { - "endIndex": 36947, - "startIndex": 36886, - "textRun": { - "content": "Future viewerDetail(String accessToken) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36886 - }, - { - "endIndex": 37017, - "paragraph": { - "elements": [ - { - "endIndex": 37017, - "startIndex": 36947, - "textRun": { - "content": " final gitHub = GitHub(auth: Authentication.withToken(accessToken));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36947 - }, - { - "endIndex": 37057, - "paragraph": { - "elements": [ - { - "endIndex": 37057, - "startIndex": 37017, - "textRun": { - "content": " return gitHub.users.getCurrentUser();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37017 - }, - { - "endIndex": 37059, - "paragraph": { - "elements": [ - { - "endIndex": 37059, - "startIndex": 37057, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37057 - } - ], - "endIndex": 37059, - "startIndex": 35192, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 37061, - "paragraph": { - "elements": [ - { - "endIndex": 37061, - "startIndex": 37060, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37060 - }, - { - "endIndex": 37518, - "paragraph": { - "elements": [ - { - "endIndex": 37518, - "startIndex": 37061, - "textRun": { - "content": "After you run this Flutter application, you will be greeted by an identical looking app, but clicking the button will reveal a difference in behaviour. If you place the app over the web browser you are using to authenticate with, when you click on the Login button, your application will be pushed behind the web browser, but once you have completed the authentication flow in the browser, your application will come to the front again. Much more polished.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37061 - }, - { - "endIndex": 37519, - "paragraph": { - "elements": [ - { - "endIndex": 37519, - "startIndex": 37518, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37518 - }, - { - "endIndex": 37520, - "paragraph": { - "elements": [ - { - "endIndex": 37520, - "startIndex": 37519, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37519 - }, - { - "endIndex": 37529, - "startIndex": 37520, - "table": { - "columns": 2, - "rows": 1, - "tableRows": [ - { - "endIndex": 37528, - "startIndex": 37521, - "tableCells": [ - { - "content": [ - { - "endIndex": 37525, - "paragraph": { - "elements": [ - { - "endIndex": 37524, - "inlineObjectElement": { - "inlineObjectId": "kix.4cz8icfcxdm4", - "textStyle": {} - }, - "startIndex": 37523 - }, - { - "endIndex": 37525, - "startIndex": 37524, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37523 - } - ], - "endIndex": 37525, - "startIndex": 37522, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 37528, - "paragraph": { - "elements": [ - { - "endIndex": 37527, - "inlineObjectElement": { - "inlineObjectId": "kix.indwct7imuzd", - "textStyle": {} - }, - "startIndex": 37526 - }, - { - "endIndex": 37528, - "startIndex": 37527, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37526 - } - ], - "endIndex": 37528, - "startIndex": 37525, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 37530, - "paragraph": { - "elements": [ - { - "endIndex": 37530, - "startIndex": 37529, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37529 - }, - { - "endIndex": 37803, - "paragraph": { - "elements": [ - { - "endIndex": 37803, - "startIndex": 37530, - "textRun": { - "content": "In the next section, you’ll build on the base that you have, to create a desktop GitHub client that gives you insight into what you have on GitHub. You’ll inspect the list of repositories in the account, the pull requests from the Flutter project, and the assigned issues.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37530 - }, - { - "endIndex": 37862, - "paragraph": { - "elements": [ - { - "endIndex": 37813, - "startIndex": 37803, - "textRun": { - "content": "View the r", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 37862, - "startIndex": 37813, - "textRun": { - "content": "epositories, pull requests, and assigned issues \n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6cpjfqrfbd6s", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 37803 - }, - { - "endIndex": 37878, - "paragraph": { - "elements": [ - { - "endIndex": 37877, - "startIndex": 37862, - "textRun": { - "content": "Duration: 10:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 37878, - "startIndex": 37877, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37862 - }, - { - "endIndex": 37879, - "paragraph": { - "elements": [ - { - "endIndex": 37879, - "startIndex": 37878, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37878 - }, - { - "endIndex": 38151, - "paragraph": { - "elements": [ - { - "endIndex": 38150, - "startIndex": 37879, - "textRun": { - "content": "You’re pretty far along into building this application, and yet, all the application does is tell you your login. You’d probably like a little bit more from a desktop GitHub client. Next, you’ll add the capability to list repositories, pull requests, and assigned issues.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 38151, - "startIndex": 38150, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37879 - }, - { - "endIndex": 38175, - "paragraph": { - "elements": [ - { - "endIndex": 38175, - "startIndex": 38151, - "textRun": { - "content": "Add one last dependency\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.1f8fwhfw59th", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 38151 - }, - { - "endIndex": 38319, - "paragraph": { - "elements": [ - { - "endIndex": 38264, - "startIndex": 38175, - "textRun": { - "content": "In rendering the data returned from the above queries, you’ll use an additional package, ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 38275, - "startIndex": 38264, - "textRun": { - "content": "fluttericon", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/fluttericon" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38299, - "startIndex": 38275, - "textRun": { - "content": ", for easily displaying ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 38316, - "startIndex": 38299, - "textRun": { - "content": "GitHub’s Octicons", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://primer.style/octicons/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 38319, - "startIndex": 38316, - "textRun": { - "content": ". \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 38175 - }, - { - "endIndex": 38320, - "paragraph": { - "elements": [ - { - "endIndex": 38320, - "startIndex": 38319, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 38319 - }, - { - "endIndex": 38548, - "startIndex": 38320, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 38547, - "startIndex": 38321, - "tableCells": [ - { - "content": [ - { - "endIndex": 38353, - "paragraph": { - "elements": [ - { - "endIndex": 38353, - "startIndex": 38323, - "textRun": { - "content": "$ flutter pub add fluttericon\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38323 - }, - { - "endIndex": 38380, - "paragraph": { - "elements": [ - { - "endIndex": 38380, - "startIndex": 38353, - "textRun": { - "content": "Resolving dependencies... \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38353 - }, - { - "endIndex": 38400, - "paragraph": { - "elements": [ - { - "endIndex": 38400, - "startIndex": 38380, - "textRun": { - "content": "+ fluttericon 2.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38380 - }, - { - "endIndex": 38451, - "paragraph": { - "elements": [ - { - "endIndex": 38451, - "startIndex": 38400, - "textRun": { - "content": " material_color_utilities 0.2.0 (0.3.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38400 - }, - { - "endIndex": 38490, - "paragraph": { - "elements": [ - { - "endIndex": 38490, - "startIndex": 38451, - "textRun": { - "content": " source_span 1.9.1 (1.10.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38451 - }, - { - "endIndex": 38525, - "paragraph": { - "elements": [ - { - "endIndex": 38525, - "startIndex": 38490, - "textRun": { - "content": " test_api 0.5.1 (0.5.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38490 - }, - { - "endIndex": 38547, - "paragraph": { - "elements": [ - { - "endIndex": 38547, - "startIndex": 38525, - "textRun": { - "content": "Changed 1 dependency!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38525 - } - ], - "endIndex": 38547, - "startIndex": 38322, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 38549, - "paragraph": { - "elements": [ - { - "endIndex": 38549, - "startIndex": 38548, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 38548 - }, - { - "endIndex": 38589, - "paragraph": { - "elements": [ - { - "endIndex": 38589, - "startIndex": 38549, - "textRun": { - "content": "Widgets to render the results to screen\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.mix5jm9qpba1", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 38549 - }, - { - "endIndex": 38923, - "paragraph": { - "elements": [ - { - "endIndex": 38660, - "startIndex": 38589, - "textRun": { - "content": "You are going to use the GitHub package you added before to populate a ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 38674, - "startIndex": 38660, - "textRun": { - "content": "NavigationRail", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.flutter.dev/flutter/material/NavigationRail-class.html" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 38780, - "startIndex": 38674, - "textRun": { - "content": " widget with views of your repositories, assigned issues, and pull requests from the Flutter project. The ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 38791, - "startIndex": 38780, - "textRun": { - "content": "Material.io", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://material.io/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 38805, - "startIndex": 38791, - "textRun": { - "content": " design system", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 38833, - "startIndex": 38805, - "textRun": { - "content": " documentation explains how ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 38849, - "startIndex": 38833, - "textRun": { - "content": "Navigation rails", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://material.io/components/navigation-rail" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 38923, - "startIndex": 38849, - "textRun": { - "content": " provide ergonomic movement between primary destinations in applications.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 38589 - }, - { - "endIndex": 38924, - "paragraph": { - "elements": [ - { - "endIndex": 38924, - "startIndex": 38923, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 38923 - }, - { - "endIndex": 38984, - "paragraph": { - "elements": [ - { - "endIndex": 38984, - "startIndex": 38924, - "textRun": { - "content": "Create a new file, and fill it with the following content. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 38924 - }, - { - "endIndex": 39012, - "paragraph": { - "elements": [ - { - "endIndex": 39011, - "startIndex": 38984, - "textRun": { - "content": "lib/src/github_summary.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/step_07/lib/src/github_summary.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 39012, - "startIndex": 39011, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.1nmaf3332ru1", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 38984 - }, - { - "endIndex": 45931, - "startIndex": 39012, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 45930, - "startIndex": 39013, - "tableCells": [ - { - "content": [ - { - "endIndex": 39055, - "paragraph": { - "elements": [ - { - "endIndex": 39055, - "startIndex": 39015, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39015 - }, - { - "endIndex": 39105, - "paragraph": { - "elements": [ - { - "endIndex": 39105, - "startIndex": 39055, - "textRun": { - "content": "import 'package:fluttericon/octicons_icons.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39055 - }, - { - "endIndex": 39142, - "paragraph": { - "elements": [ - { - "endIndex": 39142, - "startIndex": 39105, - "textRun": { - "content": "import 'package:github/github.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39105 - }, - { - "endIndex": 39198, - "paragraph": { - "elements": [ - { - "endIndex": 39198, - "startIndex": 39142, - "textRun": { - "content": "import 'package:url_launcher/url_launcher_string.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39142 - }, - { - "endIndex": 39199, - "paragraph": { - "elements": [ - { - "endIndex": 39199, - "startIndex": 39198, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39198 - }, - { - "endIndex": 39244, - "paragraph": { - "elements": [ - { - "endIndex": 39244, - "startIndex": 39199, - "textRun": { - "content": "class GitHubSummary extends StatefulWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39199 - }, - { - "endIndex": 39302, - "paragraph": { - "elements": [ - { - "endIndex": 39302, - "startIndex": 39244, - "textRun": { - "content": " const GitHubSummary({required this.gitHub, super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39244 - }, - { - "endIndex": 39325, - "paragraph": { - "elements": [ - { - "endIndex": 39325, - "startIndex": 39302, - "textRun": { - "content": " final GitHub gitHub;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39302 - }, - { - "endIndex": 39326, - "paragraph": { - "elements": [ - { - "endIndex": 39326, - "startIndex": 39325, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39325 - }, - { - "endIndex": 39338, - "paragraph": { - "elements": [ - { - "endIndex": 39338, - "startIndex": 39326, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39326 - }, - { - "endIndex": 39401, - "paragraph": { - "elements": [ - { - "endIndex": 39401, - "startIndex": 39338, - "textRun": { - "content": " State createState() => _GitHubSummaryState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39338 - }, - { - "endIndex": 39403, - "paragraph": { - "elements": [ - { - "endIndex": 39403, - "startIndex": 39401, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39401 - }, - { - "endIndex": 39404, - "paragraph": { - "elements": [ - { - "endIndex": 39404, - "startIndex": 39403, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39403 - }, - { - "endIndex": 39461, - "paragraph": { - "elements": [ - { - "endIndex": 39461, - "startIndex": 39404, - "textRun": { - "content": "class _GitHubSummaryState extends State {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39404 - }, - { - "endIndex": 39487, - "paragraph": { - "elements": [ - { - "endIndex": 39487, - "startIndex": 39461, - "textRun": { - "content": " int _selectedIndex = 0;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39461 - }, - { - "endIndex": 39488, - "paragraph": { - "elements": [ - { - "endIndex": 39488, - "startIndex": 39487, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39487 - }, - { - "endIndex": 39500, - "paragraph": { - "elements": [ - { - "endIndex": 39500, - "startIndex": 39488, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39488 - }, - { - "endIndex": 39539, - "paragraph": { - "elements": [ - { - "endIndex": 39539, - "startIndex": 39500, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39500 - }, - { - "endIndex": 39555, - "paragraph": { - "elements": [ - { - "endIndex": 39555, - "startIndex": 39539, - "textRun": { - "content": " return Row(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39539 - }, - { - "endIndex": 39573, - "paragraph": { - "elements": [ - { - "endIndex": 39573, - "startIndex": 39555, - "textRun": { - "content": " children: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39555 - }, - { - "endIndex": 39597, - "paragraph": { - "elements": [ - { - "endIndex": 39597, - "startIndex": 39573, - "textRun": { - "content": " NavigationRail(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39573 - }, - { - "endIndex": 39638, - "paragraph": { - "elements": [ - { - "endIndex": 39638, - "startIndex": 39597, - "textRun": { - "content": " selectedIndex: _selectedIndex,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39597 - }, - { - "endIndex": 39681, - "paragraph": { - "elements": [ - { - "endIndex": 39681, - "startIndex": 39638, - "textRun": { - "content": " onDestinationSelected: (index) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39638 - }, - { - "endIndex": 39707, - "paragraph": { - "elements": [ - { - "endIndex": 39707, - "startIndex": 39681, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39681 - }, - { - "endIndex": 39745, - "paragraph": { - "elements": [ - { - "endIndex": 39745, - "startIndex": 39707, - "textRun": { - "content": " _selectedIndex = index;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39707 - }, - { - "endIndex": 39761, - "paragraph": { - "elements": [ - { - "endIndex": 39761, - "startIndex": 39745, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39745 - }, - { - "endIndex": 39774, - "paragraph": { - "elements": [ - { - "endIndex": 39774, - "startIndex": 39761, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39761 - }, - { - "endIndex": 39829, - "paragraph": { - "elements": [ - { - "endIndex": 39829, - "startIndex": 39774, - "textRun": { - "content": " labelType: NavigationRailLabelType.selected,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39774 - }, - { - "endIndex": 39861, - "paragraph": { - "elements": [ - { - "endIndex": 39861, - "startIndex": 39829, - "textRun": { - "content": " destinations: const [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39829 - }, - { - "endIndex": 39900, - "paragraph": { - "elements": [ - { - "endIndex": 39900, - "startIndex": 39861, - "textRun": { - "content": " NavigationRailDestination(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39861 - }, - { - "endIndex": 39941, - "paragraph": { - "elements": [ - { - "endIndex": 39941, - "startIndex": 39900, - "textRun": { - "content": " icon: Icon(Octicons.repo),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39900 - }, - { - "endIndex": 39984, - "paragraph": { - "elements": [ - { - "endIndex": 39984, - "startIndex": 39941, - "textRun": { - "content": " label: Text('Repositories'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39941 - }, - { - "endIndex": 39999, - "paragraph": { - "elements": [ - { - "endIndex": 39999, - "startIndex": 39984, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39984 - }, - { - "endIndex": 40038, - "paragraph": { - "elements": [ - { - "endIndex": 40038, - "startIndex": 39999, - "textRun": { - "content": " NavigationRailDestination(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 39999 - }, - { - "endIndex": 40087, - "paragraph": { - "elements": [ - { - "endIndex": 40087, - "startIndex": 40038, - "textRun": { - "content": " icon: Icon(Octicons.issue_opened),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40038 - }, - { - "endIndex": 40133, - "paragraph": { - "elements": [ - { - "endIndex": 40133, - "startIndex": 40087, - "textRun": { - "content": " label: Text('Assigned Issues'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40087 - }, - { - "endIndex": 40148, - "paragraph": { - "elements": [ - { - "endIndex": 40148, - "startIndex": 40133, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40133 - }, - { - "endIndex": 40187, - "paragraph": { - "elements": [ - { - "endIndex": 40187, - "startIndex": 40148, - "textRun": { - "content": " NavigationRailDestination(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40148 - }, - { - "endIndex": 40240, - "paragraph": { - "elements": [ - { - "endIndex": 40240, - "startIndex": 40187, - "textRun": { - "content": " icon: Icon(Octicons.git_pull_request),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40187 - }, - { - "endIndex": 40284, - "paragraph": { - "elements": [ - { - "endIndex": 40284, - "startIndex": 40240, - "textRun": { - "content": " label: Text('Pull Requests'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40240 - }, - { - "endIndex": 40299, - "paragraph": { - "elements": [ - { - "endIndex": 40299, - "startIndex": 40284, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40284 - }, - { - "endIndex": 40312, - "paragraph": { - "elements": [ - { - "endIndex": 40312, - "startIndex": 40299, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40299 - }, - { - "endIndex": 40323, - "paragraph": { - "elements": [ - { - "endIndex": 40323, - "startIndex": 40312, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40312 - }, - { - "endIndex": 40378, - "paragraph": { - "elements": [ - { - "endIndex": 40378, - "startIndex": 40323, - "textRun": { - "content": " const VerticalDivider(thickness: 1, width: 1),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40323 - }, - { - "endIndex": 40415, - "paragraph": { - "elements": [ - { - "endIndex": 40415, - "startIndex": 40378, - "textRun": { - "content": " // This is the main content.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40378 - }, - { - "endIndex": 40433, - "paragraph": { - "elements": [ - { - "endIndex": 40433, - "startIndex": 40415, - "textRun": { - "content": " Expanded(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40415 - }, - { - "endIndex": 40464, - "paragraph": { - "elements": [ - { - "endIndex": 40464, - "startIndex": 40433, - "textRun": { - "content": " child: IndexedStack(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40433 - }, - { - "endIndex": 40499, - "paragraph": { - "elements": [ - { - "endIndex": 40499, - "startIndex": 40464, - "textRun": { - "content": " index: _selectedIndex,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40464 - }, - { - "endIndex": 40523, - "paragraph": { - "elements": [ - { - "endIndex": 40523, - "startIndex": 40499, - "textRun": { - "content": " children: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40499 - }, - { - "endIndex": 40578, - "paragraph": { - "elements": [ - { - "endIndex": 40578, - "startIndex": 40523, - "textRun": { - "content": " RepositoriesList(gitHub: widget.gitHub),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40523 - }, - { - "endIndex": 40635, - "paragraph": { - "elements": [ - { - "endIndex": 40635, - "startIndex": 40578, - "textRun": { - "content": " AssignedIssuesList(gitHub: widget.gitHub),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40578 - }, - { - "endIndex": 40690, - "paragraph": { - "elements": [ - { - "endIndex": 40690, - "startIndex": 40635, - "textRun": { - "content": " PullRequestsList(gitHub: widget.gitHub),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40635 - }, - { - "endIndex": 40705, - "paragraph": { - "elements": [ - { - "endIndex": 40705, - "startIndex": 40690, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40690 - }, - { - "endIndex": 40718, - "paragraph": { - "elements": [ - { - "endIndex": 40718, - "startIndex": 40705, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40705 - }, - { - "endIndex": 40729, - "paragraph": { - "elements": [ - { - "endIndex": 40729, - "startIndex": 40718, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40718 - }, - { - "endIndex": 40738, - "paragraph": { - "elements": [ - { - "endIndex": 40738, - "startIndex": 40729, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40729 - }, - { - "endIndex": 40745, - "paragraph": { - "elements": [ - { - "endIndex": 40745, - "startIndex": 40738, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40738 - }, - { - "endIndex": 40749, - "paragraph": { - "elements": [ - { - "endIndex": 40749, - "startIndex": 40745, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40745 - }, - { - "endIndex": 40751, - "paragraph": { - "elements": [ - { - "endIndex": 40751, - "startIndex": 40749, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40749 - }, - { - "endIndex": 40752, - "paragraph": { - "elements": [ - { - "endIndex": 40752, - "startIndex": 40751, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40751 - }, - { - "endIndex": 40800, - "paragraph": { - "elements": [ - { - "endIndex": 40800, - "startIndex": 40752, - "textRun": { - "content": "class RepositoriesList extends StatefulWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40752 - }, - { - "endIndex": 40861, - "paragraph": { - "elements": [ - { - "endIndex": 40861, - "startIndex": 40800, - "textRun": { - "content": " const RepositoriesList({required this.gitHub, super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40800 - }, - { - "endIndex": 40884, - "paragraph": { - "elements": [ - { - "endIndex": 40884, - "startIndex": 40861, - "textRun": { - "content": " final GitHub gitHub;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40861 - }, - { - "endIndex": 40885, - "paragraph": { - "elements": [ - { - "endIndex": 40885, - "startIndex": 40884, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40884 - }, - { - "endIndex": 40897, - "paragraph": { - "elements": [ - { - "endIndex": 40897, - "startIndex": 40885, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40885 - }, - { - "endIndex": 40966, - "paragraph": { - "elements": [ - { - "endIndex": 40966, - "startIndex": 40897, - "textRun": { - "content": " State createState() => _RepositoriesListState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40897 - }, - { - "endIndex": 40968, - "paragraph": { - "elements": [ - { - "endIndex": 40968, - "startIndex": 40966, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40966 - }, - { - "endIndex": 40969, - "paragraph": { - "elements": [ - { - "endIndex": 40969, - "startIndex": 40968, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40968 - }, - { - "endIndex": 41032, - "paragraph": { - "elements": [ - { - "endIndex": 41032, - "startIndex": 40969, - "textRun": { - "content": "class _RepositoriesListState extends State {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 40969 - }, - { - "endIndex": 41044, - "paragraph": { - "elements": [ - { - "endIndex": 41044, - "startIndex": 41032, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41032 - }, - { - "endIndex": 41060, - "paragraph": { - "elements": [ - { - "endIndex": 41060, - "startIndex": 41044, - "textRun": { - "content": " initState() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41044 - }, - { - "endIndex": 41083, - "paragraph": { - "elements": [ - { - "endIndex": 41083, - "startIndex": 41060, - "textRun": { - "content": " super.initState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41060 - }, - { - "endIndex": 41159, - "paragraph": { - "elements": [ - { - "endIndex": 41159, - "startIndex": 41083, - "textRun": { - "content": " _repositories = widget.gitHub.repositories.listRepositories().toList();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41083 - }, - { - "endIndex": 41163, - "paragraph": { - "elements": [ - { - "endIndex": 41163, - "startIndex": 41159, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41159 - }, - { - "endIndex": 41164, - "paragraph": { - "elements": [ - { - "endIndex": 41164, - "startIndex": 41163, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41163 - }, - { - "endIndex": 41211, - "paragraph": { - "elements": [ - { - "endIndex": 41211, - "startIndex": 41164, - "textRun": { - "content": " late Future> _repositories;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41164 - }, - { - "endIndex": 41212, - "paragraph": { - "elements": [ - { - "endIndex": 41212, - "startIndex": 41211, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41211 - }, - { - "endIndex": 41224, - "paragraph": { - "elements": [ - { - "endIndex": 41224, - "startIndex": 41212, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41212 - }, - { - "endIndex": 41263, - "paragraph": { - "elements": [ - { - "endIndex": 41263, - "startIndex": 41224, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41224 - }, - { - "endIndex": 41307, - "paragraph": { - "elements": [ - { - "endIndex": 41307, - "startIndex": 41263, - "textRun": { - "content": " return FutureBuilder>(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41263 - }, - { - "endIndex": 41336, - "paragraph": { - "elements": [ - { - "endIndex": 41336, - "startIndex": 41307, - "textRun": { - "content": " future: _repositories,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41307 - }, - { - "endIndex": 41373, - "paragraph": { - "elements": [ - { - "endIndex": 41373, - "startIndex": 41336, - "textRun": { - "content": " builder: (context, snapshot) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41336 - }, - { - "endIndex": 41406, - "paragraph": { - "elements": [ - { - "endIndex": 41406, - "startIndex": 41373, - "textRun": { - "content": " if (snapshot.hasError) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41373 - }, - { - "endIndex": 41465, - "paragraph": { - "elements": [ - { - "endIndex": 41465, - "startIndex": 41406, - "textRun": { - "content": " return Center(child: Text('${snapshot.error}'));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41406 - }, - { - "endIndex": 41475, - "paragraph": { - "elements": [ - { - "endIndex": 41475, - "startIndex": 41465, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41465 - }, - { - "endIndex": 41508, - "paragraph": { - "elements": [ - { - "endIndex": 41508, - "startIndex": 41475, - "textRun": { - "content": " if (!snapshot.hasData) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41475 - }, - { - "endIndex": 41575, - "paragraph": { - "elements": [ - { - "endIndex": 41575, - "startIndex": 41508, - "textRun": { - "content": " return const Center(child: CircularProgressIndicator());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41508 - }, - { - "endIndex": 41585, - "paragraph": { - "elements": [ - { - "endIndex": 41585, - "startIndex": 41575, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41575 - }, - { - "endIndex": 41627, - "paragraph": { - "elements": [ - { - "endIndex": 41627, - "startIndex": 41585, - "textRun": { - "content": " var repositories = snapshot.data;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41585 - }, - { - "endIndex": 41660, - "paragraph": { - "elements": [ - { - "endIndex": 41660, - "startIndex": 41627, - "textRun": { - "content": " return ListView.builder(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41627 - }, - { - "endIndex": 41686, - "paragraph": { - "elements": [ - { - "endIndex": 41686, - "startIndex": 41660, - "textRun": { - "content": " primary: false,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41660 - }, - { - "endIndex": 41728, - "paragraph": { - "elements": [ - { - "endIndex": 41728, - "startIndex": 41686, - "textRun": { - "content": " itemBuilder: (context, index) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41686 - }, - { - "endIndex": 41778, - "paragraph": { - "elements": [ - { - "endIndex": 41778, - "startIndex": 41728, - "textRun": { - "content": " var repository = repositories[index];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41728 - }, - { - "endIndex": 41807, - "paragraph": { - "elements": [ - { - "endIndex": 41807, - "startIndex": 41778, - "textRun": { - "content": " return ListTile(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41778 - }, - { - "endIndex": 41828, - "paragraph": { - "elements": [ - { - "endIndex": 41828, - "startIndex": 41807, - "textRun": { - "content": " title:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41807 - }, - { - "endIndex": 41907, - "paragraph": { - "elements": [ - { - "endIndex": 41907, - "startIndex": 41828, - "textRun": { - "content": " Text('${repository.owner?.login ?? ''}/${repository.name}'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41828 - }, - { - "endIndex": 41961, - "paragraph": { - "elements": [ - { - "endIndex": 41961, - "startIndex": 41907, - "textRun": { - "content": " subtitle: Text(repository.description),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41907 - }, - { - "endIndex": 42026, - "paragraph": { - "elements": [ - { - "endIndex": 42026, - "startIndex": 41961, - "textRun": { - "content": " onTap: () => _launchUrl(this, repository.htmlUrl),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 41961 - }, - { - "endIndex": 42041, - "paragraph": { - "elements": [ - { - "endIndex": 42041, - "startIndex": 42026, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42026 - }, - { - "endIndex": 42054, - "paragraph": { - "elements": [ - { - "endIndex": 42054, - "startIndex": 42041, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42041 - }, - { - "endIndex": 42097, - "paragraph": { - "elements": [ - { - "endIndex": 42097, - "startIndex": 42054, - "textRun": { - "content": " itemCount: repositories!.length,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42054 - }, - { - "endIndex": 42108, - "paragraph": { - "elements": [ - { - "endIndex": 42108, - "startIndex": 42097, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42097 - }, - { - "endIndex": 42117, - "paragraph": { - "elements": [ - { - "endIndex": 42117, - "startIndex": 42108, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42108 - }, - { - "endIndex": 42124, - "paragraph": { - "elements": [ - { - "endIndex": 42124, - "startIndex": 42117, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42117 - }, - { - "endIndex": 42128, - "paragraph": { - "elements": [ - { - "endIndex": 42128, - "startIndex": 42124, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42124 - }, - { - "endIndex": 42130, - "paragraph": { - "elements": [ - { - "endIndex": 42130, - "startIndex": 42128, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42128 - }, - { - "endIndex": 42131, - "paragraph": { - "elements": [ - { - "endIndex": 42131, - "startIndex": 42130, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42130 - }, - { - "endIndex": 42181, - "paragraph": { - "elements": [ - { - "endIndex": 42181, - "startIndex": 42131, - "textRun": { - "content": "class AssignedIssuesList extends StatefulWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42131 - }, - { - "endIndex": 42244, - "paragraph": { - "elements": [ - { - "endIndex": 42244, - "startIndex": 42181, - "textRun": { - "content": " const AssignedIssuesList({required this.gitHub, super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42181 - }, - { - "endIndex": 42267, - "paragraph": { - "elements": [ - { - "endIndex": 42267, - "startIndex": 42244, - "textRun": { - "content": " final GitHub gitHub;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42244 - }, - { - "endIndex": 42268, - "paragraph": { - "elements": [ - { - "endIndex": 42268, - "startIndex": 42267, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42267 - }, - { - "endIndex": 42280, - "paragraph": { - "elements": [ - { - "endIndex": 42280, - "startIndex": 42268, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42268 - }, - { - "endIndex": 42353, - "paragraph": { - "elements": [ - { - "endIndex": 42353, - "startIndex": 42280, - "textRun": { - "content": " State createState() => _AssignedIssuesListState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42280 - }, - { - "endIndex": 42355, - "paragraph": { - "elements": [ - { - "endIndex": 42355, - "startIndex": 42353, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42353 - }, - { - "endIndex": 42356, - "paragraph": { - "elements": [ - { - "endIndex": 42356, - "startIndex": 42355, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42355 - }, - { - "endIndex": 42423, - "paragraph": { - "elements": [ - { - "endIndex": 42423, - "startIndex": 42356, - "textRun": { - "content": "class _AssignedIssuesListState extends State {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42356 - }, - { - "endIndex": 42435, - "paragraph": { - "elements": [ - { - "endIndex": 42435, - "startIndex": 42423, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42423 - }, - { - "endIndex": 42451, - "paragraph": { - "elements": [ - { - "endIndex": 42451, - "startIndex": 42435, - "textRun": { - "content": " initState() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42435 - }, - { - "endIndex": 42474, - "paragraph": { - "elements": [ - { - "endIndex": 42474, - "startIndex": 42451, - "textRun": { - "content": " super.initState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42451 - }, - { - "endIndex": 42540, - "paragraph": { - "elements": [ - { - "endIndex": 42540, - "startIndex": 42474, - "textRun": { - "content": " _assignedIssues = widget.gitHub.issues.listByUser().toList();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42474 - }, - { - "endIndex": 42544, - "paragraph": { - "elements": [ - { - "endIndex": 42544, - "startIndex": 42540, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42540 - }, - { - "endIndex": 42545, - "paragraph": { - "elements": [ - { - "endIndex": 42545, - "startIndex": 42544, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42544 - }, - { - "endIndex": 42589, - "paragraph": { - "elements": [ - { - "endIndex": 42589, - "startIndex": 42545, - "textRun": { - "content": " late Future> _assignedIssues;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42545 - }, - { - "endIndex": 42590, - "paragraph": { - "elements": [ - { - "endIndex": 42590, - "startIndex": 42589, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42589 - }, - { - "endIndex": 42602, - "paragraph": { - "elements": [ - { - "endIndex": 42602, - "startIndex": 42590, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42590 - }, - { - "endIndex": 42641, - "paragraph": { - "elements": [ - { - "endIndex": 42641, - "startIndex": 42602, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42602 - }, - { - "endIndex": 42680, - "paragraph": { - "elements": [ - { - "endIndex": 42680, - "startIndex": 42641, - "textRun": { - "content": " return FutureBuilder>(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42641 - }, - { - "endIndex": 42711, - "paragraph": { - "elements": [ - { - "endIndex": 42711, - "startIndex": 42680, - "textRun": { - "content": " future: _assignedIssues,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42680 - }, - { - "endIndex": 42748, - "paragraph": { - "elements": [ - { - "endIndex": 42748, - "startIndex": 42711, - "textRun": { - "content": " builder: (context, snapshot) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42711 - }, - { - "endIndex": 42781, - "paragraph": { - "elements": [ - { - "endIndex": 42781, - "startIndex": 42748, - "textRun": { - "content": " if (snapshot.hasError) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42748 - }, - { - "endIndex": 42840, - "paragraph": { - "elements": [ - { - "endIndex": 42840, - "startIndex": 42781, - "textRun": { - "content": " return Center(child: Text('${snapshot.error}'));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42781 - }, - { - "endIndex": 42850, - "paragraph": { - "elements": [ - { - "endIndex": 42850, - "startIndex": 42840, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42840 - }, - { - "endIndex": 42883, - "paragraph": { - "elements": [ - { - "endIndex": 42883, - "startIndex": 42850, - "textRun": { - "content": " if (!snapshot.hasData) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42850 - }, - { - "endIndex": 42950, - "paragraph": { - "elements": [ - { - "endIndex": 42950, - "startIndex": 42883, - "textRun": { - "content": " return const Center(child: CircularProgressIndicator());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42883 - }, - { - "endIndex": 42960, - "paragraph": { - "elements": [ - { - "endIndex": 42960, - "startIndex": 42950, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42950 - }, - { - "endIndex": 43004, - "paragraph": { - "elements": [ - { - "endIndex": 43004, - "startIndex": 42960, - "textRun": { - "content": " var assignedIssues = snapshot.data;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 42960 - }, - { - "endIndex": 43037, - "paragraph": { - "elements": [ - { - "endIndex": 43037, - "startIndex": 43004, - "textRun": { - "content": " return ListView.builder(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43004 - }, - { - "endIndex": 43063, - "paragraph": { - "elements": [ - { - "endIndex": 43063, - "startIndex": 43037, - "textRun": { - "content": " primary: false,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43037 - }, - { - "endIndex": 43105, - "paragraph": { - "elements": [ - { - "endIndex": 43105, - "startIndex": 43063, - "textRun": { - "content": " itemBuilder: (context, index) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43063 - }, - { - "endIndex": 43160, - "paragraph": { - "elements": [ - { - "endIndex": 43160, - "startIndex": 43105, - "textRun": { - "content": " var assignedIssue = assignedIssues[index];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43105 - }, - { - "endIndex": 43189, - "paragraph": { - "elements": [ - { - "endIndex": 43189, - "startIndex": 43160, - "textRun": { - "content": " return ListTile(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43160 - }, - { - "endIndex": 43237, - "paragraph": { - "elements": [ - { - "endIndex": 43237, - "startIndex": 43189, - "textRun": { - "content": " title: Text(assignedIssue.title),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43189 - }, - { - "endIndex": 43302, - "paragraph": { - "elements": [ - { - "endIndex": 43302, - "startIndex": 43237, - "textRun": { - "content": " subtitle: Text('${_nameWithOwner(assignedIssue)} '\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43237 - }, - { - "endIndex": 43354, - "paragraph": { - "elements": [ - { - "endIndex": 43354, - "startIndex": 43302, - "textRun": { - "content": " 'Issue #${assignedIssue.number} '\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43302 - }, - { - "endIndex": 43421, - "paragraph": { - "elements": [ - { - "endIndex": 43421, - "startIndex": 43354, - "textRun": { - "content": " 'opened by ${assignedIssue.user?.login ?? ''}'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43354 - }, - { - "endIndex": 43489, - "paragraph": { - "elements": [ - { - "endIndex": 43489, - "startIndex": 43421, - "textRun": { - "content": " onTap: () => _launchUrl(this, assignedIssue.htmlUrl),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43421 - }, - { - "endIndex": 43504, - "paragraph": { - "elements": [ - { - "endIndex": 43504, - "startIndex": 43489, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43489 - }, - { - "endIndex": 43517, - "paragraph": { - "elements": [ - { - "endIndex": 43517, - "startIndex": 43504, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43504 - }, - { - "endIndex": 43562, - "paragraph": { - "elements": [ - { - "endIndex": 43562, - "startIndex": 43517, - "textRun": { - "content": " itemCount: assignedIssues!.length,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43517 - }, - { - "endIndex": 43573, - "paragraph": { - "elements": [ - { - "endIndex": 43573, - "startIndex": 43562, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43562 - }, - { - "endIndex": 43582, - "paragraph": { - "elements": [ - { - "endIndex": 43582, - "startIndex": 43573, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43573 - }, - { - "endIndex": 43589, - "paragraph": { - "elements": [ - { - "endIndex": 43589, - "startIndex": 43582, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43582 - }, - { - "endIndex": 43593, - "paragraph": { - "elements": [ - { - "endIndex": 43593, - "startIndex": 43589, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43589 - }, - { - "endIndex": 43594, - "paragraph": { - "elements": [ - { - "endIndex": 43594, - "startIndex": 43593, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43593 - }, - { - "endIndex": 43641, - "paragraph": { - "elements": [ - { - "endIndex": 43641, - "startIndex": 43594, - "textRun": { - "content": " String _nameWithOwner(Issue assignedIssue) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43594 - }, - { - "endIndex": 43705, - "paragraph": { - "elements": [ - { - "endIndex": 43705, - "startIndex": 43641, - "textRun": { - "content": " final endIndex = assignedIssue.url.lastIndexOf('/issues/');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43641 - }, - { - "endIndex": 43759, - "paragraph": { - "elements": [ - { - "endIndex": 43759, - "startIndex": 43705, - "textRun": { - "content": " return assignedIssue.url.substring(29, endIndex);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43705 - }, - { - "endIndex": 43763, - "paragraph": { - "elements": [ - { - "endIndex": 43763, - "startIndex": 43759, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43759 - }, - { - "endIndex": 43765, - "paragraph": { - "elements": [ - { - "endIndex": 43765, - "startIndex": 43763, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43763 - }, - { - "endIndex": 43766, - "paragraph": { - "elements": [ - { - "endIndex": 43766, - "startIndex": 43765, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43765 - }, - { - "endIndex": 43814, - "paragraph": { - "elements": [ - { - "endIndex": 43814, - "startIndex": 43766, - "textRun": { - "content": "class PullRequestsList extends StatefulWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43766 - }, - { - "endIndex": 43875, - "paragraph": { - "elements": [ - { - "endIndex": 43875, - "startIndex": 43814, - "textRun": { - "content": " const PullRequestsList({required this.gitHub, super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43814 - }, - { - "endIndex": 43898, - "paragraph": { - "elements": [ - { - "endIndex": 43898, - "startIndex": 43875, - "textRun": { - "content": " final GitHub gitHub;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43875 - }, - { - "endIndex": 43899, - "paragraph": { - "elements": [ - { - "endIndex": 43899, - "startIndex": 43898, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43898 - }, - { - "endIndex": 43911, - "paragraph": { - "elements": [ - { - "endIndex": 43911, - "startIndex": 43899, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43899 - }, - { - "endIndex": 43980, - "paragraph": { - "elements": [ - { - "endIndex": 43980, - "startIndex": 43911, - "textRun": { - "content": " State createState() => _PullRequestsListState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43911 - }, - { - "endIndex": 43982, - "paragraph": { - "elements": [ - { - "endIndex": 43982, - "startIndex": 43980, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43980 - }, - { - "endIndex": 43983, - "paragraph": { - "elements": [ - { - "endIndex": 43983, - "startIndex": 43982, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43982 - }, - { - "endIndex": 44046, - "paragraph": { - "elements": [ - { - "endIndex": 44046, - "startIndex": 43983, - "textRun": { - "content": "class _PullRequestsListState extends State {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 43983 - }, - { - "endIndex": 44058, - "paragraph": { - "elements": [ - { - "endIndex": 44058, - "startIndex": 44046, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44046 - }, - { - "endIndex": 44074, - "paragraph": { - "elements": [ - { - "endIndex": 44074, - "startIndex": 44058, - "textRun": { - "content": " initState() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44058 - }, - { - "endIndex": 44097, - "paragraph": { - "elements": [ - { - "endIndex": 44097, - "startIndex": 44074, - "textRun": { - "content": " super.initState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44074 - }, - { - "endIndex": 44144, - "paragraph": { - "elements": [ - { - "endIndex": 44144, - "startIndex": 44097, - "textRun": { - "content": " _pullRequests = widget.gitHub.pullRequests\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44097 - }, - { - "endIndex": 44196, - "paragraph": { - "elements": [ - { - "endIndex": 44196, - "startIndex": 44144, - "textRun": { - "content": " .list(RepositorySlug('flutter', 'flutter'))\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44144 - }, - { - "endIndex": 44215, - "paragraph": { - "elements": [ - { - "endIndex": 44215, - "startIndex": 44196, - "textRun": { - "content": " .toList();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44196 - }, - { - "endIndex": 44219, - "paragraph": { - "elements": [ - { - "endIndex": 44219, - "startIndex": 44215, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44215 - }, - { - "endIndex": 44220, - "paragraph": { - "elements": [ - { - "endIndex": 44220, - "startIndex": 44219, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44219 - }, - { - "endIndex": 44268, - "paragraph": { - "elements": [ - { - "endIndex": 44268, - "startIndex": 44220, - "textRun": { - "content": " late Future> _pullRequests;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44220 - }, - { - "endIndex": 44269, - "paragraph": { - "elements": [ - { - "endIndex": 44269, - "startIndex": 44268, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44268 - }, - { - "endIndex": 44281, - "paragraph": { - "elements": [ - { - "endIndex": 44281, - "startIndex": 44269, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44269 - }, - { - "endIndex": 44320, - "paragraph": { - "elements": [ - { - "endIndex": 44320, - "startIndex": 44281, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44281 - }, - { - "endIndex": 44365, - "paragraph": { - "elements": [ - { - "endIndex": 44365, - "startIndex": 44320, - "textRun": { - "content": " return FutureBuilder>(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44320 - }, - { - "endIndex": 44394, - "paragraph": { - "elements": [ - { - "endIndex": 44394, - "startIndex": 44365, - "textRun": { - "content": " future: _pullRequests,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44365 - }, - { - "endIndex": 44431, - "paragraph": { - "elements": [ - { - "endIndex": 44431, - "startIndex": 44394, - "textRun": { - "content": " builder: (context, snapshot) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44394 - }, - { - "endIndex": 44464, - "paragraph": { - "elements": [ - { - "endIndex": 44464, - "startIndex": 44431, - "textRun": { - "content": " if (snapshot.hasError) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44431 - }, - { - "endIndex": 44523, - "paragraph": { - "elements": [ - { - "endIndex": 44523, - "startIndex": 44464, - "textRun": { - "content": " return Center(child: Text('${snapshot.error}'));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44464 - }, - { - "endIndex": 44533, - "paragraph": { - "elements": [ - { - "endIndex": 44533, - "startIndex": 44523, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44523 - }, - { - "endIndex": 44566, - "paragraph": { - "elements": [ - { - "endIndex": 44566, - "startIndex": 44533, - "textRun": { - "content": " if (!snapshot.hasData) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44533 - }, - { - "endIndex": 44633, - "paragraph": { - "elements": [ - { - "endIndex": 44633, - "startIndex": 44566, - "textRun": { - "content": " return const Center(child: CircularProgressIndicator());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44566 - }, - { - "endIndex": 44643, - "paragraph": { - "elements": [ - { - "endIndex": 44643, - "startIndex": 44633, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44633 - }, - { - "endIndex": 44685, - "paragraph": { - "elements": [ - { - "endIndex": 44685, - "startIndex": 44643, - "textRun": { - "content": " var pullRequests = snapshot.data;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44643 - }, - { - "endIndex": 44718, - "paragraph": { - "elements": [ - { - "endIndex": 44718, - "startIndex": 44685, - "textRun": { - "content": " return ListView.builder(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44685 - }, - { - "endIndex": 44744, - "paragraph": { - "elements": [ - { - "endIndex": 44744, - "startIndex": 44718, - "textRun": { - "content": " primary: false,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44718 - }, - { - "endIndex": 44786, - "paragraph": { - "elements": [ - { - "endIndex": 44786, - "startIndex": 44744, - "textRun": { - "content": " itemBuilder: (context, index) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44744 - }, - { - "endIndex": 44837, - "paragraph": { - "elements": [ - { - "endIndex": 44837, - "startIndex": 44786, - "textRun": { - "content": " var pullRequest = pullRequests[index];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44786 - }, - { - "endIndex": 44866, - "paragraph": { - "elements": [ - { - "endIndex": 44866, - "startIndex": 44837, - "textRun": { - "content": " return ListTile(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44837 - }, - { - "endIndex": 44918, - "paragraph": { - "elements": [ - { - "endIndex": 44918, - "startIndex": 44866, - "textRun": { - "content": " title: Text(pullRequest.title ?? ''),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44866 - }, - { - "endIndex": 44966, - "paragraph": { - "elements": [ - { - "endIndex": 44966, - "startIndex": 44918, - "textRun": { - "content": " subtitle: Text('flutter/flutter '\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44918 - }, - { - "endIndex": 45013, - "paragraph": { - "elements": [ - { - "endIndex": 45013, - "startIndex": 44966, - "textRun": { - "content": " 'PR #${pullRequest.number} '\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44966 - }, - { - "endIndex": 45077, - "paragraph": { - "elements": [ - { - "endIndex": 45077, - "startIndex": 45013, - "textRun": { - "content": " 'opened by ${pullRequest.user?.login ?? ''} '\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45013 - }, - { - "endIndex": 45143, - "paragraph": { - "elements": [ - { - "endIndex": 45143, - "startIndex": 45077, - "textRun": { - "content": " '(${pullRequest.state?.toLowerCase() ?? ''})'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45077 - }, - { - "endIndex": 45215, - "paragraph": { - "elements": [ - { - "endIndex": 45215, - "startIndex": 45143, - "textRun": { - "content": " onTap: () => _launchUrl(this, pullRequest.htmlUrl ?? ''),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45143 - }, - { - "endIndex": 45230, - "paragraph": { - "elements": [ - { - "endIndex": 45230, - "startIndex": 45215, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45215 - }, - { - "endIndex": 45243, - "paragraph": { - "elements": [ - { - "endIndex": 45243, - "startIndex": 45230, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45230 - }, - { - "endIndex": 45286, - "paragraph": { - "elements": [ - { - "endIndex": 45286, - "startIndex": 45243, - "textRun": { - "content": " itemCount: pullRequests!.length,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45243 - }, - { - "endIndex": 45297, - "paragraph": { - "elements": [ - { - "endIndex": 45297, - "startIndex": 45286, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45286 - }, - { - "endIndex": 45306, - "paragraph": { - "elements": [ - { - "endIndex": 45306, - "startIndex": 45297, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45297 - }, - { - "endIndex": 45313, - "paragraph": { - "elements": [ - { - "endIndex": 45313, - "startIndex": 45306, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45306 - }, - { - "endIndex": 45317, - "paragraph": { - "elements": [ - { - "endIndex": 45317, - "startIndex": 45313, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45313 - }, - { - "endIndex": 45319, - "paragraph": { - "elements": [ - { - "endIndex": 45319, - "startIndex": 45317, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45317 - }, - { - "endIndex": 45320, - "paragraph": { - "elements": [ - { - "endIndex": 45320, - "startIndex": 45319, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45319 - }, - { - "endIndex": 45377, - "paragraph": { - "elements": [ - { - "endIndex": 45377, - "startIndex": 45320, - "textRun": { - "content": "Future _launchUrl(State state, String url) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45320 - }, - { - "endIndex": 45416, - "paragraph": { - "elements": [ - { - "endIndex": 45416, - "startIndex": 45377, - "textRun": { - "content": " if (await canLaunchUrlString(url)) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45377 - }, - { - "endIndex": 45448, - "paragraph": { - "elements": [ - { - "endIndex": 45448, - "startIndex": 45416, - "textRun": { - "content": " await launchUrlString(url);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45416 - }, - { - "endIndex": 45459, - "paragraph": { - "elements": [ - { - "endIndex": 45459, - "startIndex": 45448, - "textRun": { - "content": " } else {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45448 - }, - { - "endIndex": 45484, - "paragraph": { - "elements": [ - { - "endIndex": 45484, - "startIndex": 45459, - "textRun": { - "content": " if (state.mounted) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45459 - }, - { - "endIndex": 45509, - "paragraph": { - "elements": [ - { - "endIndex": 45509, - "startIndex": 45484, - "textRun": { - "content": " return showDialog(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45484 - }, - { - "endIndex": 45541, - "paragraph": { - "elements": [ - { - "endIndex": 45541, - "startIndex": 45509, - "textRun": { - "content": " context: state.context,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45509 - }, - { - "endIndex": 45584, - "paragraph": { - "elements": [ - { - "endIndex": 45584, - "startIndex": 45541, - "textRun": { - "content": " builder: (context) => AlertDialog(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45541 - }, - { - "endIndex": 45633, - "paragraph": { - "elements": [ - { - "endIndex": 45633, - "startIndex": 45584, - "textRun": { - "content": " title: const Text('Navigation error'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45584 - }, - { - "endIndex": 45683, - "paragraph": { - "elements": [ - { - "endIndex": 45683, - "startIndex": 45633, - "textRun": { - "content": " content: Text('Could not launch $url'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45633 - }, - { - "endIndex": 45712, - "paragraph": { - "elements": [ - { - "endIndex": 45712, - "startIndex": 45683, - "textRun": { - "content": " actions: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45683 - }, - { - "endIndex": 45736, - "paragraph": { - "elements": [ - { - "endIndex": 45736, - "startIndex": 45712, - "textRun": { - "content": " TextButton(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45712 - }, - { - "endIndex": 45766, - "paragraph": { - "elements": [ - { - "endIndex": 45766, - "startIndex": 45736, - "textRun": { - "content": " onPressed: () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45736 - }, - { - "endIndex": 45811, - "paragraph": { - "elements": [ - { - "endIndex": 45811, - "startIndex": 45766, - "textRun": { - "content": " Navigator.of(context).pop();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45766 - }, - { - "endIndex": 45828, - "paragraph": { - "elements": [ - { - "endIndex": 45828, - "startIndex": 45811, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45811 - }, - { - "endIndex": 45870, - "paragraph": { - "elements": [ - { - "endIndex": 45870, - "startIndex": 45828, - "textRun": { - "content": " child: const Text('Close'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45828 - }, - { - "endIndex": 45885, - "paragraph": { - "elements": [ - { - "endIndex": 45885, - "startIndex": 45870, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45870 - }, - { - "endIndex": 45898, - "paragraph": { - "elements": [ - { - "endIndex": 45898, - "startIndex": 45885, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45885 - }, - { - "endIndex": 45909, - "paragraph": { - "elements": [ - { - "endIndex": 45909, - "startIndex": 45898, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45898 - }, - { - "endIndex": 45918, - "paragraph": { - "elements": [ - { - "endIndex": 45918, - "startIndex": 45909, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45909 - }, - { - "endIndex": 45924, - "paragraph": { - "elements": [ - { - "endIndex": 45924, - "startIndex": 45918, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45918 - }, - { - "endIndex": 45928, - "paragraph": { - "elements": [ - { - "endIndex": 45928, - "startIndex": 45924, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45924 - }, - { - "endIndex": 45930, - "paragraph": { - "elements": [ - { - "endIndex": 45930, - "startIndex": 45928, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 45928 - } - ], - "endIndex": 45930, - "startIndex": 39014, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 45932, - "paragraph": { - "elements": [ - { - "endIndex": 45932, - "startIndex": 45931, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45931 - }, - { - "endIndex": 46198, - "paragraph": { - "elements": [ - { - "endIndex": 46197, - "startIndex": 45932, - "textRun": { - "content": "You have added a lot of new code here. The upside is that this is all pretty normal Flutter code, with widgets used to separate out responsibility for different concerns. Spend a few moments reviewing this code before moving onto the next step of making it all run.", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 46198, - "startIndex": 46197, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 45932 - }, - { - "endIndex": 46233, - "paragraph": { - "elements": [ - { - "endIndex": 46233, - "startIndex": 46198, - "textRun": { - "content": "Put it all together, one last time\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.y5j48x6wjjvw", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 46198 - }, - { - "endIndex": 46441, - "paragraph": { - "elements": [ - { - "endIndex": 46255, - "startIndex": 46233, - "textRun": { - "content": "It’s time to integrate", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 46256, - "startIndex": 46255, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 46269, - "startIndex": 46256, - "textRun": { - "content": "GitHubSummary", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46270, - "startIndex": 46269, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 46280, - "startIndex": 46270, - "textRun": { - "content": "into your ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 46293, - "startIndex": 46280, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46402, - "startIndex": 46293, - "textRun": { - "content": " file. The changes are fairly major this time, but consist mostly of deletions. Replace the contents of your ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 46415, - "startIndex": 46402, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 46441, - "startIndex": 46415, - "textRun": { - "content": " file with the following.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 46233 - }, - { - "endIndex": 46455, - "paragraph": { - "elements": [ - { - "endIndex": 46454, - "startIndex": 46441, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/github-client/step_07/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 46455, - "startIndex": 46454, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.e4zstb7o43sr", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 46441 - }, - { - "endIndex": 48212, - "startIndex": 46455, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 48211, - "startIndex": 46456, - "tableCells": [ - { - "content": [ - { - "endIndex": 46498, - "paragraph": { - "elements": [ - { - "endIndex": 46498, - "startIndex": 46458, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46458 - }, - { - "endIndex": 46535, - "paragraph": { - "elements": [ - { - "endIndex": 46535, - "startIndex": 46498, - "textRun": { - "content": "import 'package:github/github.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46498 - }, - { - "endIndex": 46590, - "paragraph": { - "elements": [ - { - "endIndex": 46590, - "startIndex": 46535, - "textRun": { - "content": "import 'package:window_to_front/window_to_front.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46535 - }, - { - "endIndex": 46591, - "paragraph": { - "elements": [ - { - "endIndex": 46591, - "startIndex": 46590, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46590 - }, - { - "endIndex": 46631, - "paragraph": { - "elements": [ - { - "endIndex": 46631, - "startIndex": 46591, - "textRun": { - "content": "import 'github_oauth_credentials.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46591 - }, - { - "endIndex": 46663, - "paragraph": { - "elements": [ - { - "endIndex": 46663, - "startIndex": 46631, - "textRun": { - "content": "import 'src/github_login.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46631 - }, - { - "endIndex": 46749, - "paragraph": { - "elements": [ - { - "endIndex": 46749, - "startIndex": 46663, - "textRun": { - "content": "import 'src/github_summary.dart'; // Add this import\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46663 - }, - { - "endIndex": 46750, - "paragraph": { - "elements": [ - { - "endIndex": 46750, - "startIndex": 46749, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46749 - }, - { - "endIndex": 46764, - "paragraph": { - "elements": [ - { - "endIndex": 46764, - "startIndex": 46750, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46750 - }, - { - "endIndex": 46789, - "paragraph": { - "elements": [ - { - "endIndex": 46789, - "startIndex": 46764, - "textRun": { - "content": " runApp(const MyApp());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46764 - }, - { - "endIndex": 46791, - "paragraph": { - "elements": [ - { - "endIndex": 46791, - "startIndex": 46789, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46789 - }, - { - "endIndex": 46792, - "paragraph": { - "elements": [ - { - "endIndex": 46792, - "startIndex": 46791, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46791 - }, - { - "endIndex": 46830, - "paragraph": { - "elements": [ - { - "endIndex": 46830, - "startIndex": 46792, - "textRun": { - "content": "class MyApp extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46792 - }, - { - "endIndex": 46858, - "paragraph": { - "elements": [ - { - "endIndex": 46858, - "startIndex": 46830, - "textRun": { - "content": " const MyApp({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46830 - }, - { - "endIndex": 46859, - "paragraph": { - "elements": [ - { - "endIndex": 46859, - "startIndex": 46858, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46858 - }, - { - "endIndex": 46871, - "paragraph": { - "elements": [ - { - "endIndex": 46871, - "startIndex": 46859, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46859 - }, - { - "endIndex": 46910, - "paragraph": { - "elements": [ - { - "endIndex": 46910, - "startIndex": 46871, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46871 - }, - { - "endIndex": 46934, - "paragraph": { - "elements": [ - { - "endIndex": 46934, - "startIndex": 46910, - "textRun": { - "content": " return MaterialApp(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46910 - }, - { - "endIndex": 46964, - "paragraph": { - "elements": [ - { - "endIndex": 46964, - "startIndex": 46934, - "textRun": { - "content": " title: 'GitHub Client',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46934 - }, - { - "endIndex": 46988, - "paragraph": { - "elements": [ - { - "endIndex": 46988, - "startIndex": 46964, - "textRun": { - "content": " theme: ThemeData(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46964 - }, - { - "endIndex": 47024, - "paragraph": { - "elements": [ - { - "endIndex": 47024, - "startIndex": 46988, - "textRun": { - "content": " primarySwatch: Colors.blue,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 46988 - }, - { - "endIndex": 47086, - "paragraph": { - "elements": [ - { - "endIndex": 47086, - "startIndex": 47024, - "textRun": { - "content": " visualDensity: VisualDensity.adaptivePlatformDensity,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47024 - }, - { - "endIndex": 47114, - "paragraph": { - "elements": [ - { - "endIndex": 47114, - "startIndex": 47086, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47086 - }, - { - "endIndex": 47123, - "paragraph": { - "elements": [ - { - "endIndex": 47123, - "startIndex": 47114, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47114 - }, - { - "endIndex": 47177, - "paragraph": { - "elements": [ - { - "endIndex": 47177, - "startIndex": 47123, - "textRun": { - "content": " home: const MyHomePage(title: 'GitHub Client'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47123 - }, - { - "endIndex": 47184, - "paragraph": { - "elements": [ - { - "endIndex": 47184, - "startIndex": 47177, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47177 - }, - { - "endIndex": 47188, - "paragraph": { - "elements": [ - { - "endIndex": 47188, - "startIndex": 47184, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47184 - }, - { - "endIndex": 47190, - "paragraph": { - "elements": [ - { - "endIndex": 47190, - "startIndex": 47188, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47188 - }, - { - "endIndex": 47191, - "paragraph": { - "elements": [ - { - "endIndex": 47191, - "startIndex": 47190, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47190 - }, - { - "endIndex": 47234, - "paragraph": { - "elements": [ - { - "endIndex": 47234, - "startIndex": 47191, - "textRun": { - "content": "class MyHomePage extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47191 - }, - { - "endIndex": 47288, - "paragraph": { - "elements": [ - { - "endIndex": 47288, - "startIndex": 47234, - "textRun": { - "content": " const MyHomePage({super.key, required this.title});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47234 - }, - { - "endIndex": 47310, - "paragraph": { - "elements": [ - { - "endIndex": 47310, - "startIndex": 47288, - "textRun": { - "content": " final String title;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47288 - }, - { - "endIndex": 47311, - "paragraph": { - "elements": [ - { - "endIndex": 47311, - "startIndex": 47310, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47310 - }, - { - "endIndex": 47323, - "paragraph": { - "elements": [ - { - "endIndex": 47323, - "startIndex": 47311, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47311 - }, - { - "endIndex": 47362, - "paragraph": { - "elements": [ - { - "endIndex": 47362, - "startIndex": 47323, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47323 - }, - { - "endIndex": 47392, - "paragraph": { - "elements": [ - { - "endIndex": 47392, - "startIndex": 47362, - "textRun": { - "content": " return GithubLoginWidget(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47362 - }, - { - "endIndex": 47431, - "paragraph": { - "elements": [ - { - "endIndex": 47431, - "startIndex": 47392, - "textRun": { - "content": " builder: (context, httpClient) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47392 - }, - { - "endIndex": 47465, - "paragraph": { - "elements": [ - { - "endIndex": 47465, - "startIndex": 47431, - "textRun": { - "content": " WindowToFront.activate();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47431 - }, - { - "endIndex": 47552, - "paragraph": { - "elements": [ - { - "endIndex": 47552, - "startIndex": 47465, - "textRun": { - "content": " return Scaffold( // Modify from here\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47465 - }, - { - "endIndex": 47578, - "paragraph": { - "elements": [ - { - "endIndex": 47578, - "startIndex": 47552, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47552 - }, - { - "endIndex": 47610, - "paragraph": { - "elements": [ - { - "endIndex": 47610, - "startIndex": 47578, - "textRun": { - "content": " title: Text(title),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47578 - }, - { - "endIndex": 47636, - "paragraph": { - "elements": [ - { - "endIndex": 47636, - "startIndex": 47610, - "textRun": { - "content": " elevation: 2,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47610 - }, - { - "endIndex": 47649, - "paragraph": { - "elements": [ - { - "endIndex": 47649, - "startIndex": 47636, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47636 - }, - { - "endIndex": 47680, - "paragraph": { - "elements": [ - { - "endIndex": 47680, - "startIndex": 47649, - "textRun": { - "content": " body: GitHubSummary(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47649 - }, - { - "endIndex": 47748, - "paragraph": { - "elements": [ - { - "endIndex": 47748, - "startIndex": 47680, - "textRun": { - "content": " gitHub: _getGitHub(httpClient.credentials.accessToken),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47680 - }, - { - "endIndex": 47761, - "paragraph": { - "elements": [ - { - "endIndex": 47761, - "startIndex": 47748, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47748 - }, - { - "endIndex": 47772, - "paragraph": { - "elements": [ - { - "endIndex": 47772, - "startIndex": 47761, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47761 - }, - { - "endIndex": 47851, - "paragraph": { - "elements": [ - { - "endIndex": 47851, - "startIndex": 47772, - "textRun": { - "content": " }, // to here.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47772 - }, - { - "endIndex": 47889, - "paragraph": { - "elements": [ - { - "endIndex": 47889, - "startIndex": 47851, - "textRun": { - "content": " githubClientId: githubClientId,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47851 - }, - { - "endIndex": 47935, - "paragraph": { - "elements": [ - { - "endIndex": 47935, - "startIndex": 47889, - "textRun": { - "content": " githubClientSecret: githubClientSecret,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47889 - }, - { - "endIndex": 47969, - "paragraph": { - "elements": [ - { - "endIndex": 47969, - "startIndex": 47935, - "textRun": { - "content": " githubScopes: githubScopes,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47935 - }, - { - "endIndex": 47976, - "paragraph": { - "elements": [ - { - "endIndex": 47976, - "startIndex": 47969, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47969 - }, - { - "endIndex": 47980, - "paragraph": { - "elements": [ - { - "endIndex": 47980, - "startIndex": 47976, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47976 - }, - { - "endIndex": 47982, - "paragraph": { - "elements": [ - { - "endIndex": 47982, - "startIndex": 47980, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47980 - }, - { - "endIndex": 47983, - "paragraph": { - "elements": [ - { - "endIndex": 47983, - "startIndex": 47982, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47982 - }, - { - "endIndex": 48070, - "paragraph": { - "elements": [ - { - "endIndex": 48070, - "startIndex": 47983, - "textRun": { - "content": "GitHub _getGitHub(String accessToken) { // Modify from here\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 47983 - }, - { - "endIndex": 48132, - "paragraph": { - "elements": [ - { - "endIndex": 48132, - "startIndex": 48070, - "textRun": { - "content": " return GitHub(auth: Authentication.withToken(accessToken));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48070 - }, - { - "endIndex": 48211, - "paragraph": { - "elements": [ - { - "endIndex": 48211, - "startIndex": 48132, - "textRun": { - "content": "} // to here.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48132 - } - ], - "endIndex": 48211, - "startIndex": 46457, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 48213, - "paragraph": { - "elements": [ - { - "endIndex": 48213, - "startIndex": 48212, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 48212 - }, - { - "endIndex": 48286, - "paragraph": { - "elements": [ - { - "endIndex": 48286, - "startIndex": 48213, - "textRun": { - "content": "Run the application, and you should be greeted with something like this:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 48213 - }, - { - "endIndex": 48287, - "paragraph": { - "elements": [ - { - "endIndex": 48287, - "startIndex": 48286, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 48286 - }, - { - "endIndex": 48289, - "paragraph": { - "elements": [ - { - "endIndex": 48288, - "inlineObjectElement": { - "inlineObjectId": "kix.r8eqa7qjhfq2", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "startIndex": 48287 - }, - { - "endIndex": 48289, - "startIndex": 48288, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 48287 - }, - { - "endIndex": 48291, - "paragraph": { - "elements": [ - { - "endIndex": 48290, - "horizontalRule": { - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "startIndex": 48289 - }, - { - "endIndex": 48291, - "startIndex": 48290, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 48289 - }, - { - "endIndex": 48302, - "paragraph": { - "elements": [ - { - "endIndex": 48301, - "startIndex": 48291, - "textRun": { - "content": "Next steps", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 48302, - "startIndex": 48301, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 20.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.wyjmgdlwi2kp", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 48291 - }, - { - "endIndex": 48317, - "paragraph": { - "elements": [ - { - "endIndex": 48316, - "startIndex": 48302, - "textRun": { - "content": "Duration: 0:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 48317, - "startIndex": 48316, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 48302 - }, - { - "endIndex": 48334, - "paragraph": { - "elements": [ - { - "endIndex": 48334, - "startIndex": 48317, - "textRun": { - "content": "Congratulations!\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 18.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6.0, - "unit": "PT" - } - } - }, - "startIndex": 48317 - }, - { - "endIndex": 48534, - "paragraph": { - "elements": [ - { - "endIndex": 48534, - "startIndex": 48334, - "textRun": { - "content": "You’ve completed the codelab and built a desktop Flutter application that accesses GitHub’s API. You used an authenticated API using OAuth and you used native APIs via a plugin that you also created.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 48334 - }, - { - "endIndex": 48535, - "paragraph": { - "elements": [ - { - "endIndex": 48535, - "startIndex": 48534, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 48534 - }, - { - "endIndex": 48706, - "paragraph": { - "elements": [ - { - "endIndex": 48581, - "startIndex": 48535, - "textRun": { - "content": "To learn more about Flutter on desktop, visit ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 48600, - "startIndex": 48581, - "textRun": { - "content": "flutter.dev/desktop", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/desktop" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 48670, - "startIndex": 48600, - "textRun": { - "content": ". Finally, to see a totally different take on Flutter and GitHub, see ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 48704, - "startIndex": 48670, - "textRun": { - "content": "GroovinChip's GitHub-Activity-Feed", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/GroovinChip/GitHub-Activity-Feed" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 48705, - "startIndex": 48704, - "textRun": { - "content": ".", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 48706, - "startIndex": 48705, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 48535 - } - ] - }, - "documentId": "1NJq1PfV9mB2avhoM2l12DSQ8p2x6s_epXcLwCcZwpcg", - "documentStyle": { - "background": { - "color": {} - }, - "defaultHeaderId": "kix.v4g5fejzegg1", - "marginBottom": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72.0, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792.0, - "unit": "PT" - }, - "width": { - "magnitude": 612.0, - "unit": "PT" - } - } - }, - "headers": { - "kix.v4g5fejzegg1": { - "content": [ - { - "endIndex": 1, - "paragraph": { - "elements": [ - { - "endIndex": 1, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - } - } - ], - "headerId": "kix.v4g5fejzegg1" - } - }, - "inlineObjects": { - "kix.2jbn21auh2tu": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/c-3lhCLmpuZRGzE7nM1EsUwMObkSz2q5SFg3A9syU5L8YriDtWIFl7Ttn_YSqxsqYPNUxFYDwRlvTOuBL7P49LD1fCMnQfTxKPOzeux3TTrk-FRnMVrSJaXceyrLa_EwyUBLUBN2S7KNt2mFJhcpRSwnuhEW7FtdN9DldL1xrwUAxi87I2g7Trpgm6zoWt3DXBwOU5Y", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 260.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.2jbn21auh2tu" - }, - "kix.4cz8icfcxdm4": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/c6ZvnuPeP5imeyqITgW7k2Tu50ieZ79-qGAjty2JpLLTwN7-ubIi2dJsNibA81XF0bxLJPMJWH5cE1PR6-BxTKTxJ9rqYMiYAFgm77rXpsV9x4jktD1PHkJdas_a134iPkZf77vlYSnoPoTegeOIBqQf-6Q8Y_hgh2LiSsGeQ-hRoU5eDtfZE405YjpyvKv0DdJRCjY", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 149.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.4cz8icfcxdm4" - }, - "kix.dsz4kv8xlc1j": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/nuTKRNWO_MY6kCvz65q0DigpOE5XJHsSpxuepoqRjCaM9jFRzns-dc5WvdLSDnNvEBmxRKMYYuRax0CRMRNgcP2BidVvG5dp_ufAerRhC0CRLKIeJX40YiYMcnL9S_rUFVAIRZ6mhsEt-9rnKjnskGieX9PSlZI_VoZta9SLnmuRTebIJ_Qzj5IvJOY8WkxLQt5KjL8", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 296.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.dsz4kv8xlc1j" - }, - "kix.indwct7imuzd": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/cbJU4mxBhrMkRjp8GYhcfw_Tb1SLDJOro8ViLh_eXQRDelaKbIDFheJeL1RRB10uomqm97On6hYb0lpoRXwxU2z85e14gof8s76V7FbPgN3WEQZ9Kw1cbnhGoV9xq2JLYE9JfnSxsUutYwjgW_F-Z6FcrXUIm16O-6qqQvYm_6lon_4yeXIRE0DBzr1n2ZKWXMW8sYM", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 149.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.indwct7imuzd" - }, - "kix.jul1ydybrquv": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/cT8b69R5LZq5jCmPsBglIIBpjdPVSKOvAIsmSp9RgTxjvweP2ONnEwk2uxMelsDCHht_J8uSthPqq0PwLEMqJSYA3eAREtPp0nxtvZooFNhrl7NdU28kuT61W2IPjhy8XRH8lZp8TFQ9CAmMdGccNFlkjhr0u6UC2ZiwkYV8PnTJeKrUGSPkYuI57wigQfpg8QfsrVI", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 167.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.jul1ydybrquv" - }, - "kix.lepm4wpxpiku": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/c6ZvnuPeP5imeyqITgW7k2Tu50ieZ79-qGAjty2JpLLTwN7-ubIi2dJsNibA81XF0bxLJPMJWH5cE1PR6-BxTKTxJ9rqYMiYAFgm77rXpsV9x4jktD1PHkJdas_a134iPkZf77vlYSnoPoTegeOIBqQf-6Q8Y_hgh2LiSsGeQ-hRoU5eDtfZE405YjpyvKv0DdJRCjY", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 149.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.lepm4wpxpiku" - }, - "kix.r8eqa7qjhfq2": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/GIpo006ZjxxK492v3CgTIVL17Bg48kyWD2HnTxkYlNISBhajtePiQMEm9Es5WxtCtU6jysVMc-3-WyqzpsHkHNtM3_ExNoy04g746HU4V5igEH65ykfXb5MoYfi_xtdzV6_1DeNSB9q5qybURsPNvUahiNA2mb8P2v9th6ffN1B_IrtBEad9fWKG7iLfC8NViOs5XpE", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 293.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.r8eqa7qjhfq2" - }, - "kix.srjkotqu1mbm": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/cbJU4mxBhrMkRjp8GYhcfw_Tb1SLDJOro8ViLh_eXQRDelaKbIDFheJeL1RRB10uomqm97On6hYb0lpoRXwxU2z85e14gof8s76V7FbPgN3WEQZ9Kw1cbnhGoV9xq2JLYE9JfnSxsUutYwjgW_F-Z6FcrXUIm16O-6qqQvYm_6lon_4yeXIRE0DBzr1n2ZKWXMW8sYM", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 149.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.srjkotqu1mbm" - }, - "kix.svvovjnm2z78": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/gFoWuUKowdZ5Ba8uL9T1wvRxIO2j9wZGwxXxMRaoLPjEh_2XaIHBdye1GfUv4ORmvkvU2k1o5CuWOKrxenXo2lTBbWYS8Vkn02zfNjQvYEPL4Dm8HrgtTMgo3MczEbK_tQQ-nQ-rH3B9NgPegzYr7ky_EVsHRc7unbendWddL8OUEAfR7mAHPGCdeYELf4M5SAY5Myo", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 167.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.svvovjnm2z78" - }, - "kix.wd9z5m1h3mib": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/WzDoQ3KqZpMJVGDygq4r_T6sbzuWTB1hBFQYjRd4vCNMA8wSpDtGsqLttgh2aTsxDLk2NDoceW3eD3ATrX9uUsX6s9zILCPaQzZBA-_-Co03YdH2Yb4GORmDOWUPcEsgIOp8Xi0Bk7Jm6z0pchSf5FxKxAdvdu4GIdifHUKnJZpHTHhIy_sLlv2a8OqvXhm9zaUp_ig", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 366.375, - "unit": "PT" - }, - "width": { - "magnitude": 372.62002840909093, - "unit": "PT" - } - } - } - }, - "objectId": "kix.wd9z5m1h3mib" - } - }, - "lists": { - "kix.1tjhv41sn0xa": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.1ztzk92hrth8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2ctr6ys6ni0e": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2jnyqucbt2t6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2whi3gkwlssd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3cjxume1ox5j": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3l2774habcsr": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4x1zl3kbw569": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4yb7edsq6e7h": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5hb992swn8xf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5jdr984vfzt1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5q2x329ym1hh": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.26666668, - "green": 0.26666668, - "red": 0.26666668 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6f05htw8422z": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6j918luqnpw7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6m37iee3p8wg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7or0vngkfvx7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7uh5pgoi33tb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.83lp1z9knfuo": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.8bm96xhzoe5y": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.8budch7w7arn": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.98e48u1wcy7a": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.98vmteiu60y4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9u3cg917bqs8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9ueckdtpugb1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9uhh20xkbn6m": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9z83l2c17pcu": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.agpmvda4vr7h": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.anq6omciu13j": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.aurhp3tf619": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.26666668, - "green": 0.4, - "red": 0.26666668 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.b7qotwh7gtna": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.bmk2w9stijyg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.c7ejcv2rhol9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cbv3p81ktfkm": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cicpotiggtwi": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cw1c2jqsuto": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cz18gb74rnbt": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ed3ilj3kkhq2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.f3mtn21egf47": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.f9bz4vrobr4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fa4ji89str8f": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fj7194xw5fjn": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g801zwj9tdo5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g846847cbhgd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g8ukrj6l25im": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.gawmxw84fbl": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.gpkppvve7lf6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.h1gbtohxox8w": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.hn7y8493y02l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 342.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 360.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.hnxe8uaki5ye": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.huc4gmkwuq3u": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ighvy8mje2ni": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 342.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 360.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 378.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 396.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 414.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 432.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.imsafi72ulmz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.j2ckn4bxfuh7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jah968f0rvh1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jkp7jly57b9l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.k0g7fgw2pxb9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kh0gu8ggzrfl": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kjyum9q5klsd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l2nxb9cf1l7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l9tvvj4pt5te": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.lapnsvq0oh3k": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.lwtrs6k81vg0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.nw9e0rbdtf2n": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.o6y9eyfrksu6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.o72pyift6jdv": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.oerq1n8ypay0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.pcizye4e9dah": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.phibiqsq7jjd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.pvf8i7z50kj2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.q5glzqgk6j58": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.q759u59r2yjj": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qk785s5gz3e7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qnkbj287noea": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qvkatskfprp3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qx7bo6w9dag0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qztvdbrb1co7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.r51tyrttcax1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.r8m6khspk25u": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ront1oenvgqg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rrgd3s9e8n6q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rup19lwpb96r": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rza4cz1vbnb5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.s154rj5xcbab": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.s3ytlwab2m4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.slxd9egkb7ci": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.sqqfdjlv2hm9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tismz98me1tb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tobmpp8mbh7q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.uye62wdrnhk7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.v58qrdjinxbw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vc2fcwdxd37v": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vwvs454chlx5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wa0nkis9zlxf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wvtqhihdjvtw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.x2xqmh4hm4pa": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.xj4zd89gdvlp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.y4auuiny9mus": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 342.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 360.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 378.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 396.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.yadiw4lw6xu2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z1u1i7qvii2l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z25dkq3ogzpp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z2hyt12r7kc1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z46ih1vlabol": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.zgjdicbyim0z": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6fjw6cht0bf", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.1f8fwhfw59th", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.4pgk284l6s7z", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.9ujhi55jbp4b", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_4", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.yjfswb1t0sub", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_5", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.91dfhsx5n4l3", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_6", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.uvzknuxefxg9", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "TITLE", - "pageBreakBefore": false - }, - "textStyle": { - "fontSize": { - "magnitude": 21.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - ] - }, - "revisionId": "ANeT5PSe0JLjQHIhr7w91o-_QO3-OM8mz3eAjJLDWDwi-qgMzlJfOC5IlLcgx6fehQ0_WZoIKtcM-t0l1v9N6w", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "title": "Write a Flutter desktop application Codelab (github library version)" -} \ No newline at end of file diff --git a/tooling/claat_export_images/test/data/exports/1Y099kkeEUvi3FRbE6a0pjZkkBzMHmraX3Q33zCC5uJM.json b/tooling/claat_export_images/test/data/exports/1Y099kkeEUvi3FRbE6a0pjZkkBzMHmraX3Q33zCC5uJM.json deleted file mode 100644 index 0bd93cf997..0000000000 --- a/tooling/claat_export_images/test/data/exports/1Y099kkeEUvi3FRbE6a0pjZkkBzMHmraX3Q33zCC5uJM.json +++ /dev/null @@ -1,57760 +0,0 @@ -{ - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 39, - "paragraph": { - "elements": [ - { - "endIndex": 39, - "startIndex": 1, - "textRun": { - "content": "Using a plugin with a Flutter web app\n", - "textStyle": { - "fontSize": { - "magnitude": 24.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Google Sans", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.42vbw0r8729a", - "namedStyleType": "TITLE", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 6.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1 - }, - { - "endIndex": 70, - "paragraph": { - "elements": [ - { - "endIndex": 69, - "startIndex": 39, - "textRun": { - "content": "Last update: 2/17/2020, ryjohn", - "textStyle": { - "fontSize": { - "magnitude": 8.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 70, - "startIndex": 69, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "END", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 39 - }, - { - "endIndex": 632, - "startIndex": 70, - "table": { - "columns": 2, - "rows": 9, - "tableRows": [ - { - "endIndex": 374, - "startIndex": 71, - "tableCells": [ - { - "content": [ - { - "endIndex": 81, - "paragraph": { - "elements": [ - { - "endIndex": 81, - "startIndex": 73, - "textRun": { - "content": "Summary\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 73 - } - ], - "endIndex": 81, - "startIndex": 72, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 374, - "paragraph": { - "elements": [ - { - "endIndex": 374, - "startIndex": 82, - "textRun": { - "content": "In this codelab, you’ll start with a mostly completed (but simple) web app. You’ll finish the app, and then practice debugging the app. Finally, you’ll add a URL plugin that enables you to open a new tab (on the web), launch a second copy of the app, and navigate to a hosted privacy page.\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 82 - } - ], - "endIndex": 374, - "startIndex": 81, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 407, - "startIndex": 374, - "tableCells": [ - { - "content": [ - { - "endIndex": 380, - "paragraph": { - "elements": [ - { - "endIndex": 380, - "startIndex": 376, - "textRun": { - "content": "URL\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 376 - } - ], - "endIndex": 380, - "startIndex": 375, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 407, - "paragraph": { - "elements": [ - { - "endIndex": 407, - "startIndex": 381, - "textRun": { - "content": "codelabs/web-url-launcher\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 381 - } - ], - "endIndex": 407, - "startIndex": 380, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 427, - "startIndex": 407, - "tableCells": [ - { - "content": [ - { - "endIndex": 418, - "paragraph": { - "elements": [ - { - "endIndex": 418, - "startIndex": 409, - "textRun": { - "content": "Category\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 409 - } - ], - "endIndex": 418, - "startIndex": 408, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 427, - "paragraph": { - "elements": [ - { - "endIndex": 427, - "startIndex": 419, - "textRun": { - "content": "Flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 419 - } - ], - "endIndex": 427, - "startIndex": 418, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 453, - "startIndex": 427, - "tableCells": [ - { - "content": [ - { - "endIndex": 441, - "paragraph": { - "elements": [ - { - "endIndex": 441, - "startIndex": 429, - "textRun": { - "content": "Environment\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 429 - } - ], - "endIndex": 441, - "startIndex": 428, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 453, - "paragraph": { - "elements": [ - { - "endIndex": 453, - "startIndex": 442, - "textRun": { - "content": "web, kiosk\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 442 - } - ], - "endIndex": 453, - "startIndex": 441, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 473, - "startIndex": 453, - "tableCells": [ - { - "content": [ - { - "endIndex": 462, - "paragraph": { - "elements": [ - { - "endIndex": 462, - "startIndex": 455, - "textRun": { - "content": "Status\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 455 - } - ], - "endIndex": 462, - "startIndex": 454, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 473, - "paragraph": { - "elements": [ - { - "endIndex": 473, - "startIndex": 463, - "textRun": { - "content": "Published\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 463 - } - ], - "endIndex": 473, - "startIndex": 462, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 532, - "startIndex": 473, - "tableCells": [ - { - "content": [ - { - "endIndex": 489, - "paragraph": { - "elements": [ - { - "endIndex": 489, - "startIndex": 475, - "textRun": { - "content": "Feedback Link\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 475 - } - ], - "endIndex": 489, - "startIndex": 474, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 532, - "paragraph": { - "elements": [ - { - "endIndex": 531, - "startIndex": 490, - "textRun": { - "content": "https://github.com/flutter/website/issues", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/website/issues" - }, - "underline": true - } - } - }, - { - "endIndex": 532, - "startIndex": 531, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 490 - } - ], - "endIndex": 532, - "startIndex": 489, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 580, - "startIndex": 532, - "tableCells": [ - { - "content": [ - { - "endIndex": 541, - "paragraph": { - "elements": [ - { - "endIndex": 541, - "startIndex": 534, - "textRun": { - "content": "Author\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 534 - } - ], - "endIndex": 541, - "startIndex": 533, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 580, - "paragraph": { - "elements": [ - { - "endIndex": 580, - "startIndex": 542, - "textRun": { - "content": "Shams Zakhour, code author: John Ryan\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 542 - } - ], - "endIndex": 580, - "startIndex": 541, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 609, - "startIndex": 580, - "tableCells": [ - { - "content": [ - { - "endIndex": 594, - "paragraph": { - "elements": [ - { - "endIndex": 594, - "startIndex": 582, - "textRun": { - "content": "Author LDAP\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 582 - } - ], - "endIndex": 594, - "startIndex": 581, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 609, - "paragraph": { - "elements": [ - { - "endIndex": 609, - "startIndex": 595, - "textRun": { - "content": "shaza, ryjohn\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 595 - } - ], - "endIndex": 609, - "startIndex": 594, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 631, - "startIndex": 609, - "tableCells": [ - { - "content": [ - { - "endIndex": 629, - "paragraph": { - "elements": [ - { - "endIndex": 629, - "startIndex": 611, - "textRun": { - "content": "Analytics Account\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 611 - } - ], - "endIndex": 629, - "startIndex": 610, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 631, - "paragraph": { - "elements": [ - { - "endIndex": 631, - "startIndex": 630, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 630 - } - ], - "endIndex": 631, - "startIndex": 629, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "width": { - "magnitude": 101.25, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - }, - { - "width": { - "magnitude": 366.75, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - } - ] - } - } - }, - { - "endIndex": 633, - "paragraph": { - "elements": [ - { - "endIndex": 633, - "startIndex": 632, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 632 - }, - { - "endIndex": 634, - "paragraph": { - "elements": [ - { - "endIndex": 634, - "startIndex": 633, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 633 - }, - { - "endIndex": 635, - "paragraph": { - "elements": [ - { - "endIndex": 635, - "startIndex": 634, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 634 - }, - { - "endIndex": 1014, - "startIndex": 635, - "tableOfContents": { - "content": [ - { - "endIndex": 667, - "paragraph": { - "elements": [ - { - "endIndex": 666, - "startIndex": 636, - "textRun": { - "content": "NOTES (not visible externally)", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.s13wmcdxanl" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 667, - "startIndex": 666, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 4.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 636 - }, - { - "endIndex": 680, - "paragraph": { - "elements": [ - { - "endIndex": 679, - "startIndex": 667, - "textRun": { - "content": "Introduction", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.w061xsmdkxzw" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 680, - "startIndex": 679, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 667 - }, - { - "endIndex": 698, - "paragraph": { - "elements": [ - { - "endIndex": 697, - "startIndex": 680, - "textRun": { - "content": "What you’ll learn", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.4mfxud7sfv4r" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 698, - "startIndex": 697, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 680 - }, - { - "endIndex": 746, - "paragraph": { - "elements": [ - { - "endIndex": 745, - "startIndex": 698, - "textRun": { - "content": "What would you like to learn from this codelab?", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.b7nxsg514qu3" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 746, - "startIndex": 745, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 698 - }, - { - "endIndex": 772, - "paragraph": { - "elements": [ - { - "endIndex": 771, - "startIndex": 746, - "textRun": { - "content": "What is a Flutter plugin?", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.mhvyi5287fqd" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 772, - "startIndex": 771, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 746 - }, - { - "endIndex": 804, - "paragraph": { - "elements": [ - { - "endIndex": 803, - "startIndex": 772, - "textRun": { - "content": "Set up your Flutter environment", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.mmoyw45xprw7" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 804, - "startIndex": 803, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 772 - }, - { - "endIndex": 827, - "paragraph": { - "elements": [ - { - "endIndex": 826, - "startIndex": 804, - "textRun": { - "content": "Create the starter app", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.dtb1a1qr9u6y" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 827, - "startIndex": 826, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 804 - }, - { - "endIndex": 855, - "paragraph": { - "elements": [ - { - "endIndex": 854, - "startIndex": 827, - "textRun": { - "content": "Add the GitHub star counter", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.qwovqpiiyhma" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 855, - "startIndex": 854, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 827 - }, - { - "endIndex": 865, - "paragraph": { - "elements": [ - { - "endIndex": 864, - "startIndex": 855, - "textRun": { - "content": "Debugging", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.c4pdtp9uvne1" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 865, - "startIndex": 864, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 855 - }, - { - "endIndex": 886, - "paragraph": { - "elements": [ - { - "endIndex": 885, - "startIndex": 865, - "textRun": { - "content": "Add a privacy policy", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.5397tstqsgl6" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 886, - "startIndex": 885, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 865 - }, - { - "endIndex": 905, - "paragraph": { - "elements": [ - { - "endIndex": 904, - "startIndex": 886, - "textRun": { - "content": "Host with Firebase", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.toqkntpt3r0b" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 905, - "startIndex": 904, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 886 - }, - { - "endIndex": 945, - "paragraph": { - "elements": [ - { - "endIndex": 944, - "startIndex": 905, - "textRun": { - "content": "Use an HTML file for the privacy policy", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.trx1fjg7wbe3" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 945, - "startIndex": 944, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 905 - }, - { - "endIndex": 974, - "paragraph": { - "elements": [ - { - "endIndex": 973, - "startIndex": 945, - "textRun": { - "content": "Use the url_launcher package", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.kfb695acu5qu" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 974, - "startIndex": 973, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 945 - }, - { - "endIndex": 983, - "paragraph": { - "elements": [ - { - "endIndex": 982, - "startIndex": 974, - "textRun": { - "content": "Clean up", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.dp7lhr3j3r0a" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 983, - "startIndex": 982, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 974 - }, - { - "endIndex": 1000, - "paragraph": { - "elements": [ - { - "endIndex": 999, - "startIndex": 983, - "textRun": { - "content": "Congratulations!", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.s22qmcj4zu61" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1000, - "startIndex": 999, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 983 - }, - { - "endIndex": 1013, - "paragraph": { - "elements": [ - { - "endIndex": 1012, - "startIndex": 1000, - "textRun": { - "content": "What’s next?", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.9mqifffit2ew" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1013, - "startIndex": 1012, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1000 - } - ] - } - }, - { - "endIndex": 1015, - "paragraph": { - "elements": [ - { - "endIndex": 1015, - "startIndex": 1014, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1014 - }, - { - "endIndex": 1017, - "paragraph": { - "elements": [ - { - "endIndex": 1016, - "horizontalRule": { - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 1015 - }, - { - "endIndex": 1017, - "startIndex": 1016, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1015 - }, - { - "endIndex": 1048, - "paragraph": { - "elements": [ - { - "endIndex": 1048, - "startIndex": 1017, - "textRun": { - "content": "NOTES (not visible externally)\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.s13wmcdxanl", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1017 - }, - { - "endIndex": 1066, - "paragraph": { - "elements": [ - { - "endIndex": 1066, - "startIndex": 1048, - "textRun": { - "content": "Environment: None\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1048 - }, - { - "endIndex": 1067, - "paragraph": { - "elements": [ - { - "endIndex": 1067, - "startIndex": 1066, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1066 - }, - { - "endIndex": 1121, - "paragraph": { - "elements": [ - { - "endIndex": 1093, - "startIndex": 1067, - "textRun": { - "content": "This codelab is published ", - "textStyle": {} - } - }, - { - "endIndex": 1099, - "startIndex": 1093, - "textRun": { - "content": "at URL", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://codelabs.developers.google.com/codelabs/web-url-launcher" - }, - "underline": true - } - } - }, - { - "endIndex": 1121, - "startIndex": 1099, - "textRun": { - "content": "... It’s based on ...\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1067 - }, - { - "endIndex": 1122, - "paragraph": { - "elements": [ - { - "endIndex": 1122, - "startIndex": 1121, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1121 - }, - { - "endIndex": 1141, - "paragraph": { - "elements": [ - { - "endIndex": 1141, - "startIndex": 1122, - "textRun": { - "content": "Goal for codelab: \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1122 - }, - { - "endIndex": 1202, - "paragraph": { - "bullet": { - "listId": "kix.78y1n2lze6li", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 1202, - "startIndex": 1141, - "textRun": { - "content": "We want to call out specific features that are web specific.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1141 - }, - { - "endIndex": 1352, - "paragraph": { - "bullet": { - "listId": "kix.78y1n2lze6li", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 1352, - "startIndex": 1202, - "textRun": { - "content": "There isn’t any difference in the actual widget implementation between mobile and web. So, spend little or no time coding the widget/animation code. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1202 - }, - { - "endIndex": 1388, - "paragraph": { - "bullet": { - "listId": "kix.78y1n2lze6li", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 1388, - "startIndex": 1352, - "textRun": { - "content": "Focus more on debugging on the web.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1352 - }, - { - "endIndex": 1505, - "paragraph": { - "bullet": { - "listId": "kix.78y1n2lze6li", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 1505, - "startIndex": 1388, - "textRun": { - "content": "Focus on Web primitives: plugins and navigation (nested navigation not supported), web specific and not responsive. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1388 - }, - { - "endIndex": 1506, - "paragraph": { - "elements": [ - { - "endIndex": 1506, - "startIndex": 1505, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1505 - }, - { - "endIndex": 1594, - "paragraph": { - "elements": [ - { - "endIndex": 1594, - "startIndex": 1506, - "textRun": { - "content": "Code sample: a flutter app that has a privacy policy within the app as a block of text.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1506 - }, - { - "endIndex": 1725, - "paragraph": { - "elements": [ - { - "endIndex": 1600, - "startIndex": 1594, - "textRun": { - "content": "Note: ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 1668, - "startIndex": 1600, - "textRun": { - "content": "Debugging works (on the master channel) in IntelliJ and VSCode when ", - "textStyle": {} - } - }, - { - "endIndex": 1713, - "startIndex": 1668, - "textRun": { - "content": "https://github.com/flutter/flutter/pull/51004", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/flutter/pull/51004" - }, - "underline": true - } - } - }, - { - "endIndex": 1725, - "startIndex": 1713, - "textRun": { - "content": " is merged.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1594 - }, - { - "endIndex": 1726, - "paragraph": { - "elements": [ - { - "endIndex": 1726, - "startIndex": 1725, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1725 - }, - { - "endIndex": 1741, - "paragraph": { - "elements": [ - { - "endIndex": 1727, - "inlineObjectElement": { - "inlineObjectId": "kix.v1fhcj94h66k", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 1726 - }, - { - "endIndex": 1740, - "startIndex": 1727, - "textRun": { - "content": " Observations", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 1741, - "startIndex": 1740, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1726 - }, - { - "endIndex": 1749, - "paragraph": { - "bullet": { - "listId": "kix.c0iuz2cn2ibx", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "elements": [ - { - "endIndex": 1748, - "startIndex": 1741, - "textRun": { - "content": "PENDING", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 1749, - "startIndex": 1748, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1741 - }, - { - "endIndex": 1750, - "paragraph": { - "elements": [ - { - "endIndex": 1750, - "startIndex": 1749, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1749 - }, - { - "endIndex": 1752, - "paragraph": { - "elements": [ - { - "endIndex": 1751, - "horizontalRule": { - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 1750 - }, - { - "endIndex": 1752, - "startIndex": 1751, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1750 - }, - { - "endIndex": 1765, - "paragraph": { - "elements": [ - { - "endIndex": 1765, - "startIndex": 1752, - "textRun": { - "content": "Introduction\n", - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.w061xsmdkxzw", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1752 - }, - { - "endIndex": 1780, - "paragraph": { - "elements": [ - { - "endIndex": 1780, - "startIndex": 1765, - "textRun": { - "content": "Duration: 1:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1765 - }, - { - "endIndex": 1781, - "paragraph": { - "elements": [ - { - "endIndex": 1781, - "startIndex": 1780, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1780 - }, - { - "endIndex": 2207, - "paragraph": { - "elements": [ - { - "endIndex": 2207, - "startIndex": 1781, - "textRun": { - "content": "Flutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase. In this codelab, you’ll finish an app that reports the number of stars on a GitHub repository. You’ll use Dart DevTools to do some simple debugging. You’ll learn how to host your app on Firebase. Finally, you’ll use a Flutter plugin to launch the app and open the hosted privacy policy.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 1781 - }, - { - "endIndex": 2225, - "paragraph": { - "elements": [ - { - "endIndex": 2225, - "startIndex": 2207, - "textRun": { - "content": "What you’ll learn\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.4mfxud7sfv4r", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 2207 - }, - { - "endIndex": 2226, - "paragraph": { - "elements": [ - { - "endIndex": 2226, - "startIndex": 2225, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 2225 - }, - { - "endIndex": 2267, - "paragraph": { - "bullet": { - "listId": "kix.22wvuhye0m1y", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2267, - "startIndex": 2226, - "textRun": { - "content": "How to use a Flutter plugin in a web app\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2226 - }, - { - "endIndex": 2313, - "paragraph": { - "bullet": { - "listId": "kix.22wvuhye0m1y", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 2313, - "startIndex": 2267, - "textRun": { - "content": "The difference between a package and a plugin\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2267 - }, - { - "endIndex": 2356, - "paragraph": { - "bullet": { - "listId": "kix.22wvuhye0m1y", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2356, - "startIndex": 2313, - "textRun": { - "content": "How to debug a web app using Dart DevTools\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2313 - }, - { - "endIndex": 2387, - "paragraph": { - "bullet": { - "listId": "kix.22wvuhye0m1y", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 2387, - "startIndex": 2356, - "textRun": { - "content": "How to host an app on Firebase\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2356 - }, - { - "endIndex": 2388, - "paragraph": { - "elements": [ - { - "endIndex": 2388, - "startIndex": 2387, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2387 - }, - { - "endIndex": 2571, - "paragraph": { - "elements": [ - { - "endIndex": 2401, - "startIndex": 2388, - "textRun": { - "content": "Prerequisites", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 2530, - "startIndex": 2401, - "textRun": { - "content": ": This codelab assumes that you have some basic Flutter knowledge. If you are new to Flutter, you might want to first start with ", - "textStyle": {} - } - }, - { - "endIndex": 2569, - "startIndex": 2530, - "textRun": { - "content": "Write your first Flutter app on the web", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/get-started/codelab-web" - }, - "underline": true - } - } - }, - { - "endIndex": 2571, - "startIndex": 2569, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2388 - }, - { - "endIndex": 2572, - "paragraph": { - "elements": [ - { - "endIndex": 2572, - "startIndex": 2571, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2571 - }, - { - "endIndex": 2838, - "startIndex": 2572, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 2837, - "startIndex": 2573, - "tableCells": [ - { - "content": [ - { - "endIndex": 2623, - "paragraph": { - "elements": [ - { - "endIndex": 2623, - "startIndex": 2575, - "textRun": { - "content": "What would you like to learn from this codelab?\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.b7nxsg514qu3", - "namedStyleType": "HEADING_4", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 2575 - }, - { - "endIndex": 2673, - "paragraph": { - "bullet": { - "listId": "kix.15okzfqxl6s1", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2673, - "startIndex": 2623, - "textRun": { - "content": "I'm new to the topic, and I want a good overview.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 2623 - }, - { - "endIndex": 2732, - "paragraph": { - "bullet": { - "listId": "kix.15okzfqxl6s1", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2732, - "startIndex": 2673, - "textRun": { - "content": "I know something about this topic, but I want a refresher.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 2673 - }, - { - "endIndex": 2783, - "paragraph": { - "bullet": { - "listId": "kix.15okzfqxl6s1", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2783, - "startIndex": 2732, - "textRun": { - "content": "I'm looking for example code to use in my project.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 2732 - }, - { - "endIndex": 2837, - "paragraph": { - "bullet": { - "listId": "kix.15okzfqxl6s1", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2837, - "startIndex": 2783, - "textRun": { - "content": "I'm looking for an explanation of something specific.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 2783 - } - ], - "endIndex": 2837, - "startIndex": 2574, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.8862745, - "red": 0.8117647 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 2864, - "paragraph": { - "elements": [ - { - "endIndex": 2864, - "startIndex": 2838, - "textRun": { - "content": "What is a Flutter plugin?\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.mhvyi5287fqd", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 2838 - }, - { - "endIndex": 3325, - "paragraph": { - "elements": [ - { - "endIndex": 2866, - "startIndex": 2864, - "textRun": { - "content": "A ", - "textStyle": {} - } - }, - { - "endIndex": 2872, - "startIndex": 2866, - "textRun": { - "content": "plugin", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 2888, - "startIndex": 2872, - "textRun": { - "content": " (also called a ", - "textStyle": {} - } - }, - { - "endIndex": 2902, - "startIndex": 2888, - "textRun": { - "content": "plugin package", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 3138, - "startIndex": 2902, - "textRun": { - "content": ") is a specialized Dart package that contains an API written in Dart code combined with one or more platform-specific implementations. Plugin packages can be written for Android (using Kotlin or Java), iOS (using Swift or Objective-C), ", - "textStyle": {} - } - }, - { - "endIndex": 3141, - "startIndex": 3138, - "textRun": { - "content": "web", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/web" - }, - "underline": true - } - } - }, - { - "endIndex": 3156, - "startIndex": 3141, - "textRun": { - "content": " (using Dart), ", - "textStyle": {} - } - }, - { - "endIndex": 3161, - "startIndex": 3156, - "textRun": { - "content": "macOS", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/desktop" - }, - "underline": true - } - } - }, - { - "endIndex": 3231, - "startIndex": 3161, - "textRun": { - "content": " (using Dart), or any combination thereof. (In fact, Flutter supports ", - "textStyle": {} - } - }, - { - "endIndex": 3248, - "startIndex": 3231, - "textRun": { - "content": "federated plugins", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/development/packages-and-plugins/developing-packages#federated-plugins" - }, - "underline": true - } - } - }, - { - "endIndex": 3325, - "startIndex": 3248, - "textRun": { - "content": ", which allow support for different platforms to be split across packages.) \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2864 - }, - { - "endIndex": 3326, - "paragraph": { - "elements": [ - { - "endIndex": 3326, - "startIndex": 3325, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3325 - }, - { - "endIndex": 3562, - "paragraph": { - "elements": [ - { - "endIndex": 3458, - "startIndex": 3326, - "textRun": { - "content": "A package is a Dart library that you can use to extend or simplify your app’s functionality. As previously mentioned, a plugin is a ", - "textStyle": {} - } - }, - { - "endIndex": 3462, - "startIndex": 3458, - "textRun": { - "content": "type", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 3530, - "startIndex": 3462, - "textRun": { - "content": " of a package. For more information about packages and plugins, see ", - "textStyle": {} - } - }, - { - "endIndex": 3561, - "startIndex": 3530, - "textRun": { - "content": "Flutter Plugin or Dart Package?", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://medium.com/@mehmetf_71205/flutter-plugin-or-dart-library-246c68df15f" - }, - "underline": true - } - } - }, - { - "endIndex": 3562, - "startIndex": 3561, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3326 - }, - { - "endIndex": 3594, - "paragraph": { - "elements": [ - { - "endIndex": 3594, - "startIndex": 3562, - "textRun": { - "content": "Set up your Flutter environment\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.mmoyw45xprw7", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3562 - }, - { - "endIndex": 3609, - "paragraph": { - "elements": [ - { - "endIndex": 3609, - "startIndex": 3594, - "textRun": { - "content": "Duration: 5:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3594 - }, - { - "endIndex": 3626, - "paragraph": { - "elements": [ - { - "endIndex": 3626, - "startIndex": 3609, - "textRun": { - "content": "Environment: web\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3609 - }, - { - "endIndex": 3627, - "paragraph": { - "elements": [ - { - "endIndex": 3627, - "startIndex": 3626, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3626 - }, - { - "endIndex": 3971, - "paragraph": { - "elements": [ - { - "endIndex": 3687, - "startIndex": 3627, - "textRun": { - "content": "You need three pieces of software to complete this lab: the ", - "textStyle": {} - } - }, - { - "endIndex": 3698, - "startIndex": 3687, - "textRun": { - "content": "Flutter SDK", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/get-started/install/" - }, - "underline": true - } - } - }, - { - "endIndex": 3700, - "startIndex": 3698, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 3709, - "startIndex": 3700, - "textRun": { - "content": "an editor", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/get-started/editor/" - }, - "underline": true - } - } - }, - { - "endIndex": 3719, - "startIndex": 3709, - "textRun": { - "content": ", and the ", - "textStyle": {} - } - }, - { - "endIndex": 3733, - "startIndex": 3719, - "textRun": { - "content": "Chrome browser", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.google.com/chrome/?brand=CHBD&gclid=CjwKCAiA1rPyBRAREiwA1UIy8M3xWhQtZTM_Yi1fUrkuDaj51QPTdhgAhPJyY2qyDoVxtW2Qca6xIxoCdgAQAvD_BwE&gclsrc=aw.ds" - }, - "underline": true - } - } - }, - { - "endIndex": 3881, - "startIndex": 3733, - "textRun": { - "content": ". You can use your preferred editor, such as Android Studio or IntelliJ with the Flutter and Dart plugins installed, or Visual Studio Code with the ", - "textStyle": {} - } - }, - { - "endIndex": 3913, - "startIndex": 3881, - "textRun": { - "content": "Dart Code and Flutter extensions", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://marketplace.visualstudio.com/items?itemName=Dart-Code.dart-code" - }, - "underline": true - } - } - }, - { - "endIndex": 3971, - "startIndex": 3913, - "textRun": { - "content": ". You will debug your code using Dart DevTools on Chrome.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3627 - }, - { - "endIndex": 3972, - "paragraph": { - "elements": [ - { - "endIndex": 3972, - "startIndex": 3971, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 3971 - }, - { - "endIndex": 4049, - "startIndex": 3972, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4048, - "startIndex": 3973, - "tableCells": [ - { - "content": [ - { - "endIndex": 4048, - "paragraph": { - "elements": [ - { - "endIndex": 3979, - "startIndex": 3975, - "textRun": { - "content": "Note", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 4048, - "startIndex": 3979, - "textRun": { - "content": ": The code for this codelab uses a plugin, so you can’t use DartPad.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3975 - } - ], - "endIndex": 4048, - "startIndex": 3974, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4050, - "paragraph": { - "elements": [ - { - "endIndex": 4050, - "startIndex": 4049, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4049 - }, - { - "endIndex": 4073, - "paragraph": { - "elements": [ - { - "endIndex": 4073, - "startIndex": 4050, - "textRun": { - "content": "Create the starter app\n", - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.dtb1a1qr9u6y", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4050 - }, - { - "endIndex": 4088, - "paragraph": { - "elements": [ - { - "endIndex": 4088, - "startIndex": 4073, - "textRun": { - "content": "Duration: 5:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4073 - }, - { - "endIndex": 4089, - "paragraph": { - "elements": [ - { - "endIndex": 4089, - "startIndex": 4088, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4088 - }, - { - "endIndex": 4197, - "paragraph": { - "elements": [ - { - "endIndex": 4197, - "startIndex": 4089, - "textRun": { - "content": "For this codelab, we provide much of the starting code so that you can quickly get to the interesting bits.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4089 - }, - { - "endIndex": 4198, - "paragraph": { - "elements": [ - { - "endIndex": 4198, - "startIndex": 4197, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4197 - }, - { - "endIndex": 4240, - "paragraph": { - "elements": [ - { - "endIndex": 4199, - "inlineObjectElement": { - "inlineObjectId": "kix.5db3m9m2wsxz", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 4198 - }, - { - "endIndex": 4240, - "startIndex": 4199, - "textRun": { - "content": "Create a simple, templated Flutter app. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4198 - }, - { - "endIndex": 4297, - "paragraph": { - "elements": [ - { - "endIndex": 4272, - "startIndex": 4240, - "textRun": { - "content": "Create a Flutter project called ", - "textStyle": {} - } - }, - { - "endIndex": 4284, - "startIndex": 4272, - "textRun": { - "content": "star_counter", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4297, - "startIndex": 4284, - "textRun": { - "content": " as follows.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4240 - }, - { - "endIndex": 4298, - "paragraph": { - "elements": [ - { - "endIndex": 4298, - "startIndex": 4297, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4297 - }, - { - "endIndex": 4350, - "startIndex": 4298, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4349, - "startIndex": 4299, - "tableCells": [ - { - "content": [ - { - "endIndex": 4331, - "paragraph": { - "elements": [ - { - "endIndex": 4331, - "startIndex": 4301, - "textRun": { - "content": "$ flutter create star_counter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4301 - }, - { - "endIndex": 4349, - "paragraph": { - "elements": [ - { - "endIndex": 4349, - "startIndex": 4331, - "textRun": { - "content": "$ cd star_counter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4331 - } - ], - "endIndex": 4349, - "startIndex": 4300, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4351, - "paragraph": { - "elements": [ - { - "endIndex": 4351, - "startIndex": 4350, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 4350 - }, - { - "endIndex": 4458, - "paragraph": { - "elements": [ - { - "endIndex": 4352, - "inlineObjectElement": { - "inlineObjectId": "kix.vjkt6v1dxl7n", - "textStyle": {} - }, - "startIndex": 4351 - }, - { - "endIndex": 4393, - "startIndex": 4352, - "textRun": { - "content": " Update project dependencies.\u000bRemove the ", - "textStyle": {} - } - }, - { - "endIndex": 4408, - "startIndex": 4393, - "textRun": { - "content": "cupertino_icons", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4458, - "startIndex": 4408, - "textRun": { - "content": " dependency, as this project isn’t targeting iOS.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4351 - }, - { - "endIndex": 4459, - "paragraph": { - "elements": [ - { - "endIndex": 4459, - "startIndex": 4458, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4458 - }, - { - "endIndex": 4800, - "startIndex": 4459, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4799, - "startIndex": 4460, - "tableCells": [ - { - "content": [ - { - "endIndex": 4499, - "paragraph": { - "elements": [ - { - "endIndex": 4499, - "startIndex": 4462, - "textRun": { - "content": "$ flutter pub remove cupertino_icons\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4462 - }, - { - "endIndex": 4525, - "paragraph": { - "elements": [ - { - "endIndex": 4525, - "startIndex": 4499, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4499 - }, - { - "endIndex": 4557, - "paragraph": { - "elements": [ - { - "endIndex": 4557, - "startIndex": 4525, - "textRun": { - "content": " async 2.8.1 (2.8.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4525 - }, - { - "endIndex": 4594, - "paragraph": { - "elements": [ - { - "endIndex": 4594, - "startIndex": 4557, - "textRun": { - "content": " characters 1.1.0 (1.2.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4557 - }, - { - "endIndex": 4632, - "paragraph": { - "elements": [ - { - "endIndex": 4632, - "startIndex": 4594, - "textRun": { - "content": " matcher 0.12.10 (0.12.11 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4594 - }, - { - "endIndex": 4667, - "paragraph": { - "elements": [ - { - "endIndex": 4667, - "startIndex": 4632, - "textRun": { - "content": " test_api 0.4.2 (0.4.5 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4632 - }, - { - "endIndex": 4705, - "paragraph": { - "elements": [ - { - "endIndex": 4705, - "startIndex": 4667, - "textRun": { - "content": " vector_math 2.1.0 (2.1.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4667 - }, - { - "endIndex": 4753, - "paragraph": { - "elements": [ - { - "endIndex": 4753, - "startIndex": 4705, - "textRun": { - "content": "These packages are no longer being depended on:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4705 - }, - { - "endIndex": 4777, - "paragraph": { - "elements": [ - { - "endIndex": 4777, - "startIndex": 4753, - "textRun": { - "content": "- cupertino_icons 1.0.3\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4753 - }, - { - "endIndex": 4799, - "paragraph": { - "elements": [ - { - "endIndex": 4799, - "startIndex": 4777, - "textRun": { - "content": "Changed 1 dependency!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4777 - } - ], - "endIndex": 4799, - "startIndex": 4461, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4801, - "paragraph": { - "elements": [ - { - "endIndex": 4801, - "startIndex": 4800, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4800 - }, - { - "endIndex": 4838, - "paragraph": { - "elements": [ - { - "endIndex": 4809, - "startIndex": 4801, - "textRun": { - "content": "Add the ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 4825, - "startIndex": 4809, - "textRun": { - "content": "flutter_markdown", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4838, - "startIndex": 4825, - "textRun": { - "content": " dependency.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4801 - }, - { - "endIndex": 4839, - "paragraph": { - "elements": [ - { - "endIndex": 4839, - "startIndex": 4838, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4838 - }, - { - "endIndex": 5163, - "startIndex": 4839, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 5162, - "startIndex": 4840, - "tableCells": [ - { - "content": [ - { - "endIndex": 4877, - "paragraph": { - "elements": [ - { - "endIndex": 4877, - "startIndex": 4842, - "textRun": { - "content": "$ flutter pub add flutter_markdown\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4842 - }, - { - "endIndex": 4903, - "paragraph": { - "elements": [ - { - "endIndex": 4903, - "startIndex": 4877, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4877 - }, - { - "endIndex": 4916, - "paragraph": { - "elements": [ - { - "endIndex": 4916, - "startIndex": 4903, - "textRun": { - "content": "+ args 2.3.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4903 - }, - { - "endIndex": 4948, - "paragraph": { - "elements": [ - { - "endIndex": 4948, - "startIndex": 4916, - "textRun": { - "content": " async 2.8.1 (2.8.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4916 - }, - { - "endIndex": 4985, - "paragraph": { - "elements": [ - { - "endIndex": 4985, - "startIndex": 4948, - "textRun": { - "content": " characters 1.1.0 (1.2.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4948 - }, - { - "endIndex": 5010, - "paragraph": { - "elements": [ - { - "endIndex": 5010, - "startIndex": 4985, - "textRun": { - "content": "+ flutter_markdown 0.6.6\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4985 - }, - { - "endIndex": 5027, - "paragraph": { - "elements": [ - { - "endIndex": 5027, - "startIndex": 5010, - "textRun": { - "content": "+ markdown 4.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5010 - }, - { - "endIndex": 5065, - "paragraph": { - "elements": [ - { - "endIndex": 5065, - "startIndex": 5027, - "textRun": { - "content": " matcher 0.12.10 (0.12.11 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5027 - }, - { - "endIndex": 5100, - "paragraph": { - "elements": [ - { - "endIndex": 5100, - "startIndex": 5065, - "textRun": { - "content": " test_api 0.4.2 (0.4.5 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5065 - }, - { - "endIndex": 5138, - "paragraph": { - "elements": [ - { - "endIndex": 5138, - "startIndex": 5100, - "textRun": { - "content": " vector_math 2.1.0 (2.1.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5100 - }, - { - "endIndex": 5162, - "paragraph": { - "elements": [ - { - "endIndex": 5162, - "startIndex": 5138, - "textRun": { - "content": "Changed 3 dependencies!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5138 - } - ], - "endIndex": 5162, - "startIndex": 4841, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 5164, - "paragraph": { - "elements": [ - { - "endIndex": 5164, - "startIndex": 5163, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5163 - }, - { - "endIndex": 5191, - "paragraph": { - "elements": [ - { - "endIndex": 5172, - "startIndex": 5164, - "textRun": { - "content": "Add the ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 5178, - "startIndex": 5172, - "textRun": { - "content": "github", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 5191, - "startIndex": 5178, - "textRun": { - "content": " dependency.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5164 - }, - { - "endIndex": 5192, - "paragraph": { - "elements": [ - { - "endIndex": 5192, - "startIndex": 5191, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5191 - }, - { - "endIndex": 5524, - "startIndex": 5192, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 5523, - "startIndex": 5193, - "tableCells": [ - { - "content": [ - { - "endIndex": 5220, - "paragraph": { - "elements": [ - { - "endIndex": 5220, - "startIndex": 5195, - "textRun": { - "content": "$ flutter pub add github\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5195 - }, - { - "endIndex": 5246, - "paragraph": { - "elements": [ - { - "endIndex": 5246, - "startIndex": 5220, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5220 - }, - { - "endIndex": 5278, - "paragraph": { - "elements": [ - { - "endIndex": 5278, - "startIndex": 5246, - "textRun": { - "content": " async 2.8.1 (2.8.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5246 - }, - { - "endIndex": 5315, - "paragraph": { - "elements": [ - { - "endIndex": 5315, - "startIndex": 5278, - "textRun": { - "content": " characters 1.1.0 (1.2.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5278 - }, - { - "endIndex": 5330, - "paragraph": { - "elements": [ - { - "endIndex": 5330, - "startIndex": 5315, - "textRun": { - "content": "+ github 8.1.3\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5315 - }, - { - "endIndex": 5344, - "paragraph": { - "elements": [ - { - "endIndex": 5344, - "startIndex": 5330, - "textRun": { - "content": "+ http 0.13.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5330 - }, - { - "endIndex": 5364, - "paragraph": { - "elements": [ - { - "endIndex": 5364, - "startIndex": 5344, - "textRun": { - "content": "+ http_parser 4.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5344 - }, - { - "endIndex": 5388, - "paragraph": { - "elements": [ - { - "endIndex": 5388, - "startIndex": 5364, - "textRun": { - "content": "+ json_annotation 4.1.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5364 - }, - { - "endIndex": 5426, - "paragraph": { - "elements": [ - { - "endIndex": 5426, - "startIndex": 5388, - "textRun": { - "content": " matcher 0.12.10 (0.12.11 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5388 - }, - { - "endIndex": 5461, - "paragraph": { - "elements": [ - { - "endIndex": 5461, - "startIndex": 5426, - "textRun": { - "content": " test_api 0.4.2 (0.4.5 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5426 - }, - { - "endIndex": 5499, - "paragraph": { - "elements": [ - { - "endIndex": 5499, - "startIndex": 5461, - "textRun": { - "content": " vector_math 2.1.0 (2.1.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5461 - }, - { - "endIndex": 5523, - "paragraph": { - "elements": [ - { - "endIndex": 5523, - "startIndex": 5499, - "textRun": { - "content": "Changed 4 dependencies!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5499 - } - ], - "endIndex": 5523, - "startIndex": 5194, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 5525, - "paragraph": { - "elements": [ - { - "endIndex": 5525, - "startIndex": 5524, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5524 - }, - { - "endIndex": 5559, - "paragraph": { - "elements": [ - { - "endIndex": 5542, - "startIndex": 5525, - "textRun": { - "content": "Finally, add the ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - }, - { - "endIndex": 5546, - "startIndex": 5542, - "textRun": { - "content": "intl", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 5559, - "startIndex": 5546, - "textRun": { - "content": " dependency.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5525 - }, - { - "endIndex": 5560, - "paragraph": { - "elements": [ - { - "endIndex": 5560, - "startIndex": 5559, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5559 - }, - { - "endIndex": 5829, - "startIndex": 5560, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 5828, - "startIndex": 5561, - "tableCells": [ - { - "content": [ - { - "endIndex": 5586, - "paragraph": { - "elements": [ - { - "endIndex": 5586, - "startIndex": 5563, - "textRun": { - "content": "$ flutter pub add intl\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5563 - }, - { - "endIndex": 5612, - "paragraph": { - "elements": [ - { - "endIndex": 5612, - "startIndex": 5586, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5586 - }, - { - "endIndex": 5644, - "paragraph": { - "elements": [ - { - "endIndex": 5644, - "startIndex": 5612, - "textRun": { - "content": " async 2.8.1 (2.8.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5612 - }, - { - "endIndex": 5681, - "paragraph": { - "elements": [ - { - "endIndex": 5681, - "startIndex": 5644, - "textRun": { - "content": " characters 1.1.0 (1.2.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5644 - }, - { - "endIndex": 5695, - "paragraph": { - "elements": [ - { - "endIndex": 5695, - "startIndex": 5681, - "textRun": { - "content": "+ intl 0.17.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5681 - }, - { - "endIndex": 5733, - "paragraph": { - "elements": [ - { - "endIndex": 5733, - "startIndex": 5695, - "textRun": { - "content": " matcher 0.12.10 (0.12.11 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5695 - }, - { - "endIndex": 5768, - "paragraph": { - "elements": [ - { - "endIndex": 5768, - "startIndex": 5733, - "textRun": { - "content": " test_api 0.4.2 (0.4.5 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5733 - }, - { - "endIndex": 5806, - "paragraph": { - "elements": [ - { - "endIndex": 5806, - "startIndex": 5768, - "textRun": { - "content": " vector_math 2.1.0 (2.1.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5768 - }, - { - "endIndex": 5828, - "paragraph": { - "elements": [ - { - "endIndex": 5828, - "startIndex": 5806, - "textRun": { - "content": "Changed 1 dependency!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5806 - } - ], - "endIndex": 5828, - "startIndex": 5562, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 5830, - "paragraph": { - "elements": [ - { - "endIndex": 5830, - "startIndex": 5829, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5829 - }, - { - "endIndex": 5867, - "paragraph": { - "elements": [ - { - "endIndex": 5831, - "inlineObjectElement": { - "inlineObjectId": "kix.twxjmoc118hg", - "textStyle": {} - }, - "startIndex": 5830 - }, - { - "endIndex": 5867, - "startIndex": 5831, - "textRun": { - "content": " Remove mobile and desktop runners.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5830 - }, - { - "endIndex": 6038, - "paragraph": { - "elements": [ - { - "endIndex": 6038, - "startIndex": 5867, - "textRun": { - "content": "This project is designed to work with Flutter for the web. Removing the mobile and desktop runners will eliminate the need to select which platform to run this project on\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5867 - }, - { - "endIndex": 6039, - "paragraph": { - "elements": [ - { - "endIndex": 6039, - "startIndex": 6038, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6038 - }, - { - "endIndex": 6083, - "startIndex": 6039, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 6082, - "startIndex": 6040, - "tableCells": [ - { - "content": [ - { - "endIndex": 6082, - "paragraph": { - "elements": [ - { - "endIndex": 6082, - "startIndex": 6042, - "textRun": { - "content": "$ rm -r android ios linux macos windows\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6042 - } - ], - "endIndex": 6082, - "startIndex": 6041, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6084, - "paragraph": { - "elements": [ - { - "endIndex": 6084, - "startIndex": 6083, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6083 - }, - { - "endIndex": 6085, - "paragraph": { - "elements": [ - { - "endIndex": 6085, - "startIndex": 6084, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6084 - }, - { - "endIndex": 6348, - "paragraph": { - "elements": [ - { - "endIndex": 6086, - "inlineObjectElement": { - "inlineObjectId": "kix.61wjzryati9j", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - "startIndex": 6085 - }, - { - "endIndex": 6087, - "startIndex": 6086, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 6111, - "startIndex": 6087, - "textRun": { - "content": "Replace the contents of ", - "textStyle": {} - } - }, - { - "endIndex": 6124, - "startIndex": 6111, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6154, - "startIndex": 6124, - "textRun": { - "content": ".\u000bDelete all of the code from ", - "textStyle": {} - } - }, - { - "endIndex": 6167, - "startIndex": 6154, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6348, - "startIndex": 6167, - "textRun": { - "content": ", which creates a Material-themed, count-the-number-of-button-presses app. Add the following code, which sets up a not-yet-complete, count-the-number-of-stars-on-a-GitHub-repo app:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 6085 - }, - { - "endIndex": 6362, - "paragraph": { - "elements": [ - { - "endIndex": 6361, - "startIndex": 6348, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_04/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 6362, - "startIndex": 6361, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.rh8xifbejxdd", - "lineSpacing": 100.0, - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 6348 - }, - { - "endIndex": 8345, - "startIndex": 6362, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 8344, - "startIndex": 6363, - "tableCells": [ - { - "content": [ - { - "endIndex": 6405, - "paragraph": { - "elements": [ - { - "endIndex": 6405, - "startIndex": 6365, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6365 - }, - { - "endIndex": 6406, - "paragraph": { - "elements": [ - { - "endIndex": 6406, - "startIndex": 6405, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6405 - }, - { - "endIndex": 6420, - "paragraph": { - "elements": [ - { - "endIndex": 6420, - "startIndex": 6406, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6406 - }, - { - "endIndex": 6454, - "paragraph": { - "elements": [ - { - "endIndex": 6454, - "startIndex": 6420, - "textRun": { - "content": " runApp(const StarCounterApp());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6420 - }, - { - "endIndex": 6456, - "paragraph": { - "elements": [ - { - "endIndex": 6456, - "startIndex": 6454, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6454 - }, - { - "endIndex": 6457, - "paragraph": { - "elements": [ - { - "endIndex": 6457, - "startIndex": 6456, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6456 - }, - { - "endIndex": 6504, - "paragraph": { - "elements": [ - { - "endIndex": 6504, - "startIndex": 6457, - "textRun": { - "content": "class StarCounterApp extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6457 - }, - { - "endIndex": 6541, - "paragraph": { - "elements": [ - { - "endIndex": 6541, - "startIndex": 6504, - "textRun": { - "content": " const StarCounterApp({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6504 - }, - { - "endIndex": 6542, - "paragraph": { - "elements": [ - { - "endIndex": 6542, - "startIndex": 6541, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6541 - }, - { - "endIndex": 6554, - "paragraph": { - "elements": [ - { - "endIndex": 6554, - "startIndex": 6542, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6542 - }, - { - "endIndex": 6593, - "paragraph": { - "elements": [ - { - "endIndex": 6593, - "startIndex": 6554, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6554 - }, - { - "endIndex": 6617, - "paragraph": { - "elements": [ - { - "endIndex": 6617, - "startIndex": 6593, - "textRun": { - "content": " return MaterialApp(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6593 - }, - { - "endIndex": 6641, - "paragraph": { - "elements": [ - { - "endIndex": 6641, - "startIndex": 6617, - "textRun": { - "content": " theme: ThemeData(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6617 - }, - { - "endIndex": 6679, - "paragraph": { - "elements": [ - { - "endIndex": 6679, - "startIndex": 6641, - "textRun": { - "content": " brightness: Brightness.light,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6641 - }, - { - "endIndex": 6707, - "paragraph": { - "elements": [ - { - "endIndex": 6707, - "startIndex": 6679, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6679 - }, - { - "endIndex": 6716, - "paragraph": { - "elements": [ - { - "endIndex": 6716, - "startIndex": 6707, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6707 - }, - { - "endIndex": 6732, - "paragraph": { - "elements": [ - { - "endIndex": 6732, - "startIndex": 6716, - "textRun": { - "content": " routes: {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6716 - }, - { - "endIndex": 6776, - "paragraph": { - "elements": [ - { - "endIndex": 6776, - "startIndex": 6732, - "textRun": { - "content": " '/': (context) => const HomePage(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6732 - }, - { - "endIndex": 6785, - "paragraph": { - "elements": [ - { - "endIndex": 6785, - "startIndex": 6776, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6776 - }, - { - "endIndex": 6792, - "paragraph": { - "elements": [ - { - "endIndex": 6792, - "startIndex": 6785, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6785 - }, - { - "endIndex": 6796, - "paragraph": { - "elements": [ - { - "endIndex": 6796, - "startIndex": 6792, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6792 - }, - { - "endIndex": 6798, - "paragraph": { - "elements": [ - { - "endIndex": 6798, - "startIndex": 6796, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6796 - }, - { - "endIndex": 6799, - "paragraph": { - "elements": [ - { - "endIndex": 6799, - "startIndex": 6798, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6798 - }, - { - "endIndex": 6839, - "paragraph": { - "elements": [ - { - "endIndex": 6839, - "startIndex": 6799, - "textRun": { - "content": "class HomePage extends StatefulWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6799 - }, - { - "endIndex": 6870, - "paragraph": { - "elements": [ - { - "endIndex": 6870, - "startIndex": 6839, - "textRun": { - "content": " const HomePage({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6839 - }, - { - "endIndex": 6871, - "paragraph": { - "elements": [ - { - "endIndex": 6871, - "startIndex": 6870, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6870 - }, - { - "endIndex": 6883, - "paragraph": { - "elements": [ - { - "endIndex": 6883, - "startIndex": 6871, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6871 - }, - { - "endIndex": 6936, - "paragraph": { - "elements": [ - { - "endIndex": 6936, - "startIndex": 6883, - "textRun": { - "content": " State createState() => _HomePageState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6883 - }, - { - "endIndex": 6938, - "paragraph": { - "elements": [ - { - "endIndex": 6938, - "startIndex": 6936, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6936 - }, - { - "endIndex": 6939, - "paragraph": { - "elements": [ - { - "endIndex": 6939, - "startIndex": 6938, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6938 - }, - { - "endIndex": 6986, - "paragraph": { - "elements": [ - { - "endIndex": 6986, - "startIndex": 6939, - "textRun": { - "content": "class _HomePageState extends State {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6939 - }, - { - "endIndex": 7017, - "paragraph": { - "elements": [ - { - "endIndex": 7017, - "startIndex": 6986, - "textRun": { - "content": " String _repositoryName = '';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6986 - }, - { - "endIndex": 7018, - "paragraph": { - "elements": [ - { - "endIndex": 7018, - "startIndex": 7017, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7017 - }, - { - "endIndex": 7030, - "paragraph": { - "elements": [ - { - "endIndex": 7030, - "startIndex": 7018, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7018 - }, - { - "endIndex": 7069, - "paragraph": { - "elements": [ - { - "endIndex": 7069, - "startIndex": 7030, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7030 - }, - { - "endIndex": 7090, - "paragraph": { - "elements": [ - { - "endIndex": 7090, - "startIndex": 7069, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7069 - }, - { - "endIndex": 7110, - "paragraph": { - "elements": [ - { - "endIndex": 7110, - "startIndex": 7090, - "textRun": { - "content": " body: Center(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7090 - }, - { - "endIndex": 7141, - "paragraph": { - "elements": [ - { - "endIndex": 7141, - "startIndex": 7110, - "textRun": { - "content": " child: ConstrainedBox(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7110 - }, - { - "endIndex": 7201, - "paragraph": { - "elements": [ - { - "endIndex": 7201, - "startIndex": 7141, - "textRun": { - "content": " constraints: const BoxConstraints(maxWidth: 400),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7141 - }, - { - "endIndex": 7224, - "paragraph": { - "elements": [ - { - "endIndex": 7224, - "startIndex": 7201, - "textRun": { - "content": " child: Card(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7201 - }, - { - "endIndex": 7252, - "paragraph": { - "elements": [ - { - "endIndex": 7252, - "startIndex": 7224, - "textRun": { - "content": " child: Padding(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7224 - }, - { - "endIndex": 7303, - "paragraph": { - "elements": [ - { - "endIndex": 7303, - "startIndex": 7252, - "textRun": { - "content": " padding: const EdgeInsets.all(16.0),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7252 - }, - { - "endIndex": 7332, - "paragraph": { - "elements": [ - { - "endIndex": 7332, - "startIndex": 7303, - "textRun": { - "content": " child: Column(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7303 - }, - { - "endIndex": 7380, - "paragraph": { - "elements": [ - { - "endIndex": 7380, - "startIndex": 7332, - "textRun": { - "content": " mainAxisSize: MainAxisSize.min,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7332 - }, - { - "endIndex": 7443, - "paragraph": { - "elements": [ - { - "endIndex": 7443, - "startIndex": 7380, - "textRun": { - "content": " crossAxisAlignment: CrossAxisAlignment.center,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7380 - }, - { - "endIndex": 7471, - "paragraph": { - "elements": [ - { - "endIndex": 7471, - "startIndex": 7443, - "textRun": { - "content": " children: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7443 - }, - { - "endIndex": 7495, - "paragraph": { - "elements": [ - { - "endIndex": 7495, - "startIndex": 7471, - "textRun": { - "content": " Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7471 - }, - { - "endIndex": 7538, - "paragraph": { - "elements": [ - { - "endIndex": 7538, - "startIndex": 7495, - "textRun": { - "content": " 'GitHub Star Counter',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7495 - }, - { - "endIndex": 7604, - "paragraph": { - "elements": [ - { - "endIndex": 7604, - "startIndex": 7538, - "textRun": { - "content": " style: Theme.of(context).textTheme.headline4,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7538 - }, - { - "endIndex": 7625, - "paragraph": { - "elements": [ - { - "endIndex": 7625, - "startIndex": 7604, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7604 - }, - { - "endIndex": 7654, - "paragraph": { - "elements": [ - { - "endIndex": 7654, - "startIndex": 7625, - "textRun": { - "content": " TextField(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7625 - }, - { - "endIndex": 7709, - "paragraph": { - "elements": [ - { - "endIndex": 7709, - "startIndex": 7654, - "textRun": { - "content": " decoration: const InputDecoration(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7654 - }, - { - "endIndex": 7771, - "paragraph": { - "elements": [ - { - "endIndex": 7771, - "startIndex": 7709, - "textRun": { - "content": " labelText: 'Enter a GitHub repository',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7709 - }, - { - "endIndex": 7822, - "paragraph": { - "elements": [ - { - "endIndex": 7822, - "startIndex": 7771, - "textRun": { - "content": " hintText: 'flutter/flutter',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7771 - }, - { - "endIndex": 7845, - "paragraph": { - "elements": [ - { - "endIndex": 7845, - "startIndex": 7822, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7822 - }, - { - "endIndex": 7887, - "paragraph": { - "elements": [ - { - "endIndex": 7887, - "startIndex": 7845, - "textRun": { - "content": " onSubmitted: (text) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7845 - }, - { - "endIndex": 7923, - "paragraph": { - "elements": [ - { - "endIndex": 7923, - "startIndex": 7887, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7887 - }, - { - "endIndex": 7971, - "paragraph": { - "elements": [ - { - "endIndex": 7971, - "startIndex": 7923, - "textRun": { - "content": " _repositoryName = text;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7923 - }, - { - "endIndex": 7997, - "paragraph": { - "elements": [ - { - "endIndex": 7997, - "startIndex": 7971, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7971 - }, - { - "endIndex": 8020, - "paragraph": { - "elements": [ - { - "endIndex": 8020, - "startIndex": 7997, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7997 - }, - { - "endIndex": 8041, - "paragraph": { - "elements": [ - { - "endIndex": 8041, - "startIndex": 8020, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8020 - }, - { - "endIndex": 8068, - "paragraph": { - "elements": [ - { - "endIndex": 8068, - "startIndex": 8041, - "textRun": { - "content": " Padding(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8041 - }, - { - "endIndex": 8131, - "paragraph": { - "elements": [ - { - "endIndex": 8131, - "startIndex": 8068, - "textRun": { - "content": " padding: const EdgeInsets.only(top: 32.0),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8068 - }, - { - "endIndex": 8164, - "paragraph": { - "elements": [ - { - "endIndex": 8164, - "startIndex": 8131, - "textRun": { - "content": " child: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8131 - }, - { - "endIndex": 8203, - "paragraph": { - "elements": [ - { - "endIndex": 8203, - "startIndex": 8164, - "textRun": { - "content": " _repositoryName,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8164 - }, - { - "endIndex": 8226, - "paragraph": { - "elements": [ - { - "endIndex": 8226, - "startIndex": 8203, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8203 - }, - { - "endIndex": 8247, - "paragraph": { - "elements": [ - { - "endIndex": 8247, - "startIndex": 8226, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8226 - }, - { - "endIndex": 8266, - "paragraph": { - "elements": [ - { - "endIndex": 8266, - "startIndex": 8247, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8247 - }, - { - "endIndex": 8283, - "paragraph": { - "elements": [ - { - "endIndex": 8283, - "startIndex": 8266, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8266 - }, - { - "endIndex": 8298, - "paragraph": { - "elements": [ - { - "endIndex": 8298, - "startIndex": 8283, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8283 - }, - { - "endIndex": 8311, - "paragraph": { - "elements": [ - { - "endIndex": 8311, - "startIndex": 8298, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8298 - }, - { - "endIndex": 8322, - "paragraph": { - "elements": [ - { - "endIndex": 8322, - "startIndex": 8311, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8311 - }, - { - "endIndex": 8331, - "paragraph": { - "elements": [ - { - "endIndex": 8331, - "startIndex": 8322, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8322 - }, - { - "endIndex": 8338, - "paragraph": { - "elements": [ - { - "endIndex": 8338, - "startIndex": 8331, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8331 - }, - { - "endIndex": 8342, - "paragraph": { - "elements": [ - { - "endIndex": 8342, - "startIndex": 8338, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8338 - }, - { - "endIndex": 8344, - "paragraph": { - "elements": [ - { - "endIndex": 8344, - "startIndex": 8342, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8342 - } - ], - "endIndex": 8344, - "startIndex": 6364, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 8346, - "paragraph": { - "elements": [ - { - "endIndex": 8346, - "startIndex": 8345, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8345 - }, - { - "endIndex": 8544, - "paragraph": { - "elements": [ - { - "endIndex": 8347, - "inlineObjectElement": { - "inlineObjectId": "kix.cnwl556irrz2", - "textStyle": {} - }, - "startIndex": 8346 - }, - { - "endIndex": 8425, - "startIndex": 8347, - "textRun": { - "content": "Run the app.\u000bRun the app on Chrome. If you’re using an IDE, then first select ", - "textStyle": {} - } - }, - { - "endIndex": 8431, - "startIndex": 8425, - "textRun": { - "content": "Chrome", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 8530, - "startIndex": 8431, - "textRun": { - "content": " from the device pulldown. If you’re using the command line, then from the top of the package, run ", - "textStyle": {} - } - }, - { - "endIndex": 8541, - "startIndex": 8530, - "textRun": { - "content": "flutter run", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8544, - "startIndex": 8541, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8346 - }, - { - "endIndex": 8545, - "paragraph": { - "elements": [ - { - "endIndex": 8545, - "startIndex": 8544, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8544 - }, - { - "endIndex": 8611, - "paragraph": { - "elements": [ - { - "endIndex": 8611, - "startIndex": 8545, - "textRun": { - "content": "Chrome launches, and you should see something like the following:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8545 - }, - { - "endIndex": 8612, - "paragraph": { - "elements": [ - { - "endIndex": 8612, - "startIndex": 8611, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8611 - }, - { - "endIndex": 8614, - "paragraph": { - "elements": [ - { - "endIndex": 8613, - "inlineObjectElement": { - "inlineObjectId": "kix.gpsty19g7y9", - "textStyle": {} - }, - "startIndex": 8612 - }, - { - "endIndex": 8614, - "startIndex": 8613, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8612 - }, - { - "endIndex": 8740, - "paragraph": { - "elements": [ - { - "endIndex": 8671, - "startIndex": 8614, - "textRun": { - "content": "Enter some text into the text field followed by pressing ", - "textStyle": {} - } - }, - { - "endIndex": 8677, - "startIndex": 8671, - "textRun": { - "content": "Return", - "textStyle": {} - } - }, - { - "endIndex": 8740, - "startIndex": 8677, - "textRun": { - "content": ". The text you typed is displayed at the bottom of the window.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8614 - }, - { - "endIndex": 8741, - "paragraph": { - "elements": [ - { - "endIndex": 8741, - "startIndex": 8740, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8740 - }, - { - "endIndex": 8769, - "paragraph": { - "elements": [ - { - "endIndex": 8769, - "startIndex": 8741, - "textRun": { - "content": "Add the GitHub star counter\n", - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.qwovqpiiyhma", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 8741 - }, - { - "endIndex": 8784, - "paragraph": { - "elements": [ - { - "endIndex": 8784, - "startIndex": 8769, - "textRun": { - "content": "Duration: 3:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 8769 - }, - { - "endIndex": 8785, - "paragraph": { - "elements": [ - { - "endIndex": 8785, - "startIndex": 8784, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8784 - }, - { - "endIndex": 8941, - "paragraph": { - "elements": [ - { - "endIndex": 8853, - "startIndex": 8785, - "textRun": { - "content": "Next, instead of displaying the text that was entered in the form, “", - "textStyle": {} - } - }, - { - "endIndex": 8875, - "startIndex": 8853, - "textRun": { - "content": "google/flutter.widgets", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/google/flutter.widgets" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 8941, - "startIndex": 8875, - "textRun": { - "content": "\", you modify the app to show the number of stars for that repo. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8785 - }, - { - "endIndex": 8942, - "paragraph": { - "elements": [ - { - "endIndex": 8942, - "startIndex": 8941, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8941 - }, - { - "endIndex": 8994, - "paragraph": { - "elements": [ - { - "endIndex": 8943, - "inlineObjectElement": { - "inlineObjectId": "kix.prx7fpu8fm7s", - "textStyle": {} - }, - "startIndex": 8942 - }, - { - "endIndex": 8964, - "startIndex": 8943, - "textRun": { - "content": "Create a new file in ", - "textStyle": {} - } - }, - { - "endIndex": 8967, - "startIndex": 8964, - "textRun": { - "content": "lib", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8975, - "startIndex": 8967, - "textRun": { - "content": " called ", - "textStyle": {} - } - }, - { - "endIndex": 8992, - "startIndex": 8975, - "textRun": { - "content": "star_counter.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8993, - "startIndex": 8992, - "textRun": { - "content": ":", - "textStyle": {} - } - }, - { - "endIndex": 8994, - "startIndex": 8993, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8942 - }, - { - "endIndex": 9016, - "paragraph": { - "elements": [ - { - "endIndex": 9015, - "startIndex": 8994, - "textRun": { - "content": "lib/star_counter.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_05/lib/star_counter.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 9016, - "startIndex": 9015, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.wpmfccc8wx68", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 8994 - }, - { - "endIndex": 11211, - "startIndex": 9016, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 11210, - "startIndex": 9017, - "tableCells": [ - { - "content": [ - { - "endIndex": 9059, - "paragraph": { - "elements": [ - { - "endIndex": 9059, - "startIndex": 9019, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9019 - }, - { - "endIndex": 9096, - "paragraph": { - "elements": [ - { - "endIndex": 9096, - "startIndex": 9059, - "textRun": { - "content": "import 'package:github/github.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9059 - }, - { - "endIndex": 9137, - "paragraph": { - "elements": [ - { - "endIndex": 9137, - "startIndex": 9096, - "textRun": { - "content": "import 'package:intl/intl.dart' as intl;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9096 - }, - { - "endIndex": 9138, - "paragraph": { - "elements": [ - { - "endIndex": 9138, - "startIndex": 9137, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9137 - }, - { - "endIndex": 9187, - "paragraph": { - "elements": [ - { - "endIndex": 9187, - "startIndex": 9138, - "textRun": { - "content": "class GitHubStarCounter extends StatefulWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9138 - }, - { - "endIndex": 9239, - "paragraph": { - "elements": [ - { - "endIndex": 9239, - "startIndex": 9187, - "textRun": { - "content": " /// The full repository name, e.g. torvalds/linux\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9187 - }, - { - "endIndex": 9270, - "paragraph": { - "elements": [ - { - "endIndex": 9270, - "startIndex": 9239, - "textRun": { - "content": " final String repositoryName;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9239 - }, - { - "endIndex": 9271, - "paragraph": { - "elements": [ - { - "endIndex": 9271, - "startIndex": 9270, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9270 - }, - { - "endIndex": 9299, - "paragraph": { - "elements": [ - { - "endIndex": 9299, - "startIndex": 9271, - "textRun": { - "content": " const GitHubStarCounter({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9271 - }, - { - "endIndex": 9333, - "paragraph": { - "elements": [ - { - "endIndex": 9333, - "startIndex": 9299, - "textRun": { - "content": " required this.repositoryName,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9299 - }, - { - "endIndex": 9348, - "paragraph": { - "elements": [ - { - "endIndex": 9348, - "startIndex": 9333, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9333 - }, - { - "endIndex": 9354, - "paragraph": { - "elements": [ - { - "endIndex": 9354, - "startIndex": 9348, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9348 - }, - { - "endIndex": 9355, - "paragraph": { - "elements": [ - { - "endIndex": 9355, - "startIndex": 9354, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9354 - }, - { - "endIndex": 9367, - "paragraph": { - "elements": [ - { - "endIndex": 9367, - "startIndex": 9355, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9355 - }, - { - "endIndex": 9438, - "paragraph": { - "elements": [ - { - "endIndex": 9438, - "startIndex": 9367, - "textRun": { - "content": " State createState() => _GitHubStarCounterState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9367 - }, - { - "endIndex": 9440, - "paragraph": { - "elements": [ - { - "endIndex": 9440, - "startIndex": 9438, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9438 - }, - { - "endIndex": 9441, - "paragraph": { - "elements": [ - { - "endIndex": 9441, - "startIndex": 9440, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9440 - }, - { - "endIndex": 9506, - "paragraph": { - "elements": [ - { - "endIndex": 9506, - "startIndex": 9441, - "textRun": { - "content": "class _GitHubStarCounterState extends State {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9441 - }, - { - "endIndex": 9533, - "paragraph": { - "elements": [ - { - "endIndex": 9533, - "startIndex": 9506, - "textRun": { - "content": " // The GitHub API client\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9506 - }, - { - "endIndex": 9555, - "paragraph": { - "elements": [ - { - "endIndex": 9555, - "startIndex": 9533, - "textRun": { - "content": " late GitHub github;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9533 - }, - { - "endIndex": 9556, - "paragraph": { - "elements": [ - { - "endIndex": 9556, - "startIndex": 9555, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9555 - }, - { - "endIndex": 9588, - "paragraph": { - "elements": [ - { - "endIndex": 9588, - "startIndex": 9556, - "textRun": { - "content": " // The repository information\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9556 - }, - { - "endIndex": 9614, - "paragraph": { - "elements": [ - { - "endIndex": 9614, - "startIndex": 9588, - "textRun": { - "content": " Repository? repository;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9588 - }, - { - "endIndex": 9615, - "paragraph": { - "elements": [ - { - "endIndex": 9615, - "startIndex": 9614, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9614 - }, - { - "endIndex": 9676, - "paragraph": { - "elements": [ - { - "endIndex": 9676, - "startIndex": 9615, - "textRun": { - "content": " // A human-readable error when the repository isn't found.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9615 - }, - { - "endIndex": 9700, - "paragraph": { - "elements": [ - { - "endIndex": 9700, - "startIndex": 9676, - "textRun": { - "content": " String? errorMessage;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9676 - }, - { - "endIndex": 9701, - "paragraph": { - "elements": [ - { - "endIndex": 9701, - "startIndex": 9700, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9700 - }, - { - "endIndex": 9713, - "paragraph": { - "elements": [ - { - "endIndex": 9713, - "startIndex": 9701, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9701 - }, - { - "endIndex": 9734, - "paragraph": { - "elements": [ - { - "endIndex": 9734, - "startIndex": 9713, - "textRun": { - "content": " void initState() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9713 - }, - { - "endIndex": 9757, - "paragraph": { - "elements": [ - { - "endIndex": 9757, - "startIndex": 9734, - "textRun": { - "content": " super.initState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9734 - }, - { - "endIndex": 9780, - "paragraph": { - "elements": [ - { - "endIndex": 9780, - "startIndex": 9757, - "textRun": { - "content": " github = GitHub();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9757 - }, - { - "endIndex": 9781, - "paragraph": { - "elements": [ - { - "endIndex": 9781, - "startIndex": 9780, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9780 - }, - { - "endIndex": 9804, - "paragraph": { - "elements": [ - { - "endIndex": 9804, - "startIndex": 9781, - "textRun": { - "content": " fetchRepository();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9781 - }, - { - "endIndex": 9808, - "paragraph": { - "elements": [ - { - "endIndex": 9808, - "startIndex": 9804, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9804 - }, - { - "endIndex": 9809, - "paragraph": { - "elements": [ - { - "endIndex": 9809, - "startIndex": 9808, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9808 - }, - { - "endIndex": 9821, - "paragraph": { - "elements": [ - { - "endIndex": 9821, - "startIndex": 9809, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9809 - }, - { - "endIndex": 9875, - "paragraph": { - "elements": [ - { - "endIndex": 9875, - "startIndex": 9821, - "textRun": { - "content": " void didUpdateWidget(GitHubStarCounter oldWidget) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9821 - }, - { - "endIndex": 9913, - "paragraph": { - "elements": [ - { - "endIndex": 9913, - "startIndex": 9875, - "textRun": { - "content": " super.didUpdateWidget(oldWidget);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9875 - }, - { - "endIndex": 9914, - "paragraph": { - "elements": [ - { - "endIndex": 9914, - "startIndex": 9913, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9913 - }, - { - "endIndex": 9966, - "paragraph": { - "elements": [ - { - "endIndex": 9966, - "startIndex": 9914, - "textRun": { - "content": " // When this widget's [repositoryName] changes,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9914 - }, - { - "endIndex": 10006, - "paragraph": { - "elements": [ - { - "endIndex": 10006, - "startIndex": 9966, - "textRun": { - "content": " // load the Repository information.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9966 - }, - { - "endIndex": 10067, - "paragraph": { - "elements": [ - { - "endIndex": 10067, - "startIndex": 10006, - "textRun": { - "content": " if (widget.repositoryName == oldWidget.repositoryName) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10006 - }, - { - "endIndex": 10081, - "paragraph": { - "elements": [ - { - "endIndex": 10081, - "startIndex": 10067, - "textRun": { - "content": " return;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10067 - }, - { - "endIndex": 10087, - "paragraph": { - "elements": [ - { - "endIndex": 10087, - "startIndex": 10081, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10081 - }, - { - "endIndex": 10088, - "paragraph": { - "elements": [ - { - "endIndex": 10088, - "startIndex": 10087, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10087 - }, - { - "endIndex": 10111, - "paragraph": { - "elements": [ - { - "endIndex": 10111, - "startIndex": 10088, - "textRun": { - "content": " fetchRepository();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10088 - }, - { - "endIndex": 10115, - "paragraph": { - "elements": [ - { - "endIndex": 10115, - "startIndex": 10111, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10111 - }, - { - "endIndex": 10116, - "paragraph": { - "elements": [ - { - "endIndex": 10116, - "startIndex": 10115, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10115 - }, - { - "endIndex": 10157, - "paragraph": { - "elements": [ - { - "endIndex": 10157, - "startIndex": 10116, - "textRun": { - "content": " Future fetchRepository() async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10116 - }, - { - "endIndex": 10175, - "paragraph": { - "elements": [ - { - "endIndex": 10175, - "startIndex": 10157, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10157 - }, - { - "endIndex": 10200, - "paragraph": { - "elements": [ - { - "endIndex": 10200, - "startIndex": 10175, - "textRun": { - "content": " repository = null;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10175 - }, - { - "endIndex": 10227, - "paragraph": { - "elements": [ - { - "endIndex": 10227, - "startIndex": 10200, - "textRun": { - "content": " errorMessage = null;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10200 - }, - { - "endIndex": 10235, - "paragraph": { - "elements": [ - { - "endIndex": 10235, - "startIndex": 10227, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10227 - }, - { - "endIndex": 10236, - "paragraph": { - "elements": [ - { - "endIndex": 10236, - "startIndex": 10235, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10235 - }, - { - "endIndex": 10280, - "paragraph": { - "elements": [ - { - "endIndex": 10280, - "startIndex": 10236, - "textRun": { - "content": " if (widget.repositoryName.isNotEmpty) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10236 - }, - { - "endIndex": 10323, - "paragraph": { - "elements": [ - { - "endIndex": 10323, - "startIndex": 10280, - "textRun": { - "content": " var repo = await github.repositories\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10280 - }, - { - "endIndex": 10393, - "paragraph": { - "elements": [ - { - "endIndex": 10393, - "startIndex": 10323, - "textRun": { - "content": " .getRepository(RepositorySlug.full(widget.repositoryName));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10323 - }, - { - "endIndex": 10413, - "paragraph": { - "elements": [ - { - "endIndex": 10413, - "startIndex": 10393, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10393 - }, - { - "endIndex": 10440, - "paragraph": { - "elements": [ - { - "endIndex": 10440, - "startIndex": 10413, - "textRun": { - "content": " repository = repo;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10413 - }, - { - "endIndex": 10450, - "paragraph": { - "elements": [ - { - "endIndex": 10450, - "startIndex": 10440, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10440 - }, - { - "endIndex": 10456, - "paragraph": { - "elements": [ - { - "endIndex": 10456, - "startIndex": 10450, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10450 - }, - { - "endIndex": 10460, - "paragraph": { - "elements": [ - { - "endIndex": 10460, - "startIndex": 10456, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10456 - }, - { - "endIndex": 10461, - "paragraph": { - "elements": [ - { - "endIndex": 10461, - "startIndex": 10460, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10460 - }, - { - "endIndex": 10473, - "paragraph": { - "elements": [ - { - "endIndex": 10473, - "startIndex": 10461, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10461 - }, - { - "endIndex": 10512, - "paragraph": { - "elements": [ - { - "endIndex": 10512, - "startIndex": 10473, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10473 - }, - { - "endIndex": 10563, - "paragraph": { - "elements": [ - { - "endIndex": 10563, - "startIndex": 10512, - "textRun": { - "content": " final textTheme = Theme.of(context).textTheme;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10512 - }, - { - "endIndex": 10634, - "paragraph": { - "elements": [ - { - "endIndex": 10634, - "startIndex": 10563, - "textRun": { - "content": " final textStyle = textTheme.headline4?.apply(color: Colors.green);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10563 - }, - { - "endIndex": 10704, - "paragraph": { - "elements": [ - { - "endIndex": 10704, - "startIndex": 10634, - "textRun": { - "content": " final errorStyle = textTheme.bodyText1?.apply(color: Colors.red);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10634 - }, - { - "endIndex": 10765, - "paragraph": { - "elements": [ - { - "endIndex": 10765, - "startIndex": 10704, - "textRun": { - "content": " final numberFormat = intl.NumberFormat.decimalPattern();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10704 - }, - { - "endIndex": 10766, - "paragraph": { - "elements": [ - { - "endIndex": 10766, - "startIndex": 10765, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10765 - }, - { - "endIndex": 10798, - "paragraph": { - "elements": [ - { - "endIndex": 10798, - "startIndex": 10766, - "textRun": { - "content": " if (errorMessage != null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10766 - }, - { - "endIndex": 10851, - "paragraph": { - "elements": [ - { - "endIndex": 10851, - "startIndex": 10798, - "textRun": { - "content": " return Text(errorMessage!, style: errorStyle);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10798 - }, - { - "endIndex": 10857, - "paragraph": { - "elements": [ - { - "endIndex": 10857, - "startIndex": 10851, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10851 - }, - { - "endIndex": 10858, - "paragraph": { - "elements": [ - { - "endIndex": 10858, - "startIndex": 10857, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10857 - }, - { - "endIndex": 10924, - "paragraph": { - "elements": [ - { - "endIndex": 10924, - "startIndex": 10858, - "textRun": { - "content": " if (widget.repositoryName.isNotEmpty && repository == null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10858 - }, - { - "endIndex": 10963, - "paragraph": { - "elements": [ - { - "endIndex": 10963, - "startIndex": 10924, - "textRun": { - "content": " return const Text('loading...');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10924 - }, - { - "endIndex": 10969, - "paragraph": { - "elements": [ - { - "endIndex": 10969, - "startIndex": 10963, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10963 - }, - { - "endIndex": 10970, - "paragraph": { - "elements": [ - { - "endIndex": 10970, - "startIndex": 10969, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10969 - }, - { - "endIndex": 11000, - "paragraph": { - "elements": [ - { - "endIndex": 11000, - "startIndex": 10970, - "textRun": { - "content": " if (repository == null) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10970 - }, - { - "endIndex": 11062, - "paragraph": { - "elements": [ - { - "endIndex": 11062, - "startIndex": 11000, - "textRun": { - "content": " // If no repository is entered, return an empty widget.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11000 - }, - { - "endIndex": 11093, - "paragraph": { - "elements": [ - { - "endIndex": 11093, - "startIndex": 11062, - "textRun": { - "content": " return const SizedBox();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11062 - }, - { - "endIndex": 11099, - "paragraph": { - "elements": [ - { - "endIndex": 11099, - "startIndex": 11093, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11093 - }, - { - "endIndex": 11100, - "paragraph": { - "elements": [ - { - "endIndex": 11100, - "startIndex": 11099, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11099 - }, - { - "endIndex": 11117, - "paragraph": { - "elements": [ - { - "endIndex": 11117, - "startIndex": 11100, - "textRun": { - "content": " return Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11100 - }, - { - "endIndex": 11173, - "paragraph": { - "elements": [ - { - "endIndex": 11173, - "startIndex": 11117, - "textRun": { - "content": " numberFormat.format(repository!.stargazersCount),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11117 - }, - { - "endIndex": 11197, - "paragraph": { - "elements": [ - { - "endIndex": 11197, - "startIndex": 11173, - "textRun": { - "content": " style: textStyle,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11173 - }, - { - "endIndex": 11204, - "paragraph": { - "elements": [ - { - "endIndex": 11204, - "startIndex": 11197, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11197 - }, - { - "endIndex": 11208, - "paragraph": { - "elements": [ - { - "endIndex": 11208, - "startIndex": 11204, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11204 - }, - { - "endIndex": 11210, - "paragraph": { - "elements": [ - { - "endIndex": 11210, - "startIndex": 11208, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11208 - } - ], - "endIndex": 11210, - "startIndex": 9018, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 11212, - "paragraph": { - "elements": [ - { - "endIndex": 11212, - "startIndex": 11211, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11211 - }, - { - "endIndex": 11227, - "paragraph": { - "elements": [ - { - "endIndex": 11213, - "inlineObjectElement": { - "inlineObjectId": "kix.qkuo9zsi1plx", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - }, - "startIndex": 11212 - }, - { - "endIndex": 11227, - "startIndex": 11213, - "textRun": { - "content": " Observations\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 11212 - }, - { - "endIndex": 11328, - "paragraph": { - "bullet": { - "listId": "kix.p76lagvjeokf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 11253, - "startIndex": 11227, - "textRun": { - "content": "The star counter uses the ", - "textStyle": {} - } - }, - { - "endIndex": 11259, - "startIndex": 11253, - "textRun": { - "content": "github", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/github" - }, - "underline": true - } - } - }, - { - "endIndex": 11328, - "startIndex": 11259, - "textRun": { - "content": " Dart package to query GitHub for the number of stars a repo earned.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11227 - }, - { - "endIndex": 11375, - "paragraph": { - "bullet": { - "listId": "kix.p76lagvjeokf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 11365, - "startIndex": 11328, - "textRun": { - "content": "You can find packages and plugins on ", - "textStyle": {} - } - }, - { - "endIndex": 11372, - "startIndex": 11365, - "textRun": { - "content": "pub.dev", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev" - }, - "underline": true - } - } - }, - { - "endIndex": 11375, - "startIndex": 11372, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11328 - }, - { - "endIndex": 11669, - "paragraph": { - "bullet": { - "listId": "kix.p76lagvjeokf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 11456, - "startIndex": 11375, - "textRun": { - "content": "You can also browse and search packages for a particular platform. If you select ", - "textStyle": {} - } - }, - { - "endIndex": 11463, - "startIndex": 11456, - "textRun": { - "content": "FLUTTER", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 11473, - "startIndex": 11463, - "textRun": { - "content": " from the ", - "textStyle": {} - } - }, - { - "endIndex": 11485, - "startIndex": 11473, - "textRun": { - "content": "landing page", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/" - }, - "underline": true - } - } - }, - { - "endIndex": 11517, - "startIndex": 11485, - "textRun": { - "content": ", then on the next page, select ", - "textStyle": {} - } - }, - { - "endIndex": 11520, - "startIndex": 11517, - "textRun": { - "content": "WEB", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 11547, - "startIndex": 11520, - "textRun": { - "content": ". This brings up all of the", - "textStyle": {} - } - }, - { - "endIndex": 11576, - "startIndex": 11547, - "textRun": { - "content": " packages that run on the web", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/flutter/packages?platform=web" - }, - "underline": true - } - } - }, - { - "endIndex": 11669, - "startIndex": 11576, - "textRun": { - "content": ". Either browse through the pages of packages, or use the search bar to narrow your results.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11375 - }, - { - "endIndex": 11865, - "paragraph": { - "bullet": { - "listId": "kix.p76lagvjeokf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 11727, - "startIndex": 11669, - "textRun": { - "content": "The Flutter community contributes packages and plugins to ", - "textStyle": {} - } - }, - { - "endIndex": 11734, - "startIndex": 11727, - "textRun": { - "content": "pub.dev", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/" - }, - "underline": true - } - } - }, - { - "endIndex": 11768, - "startIndex": 11734, - "textRun": { - "content": ". If you look at the page for the ", - "textStyle": {} - } - }, - { - "endIndex": 11774, - "startIndex": 11768, - "textRun": { - "content": "github", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/github" - }, - "underline": true - } - } - }, - { - "endIndex": 11825, - "startIndex": 11774, - "textRun": { - "content": " package, you’ll see that it works for pretty much ", - "textStyle": {} - } - }, - { - "endIndex": 11828, - "startIndex": 11825, - "textRun": { - "content": "any", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 11860, - "startIndex": 11828, - "textRun": { - "content": " Dart or Flutter app, including ", - "textStyle": {} - } - }, - { - "endIndex": 11863, - "startIndex": 11860, - "textRun": { - "content": "WEB", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 11865, - "startIndex": 11863, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11669 - }, - { - "endIndex": 12085, - "paragraph": { - "bullet": { - "listId": "kix.p76lagvjeokf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 11931, - "startIndex": 11865, - "textRun": { - "content": "You might pay particular attention to packages that are marked as ", - "textStyle": {} - } - }, - { - "endIndex": 11948, - "startIndex": 11931, - "textRun": { - "content": "Flutter Favorites", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/flutter/favorites" - }, - "underline": true - } - } - }, - { - "endIndex": 11954, - "startIndex": 11948, - "textRun": { - "content": ". The ", - "textStyle": {} - } - }, - { - "endIndex": 11979, - "startIndex": 11954, - "textRun": { - "content": "Flutter Favorites program", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/development/packages-and-plugins/favorites#flutter-favorites" - }, - "underline": true - } - } - }, - { - "endIndex": 12085, - "startIndex": 11979, - "textRun": { - "content": " identifies packages that meet specific criteria, such as feature completeness and good runtime behavior.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11865 - }, - { - "endIndex": 12139, - "paragraph": { - "bullet": { - "listId": "kix.p76lagvjeokf", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 12114, - "startIndex": 12085, - "textRun": { - "content": "Later, you add a plugin from ", - "textStyle": {} - } - }, - { - "endIndex": 12121, - "startIndex": 12114, - "textRun": { - "content": "pub.dev", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev" - }, - "underline": true - } - } - }, - { - "endIndex": 12139, - "startIndex": 12121, - "textRun": { - "content": " to this example.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12085 - }, - { - "endIndex": 12140, - "paragraph": { - "elements": [ - { - "endIndex": 12140, - "startIndex": 12139, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12139 - }, - { - "endIndex": 12180, - "paragraph": { - "elements": [ - { - "endIndex": 12141, - "inlineObjectElement": { - "inlineObjectId": "kix.ov85hoi1tzln", - "textStyle": {} - }, - "startIndex": 12140 - }, - { - "endIndex": 12159, - "startIndex": 12141, - "textRun": { - "content": "Add the following ", - "textStyle": {} - } - }, - { - "endIndex": 12165, - "startIndex": 12159, - "textRun": { - "content": "import", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12169, - "startIndex": 12165, - "textRun": { - "content": " to ", - "textStyle": {} - } - }, - { - "endIndex": 12178, - "startIndex": 12169, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12180, - "startIndex": 12178, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12140 - }, - { - "endIndex": 12194, - "paragraph": { - "elements": [ - { - "endIndex": 12193, - "startIndex": 12180, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_05/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 12194, - "startIndex": 12193, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.63bwqv5pc9ek", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 12180 - }, - { - "endIndex": 12226, - "startIndex": 12194, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 12225, - "startIndex": 12195, - "tableCells": [ - { - "content": [ - { - "endIndex": 12225, - "paragraph": { - "elements": [ - { - "endIndex": 12225, - "startIndex": 12197, - "textRun": { - "content": "import 'star_counter.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12197 - } - ], - "endIndex": 12225, - "startIndex": 12196, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 12227, - "paragraph": { - "elements": [ - { - "endIndex": 12227, - "startIndex": 12226, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12226 - }, - { - "endIndex": 12267, - "paragraph": { - "elements": [ - { - "endIndex": 12228, - "inlineObjectElement": { - "inlineObjectId": "kix.1p0qrx9bdm40", - "textStyle": {} - }, - "startIndex": 12227 - }, - { - "endIndex": 12241, - "startIndex": 12228, - "textRun": { - "content": " Use the new ", - "textStyle": {} - } - }, - { - "endIndex": 12258, - "startIndex": 12241, - "textRun": { - "content": "GitHubStarCounter", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12267, - "startIndex": 12258, - "textRun": { - "content": " widget.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12227 - }, - { - "endIndex": 12381, - "paragraph": { - "elements": [ - { - "endIndex": 12270, - "startIndex": 12267, - "textRun": { - "content": "In ", - "textStyle": {} - } - }, - { - "endIndex": 12279, - "startIndex": 12270, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12293, - "startIndex": 12279, - "textRun": { - "content": ", replace the ", - "textStyle": {} - } - }, - { - "endIndex": 12297, - "startIndex": 12293, - "textRun": { - "content": "Text", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12356, - "startIndex": 12297, - "textRun": { - "content": " widget (lines 61-63) with the 3 new lines that define the ", - "textStyle": {} - } - }, - { - "endIndex": 12379, - "startIndex": 12356, - "textRun": { - "content": "GitHubStarCounterWidget", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12381, - "startIndex": 12379, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12267 - }, - { - "endIndex": 12395, - "paragraph": { - "elements": [ - { - "endIndex": 12394, - "startIndex": 12381, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_05/lib/main.dart#L60" - }, - "underline": true - } - } - }, - { - "endIndex": 12395, - "startIndex": 12394, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.9pgndhjarulq", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 12381 - }, - { - "endIndex": 12600, - "startIndex": 12395, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 12599, - "startIndex": 12396, - "tableCells": [ - { - "content": [ - { - "endIndex": 12407, - "paragraph": { - "elements": [ - { - "endIndex": 12407, - "startIndex": 12398, - "textRun": { - "content": "Padding(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12398 - }, - { - "endIndex": 12452, - "paragraph": { - "elements": [ - { - "endIndex": 12452, - "startIndex": 12407, - "textRun": { - "content": " padding: const EdgeInsets.only(top: 32.0),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12407 - }, - { - "endIndex": 12500, - "paragraph": { - "elements": [ - { - "endIndex": 12500, - "startIndex": 12452, - "textRun": { - "content": " child: GitHubStarCounter( // New\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12452 - }, - { - "endIndex": 12548, - "paragraph": { - "elements": [ - { - "endIndex": 12548, - "startIndex": 12500, - "textRun": { - "content": " repositoryName: _repositoryName, // New\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12500 - }, - { - "endIndex": 12596, - "paragraph": { - "elements": [ - { - "endIndex": 12596, - "startIndex": 12548, - "textRun": { - "content": " ), // New\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12548 - }, - { - "endIndex": 12599, - "paragraph": { - "elements": [ - { - "endIndex": 12599, - "startIndex": 12596, - "textRun": { - "content": "),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12596 - } - ], - "endIndex": 12599, - "startIndex": 12397, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 12601, - "paragraph": { - "elements": [ - { - "endIndex": 12601, - "startIndex": 12600, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12600 - }, - { - "endIndex": 12615, - "paragraph": { - "elements": [ - { - "endIndex": 12602, - "inlineObjectElement": { - "inlineObjectId": "kix.vgd17uvaq3je", - "textStyle": {} - }, - "startIndex": 12601 - }, - { - "endIndex": 12615, - "startIndex": 12602, - "textRun": { - "content": "Run the app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12601 - }, - { - "endIndex": 12846, - "paragraph": { - "elements": [ - { - "endIndex": 12651, - "startIndex": 12615, - "textRun": { - "content": "Hot restart the app by clicking the ", - "textStyle": {} - } - }, - { - "endIndex": 12655, - "startIndex": 12651, - "textRun": { - "content": "Run ", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 12745, - "startIndex": 12655, - "textRun": { - "content": "button again in the IDE (without first stopping the app), clicking the hot restart button ", - "textStyle": {} - } - }, - { - "endIndex": 12746, - "inlineObjectElement": { - "inlineObjectId": "kix.l68j68myhkq0", - "textStyle": {} - }, - "startIndex": 12745 - }, - { - "endIndex": 12774, - "startIndex": 12746, - "textRun": { - "content": " in the IDE , or by typing ", - "textStyle": {} - } - }, - { - "endIndex": 12775, - "startIndex": 12774, - "textRun": { - "content": "r", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12846, - "startIndex": 12775, - "textRun": { - "content": " in the console. This updates the app without refreshing the browser. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12615 - }, - { - "endIndex": 12847, - "paragraph": { - "elements": [ - { - "endIndex": 12847, - "startIndex": 12846, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12846 - }, - { - "endIndex": 13022, - "startIndex": 12847, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 13021, - "startIndex": 12848, - "tableCells": [ - { - "content": [ - { - "endIndex": 13021, - "paragraph": { - "elements": [ - { - "endIndex": 12854, - "startIndex": 12850, - "textRun": { - "content": "Note", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 12942, - "startIndex": 12854, - "textRun": { - "content": ": Hot reload doesn’t yet work on the web. When running a web app from the command line, ", - "textStyle": {} - } - }, - { - "endIndex": 12943, - "startIndex": 12942, - "textRun": { - "content": "r", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12994, - "startIndex": 12943, - "textRun": { - "content": " performs a hot restart. For more information, see ", - "textStyle": {} - } - }, - { - "endIndex": 13004, - "startIndex": 12994, - "textRun": { - "content": "Hot reload", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/development/tools/hot-reload" - }, - "underline": true - } - } - }, - { - "endIndex": 13021, - "startIndex": 13004, - "textRun": { - "content": " on flutter.dev.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12850 - } - ], - "endIndex": 13021, - "startIndex": 12849, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 13023, - "paragraph": { - "elements": [ - { - "endIndex": 13023, - "startIndex": 13022, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13022 - }, - { - "endIndex": 13195, - "paragraph": { - "elements": [ - { - "endIndex": 13111, - "startIndex": 13023, - "textRun": { - "content": "The window looks the same as before. Enter an existing repo, such as the one suggested: ", - "textStyle": {} - } - }, - { - "endIndex": 13126, - "startIndex": 13111, - "textRun": { - "content": "flutter/flutter", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13128, - "startIndex": 13126, - "textRun": { - "content": ". ", - "textStyle": {} - } - }, - { - "endIndex": 13195, - "startIndex": 13128, - "textRun": { - "content": "The number of stars is reported below the text field, for example:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13023 - }, - { - "endIndex": 13197, - "paragraph": { - "elements": [ - { - "endIndex": 13196, - "inlineObjectElement": { - "inlineObjectId": "kix.oan8p0k9bqo4", - "textStyle": {} - }, - "startIndex": 13195 - }, - { - "endIndex": 13197, - "startIndex": 13196, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13195 - }, - { - "endIndex": 13207, - "paragraph": { - "elements": [ - { - "endIndex": 13207, - "startIndex": 13197, - "textRun": { - "content": "Debugging\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.c4pdtp9uvne1", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 13197 - }, - { - "endIndex": 13223, - "paragraph": { - "elements": [ - { - "endIndex": 13223, - "startIndex": 13207, - "textRun": { - "content": "Duration: 10:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 13207 - }, - { - "endIndex": 13224, - "paragraph": { - "elements": [ - { - "endIndex": 13224, - "startIndex": 13223, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13223 - }, - { - "endIndex": 13385, - "paragraph": { - "elements": [ - { - "endIndex": 13319, - "startIndex": 13224, - "textRun": { - "content": "Are you ready for a debugging exercise? In the running app, enter a non-existent repo, such as ", - "textStyle": {} - } - }, - { - "endIndex": 13326, - "startIndex": 13319, - "textRun": { - "content": "foo/bar", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13356, - "startIndex": 13326, - "textRun": { - "content": ". The widget is stuck saying “", - "textStyle": {} - } - }, - { - "endIndex": 13364, - "startIndex": 13356, - "textRun": { - "content": "Loading…", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 13385, - "startIndex": 13364, - "textRun": { - "content": "”. You fix that now.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13224 - }, - { - "endIndex": 13386, - "paragraph": { - "elements": [ - { - "endIndex": 13386, - "startIndex": 13385, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13385 - }, - { - "endIndex": 13410, - "paragraph": { - "elements": [ - { - "endIndex": 13387, - "inlineObjectElement": { - "inlineObjectId": "kix.4rmo0vhogzh4", - "textStyle": {} - }, - "startIndex": 13386 - }, - { - "endIndex": 13410, - "startIndex": 13387, - "textRun": { - "content": " Launch Dart DevTools.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13386 - }, - { - "endIndex": 13745, - "paragraph": { - "elements": [ - { - "endIndex": 13745, - "startIndex": 13410, - "textRun": { - "content": "You may be familiar with Chrome DevTools, but to debug a Flutter app, you’ll want to use Dart DevTools. Dart DevTools was designed to debug and profile Dart and Flutter apps. There are a number of ways to launch Dart DevTools, depending on your workflow. The following pages have instructions about how to install and launch DevTools:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13410 - }, - { - "endIndex": 13746, - "paragraph": { - "elements": [ - { - "endIndex": 13746, - "startIndex": 13745, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13745 - }, - { - "endIndex": 13795, - "paragraph": { - "bullet": { - "listId": "kix.uz1urpwt6nk8", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 13793, - "startIndex": 13746, - "textRun": { - "content": "Launch DevTools from Android Studio or IntelliJ", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/development/tools/devtools/android-studio" - }, - "underline": true - } - } - }, - { - "endIndex": 13795, - "startIndex": 13793, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13746 - }, - { - "endIndex": 13825, - "paragraph": { - "bullet": { - "listId": "kix.uz1urpwt6nk8", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 13823, - "startIndex": 13795, - "textRun": { - "content": "Launch DevTools from VS Code", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/development/tools/devtools/vscode" - }, - "underline": true - } - } - }, - { - "endIndex": 13825, - "startIndex": 13823, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13795 - }, - { - "endIndex": 13864, - "paragraph": { - "bullet": { - "listId": "kix.uz1urpwt6nk8", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 13862, - "startIndex": 13825, - "textRun": { - "content": "Launch DevTools from the command line", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/development/tools/devtools/cli" - }, - "underline": true - } - } - }, - { - "endIndex": 13863, - "startIndex": 13862, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 13864, - "startIndex": 13863, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13825 - }, - { - "endIndex": 13865, - "paragraph": { - "elements": [ - { - "endIndex": 13865, - "startIndex": 13864, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13864 - }, - { - "endIndex": 13890, - "paragraph": { - "elements": [ - { - "endIndex": 13866, - "inlineObjectElement": { - "inlineObjectId": "kix.905l4wv25igv", - "textStyle": {} - }, - "startIndex": 13865 - }, - { - "endIndex": 13890, - "startIndex": 13866, - "textRun": { - "content": " Bring up the debugger.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13865 - }, - { - "endIndex": 14055, - "paragraph": { - "elements": [ - { - "endIndex": 14013, - "startIndex": 13890, - "textRun": { - "content": "The initial browser page you see when Dart DevTools launches can be different, depending on how it was launched. Click the ", - "textStyle": {} - } - }, - { - "endIndex": 14021, - "startIndex": 14013, - "textRun": { - "content": "Debugger", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 14026, - "startIndex": 14021, - "textRun": { - "content": " tab ", - "textStyle": {} - } - }, - { - "endIndex": 14027, - "inlineObjectElement": { - "inlineObjectId": "kix.im7tb31r3srk", - "textStyle": {} - }, - "startIndex": 14026 - }, - { - "endIndex": 14055, - "startIndex": 14027, - "textRun": { - "content": ", to bring up the debugger.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13890 - }, - { - "endIndex": 14056, - "paragraph": { - "elements": [ - { - "endIndex": 14056, - "startIndex": 14055, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14055 - }, - { - "endIndex": 14102, - "paragraph": { - "elements": [ - { - "endIndex": 14057, - "inlineObjectElement": { - "inlineObjectId": "kix.2lhj08hjulna", - "textStyle": {} - }, - "startIndex": 14056 - }, - { - "endIndex": 14071, - "startIndex": 14057, - "textRun": { - "content": " Bring up the ", - "textStyle": {} - } - }, - { - "endIndex": 14088, - "startIndex": 14071, - "textRun": { - "content": "star_counter.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14102, - "startIndex": 14088, - "textRun": { - "content": " source code.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14056 - }, - { - "endIndex": 14284, - "paragraph": { - "elements": [ - { - "endIndex": 14109, - "startIndex": 14102, - "textRun": { - "content": "In the ", - "textStyle": {} - } - }, - { - "endIndex": 14118, - "startIndex": 14109, - "textRun": { - "content": "Libraries", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 14156, - "startIndex": 14118, - "textRun": { - "content": " text field, in the lower left, enter ", - "textStyle": {} - } - }, - { - "endIndex": 14168, - "startIndex": 14156, - "textRun": { - "content": "star_counter", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14187, - "startIndex": 14168, - "textRun": { - "content": "” Double-click the ", - "textStyle": {} - } - }, - { - "endIndex": 14225, - "startIndex": 14187, - "textRun": { - "content": "package:star_counter/star_counter.dart", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 14284, - "startIndex": 14225, - "textRun": { - "content": " entry from the results list, to open it in the File view.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14102 - }, - { - "endIndex": 14285, - "paragraph": { - "elements": [ - { - "endIndex": 14285, - "startIndex": 14284, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14284 - }, - { - "endIndex": 14305, - "paragraph": { - "elements": [ - { - "endIndex": 14286, - "inlineObjectElement": { - "inlineObjectId": "kix.7y6k49xkw61s", - "textStyle": {} - }, - "startIndex": 14285 - }, - { - "endIndex": 14305, - "startIndex": 14286, - "textRun": { - "content": " Set a breakpoint.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14285 - }, - { - "endIndex": 14671, - "paragraph": { - "elements": [ - { - "endIndex": 14345, - "startIndex": 14305, - "textRun": { - "content": "Find the following line in the source: ", - "textStyle": {} - } - }, - { - "endIndex": 14381, - "startIndex": 14345, - "textRun": { - "content": "var repo = await github.repositories", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14382, - "startIndex": 14381, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 14541, - "startIndex": 14382, - "textRun": { - "content": " It should be on line 52. Click to the left of the line number, and a circle appears, indicating that you set a breakpoint. The breakpoint also appears in the ", - "textStyle": {} - } - }, - { - "endIndex": 14552, - "startIndex": 14541, - "textRun": { - "content": "Breakpoints", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 14602, - "startIndex": 14552, - "textRun": { - "content": " list on the left. On the upper right, select the ", - "textStyle": {} - } - }, - { - "endIndex": 14621, - "startIndex": 14602, - "textRun": { - "content": "Break on exceptions", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 14671, - "startIndex": 14621, - "textRun": { - "content": " checkbox. The UI should look like the following:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14305 - }, - { - "endIndex": 14673, - "paragraph": { - "elements": [ - { - "endIndex": 14672, - "inlineObjectElement": { - "inlineObjectId": "kix.id8ngxw4itan", - "textStyle": {} - }, - "startIndex": 14671 - }, - { - "endIndex": 14673, - "startIndex": 14672, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14671 - }, - { - "endIndex": 14688, - "paragraph": { - "elements": [ - { - "endIndex": 14674, - "inlineObjectElement": { - "inlineObjectId": "kix.zi6frmaw30ee", - "textStyle": {} - }, - "startIndex": 14673 - }, - { - "endIndex": 14688, - "startIndex": 14674, - "textRun": { - "content": " Run the app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14673 - }, - { - "endIndex": 14855, - "paragraph": { - "elements": [ - { - "endIndex": 14730, - "startIndex": 14688, - "textRun": { - "content": "Enter a non-existent repository and press ", - "textStyle": {} - } - }, - { - "endIndex": 14736, - "startIndex": 14730, - "textRun": { - "content": "Return", - "textStyle": {} - } - }, - { - "endIndex": 14798, - "startIndex": 14736, - "textRun": { - "content": ". In the error pane, below the code pane, you’ll see that the ", - "textStyle": {} - } - }, - { - "endIndex": 14804, - "startIndex": 14798, - "textRun": { - "content": "github", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14855, - "startIndex": 14804, - "textRun": { - "content": " package threw a “repository not found” exception:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14688 - }, - { - "endIndex": 14856, - "paragraph": { - "elements": [ - { - "endIndex": 14856, - "startIndex": 14855, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14855 - }, - { - "endIndex": 15972, - "startIndex": 14856, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 15971, - "startIndex": 14857, - "tableCells": [ - { - "content": [ - { - "endIndex": 14904, - "paragraph": { - "elements": [ - { - "endIndex": 14904, - "startIndex": 14859, - "textRun": { - "content": "Error: GitHub Error: Repository Not Found: /\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14859 - }, - { - "endIndex": 14981, - "paragraph": { - "elements": [ - { - "endIndex": 14981, - "startIndex": 14904, - "textRun": { - "content": " at Object.throw_ [as throw] (http://localhost:52956/dart_sdk.js:4463:11)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14904 - }, - { - "endIndex": 15071, - "paragraph": { - "elements": [ - { - "endIndex": 15071, - "startIndex": 14981, - "textRun": { - "content": " at http://localhost:52956/packages/github/src/common/xplat_common.dart.lib.js:1351:25\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14981 - }, - { - "endIndex": 15190, - "paragraph": { - "elements": [ - { - "endIndex": 15190, - "startIndex": 15071, - "textRun": { - "content": " at github.GitHub.new.request (http://localhost:52956/packages/github/src/common/xplat_common.dart.lib.js:10679:13)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15071 - }, - { - "endIndex": 15224, - "paragraph": { - "elements": [ - { - "endIndex": 15224, - "startIndex": 15190, - "textRun": { - "content": " at request.next ()\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15190 - }, - { - "endIndex": 15275, - "paragraph": { - "elements": [ - { - "endIndex": 15275, - "startIndex": 15224, - "textRun": { - "content": " at http://localhost:52956/dart_sdk.js:37175:33\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15224 - }, - { - "endIndex": 15347, - "paragraph": { - "elements": [ - { - "endIndex": 15347, - "startIndex": 15275, - "textRun": { - "content": " at _RootZone.runUnary (http://localhost:52956/dart_sdk.js:37029:58)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15275 - }, - { - "endIndex": 15438, - "paragraph": { - "elements": [ - { - "endIndex": 15438, - "startIndex": 15347, - "textRun": { - "content": " at _FutureListener.thenAwait.handleValue (http://localhost:52956/dart_sdk.js:32116:29)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15347 - }, - { - "endIndex": 15511, - "paragraph": { - "elements": [ - { - "endIndex": 15511, - "startIndex": 15438, - "textRun": { - "content": " at handleValueCallback (http://localhost:52956/dart_sdk.js:32663:49)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15438 - }, - { - "endIndex": 15595, - "paragraph": { - "elements": [ - { - "endIndex": 15595, - "startIndex": 15511, - "textRun": { - "content": " at Function._propagateToListeners (http://localhost:52956/dart_sdk.js:32701:17)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15511 - }, - { - "endIndex": 15681, - "paragraph": { - "elements": [ - { - "endIndex": 15681, - "startIndex": 15595, - "textRun": { - "content": " at _Future.new.[_completeWithValue] (http://localhost:52956/dart_sdk.js:32544:23)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15595 - }, - { - "endIndex": 15773, - "paragraph": { - "elements": [ - { - "endIndex": 15773, - "startIndex": 15681, - "textRun": { - "content": " at async._AsyncCallbackEntry.new.callback (http://localhost:52956/dart_sdk.js:32566:35)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15681 - }, - { - "endIndex": 15848, - "paragraph": { - "elements": [ - { - "endIndex": 15848, - "startIndex": 15773, - "textRun": { - "content": " at Object._microtaskLoop (http://localhost:52956/dart_sdk.js:37290:13)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15773 - }, - { - "endIndex": 15921, - "paragraph": { - "elements": [ - { - "endIndex": 15921, - "startIndex": 15848, - "textRun": { - "content": " at _startMicrotaskLoop (http://localhost:52956/dart_sdk.js:37296:13)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15848 - }, - { - "endIndex": 15971, - "paragraph": { - "elements": [ - { - "endIndex": 15971, - "startIndex": 15921, - "textRun": { - "content": " at http://localhost:52956/dart_sdk.js:32918:9\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15921 - } - ], - "endIndex": 15971, - "startIndex": 14858, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 15973, - "paragraph": { - "elements": [ - { - "endIndex": 15973, - "startIndex": 15972, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15972 - }, - { - "endIndex": 15992, - "paragraph": { - "elements": [ - { - "endIndex": 15974, - "inlineObjectElement": { - "inlineObjectId": "kix.jqpd88xm4i34", - "textStyle": {} - }, - "startIndex": 15973 - }, - { - "endIndex": 15992, - "startIndex": 15974, - "textRun": { - "content": " Catch the error.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15973 - }, - { - "endIndex": 16053, - "paragraph": { - "elements": [ - { - "endIndex": 15995, - "startIndex": 15992, - "textRun": { - "content": "In ", - "textStyle": {} - } - }, - { - "endIndex": 16012, - "startIndex": 15995, - "textRun": { - "content": "star_counter.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16053, - "startIndex": 16012, - "textRun": { - "content": ", find the following code (lines 55-61):\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 15992 - }, - { - "endIndex": 16054, - "paragraph": { - "elements": [ - { - "endIndex": 16054, - "startIndex": 16053, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16053 - }, - { - "endIndex": 16250, - "startIndex": 16054, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16249, - "startIndex": 16055, - "tableCells": [ - { - "content": [ - { - "endIndex": 16097, - "paragraph": { - "elements": [ - { - "endIndex": 16097, - "startIndex": 16057, - "textRun": { - "content": "if (widget.repositoryName.isNotEmpty) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16057 - }, - { - "endIndex": 16136, - "paragraph": { - "elements": [ - { - "endIndex": 16136, - "startIndex": 16097, - "textRun": { - "content": " var repo = await github.repositories\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16097 - }, - { - "endIndex": 16202, - "paragraph": { - "elements": [ - { - "endIndex": 16202, - "startIndex": 16136, - "textRun": { - "content": " .getRepository(RepositorySlug.full(widget.repositoryName));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16136 - }, - { - "endIndex": 16218, - "paragraph": { - "elements": [ - { - "endIndex": 16218, - "startIndex": 16202, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16202 - }, - { - "endIndex": 16241, - "paragraph": { - "elements": [ - { - "endIndex": 16241, - "startIndex": 16218, - "textRun": { - "content": " repository = repo;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16218 - }, - { - "endIndex": 16247, - "paragraph": { - "elements": [ - { - "endIndex": 16247, - "startIndex": 16241, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16241 - }, - { - "endIndex": 16249, - "paragraph": { - "elements": [ - { - "endIndex": 16249, - "startIndex": 16247, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16247 - } - ], - "endIndex": 16249, - "startIndex": 16056, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16251, - "paragraph": { - "elements": [ - { - "endIndex": 16251, - "startIndex": 16250, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16250 - }, - { - "endIndex": 16380, - "paragraph": { - "elements": [ - { - "endIndex": 16291, - "startIndex": 16251, - "textRun": { - "content": "Replace that code with code that uses a ", - "textStyle": {} - } - }, - { - "endIndex": 16300, - "startIndex": 16291, - "textRun": { - "content": "try-catch", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16380, - "startIndex": 16300, - "textRun": { - "content": " block, to behave more gracefully by catching the error and printing a message:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16251 - }, - { - "endIndex": 16402, - "paragraph": { - "elements": [ - { - "endIndex": 16401, - "startIndex": 16380, - "textRun": { - "content": "lib/star_counter.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_06/lib/star_counter.dart#L52" - }, - "underline": true - } - } - }, - { - "endIndex": 16402, - "startIndex": 16401, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6di1slivhjkd", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 16380 - }, - { - "endIndex": 16759, - "startIndex": 16402, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16758, - "startIndex": 16403, - "tableCells": [ - { - "content": [ - { - "endIndex": 16445, - "paragraph": { - "elements": [ - { - "endIndex": 16445, - "startIndex": 16405, - "textRun": { - "content": "if (widget.repositoryName.isNotEmpty) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16405 - }, - { - "endIndex": 16453, - "paragraph": { - "elements": [ - { - "endIndex": 16453, - "startIndex": 16445, - "textRun": { - "content": " try {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16445 - }, - { - "endIndex": 16494, - "paragraph": { - "elements": [ - { - "endIndex": 16494, - "startIndex": 16453, - "textRun": { - "content": " var repo = await github.repositories\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16453 - }, - { - "endIndex": 16562, - "paragraph": { - "elements": [ - { - "endIndex": 16562, - "startIndex": 16494, - "textRun": { - "content": " .getRepository(RepositorySlug.full(widget.repositoryName));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16494 - }, - { - "endIndex": 16580, - "paragraph": { - "elements": [ - { - "endIndex": 16580, - "startIndex": 16562, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16562 - }, - { - "endIndex": 16605, - "paragraph": { - "elements": [ - { - "endIndex": 16605, - "startIndex": 16580, - "textRun": { - "content": " repository = repo;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16580 - }, - { - "endIndex": 16613, - "paragraph": { - "elements": [ - { - "endIndex": 16613, - "startIndex": 16605, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16605 - }, - { - "endIndex": 16641, - "paragraph": { - "elements": [ - { - "endIndex": 16641, - "startIndex": 16613, - "textRun": { - "content": " } on RepositoryNotFound {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16613 - }, - { - "endIndex": 16659, - "paragraph": { - "elements": [ - { - "endIndex": 16659, - "startIndex": 16641, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16641 - }, - { - "endIndex": 16684, - "paragraph": { - "elements": [ - { - "endIndex": 16684, - "startIndex": 16659, - "textRun": { - "content": " repository = null;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16659 - }, - { - "endIndex": 16744, - "paragraph": { - "elements": [ - { - "endIndex": 16744, - "startIndex": 16684, - "textRun": { - "content": " errorMessage = '${widget.repositoryName} not found.';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16684 - }, - { - "endIndex": 16752, - "paragraph": { - "elements": [ - { - "endIndex": 16752, - "startIndex": 16744, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16744 - }, - { - "endIndex": 16756, - "paragraph": { - "elements": [ - { - "endIndex": 16756, - "startIndex": 16752, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16752 - }, - { - "endIndex": 16758, - "paragraph": { - "elements": [ - { - "endIndex": 16758, - "startIndex": 16756, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16756 - } - ], - "endIndex": 16758, - "startIndex": 16404, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16760, - "paragraph": { - "elements": [ - { - "endIndex": 16760, - "startIndex": 16759, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16759 - }, - { - "endIndex": 16783, - "paragraph": { - "elements": [ - { - "endIndex": 16761, - "inlineObjectElement": { - "inlineObjectId": "kix.prp9q1hi2jky", - "textStyle": {} - }, - "startIndex": 16760 - }, - { - "endIndex": 16783, - "startIndex": 16761, - "textRun": { - "content": " Hot restart the app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16760 - }, - { - "endIndex": 16916, - "paragraph": { - "elements": [ - { - "endIndex": 16916, - "startIndex": 16783, - "textRun": { - "content": "In DevTools, the source code is updated to reflect the changes. Once again, enter a non-existent repo. You should see the following:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16783 - }, - { - "endIndex": 16918, - "paragraph": { - "elements": [ - { - "endIndex": 16917, - "inlineObjectElement": { - "inlineObjectId": "kix.n528il6a8xqw", - "textStyle": {} - }, - "startIndex": 16916 - }, - { - "endIndex": 16918, - "startIndex": 16917, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16916 - }, - { - "endIndex": 16939, - "paragraph": { - "elements": [ - { - "endIndex": 16939, - "startIndex": 16918, - "textRun": { - "content": "Add a privacy policy\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.5397tstqsgl6", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 16918 - }, - { - "endIndex": 16955, - "paragraph": { - "elements": [ - { - "endIndex": 16955, - "startIndex": 16939, - "textRun": { - "content": "Duration: 10:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 16939 - }, - { - "endIndex": 16956, - "paragraph": { - "elements": [ - { - "endIndex": 16956, - "startIndex": 16955, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16955 - }, - { - "endIndex": 17083, - "paragraph": { - "elements": [ - { - "endIndex": 17082, - "startIndex": 16956, - "textRun": { - "content": "In this step you’ll add a privacy policy page to your app. At first, you will embed the privacy policy text in your Dart code.", - "textStyle": {} - } - }, - { - "endIndex": 17083, - "startIndex": 17082, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16956 - }, - { - "endIndex": 17084, - "paragraph": { - "elements": [ - { - "endIndex": 17084, - "startIndex": 17083, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17083 - }, - { - "endIndex": 17192, - "paragraph": { - "elements": [ - { - "endIndex": 17085, - "inlineObjectElement": { - "inlineObjectId": "kix.2vha33hxrbat", - "textStyle": {} - }, - "startIndex": 17084 - }, - { - "endIndex": 17092, - "startIndex": 17085, - "textRun": { - "content": " Add a ", - "textStyle": {} - } - }, - { - "endIndex": 17115, - "startIndex": 17092, - "textRun": { - "content": "lib/privacy_policy.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17129, - "startIndex": 17115, - "textRun": { - "content": " file.\u000bIn the ", - "textStyle": {} - } - }, - { - "endIndex": 17132, - "startIndex": 17129, - "textRun": { - "content": "lib", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17150, - "startIndex": 17132, - "textRun": { - "content": " directory, add a ", - "textStyle": {} - } - }, - { - "endIndex": 17169, - "startIndex": 17150, - "textRun": { - "content": "privacy_policy.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17192, - "startIndex": 17169, - "textRun": { - "content": " file to your project:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 17084 - }, - { - "endIndex": 17216, - "paragraph": { - "elements": [ - { - "endIndex": 17215, - "startIndex": 17192, - "textRun": { - "content": "lib/privacy_policy.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_07/lib/privacy_policy.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 17216, - "startIndex": 17215, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.x1az53zbwvlf", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 17192 - }, - { - "endIndex": 18501, - "startIndex": 17216, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 18500, - "startIndex": 17217, - "tableCells": [ - { - "content": [ - { - "endIndex": 17258, - "paragraph": { - "elements": [ - { - "endIndex": 17258, - "startIndex": 17219, - "textRun": { - "content": "import 'package:flutter/widgets.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17219 - }, - { - "endIndex": 17315, - "paragraph": { - "elements": [ - { - "endIndex": 17315, - "startIndex": 17258, - "textRun": { - "content": "import 'package:flutter_markdown/flutter_markdown.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17258 - }, - { - "endIndex": 17316, - "paragraph": { - "elements": [ - { - "endIndex": 17316, - "startIndex": 17315, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17315 - }, - { - "endIndex": 17362, - "paragraph": { - "elements": [ - { - "endIndex": 17362, - "startIndex": 17316, - "textRun": { - "content": "class PrivacyPolicy extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17316 - }, - { - "endIndex": 17398, - "paragraph": { - "elements": [ - { - "endIndex": 17398, - "startIndex": 17362, - "textRun": { - "content": " const PrivacyPolicy({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17362 - }, - { - "endIndex": 17399, - "paragraph": { - "elements": [ - { - "endIndex": 17399, - "startIndex": 17398, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17398 - }, - { - "endIndex": 17411, - "paragraph": { - "elements": [ - { - "endIndex": 17411, - "startIndex": 17399, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17399 - }, - { - "endIndex": 17450, - "paragraph": { - "elements": [ - { - "endIndex": 17450, - "startIndex": 17411, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17411 - }, - { - "endIndex": 17471, - "paragraph": { - "elements": [ - { - "endIndex": 17471, - "startIndex": 17450, - "textRun": { - "content": " return Markdown(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17450 - }, - { - "endIndex": 17503, - "paragraph": { - "elements": [ - { - "endIndex": 17503, - "startIndex": 17471, - "textRun": { - "content": " data: _privacyPolicyText,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17471 - }, - { - "endIndex": 17510, - "paragraph": { - "elements": [ - { - "endIndex": 17510, - "startIndex": 17503, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17503 - }, - { - "endIndex": 17514, - "paragraph": { - "elements": [ - { - "endIndex": 17514, - "startIndex": 17510, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17510 - }, - { - "endIndex": 17516, - "paragraph": { - "elements": [ - { - "endIndex": 17516, - "startIndex": 17514, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17514 - }, - { - "endIndex": 17517, - "paragraph": { - "elements": [ - { - "endIndex": 17517, - "startIndex": 17516, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17516 - }, - { - "endIndex": 17572, - "paragraph": { - "elements": [ - { - "endIndex": 17572, - "startIndex": 17517, - "textRun": { - "content": "// The source for this privacy policy was generated by\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17517 - }, - { - "endIndex": 17629, - "paragraph": { - "elements": [ - { - "endIndex": 17629, - "startIndex": 17572, - "textRun": { - "content": "// https://app-privacy-policy-generator.firebaseapp.com/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17572 - }, - { - "endIndex": 17658, - "paragraph": { - "elements": [ - { - "endIndex": 17658, - "startIndex": 17629, - "textRun": { - "content": "var _privacyPolicyText = '''\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17629 - }, - { - "endIndex": 17676, - "paragraph": { - "elements": [ - { - "endIndex": 17676, - "startIndex": 17658, - "textRun": { - "content": "## Privacy Policy\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17658 - }, - { - "endIndex": 17677, - "paragraph": { - "elements": [ - { - "endIndex": 17677, - "startIndex": 17676, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17676 - }, - { - "endIndex": 17845, - "paragraph": { - "elements": [ - { - "endIndex": 17845, - "startIndex": 17677, - "textRun": { - "content": "Flutter Example Company built the Star Counter app as an Open Source app. This SERVICE is provided by Flutter Example Company at no cost and is intended for use as is.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17677 - }, - { - "endIndex": 17846, - "paragraph": { - "elements": [ - { - "endIndex": 17846, - "startIndex": 17845, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17845 - }, - { - "endIndex": 18009, - "paragraph": { - "elements": [ - { - "endIndex": 18009, - "startIndex": 17846, - "textRun": { - "content": "This page is used to inform visitors regarding our policies with the collection, use, and disclosure of Personal Information if anyone decided to use our Service.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17846 - }, - { - "endIndex": 18010, - "paragraph": { - "elements": [ - { - "endIndex": 18010, - "startIndex": 18009, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18009 - }, - { - "endIndex": 18316, - "paragraph": { - "elements": [ - { - "endIndex": 18316, - "startIndex": 18010, - "textRun": { - "content": "If you choose to use our Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that we collect is used for providing and improving the Service. We will not use or share your information with anyone except as described in this Privacy Policy.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18010 - }, - { - "endIndex": 18317, - "paragraph": { - "elements": [ - { - "endIndex": 18317, - "startIndex": 18316, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18316 - }, - { - "endIndex": 18495, - "paragraph": { - "elements": [ - { - "endIndex": 18495, - "startIndex": 18317, - "textRun": { - "content": "The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Star Counter unless otherwise defined in this Privacy Policy.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18317 - }, - { - "endIndex": 18500, - "paragraph": { - "elements": [ - { - "endIndex": 18500, - "startIndex": 18495, - "textRun": { - "content": "''';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18495 - } - ], - "endIndex": 18500, - "startIndex": 17218, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 18502, - "paragraph": { - "elements": [ - { - "endIndex": 18502, - "startIndex": 18501, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18501 - }, - { - "endIndex": 18542, - "paragraph": { - "elements": [ - { - "endIndex": 18503, - "inlineObjectElement": { - "inlineObjectId": "kix.d3qbsr13ierz", - "textStyle": {} - }, - "startIndex": 18502 - }, - { - "endIndex": 18521, - "startIndex": 18503, - "textRun": { - "content": "Add the following ", - "textStyle": {} - } - }, - { - "endIndex": 18527, - "startIndex": 18521, - "textRun": { - "content": "import", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18531, - "startIndex": 18527, - "textRun": { - "content": " to ", - "textStyle": {} - } - }, - { - "endIndex": 18540, - "startIndex": 18531, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18542, - "startIndex": 18540, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18502 - }, - { - "endIndex": 18556, - "paragraph": { - "elements": [ - { - "endIndex": 18555, - "startIndex": 18542, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_07/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 18556, - "startIndex": 18555, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.2w0x1pvr1rn3", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 18542 - }, - { - "endIndex": 18590, - "startIndex": 18556, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 18589, - "startIndex": 18557, - "tableCells": [ - { - "content": [ - { - "endIndex": 18589, - "paragraph": { - "elements": [ - { - "endIndex": 18589, - "startIndex": 18559, - "textRun": { - "content": "import 'privacy_policy.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18559 - } - ], - "endIndex": 18589, - "startIndex": 18558, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 18591, - "paragraph": { - "elements": [ - { - "endIndex": 18591, - "startIndex": 18590, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18590 - }, - { - "endIndex": 18639, - "paragraph": { - "elements": [ - { - "endIndex": 18592, - "inlineObjectElement": { - "inlineObjectId": "kix.r2xooln1ehwq", - "textStyle": {} - }, - "startIndex": 18591 - }, - { - "endIndex": 18639, - "startIndex": 18592, - "textRun": { - "content": "Add a new route (page) for the privacy policy.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18591 - }, - { - "endIndex": 18697, - "paragraph": { - "elements": [ - { - "endIndex": 18697, - "startIndex": 18639, - "textRun": { - "content": "After line 19, add the route for the privacy policy page:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18639 - }, - { - "endIndex": 18711, - "paragraph": { - "elements": [ - { - "endIndex": 18710, - "startIndex": 18697, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_07/lib/main.dart#L16" - }, - "underline": true - } - } - }, - { - "endIndex": 18711, - "startIndex": 18710, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.mx44kylijo59", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 18697 - }, - { - "endIndex": 18824, - "startIndex": 18711, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 18823, - "startIndex": 18712, - "tableCells": [ - { - "content": [ - { - "endIndex": 18724, - "paragraph": { - "elements": [ - { - "endIndex": 18724, - "startIndex": 18714, - "textRun": { - "content": "routes: {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18714 - }, - { - "endIndex": 18756, - "paragraph": { - "elements": [ - { - "endIndex": 18756, - "startIndex": 18724, - "textRun": { - "content": " '/': (context) => HomePage(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18724 - }, - { - "endIndex": 18820, - "paragraph": { - "elements": [ - { - "endIndex": 18820, - "startIndex": 18756, - "textRun": { - "content": " '/privacypolicy': (context) => const PrivacyPolicy(), // NEW\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18756 - }, - { - "endIndex": 18823, - "paragraph": { - "elements": [ - { - "endIndex": 18823, - "startIndex": 18820, - "textRun": { - "content": "},\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18820 - } - ], - "endIndex": 18823, - "startIndex": 18713, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 18825, - "paragraph": { - "elements": [ - { - "endIndex": 18825, - "startIndex": 18824, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18824 - }, - { - "endIndex": 18870, - "paragraph": { - "elements": [ - { - "endIndex": 18826, - "inlineObjectElement": { - "inlineObjectId": "kix.14d3j8txqua8", - "textStyle": {} - }, - "startIndex": 18825 - }, - { - "endIndex": 18870, - "startIndex": 18826, - "textRun": { - "content": "Add a button to display the privacy policy.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18825 - }, - { - "endIndex": 18971, - "paragraph": { - "elements": [ - { - "endIndex": 18877, - "startIndex": 18870, - "textRun": { - "content": "In the ", - "textStyle": {} - } - }, - { - "endIndex": 18891, - "startIndex": 18877, - "textRun": { - "content": "_HomePageState", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18894, - "startIndex": 18891, - "textRun": { - "content": "’s ", - "textStyle": {} - } - }, - { - "endIndex": 18901, - "startIndex": 18894, - "textRun": { - "content": "build()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18916, - "startIndex": 18901, - "textRun": { - "content": " method, add a ", - "textStyle": {} - } - }, - { - "endIndex": 18926, - "startIndex": 18916, - "textRun": { - "content": "TextButton", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18948, - "startIndex": 18926, - "textRun": { - "content": " to the bottom of the ", - "textStyle": {} - } - }, - { - "endIndex": 18954, - "startIndex": 18948, - "textRun": { - "content": "Column", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18971, - "startIndex": 18954, - "textRun": { - "content": ", after line 69:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18870 - }, - { - "endIndex": 18985, - "paragraph": { - "elements": [ - { - "endIndex": 18984, - "startIndex": 18971, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_07/lib/main.dart#L66" - }, - "underline": true - } - } - }, - { - "endIndex": 18985, - "startIndex": 18984, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.dzv2zpctvm3g", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 18971 - }, - { - "endIndex": 19266, - "startIndex": 18985, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 19265, - "startIndex": 18986, - "tableCells": [ - { - "content": [ - { - "endIndex": 19000, - "paragraph": { - "elements": [ - { - "endIndex": 19000, - "startIndex": 18988, - "textRun": { - "content": "TextButton(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18988 - }, - { - "endIndex": 19022, - "paragraph": { - "elements": [ - { - "endIndex": 19022, - "startIndex": 19000, - "textRun": { - "content": " style: ButtonStyle(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19000 - }, - { - "endIndex": 19083, - "paragraph": { - "elements": [ - { - "endIndex": 19083, - "startIndex": 19022, - "textRun": { - "content": " foregroundColor: MaterialStateProperty.all(Colors.blue),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19022 - }, - { - "endIndex": 19148, - "paragraph": { - "elements": [ - { - "endIndex": 19148, - "startIndex": 19083, - "textRun": { - "content": " overlayColor: MaterialStateProperty.all(Colors.transparent),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19083 - }, - { - "endIndex": 19153, - "paragraph": { - "elements": [ - { - "endIndex": 19153, - "startIndex": 19148, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19148 - }, - { - "endIndex": 19223, - "paragraph": { - "elements": [ - { - "endIndex": 19223, - "startIndex": 19153, - "textRun": { - "content": " onPressed: () => Navigator.of(context).pushNamed('/privacypolicy'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19153 - }, - { - "endIndex": 19262, - "paragraph": { - "elements": [ - { - "endIndex": 19262, - "startIndex": 19223, - "textRun": { - "content": " child: const Text('Privacy Policy'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19223 - }, - { - "endIndex": 19265, - "paragraph": { - "elements": [ - { - "endIndex": 19265, - "startIndex": 19262, - "textRun": { - "content": "),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19262 - } - ], - "endIndex": 19265, - "startIndex": 18987, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 19267, - "paragraph": { - "elements": [ - { - "endIndex": 19267, - "startIndex": 19266, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19266 - }, - { - "endIndex": 19281, - "paragraph": { - "elements": [ - { - "endIndex": 19268, - "inlineObjectElement": { - "inlineObjectId": "kix.ncw20rpxdw0b", - "textStyle": {} - }, - "startIndex": 19267 - }, - { - "endIndex": 19281, - "startIndex": 19268, - "textRun": { - "content": "Run the app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19267 - }, - { - "endIndex": 19364, - "paragraph": { - "elements": [ - { - "endIndex": 19315, - "startIndex": 19281, - "textRun": { - "content": "Hot restart the app. It now has a ", - "textStyle": {} - } - }, - { - "endIndex": 19329, - "startIndex": 19315, - "textRun": { - "content": "Privacy Policy", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19364, - "startIndex": 19329, - "textRun": { - "content": " link at the bottom of the screen:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19281 - }, - { - "endIndex": 19366, - "paragraph": { - "elements": [ - { - "endIndex": 19365, - "inlineObjectElement": { - "inlineObjectId": "kix.iiekv1azpgfs", - "textStyle": {} - }, - "startIndex": 19364 - }, - { - "endIndex": 19366, - "startIndex": 19365, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19364 - }, - { - "endIndex": 19401, - "paragraph": { - "elements": [ - { - "endIndex": 19367, - "inlineObjectElement": { - "inlineObjectId": "kix.6l7crdsfdy3x", - "textStyle": {} - }, - "startIndex": 19366 - }, - { - "endIndex": 19378, - "startIndex": 19367, - "textRun": { - "content": " Click the ", - "textStyle": {} - } - }, - { - "endIndex": 19392, - "startIndex": 19378, - "textRun": { - "content": "Privacy Policy", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19401, - "startIndex": 19392, - "textRun": { - "content": " button.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19366 - }, - { - "endIndex": 19479, - "paragraph": { - "elements": [ - { - "endIndex": 19463, - "startIndex": 19401, - "textRun": { - "content": "Note that the privacy policy displays, and the URL changes to ", - "textStyle": {} - } - }, - { - "endIndex": 19477, - "startIndex": 19463, - "textRun": { - "content": "/privacypolicy", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19479, - "startIndex": 19477, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19401 - }, - { - "endIndex": 19481, - "paragraph": { - "elements": [ - { - "endIndex": 19480, - "inlineObjectElement": { - "inlineObjectId": "kix.qlezbs828lvb", - "textStyle": {} - }, - "startIndex": 19479 - }, - { - "endIndex": 19481, - "startIndex": 19480, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19479 - }, - { - "endIndex": 19491, - "paragraph": { - "elements": [ - { - "endIndex": 19482, - "inlineObjectElement": { - "inlineObjectId": "kix.flx8r0d8dr2j", - "textStyle": {} - }, - "startIndex": 19481 - }, - { - "endIndex": 19491, - "startIndex": 19482, - "textRun": { - "content": "Go back.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19481 - }, - { - "endIndex": 19582, - "paragraph": { - "elements": [ - { - "endIndex": 19509, - "startIndex": 19491, - "textRun": { - "content": "Use the browser’s ", - "textStyle": {} - } - }, - { - "endIndex": 19513, - "startIndex": 19509, - "textRun": { - "content": "Back", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19582, - "startIndex": 19513, - "textRun": { - "content": " button to return to the first page. You get this behavior for free.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 19491 - }, - { - "endIndex": 19908, - "startIndex": 19582, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 19907, - "startIndex": 19583, - "tableCells": [ - { - "content": [ - { - "endIndex": 19907, - "paragraph": { - "elements": [ - { - "endIndex": 19588, - "startIndex": 19585, - "textRun": { - "content": "Tip", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19619, - "startIndex": 19588, - "textRun": { - "content": ": Because Flutter has only one ", - "textStyle": {} - } - }, - { - "endIndex": 19628, - "startIndex": 19619, - "textRun": { - "content": "Navigator", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19692, - "startIndex": 19628, - "textRun": { - "content": " object, you don’t have to write any code to make the browser’s ", - "textStyle": {} - } - }, - { - "endIndex": 19696, - "startIndex": 19692, - "textRun": { - "content": "Back", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19714, - "startIndex": 19696, - "textRun": { - "content": " button work. The ", - "textStyle": {} - } - }, - { - "endIndex": 19723, - "startIndex": 19714, - "textRun": { - "content": "Navigator", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19742, - "startIndex": 19723, - "textRun": { - "content": " manages Flutter’s ", - "textStyle": {} - } - }, - { - "endIndex": 19748, - "startIndex": 19742, - "textRun": { - "content": "routes", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 19775, - "startIndex": 19748, - "textRun": { - "content": " (sometimes referred to as ", - "textStyle": {} - } - }, - { - "endIndex": 19782, - "startIndex": 19775, - "textRun": { - "content": "screens", - "textStyle": {} - } - }, - { - "endIndex": 19786, - "startIndex": 19782, - "textRun": { - "content": " or ", - "textStyle": {} - } - }, - { - "endIndex": 19791, - "startIndex": 19786, - "textRun": { - "content": "pages", - "textStyle": {} - } - }, - { - "endIndex": 19883, - "startIndex": 19791, - "textRun": { - "content": ") inside a stack. Flutter’s navigation is integrated into the browser’s navigation, and the ", - "textStyle": {} - } - }, - { - "endIndex": 19887, - "startIndex": 19883, - "textRun": { - "content": "Back", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 19907, - "startIndex": 19887, - "textRun": { - "content": " button just works.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19585 - } - ], - "endIndex": 19907, - "startIndex": 19584, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.827451, - "green": 0.91764706, - "red": 0.8509804 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 19909, - "paragraph": { - "elements": [ - { - "endIndex": 19909, - "startIndex": 19908, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19908 - }, - { - "endIndex": 19928, - "paragraph": { - "elements": [ - { - "endIndex": 19928, - "startIndex": 19909, - "textRun": { - "content": "Host with Firebase\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.toqkntpt3r0b", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 19909 - }, - { - "endIndex": 19943, - "paragraph": { - "elements": [ - { - "endIndex": 19943, - "startIndex": 19928, - "textRun": { - "content": "Duration: 5:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 19928 - }, - { - "endIndex": 19944, - "paragraph": { - "elements": [ - { - "endIndex": 19944, - "startIndex": 19943, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19943 - }, - { - "endIndex": 20055, - "paragraph": { - "elements": [ - { - "endIndex": 20055, - "startIndex": 19944, - "textRun": { - "content": "The advantage of a hosted page is that you can change that page, without releasing a new version of your app. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19944 - }, - { - "endIndex": 20056, - "paragraph": { - "elements": [ - { - "endIndex": 20056, - "startIndex": 20055, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20055 - }, - { - "endIndex": 20139, - "paragraph": { - "elements": [ - { - "endIndex": 20139, - "startIndex": 20056, - "textRun": { - "content": "From the command line, at the root of the project, use the following instructions:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20056 - }, - { - "endIndex": 20140, - "paragraph": { - "elements": [ - { - "endIndex": 20140, - "startIndex": 20139, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20139 - }, - { - "endIndex": 20167, - "paragraph": { - "elements": [ - { - "endIndex": 20141, - "inlineObjectElement": { - "inlineObjectId": "kix.6yygs4bfvvqc", - "textStyle": {} - }, - "startIndex": 20140 - }, - { - "endIndex": 20165, - "startIndex": 20141, - "textRun": { - "content": "Install the Firebase CLI", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://firebase.google.com/docs/cli#install_the_firebase_cli" - }, - "underline": true - } - } - }, - { - "endIndex": 20166, - "startIndex": 20165, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 20167, - "startIndex": 20166, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 20140 - }, - { - "endIndex": 20225, - "paragraph": { - "elements": [ - { - "endIndex": 20168, - "inlineObjectElement": { - "inlineObjectId": "kix.u4jxxcyu253f", - "textStyle": {} - }, - "startIndex": 20167 - }, - { - "endIndex": 20202, - "startIndex": 20168, - "textRun": { - "content": "Log in to Firebase to authenticate", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://firebase.google.com/docs/cli#sign-in-test-cli" - }, - "underline": true - } - } - }, - { - "endIndex": 20208, - "startIndex": 20202, - "textRun": { - "content": " using", - "textStyle": {} - } - }, - { - "endIndex": 20223, - "startIndex": 20208, - "textRun": { - "content": " firebase login", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20225, - "startIndex": 20223, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 20167 - }, - { - "endIndex": 20277, - "paragraph": { - "elements": [ - { - "endIndex": 20226, - "inlineObjectElement": { - "inlineObjectId": "kix.exhi8in1q0vl", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://firebase.google.com/docs/cli#initialize_a_firebase_project" - }, - "underline": true - } - }, - "startIndex": 20225 - }, - { - "endIndex": 20255, - "startIndex": 20226, - "textRun": { - "content": "Initialize a Firebase project", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://firebase.google.com/docs/cli#initialize_a_firebase_project" - }, - "underline": true - } - } - }, - { - "endIndex": 20262, - "startIndex": 20255, - "textRun": { - "content": " using ", - "textStyle": {} - } - }, - { - "endIndex": 20277, - "startIndex": 20262, - "textRun": { - "content": "firebase init.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 20225 - }, - { - "endIndex": 20303, - "paragraph": { - "elements": [ - { - "endIndex": 20303, - "startIndex": 20277, - "textRun": { - "content": "Use the following values:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 20277 - }, - { - "endIndex": 20336, - "paragraph": { - "bullet": { - "listId": "kix.9epdyhq1em8x", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20328, - "startIndex": 20303, - "textRun": { - "content": "Which Firebase features? ", - "textStyle": {} - } - }, - { - "endIndex": 20335, - "startIndex": 20328, - "textRun": { - "content": "Hosting", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 20336, - "startIndex": 20335, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 20303 - }, - { - "endIndex": 20372, - "paragraph": { - "bullet": { - "listId": "kix.9epdyhq1em8x", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20351, - "startIndex": 20336, - "textRun": { - "content": "Project setup: ", - "textStyle": {} - } - }, - { - "endIndex": 20372, - "startIndex": 20351, - "textRun": { - "content": "Create a new project\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 20336 - }, - { - "endIndex": 20434, - "paragraph": { - "bullet": { - "listId": "kix.9epdyhq1em8x", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20391, - "startIndex": 20372, - "textRun": { - "content": "What project name? ", - "textStyle": {} - } - }, - { - "endIndex": 20416, - "startIndex": 20391, - "textRun": { - "content": "[yourname]-my-flutter-app", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 20434, - "startIndex": 20416, - "textRun": { - "content": " (must be unique)\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 20372 - }, - { - "endIndex": 20559, - "paragraph": { - "bullet": { - "listId": "kix.9epdyhq1em8x", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20467, - "startIndex": 20434, - "textRun": { - "content": "What to call your project? Press ", - "textStyle": {} - } - }, - { - "endIndex": 20473, - "startIndex": 20467, - "textRun": { - "content": "Return", - "textStyle": {} - } - }, - { - "endIndex": 20559, - "startIndex": 20473, - "textRun": { - "content": " to accept the default (which is the same as the name used in the previous question).\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 20434 - }, - { - "endIndex": 20613, - "paragraph": { - "bullet": { - "listId": "kix.9epdyhq1em8x", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20582, - "startIndex": 20559, - "textRun": { - "content": "What public directory? ", - "textStyle": {} - } - }, - { - "endIndex": 20591, - "startIndex": 20582, - "textRun": { - "content": "build/web", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 20613, - "startIndex": 20591, - "textRun": { - "content": " (This is important.)\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 20559 - }, - { - "endIndex": 20649, - "paragraph": { - "bullet": { - "listId": "kix.9epdyhq1em8x", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20645, - "startIndex": 20613, - "textRun": { - "content": "Configure as a single page app? ", - "textStyle": {} - } - }, - { - "endIndex": 20649, - "startIndex": 20645, - "textRun": { - "content": "Yes\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 20613 - }, - { - "endIndex": 20701, - "paragraph": { - "bullet": { - "listId": "kix.9epdyhq1em8x", - "textStyle": { - "bold": true, - "underline": false - } - }, - "elements": [ - { - "endIndex": 20697, - "startIndex": 20649, - "textRun": { - "content": "Set up automatic builds and deploys with GitHub?", - "textStyle": {} - } - }, - { - "endIndex": 20701, - "startIndex": 20697, - "textRun": { - "content": " No\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 20649 - }, - { - "endIndex": 20802, - "paragraph": { - "elements": [ - { - "endIndex": 20787, - "startIndex": 20701, - "textRun": { - "content": "At the command line, you’ll see something like the following after you finish running ", - "textStyle": {} - } - }, - { - "endIndex": 20800, - "startIndex": 20787, - "textRun": { - "content": "firebase init", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20802, - "startIndex": 20800, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 20701 - }, - { - "endIndex": 20804, - "paragraph": { - "elements": [ - { - "endIndex": 20803, - "inlineObjectElement": { - "inlineObjectId": "kix.itqz39i383il", - "textStyle": {} - }, - "startIndex": 20802 - }, - { - "endIndex": 20804, - "startIndex": 20803, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 20802 - }, - { - "endIndex": 20890, - "paragraph": { - "elements": [ - { - "endIndex": 20829, - "startIndex": 20804, - "textRun": { - "content": "At the completion of the ", - "textStyle": {} - } - }, - { - "endIndex": 20833, - "startIndex": 20829, - "textRun": { - "content": "init", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20890, - "startIndex": 20833, - "textRun": { - "content": " command, the following files are added to your project:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 20804 - }, - { - "endIndex": 20928, - "paragraph": { - "bullet": { - "listId": "kix.g0uc1tjsv82r", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20903, - "startIndex": 20890, - "textRun": { - "content": "firebase.json", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20928, - "startIndex": 20903, - "textRun": { - "content": ", the configuration file\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 20890 - }, - { - "endIndex": 20972, - "paragraph": { - "bullet": { - "listId": "kix.g0uc1tjsv82r", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 20939, - "startIndex": 20928, - "textRun": { - "content": ".firebaserc", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20972, - "startIndex": 20939, - "textRun": { - "content": ", containing your project data \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 20928 - }, - { - "endIndex": 21060, - "paragraph": { - "elements": [ - { - "endIndex": 20991, - "startIndex": 20972, - "textRun": { - "content": "Make sure that the ", - "textStyle": {} - } - }, - { - "endIndex": 20997, - "startIndex": 20991, - "textRun": { - "content": "public", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21012, - "startIndex": 20997, - "textRun": { - "content": " field in your ", - "textStyle": {} - } - }, - { - "endIndex": 21025, - "startIndex": 21012, - "textRun": { - "content": "firebase.json", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21036, - "startIndex": 21025, - "textRun": { - "content": " specifies ", - "textStyle": {} - } - }, - { - "endIndex": 21045, - "startIndex": 21036, - "textRun": { - "content": "build/web", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21046, - "startIndex": 21045, - "textRun": { - "content": ",", - "textStyle": {} - } - }, - { - "endIndex": 21060, - "startIndex": 21046, - "textRun": { - "content": " for example:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 20972 - }, - { - "endIndex": 21074, - "paragraph": { - "elements": [ - { - "endIndex": 21073, - "startIndex": 21060, - "textRun": { - "content": "firebase.json", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_08/firebase.json" - }, - "underline": true - } - } - }, - { - "endIndex": 21074, - "startIndex": 21073, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ckdfwsit8uyr", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 21060 - }, - { - "endIndex": 21341, - "startIndex": 21074, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 21340, - "startIndex": 21075, - "tableCells": [ - { - "content": [ - { - "endIndex": 21079, - "paragraph": { - "elements": [ - { - "endIndex": 21079, - "startIndex": 21077, - "textRun": { - "content": "{\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21077 - }, - { - "endIndex": 21094, - "paragraph": { - "elements": [ - { - "endIndex": 21094, - "startIndex": 21079, - "textRun": { - "content": " \"hosting\": {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21079 - }, - { - "endIndex": 21145, - "paragraph": { - "elements": [ - { - "endIndex": 21145, - "startIndex": 21094, - "textRun": { - "content": " \"public\": \"build/web\", # This is important!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21094 - }, - { - "endIndex": 21161, - "paragraph": { - "elements": [ - { - "endIndex": 21161, - "startIndex": 21145, - "textRun": { - "content": " \"ignore\": [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21145 - }, - { - "endIndex": 21184, - "paragraph": { - "elements": [ - { - "endIndex": 21184, - "startIndex": 21161, - "textRun": { - "content": " \"firebase.json\",\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21161 - }, - { - "endIndex": 21199, - "paragraph": { - "elements": [ - { - "endIndex": 21199, - "startIndex": 21184, - "textRun": { - "content": " \"**/.*\",\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21184 - }, - { - "endIndex": 21226, - "paragraph": { - "elements": [ - { - "endIndex": 21226, - "startIndex": 21199, - "textRun": { - "content": " \"**/node_modules/**\"\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21199 - }, - { - "endIndex": 21233, - "paragraph": { - "elements": [ - { - "endIndex": 21233, - "startIndex": 21226, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21226 - }, - { - "endIndex": 21251, - "paragraph": { - "elements": [ - { - "endIndex": 21251, - "startIndex": 21233, - "textRun": { - "content": " \"rewrites\": [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21233 - }, - { - "endIndex": 21259, - "paragraph": { - "elements": [ - { - "endIndex": 21259, - "startIndex": 21251, - "textRun": { - "content": " {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21251 - }, - { - "endIndex": 21283, - "paragraph": { - "elements": [ - { - "endIndex": 21283, - "startIndex": 21259, - "textRun": { - "content": " \"source\": \"**\",\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21259 - }, - { - "endIndex": 21320, - "paragraph": { - "elements": [ - { - "endIndex": 21320, - "startIndex": 21283, - "textRun": { - "content": " \"destination\": \"/index.html\"\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21283 - }, - { - "endIndex": 21328, - "paragraph": { - "elements": [ - { - "endIndex": 21328, - "startIndex": 21320, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21320 - }, - { - "endIndex": 21334, - "paragraph": { - "elements": [ - { - "endIndex": 21334, - "startIndex": 21328, - "textRun": { - "content": " ]\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21328 - }, - { - "endIndex": 21338, - "paragraph": { - "elements": [ - { - "endIndex": 21338, - "startIndex": 21334, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21334 - }, - { - "endIndex": 21340, - "paragraph": { - "elements": [ - { - "endIndex": 21340, - "startIndex": 21338, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21338 - } - ], - "endIndex": 21340, - "startIndex": 21076, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 21342, - "paragraph": { - "elements": [ - { - "endIndex": 21342, - "startIndex": 21341, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 21341 - }, - { - "endIndex": 21380, - "paragraph": { - "elements": [ - { - "endIndex": 21343, - "inlineObjectElement": { - "inlineObjectId": "kix.q6ezslfpncxw", - "textStyle": {} - }, - "startIndex": 21342 - }, - { - "endIndex": 21380, - "startIndex": 21343, - "textRun": { - "content": "Build a release version of your app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21342 - }, - { - "endIndex": 21477, - "paragraph": { - "elements": [ - { - "endIndex": 21477, - "startIndex": 21380, - "textRun": { - "content": "Configure your IDE to build a release version of your app using one of the following approaches:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 21380 - }, - { - "endIndex": 21620, - "paragraph": { - "bullet": { - "listId": "kix.rbv433e0ib2q", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 21516, - "startIndex": 21477, - "textRun": { - "content": "In Android Studio or IntelliJ, specify ", - "textStyle": {} - } - }, - { - "endIndex": 21525, - "startIndex": 21516, - "textRun": { - "content": "--release", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21533, - "startIndex": 21525, - "textRun": { - "content": " in the ", - "textStyle": {} - } - }, - { - "endIndex": 21553, - "startIndex": 21533, - "textRun": { - "content": "Additional arguments", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 21567, - "startIndex": 21553, - "textRun": { - "content": " field of the ", - "textStyle": {} - } - }, - { - "endIndex": 21570, - "startIndex": 21567, - "textRun": { - "content": "Run", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 21572, - "startIndex": 21570, - "textRun": { - "content": " >", - "textStyle": {} - } - }, - { - "endIndex": 21591, - "startIndex": 21572, - "textRun": { - "content": " Edit Configuration", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 21620, - "startIndex": 21591, - "textRun": { - "content": " dialog. Then, run your app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 21477 - }, - { - "endIndex": 21675, - "paragraph": { - "bullet": { - "listId": "kix.rbv433e0ib2q", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 21644, - "startIndex": 21620, - "textRun": { - "content": "At the command line, run", - "textStyle": {} - } - }, - { - "endIndex": 21672, - "startIndex": 21644, - "textRun": { - "content": " flutter build web --release", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21675, - "startIndex": 21672, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 21620 - }, - { - "endIndex": 21829, - "paragraph": { - "elements": [ - { - "endIndex": 21722, - "startIndex": 21675, - "textRun": { - "content": "Confirm that this step worked by examining the ", - "textStyle": {} - } - }, - { - "endIndex": 21731, - "startIndex": 21722, - "textRun": { - "content": "build/web", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21817, - "startIndex": 21731, - "textRun": { - "content": " directory of your project. The directory should contain a number of files, including ", - "textStyle": {} - } - }, - { - "endIndex": 21827, - "startIndex": 21817, - "textRun": { - "content": "index.html", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21829, - "startIndex": 21827, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - } - } - }, - "startIndex": 21675 - }, - { - "endIndex": 21847, - "paragraph": { - "elements": [ - { - "endIndex": 21830, - "inlineObjectElement": { - "inlineObjectId": "kix.p76r74f2stm5", - "textStyle": {} - }, - "startIndex": 21829 - }, - { - "endIndex": 21847, - "startIndex": 21830, - "textRun": { - "content": "Deploy your app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21829 - }, - { - "endIndex": 22041, - "paragraph": { - "elements": [ - { - "endIndex": 21871, - "startIndex": 21847, - "textRun": { - "content": "At the command line, run", - "textStyle": {} - } - }, - { - "endIndex": 21887, - "startIndex": 21871, - "textRun": { - "content": " firebase deploy", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21946, - "startIndex": 21887, - "textRun": { - "content": " from the top of the project to deploy the contents of the ", - "textStyle": {} - } - }, - { - "endIndex": 21953, - "startIndex": 21946, - "textRun": { - "content": "public ", - "textStyle": {} - } - }, - { - "endIndex": 21962, - "startIndex": 21953, - "textRun": { - "content": "build/web", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22012, - "startIndex": 21962, - "textRun": { - "content": " directory. This shows the URL where it's hosted, ", - "textStyle": {} - } - }, - { - "endIndex": 22020, - "startIndex": 22012, - "textRun": { - "content": "https://", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 22031, - "startIndex": 22020, - "textRun": { - "content": "project-id>", - "textStyle": { - "italic": true, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 22041, - "startIndex": 22031, - "textRun": { - "content": ".web.app.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 21847 - }, - { - "endIndex": 22191, - "paragraph": { - "elements": [ - { - "endIndex": 22063, - "startIndex": 22041, - "textRun": { - "content": "In the browser, go to ", - "textStyle": {} - } - }, - { - "endIndex": 22072, - "startIndex": 22063, - "textRun": { - "content": "https://<", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22082, - "startIndex": 22072, - "textRun": { - "content": "project-id", - "textStyle": { - "italic": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22091, - "startIndex": 22082, - "textRun": { - "content": ">.web.app", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22095, - "startIndex": 22091, - "textRun": { - "content": " or ", - "textStyle": {} - } - }, - { - "endIndex": 22104, - "startIndex": 22095, - "textRun": { - "content": "https://<", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22114, - "startIndex": 22104, - "textRun": { - "content": "project-id", - "textStyle": { - "italic": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22139, - "startIndex": 22114, - "textRun": { - "content": ">.web.app/#/privacypolicy", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22191, - "startIndex": 22139, - "textRun": { - "content": " to see the running version of your privacy policy.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 22041 - }, - { - "endIndex": 22231, - "paragraph": { - "elements": [ - { - "endIndex": 22231, - "startIndex": 22191, - "textRun": { - "content": "Use an HTML file for the privacy policy\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.trx1fjg7wbe3", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 22191 - }, - { - "endIndex": 22342, - "paragraph": { - "elements": [ - { - "endIndex": 22342, - "startIndex": 22231, - "textRun": { - "content": "Next, instead of embedding the privacy policy in the Dart code, you’ll host it as an HTML page using Firebase.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22231 - }, - { - "endIndex": 22343, - "paragraph": { - "elements": [ - { - "endIndex": 22343, - "startIndex": 22342, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22342 - }, - { - "endIndex": 22372, - "paragraph": { - "elements": [ - { - "endIndex": 22344, - "inlineObjectElement": { - "inlineObjectId": "kix.486ave73ctsl", - "textStyle": {} - }, - "startIndex": 22343 - }, - { - "endIndex": 22351, - "startIndex": 22344, - "textRun": { - "content": "Delete ", - "textStyle": {} - } - }, - { - "endIndex": 22372, - "startIndex": 22351, - "textRun": { - "content": "privacy_policy.dart.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22343 - }, - { - "endIndex": 22428, - "paragraph": { - "elements": [ - { - "endIndex": 22397, - "startIndex": 22372, - "textRun": { - "content": "Remove the file from the ", - "textStyle": {} - } - }, - { - "endIndex": 22400, - "startIndex": 22397, - "textRun": { - "content": "lib", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22428, - "startIndex": 22400, - "textRun": { - "content": " directory of your project.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22372 - }, - { - "endIndex": 22429, - "paragraph": { - "elements": [ - { - "endIndex": 22429, - "startIndex": 22428, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22428 - }, - { - "endIndex": 22448, - "paragraph": { - "elements": [ - { - "endIndex": 22430, - "inlineObjectElement": { - "inlineObjectId": "kix.ihxd3eo3cl5p", - "textStyle": {} - }, - "startIndex": 22429 - }, - { - "endIndex": 22437, - "startIndex": 22430, - "textRun": { - "content": "Update ", - "textStyle": {} - } - }, - { - "endIndex": 22448, - "startIndex": 22437, - "textRun": { - "content": "main.dart.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22429 - }, - { - "endIndex": 22571, - "paragraph": { - "elements": [ - { - "endIndex": 22451, - "startIndex": 22448, - "textRun": { - "content": "In ", - "textStyle": {} - } - }, - { - "endIndex": 22455, - "startIndex": 22451, - "textRun": { - "content": "lib/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22464, - "startIndex": 22455, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22494, - "startIndex": 22464, - "textRun": { - "content": ", remove the import statement ", - "textStyle": {} - } - }, - { - "endIndex": 22520, - "startIndex": 22494, - "textRun": { - "content": "import privacy_policy.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22529, - "startIndex": 22520, - "textRun": { - "content": " and the ", - "textStyle": {} - } - }, - { - "endIndex": 22543, - "startIndex": 22529, - "textRun": { - "content": "/privacypolicy", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22555, - "startIndex": 22543, - "textRun": { - "content": " route from ", - "textStyle": {} - } - }, - { - "endIndex": 22569, - "startIndex": 22555, - "textRun": { - "content": "StarCounterApp", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22571, - "startIndex": 22569, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22448 - }, - { - "endIndex": 22572, - "paragraph": { - "elements": [ - { - "endIndex": 22572, - "startIndex": 22571, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22571 - }, - { - "endIndex": 22598, - "paragraph": { - "elements": [ - { - "endIndex": 22573, - "inlineObjectElement": { - "inlineObjectId": "kix.qqm23wx09aaq", - "textStyle": {} - }, - "startIndex": 22572 - }, - { - "endIndex": 22577, - "startIndex": 22573, - "textRun": { - "content": "Add ", - "textStyle": {} - } - }, - { - "endIndex": 22598, - "startIndex": 22577, - "textRun": { - "content": "privacy_policy.html.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22572 - }, - { - "endIndex": 22652, - "paragraph": { - "elements": [ - { - "endIndex": 22621, - "startIndex": 22598, - "textRun": { - "content": "Place this file in the ", - "textStyle": {} - } - }, - { - "endIndex": 22624, - "startIndex": 22621, - "textRun": { - "content": "web", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22652, - "startIndex": 22624, - "textRun": { - "content": " directory of your project.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 22598 - }, - { - "endIndex": 22676, - "paragraph": { - "elements": [ - { - "endIndex": 22675, - "startIndex": 22652, - "textRun": { - "content": "web/privacy_policy.html", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_09/web/privacy_policy.html" - }, - "underline": true - } - } - }, - { - "endIndex": 22676, - "startIndex": 22675, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.tpt16irubtwl", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 22652 - }, - { - "endIndex": 23698, - "startIndex": 22676, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 23697, - "startIndex": 22677, - "tableCells": [ - { - "content": [ - { - "endIndex": 22695, - "paragraph": { - "elements": [ - { - "endIndex": 22695, - "startIndex": 22679, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22679 - }, - { - "endIndex": 22696, - "paragraph": { - "elements": [ - { - "endIndex": 22696, - "startIndex": 22695, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22695 - }, - { - "endIndex": 22713, - "paragraph": { - "elements": [ - { - "endIndex": 22713, - "startIndex": 22696, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22696 - }, - { - "endIndex": 22720, - "paragraph": { - "elements": [ - { - "endIndex": 22720, - "startIndex": 22713, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22713 - }, - { - "endIndex": 22745, - "paragraph": { - "elements": [ - { - "endIndex": 22745, - "startIndex": 22720, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22720 - }, - { - "endIndex": 22746, - "paragraph": { - "elements": [ - { - "endIndex": 22746, - "startIndex": 22745, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22745 - }, - { - "endIndex": 22778, - "paragraph": { - "elements": [ - { - "endIndex": 22778, - "startIndex": 22746, - "textRun": { - "content": " Privacy Policy\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22746 - }, - { - "endIndex": 22786, - "paragraph": { - "elements": [ - { - "endIndex": 22786, - "startIndex": 22778, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22778 - }, - { - "endIndex": 22787, - "paragraph": { - "elements": [ - { - "endIndex": 22787, - "startIndex": 22786, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22786 - }, - { - "endIndex": 22794, - "paragraph": { - "elements": [ - { - "endIndex": 22794, - "startIndex": 22787, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22787 - }, - { - "endIndex": 22838, - "paragraph": { - "elements": [ - { - "endIndex": 22838, - "startIndex": 22794, - "textRun": { - "content": "

Privacy Policy

\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22794 - }, - { - "endIndex": 23013, - "paragraph": { - "elements": [ - { - "endIndex": 23013, - "startIndex": 22838, - "textRun": { - "content": "

Flutter Example Company built the Star Counter app as an Open Source app. This SERVICE is provided by Flutter Example Company at no cost and is intended for use as is.

\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22838 - }, - { - "endIndex": 23183, - "paragraph": { - "elements": [ - { - "endIndex": 23183, - "startIndex": 23013, - "textRun": { - "content": "

This page is used to inform visitors regarding our policies with the collection, use, and disclosure of Personal Information if anyone decided to use our Service.

\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23013 - }, - { - "endIndex": 23496, - "paragraph": { - "elements": [ - { - "endIndex": 23496, - "startIndex": 23183, - "textRun": { - "content": "

If you choose to use our Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that we collect is used for providing and improving the Service. We will not use or share your information with anyone except as described in this Privacy Policy.

\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23183 - }, - { - "endIndex": 23681, - "paragraph": { - "elements": [ - { - "endIndex": 23681, - "startIndex": 23496, - "textRun": { - "content": "

The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Star Counter unless otherwise defined in this Privacy Policy.

\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23496 - }, - { - "endIndex": 23689, - "paragraph": { - "elements": [ - { - "endIndex": 23689, - "startIndex": 23681, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23681 - }, - { - "endIndex": 23697, - "paragraph": { - "elements": [ - { - "endIndex": 23697, - "startIndex": 23689, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23689 - } - ], - "endIndex": 23697, - "startIndex": 22678, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 23727, - "paragraph": { - "elements": [ - { - "endIndex": 23727, - "startIndex": 23698, - "textRun": { - "content": "Use the url_launcher package\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.kfb695acu5qu", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 23698 - }, - { - "endIndex": 23742, - "paragraph": { - "elements": [ - { - "endIndex": 23742, - "startIndex": 23727, - "textRun": { - "content": "Duration: 5:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 23727 - }, - { - "endIndex": 23743, - "paragraph": { - "elements": [ - { - "endIndex": 23743, - "startIndex": 23742, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23742 - }, - { - "endIndex": 23822, - "paragraph": { - "elements": [ - { - "endIndex": 23761, - "startIndex": 23743, - "textRun": { - "content": "Next, you use the ", - "textStyle": {} - } - }, - { - "endIndex": 23773, - "startIndex": 23761, - "textRun": { - "content": "url_launcher", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/url_launcher" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23822, - "startIndex": 23773, - "textRun": { - "content": " plugin to open the privacy policy in a new tab.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23743 - }, - { - "endIndex": 23823, - "paragraph": { - "elements": [ - { - "endIndex": 23823, - "startIndex": 23822, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23822 - }, - { - "endIndex": 24134, - "paragraph": { - "elements": [ - { - "endIndex": 23844, - "startIndex": 23823, - "textRun": { - "content": "Flutter web apps are ", - "textStyle": {} - } - }, - { - "endIndex": 23860, - "startIndex": 23844, - "textRun": { - "content": "Single Page Apps", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://en.wikipedia.org/wiki/Single-page_application" - }, - "underline": true - } - } - }, - { - "endIndex": 24133, - "startIndex": 23860, - "textRun": { - "content": " (SPAs). This is why using the standard routing mechanism in our web example opens the privacy policy in the same web page. The URL launcher plugin, on the other hand, opens a new tab in the browser, launches another copy of the app, and routes the app to the hosted page. ", - "textStyle": {} - } - }, - { - "endIndex": 24134, - "startIndex": 24133, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23823 - }, - { - "endIndex": 24153, - "paragraph": { - "elements": [ - { - "endIndex": 24135, - "inlineObjectElement": { - "inlineObjectId": "kix.3klsnm9z68sn", - "textStyle": {} - }, - "startIndex": 24134 - }, - { - "endIndex": 24153, - "startIndex": 24135, - "textRun": { - "content": "Add a dependency.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 24134 - }, - { - "endIndex": 24186, - "paragraph": { - "elements": [ - { - "endIndex": 24161, - "startIndex": 24153, - "textRun": { - "content": "Add the ", - "textStyle": {} - } - }, - { - "endIndex": 24173, - "startIndex": 24161, - "textRun": { - "content": "url_launcher", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/url_launcher" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24186, - "startIndex": 24173, - "textRun": { - "content": " dependency:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 24153 - }, - { - "endIndex": 24187, - "paragraph": { - "elements": [ - { - "endIndex": 24187, - "startIndex": 24186, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 24186 - }, - { - "endIndex": 24712, - "startIndex": 24187, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 24711, - "startIndex": 24188, - "tableCells": [ - { - "content": [ - { - "endIndex": 24221, - "paragraph": { - "elements": [ - { - "endIndex": 24221, - "startIndex": 24190, - "textRun": { - "content": "$ flutter pub add url_launcher\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24190 - }, - { - "endIndex": 24247, - "paragraph": { - "elements": [ - { - "endIndex": 24247, - "startIndex": 24221, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24221 - }, - { - "endIndex": 24279, - "paragraph": { - "elements": [ - { - "endIndex": 24279, - "startIndex": 24247, - "textRun": { - "content": " async 2.8.1 (2.8.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24247 - }, - { - "endIndex": 24316, - "paragraph": { - "elements": [ - { - "endIndex": 24316, - "startIndex": 24279, - "textRun": { - "content": " characters 1.1.0 (1.2.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24279 - }, - { - "endIndex": 24361, - "paragraph": { - "elements": [ - { - "endIndex": 24361, - "startIndex": 24316, - "textRun": { - "content": "+ flutter_web_plugins 0.0.0 from sdk flutter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24316 - }, - { - "endIndex": 24372, - "paragraph": { - "elements": [ - { - "endIndex": 24372, - "startIndex": 24361, - "textRun": { - "content": "+ js 0.6.3\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24361 - }, - { - "endIndex": 24410, - "paragraph": { - "elements": [ - { - "endIndex": 24410, - "startIndex": 24372, - "textRun": { - "content": " matcher 0.12.10 (0.12.11 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24372 - }, - { - "endIndex": 24444, - "paragraph": { - "elements": [ - { - "endIndex": 24444, - "startIndex": 24410, - "textRun": { - "content": "+ plugin_platform_interface 2.0.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24410 - }, - { - "endIndex": 24479, - "paragraph": { - "elements": [ - { - "endIndex": 24479, - "startIndex": 24444, - "textRun": { - "content": " test_api 0.4.2 (0.4.5 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24444 - }, - { - "endIndex": 24501, - "paragraph": { - "elements": [ - { - "endIndex": 24501, - "startIndex": 24479, - "textRun": { - "content": "+ url_launcher 6.0.12\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24479 - }, - { - "endIndex": 24528, - "paragraph": { - "elements": [ - { - "endIndex": 24528, - "startIndex": 24501, - "textRun": { - "content": "+ url_launcher_linux 2.0.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24501 - }, - { - "endIndex": 24555, - "paragraph": { - "elements": [ - { - "endIndex": 24555, - "startIndex": 24528, - "textRun": { - "content": "+ url_launcher_macos 2.0.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24528 - }, - { - "endIndex": 24595, - "paragraph": { - "elements": [ - { - "endIndex": 24595, - "startIndex": 24555, - "textRun": { - "content": "+ url_launcher_platform_interface 2.0.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24555 - }, - { - "endIndex": 24620, - "paragraph": { - "elements": [ - { - "endIndex": 24620, - "startIndex": 24595, - "textRun": { - "content": "+ url_launcher_web 2.0.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24595 - }, - { - "endIndex": 24649, - "paragraph": { - "elements": [ - { - "endIndex": 24649, - "startIndex": 24620, - "textRun": { - "content": "+ url_launcher_windows 2.0.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24620 - }, - { - "endIndex": 24687, - "paragraph": { - "elements": [ - { - "endIndex": 24687, - "startIndex": 24649, - "textRun": { - "content": " vector_math 2.1.0 (2.1.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24649 - }, - { - "endIndex": 24711, - "paragraph": { - "elements": [ - { - "endIndex": 24711, - "startIndex": 24687, - "textRun": { - "content": "Changed 9 dependencies!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24687 - } - ], - "endIndex": 24711, - "startIndex": 24189, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 24713, - "paragraph": { - "elements": [ - { - "endIndex": 24713, - "startIndex": 24712, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 24712 - }, - { - "endIndex": 24741, - "paragraph": { - "elements": [ - { - "endIndex": 24714, - "inlineObjectElement": { - "inlineObjectId": "kix.la124mwnolks", - "textStyle": {} - }, - "startIndex": 24713 - }, - { - "endIndex": 24741, - "startIndex": 24714, - "textRun": { - "content": " Fetch the new dependency.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 24713 - }, - { - "endIndex": 24930, - "paragraph": { - "elements": [ - { - "endIndex": 24829, - "startIndex": 24741, - "textRun": { - "content": "Stop the app, because adding a dependency requires a full restart of the app. Click the ", - "textStyle": {} - } - }, - { - "endIndex": 24836, - "startIndex": 24829, - "textRun": { - "content": "Pub get", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 24885, - "startIndex": 24836, - "textRun": { - "content": " button in your IDE or, at the command line, run ", - "textStyle": {} - } - }, - { - "endIndex": 24900, - "startIndex": 24885, - "textRun": { - "content": "flutter pub get", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24930, - "startIndex": 24900, - "textRun": { - "content": " from the top of the project.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 24741 - }, - { - "endIndex": 24970, - "paragraph": { - "elements": [ - { - "endIndex": 24931, - "inlineObjectElement": { - "inlineObjectId": "kix.2e5vd1oegigq", - "textStyle": {} - }, - "startIndex": 24930 - }, - { - "endIndex": 24949, - "startIndex": 24931, - "textRun": { - "content": "Add the following ", - "textStyle": {} - } - }, - { - "endIndex": 24955, - "startIndex": 24949, - "textRun": { - "content": "import", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24959, - "startIndex": 24955, - "textRun": { - "content": " to ", - "textStyle": {} - } - }, - { - "endIndex": 24968, - "startIndex": 24959, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24970, - "startIndex": 24968, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 24930 - }, - { - "endIndex": 24984, - "paragraph": { - "elements": [ - { - "endIndex": 24983, - "startIndex": 24970, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_10/lib/main.dart#L2" - }, - "underline": true - } - } - }, - { - "endIndex": 24984, - "startIndex": 24983, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.bu41gtmwtewu", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 24970 - }, - { - "endIndex": 25037, - "startIndex": 24984, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 25036, - "startIndex": 24985, - "tableCells": [ - { - "content": [ - { - "endIndex": 25036, - "paragraph": { - "elements": [ - { - "endIndex": 25036, - "startIndex": 24987, - "textRun": { - "content": "import 'package:url_launcher/url_launcher.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24987 - } - ], - "endIndex": 25036, - "startIndex": 24986, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 25038, - "paragraph": { - "elements": [ - { - "endIndex": 25038, - "startIndex": 25037, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 25037 - }, - { - "endIndex": 25072, - "paragraph": { - "elements": [ - { - "endIndex": 25039, - "inlineObjectElement": { - "inlineObjectId": "kix.yt7q6gvt4jq8", - "textStyle": {} - }, - "startIndex": 25038 - }, - { - "endIndex": 25050, - "startIndex": 25039, - "textRun": { - "content": "Update the ", - "textStyle": {} - } - }, - { - "endIndex": 25060, - "startIndex": 25050, - "textRun": { - "content": "TextButton", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25072, - "startIndex": 25060, - "textRun": { - "content": "’s handler.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25038 - }, - { - "endIndex": 25251, - "paragraph": { - "elements": [ - { - "endIndex": 25080, - "startIndex": 25072, - "textRun": { - "content": "Also in ", - "textStyle": {} - } - }, - { - "endIndex": 25089, - "startIndex": 25080, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25149, - "startIndex": 25089, - "textRun": { - "content": ", replace the code that is called when the user presses the ", - "textStyle": {} - } - }, - { - "endIndex": 25163, - "startIndex": 25149, - "textRun": { - "content": "Privacy Policy", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 25251, - "startIndex": 25163, - "textRun": { - "content": " button. The original code (on line 75 and 76) uses Flutter’s normal routing mechanism:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25072 - }, - { - "endIndex": 25252, - "paragraph": { - "elements": [ - { - "endIndex": 25252, - "startIndex": 25251, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25251 - }, - { - "endIndex": 25328, - "startIndex": 25252, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 25327, - "startIndex": 25253, - "tableCells": [ - { - "content": [ - { - "endIndex": 25272, - "paragraph": { - "elements": [ - { - "endIndex": 25272, - "startIndex": 25255, - "textRun": { - "content": "onPressed: () =>\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25255 - }, - { - "endIndex": 25327, - "paragraph": { - "elements": [ - { - "endIndex": 25327, - "startIndex": 25272, - "textRun": { - "content": " Navigator.of(context).pushNamed('/privacypolicy'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25272 - } - ], - "endIndex": 25327, - "startIndex": 25254, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 25329, - "paragraph": { - "elements": [ - { - "endIndex": 25329, - "startIndex": 25328, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25328 - }, - { - "endIndex": 25388, - "paragraph": { - "elements": [ - { - "endIndex": 25346, - "startIndex": 25329, - "textRun": { - "content": "The new code for ", - "textStyle": {} - } - }, - { - "endIndex": 25355, - "startIndex": 25346, - "textRun": { - "content": "onPressed", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25366, - "startIndex": 25355, - "textRun": { - "content": " calls the ", - "textStyle": {} - } - }, - { - "endIndex": 25378, - "startIndex": 25366, - "textRun": { - "content": "url_launcher", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25388, - "startIndex": 25378, - "textRun": { - "content": " package:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25329 - }, - { - "endIndex": 25402, - "paragraph": { - "elements": [ - { - "endIndex": 25401, - "startIndex": 25388, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/star_counter/step_10/lib/main.dart#L71" - }, - "underline": true - } - } - }, - { - "endIndex": 25402, - "startIndex": 25401, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hg8m9sf7gvta", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "shading": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.99215686, - "green": 0.99215686, - "red": 0.99215686 - } - } - } - }, - "spaceBelow": { - "magnitude": 11.0, - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 25388 - }, - { - "endIndex": 25473, - "startIndex": 25402, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 25472, - "startIndex": 25403, - "tableCells": [ - { - "content": [ - { - "endIndex": 25422, - "paragraph": { - "elements": [ - { - "endIndex": 25422, - "startIndex": 25405, - "textRun": { - "content": "onPressed: () =>\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25405 - }, - { - "endIndex": 25472, - "paragraph": { - "elements": [ - { - "endIndex": 25472, - "startIndex": 25422, - "textRun": { - "content": " launchUrl(Uri.parse('/privacy_policy.html')),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 25422 - } - ], - "endIndex": 25472, - "startIndex": 25404, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 25474, - "paragraph": { - "elements": [ - { - "endIndex": 25474, - "startIndex": 25473, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25473 - }, - { - "endIndex": 25488, - "paragraph": { - "elements": [ - { - "endIndex": 25475, - "inlineObjectElement": { - "inlineObjectId": "kix.zdnep4y812hf", - "textStyle": {} - }, - "startIndex": 25474 - }, - { - "endIndex": 25488, - "startIndex": 25475, - "textRun": { - "content": "Run the app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25474 - }, - { - "endIndex": 25802, - "paragraph": { - "elements": [ - { - "endIndex": 25497, - "startIndex": 25488, - "textRun": { - "content": "Click the", - "textStyle": {} - } - }, - { - "endIndex": 25512, - "startIndex": 25497, - "textRun": { - "content": " Privacy Policy", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 25586, - "startIndex": 25512, - "textRun": { - "content": " button to open the file in a new tab. The primary advantage of using the ", - "textStyle": {} - } - }, - { - "endIndex": 25598, - "startIndex": 25586, - "textRun": { - "content": "url_launcher", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 25606, - "startIndex": 25598, - "textRun": { - "content": " package", - "textStyle": {} - } - }, - { - "endIndex": 25674, - "startIndex": 25606, - "textRun": { - "content": " is that (after the privacy policy page is hosted), it works on web ", - "textStyle": {} - } - }, - { - "endIndex": 25677, - "startIndex": 25674, - "textRun": { - "content": "and", - "textStyle": { - "italic": true - } - } - }, - { - "endIndex": 25802, - "startIndex": 25677, - "textRun": { - "content": " mobile platforms. An additional benefit is that you can modify the hosted privacy policy page without recompiling your app.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25488 - }, - { - "endIndex": 25803, - "paragraph": { - "elements": [ - { - "endIndex": 25803, - "startIndex": 25802, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25802 - }, - { - "endIndex": 25812, - "paragraph": { - "elements": [ - { - "endIndex": 25812, - "startIndex": 25803, - "textRun": { - "content": "Clean up\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.dp7lhr3j3r0a", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 25803 - }, - { - "endIndex": 25827, - "paragraph": { - "elements": [ - { - "endIndex": 25826, - "startIndex": 25812, - "textRun": { - "content": "Duration: 2:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - }, - { - "endIndex": 25827, - "startIndex": 25826, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 25812 - }, - { - "endIndex": 25828, - "paragraph": { - "elements": [ - { - "endIndex": 25828, - "startIndex": 25827, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25827 - }, - { - "endIndex": 25887, - "paragraph": { - "elements": [ - { - "endIndex": 25887, - "startIndex": 25828, - "textRun": { - "content": "After your finish with your project, remember to clean up:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 25828 - }, - { - "endIndex": 25888, - "paragraph": { - "elements": [ - { - "endIndex": 25888, - "startIndex": 25887, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25887 - }, - { - "endIndex": 25919, - "paragraph": { - "elements": [ - { - "endIndex": 25889, - "inlineObjectElement": { - "inlineObjectId": "kix.bcv72rze17ka", - "textStyle": {} - }, - "startIndex": 25888 - }, - { - "endIndex": 25917, - "startIndex": 25889, - "textRun": { - "content": "Delete your firebase project", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://support.google.com/firebase/answer/9137886" - }, - "underline": true - } - } - }, - { - "endIndex": 25918, - "startIndex": 25917, - "textRun": { - "content": ".", - "textStyle": {} - } - }, - { - "endIndex": 25919, - "startIndex": 25918, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25888 - }, - { - "endIndex": 25920, - "paragraph": { - "elements": [ - { - "endIndex": 25920, - "startIndex": 25919, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 25919 - }, - { - "endIndex": 25937, - "paragraph": { - "elements": [ - { - "endIndex": 25937, - "startIndex": 25920, - "textRun": { - "content": "Congratulations!\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.s22qmcj4zu61", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 25920 - }, - { - "endIndex": 25952, - "paragraph": { - "elements": [ - { - "endIndex": 25951, - "startIndex": 25937, - "textRun": { - "content": "Duration: 0:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - } - } - } - }, - { - "endIndex": 25952, - "startIndex": 25951, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 25937 - }, - { - "endIndex": 25953, - "paragraph": { - "elements": [ - { - "endIndex": 25953, - "startIndex": 25952, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 25952 - }, - { - "endIndex": 26156, - "paragraph": { - "elements": [ - { - "endIndex": 26156, - "startIndex": 25953, - "textRun": { - "content": "Congratulations, you successfully completed the GitHub Star Counter app! You also got a small taste of Dart DevTools, which you can use to debug and profile all Dart and Flutter apps, not just web apps.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 25953 - }, - { - "endIndex": 26157, - "paragraph": { - "elements": [ - { - "endIndex": 26157, - "startIndex": 26156, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 26156 - }, - { - "endIndex": 26170, - "paragraph": { - "elements": [ - { - "endIndex": 26169, - "startIndex": 26157, - "textRun": { - "content": "What’s next?", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 26170, - "startIndex": 26169, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.9mqifffit2ew", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 26157 - }, - { - "endIndex": 26209, - "paragraph": { - "bullet": { - "listId": "kix.5rjzqb2i1eeb", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 26191, - "startIndex": 26170, - "textRun": { - "content": "Try one of the other ", - "textStyle": {} - } - }, - { - "endIndex": 26207, - "startIndex": 26191, - "textRun": { - "content": "Flutter codelabs", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/codelabs" - }, - "underline": true - } - } - }, - { - "endIndex": 26209, - "startIndex": 26207, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26170 - }, - { - "endIndex": 26254, - "paragraph": { - "bullet": { - "listId": "kix.5rjzqb2i1eeb", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 26239, - "startIndex": 26209, - "textRun": { - "content": "Learn more about the power of ", - "textStyle": {} - } - }, - { - "endIndex": 26252, - "startIndex": 26239, - "textRun": { - "content": "Dart Devtools", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/development/tools/devtools/overview" - }, - "underline": true - } - } - }, - { - "endIndex": 26254, - "startIndex": 26252, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26209 - }, - { - "endIndex": 26255, - "paragraph": { - "elements": [ - { - "endIndex": 26255, - "startIndex": 26254, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 26254 - }, - { - "endIndex": 26288, - "paragraph": { - "elements": [ - { - "endIndex": 26288, - "startIndex": 26255, - "textRun": { - "content": "Continue learning about Flutter:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "NEVER_COLLAPSE" - } - }, - "startIndex": 26255 - }, - { - "endIndex": 26348, - "paragraph": { - "bullet": { - "listId": "kix.dwne8gt007xc", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 26299, - "startIndex": 26288, - "textRun": { - "content": "flutter.dev", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev" - }, - "underline": true - } - } - }, - { - "endIndex": 26348, - "startIndex": 26299, - "textRun": { - "content": ": The documentation site for the Flutter project\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26288 - }, - { - "endIndex": 26369, - "paragraph": { - "bullet": { - "listId": "kix.dwne8gt007xc", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 26352, - "startIndex": 26348, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 26368, - "startIndex": 26352, - "textRun": { - "content": "Flutter Cookbook", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/cookbook" - }, - "underline": true - } - } - }, - { - "endIndex": 26369, - "startIndex": 26368, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26348 - }, - { - "endIndex": 26409, - "paragraph": { - "bullet": { - "listId": "kix.dwne8gt007xc", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 26373, - "startIndex": 26369, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 26394, - "startIndex": 26373, - "textRun": { - "content": "Flutter API reference", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://api.flutter.dev/index.html" - }, - "underline": true - } - } - }, - { - "endIndex": 26409, - "startIndex": 26394, - "textRun": { - "content": " documentation\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26369 - }, - { - "endIndex": 26458, - "paragraph": { - "bullet": { - "listId": "kix.dwne8gt007xc", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 26420, - "startIndex": 26409, - "textRun": { - "content": "Additional ", - "textStyle": {} - } - }, - { - "endIndex": 26439, - "startIndex": 26420, - "textRun": { - "content": "Flutter sample apps", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.github.io/samples/#" - }, - "underline": true - } - } - }, - { - "endIndex": 26457, - "startIndex": 26439, - "textRun": { - "content": ", with source code", - "textStyle": {} - } - }, - { - "endIndex": 26458, - "startIndex": 26457, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.30980393, - "green": 0.65882355, - "red": 0.41568628 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26409 - }, - { - "endIndex": 26459, - "paragraph": { - "elements": [ - { - "endIndex": 26459, - "startIndex": 26458, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 26458 - } - ] - }, - "documentId": "1Y099kkeEUvi3FRbE6a0pjZkkBzMHmraX3Q33zCC5uJM", - "documentStyle": { - "background": { - "color": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - } - }, - "defaultHeaderId": "kix.srbymyotmcnx", - "marginBottom": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72.0, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792.0, - "unit": "PT" - }, - "width": { - "magnitude": 612.0, - "unit": "PT" - } - }, - "useCustomHeaderFooterMargins": true - }, - "headers": { - "kix.srbymyotmcnx": { - "content": [ - { - "endIndex": 1, - "paragraph": { - "elements": [ - { - "endIndex": 1, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - } - } - ], - "headerId": "kix.srbymyotmcnx" - } - }, - "inlineObjects": { - "kix.14d3j8txqua8": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.14d3j8txqua8" - }, - "kix.1p0qrx9bdm40": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.1p0qrx9bdm40" - }, - "kix.2e5vd1oegigq": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.2e5vd1oegigq" - }, - "kix.2lhj08hjulna": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.2lhj08hjulna" - }, - "kix.2vha33hxrbat": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.2vha33hxrbat" - }, - "kix.3klsnm9z68sn": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.3klsnm9z68sn" - }, - "kix.486ave73ctsl": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.486ave73ctsl" - }, - "kix.4rmo0vhogzh4": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.4rmo0vhogzh4" - }, - "kix.5db3m9m2wsxz": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 18.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.5db3m9m2wsxz" - }, - "kix.61wjzryati9j": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.61wjzryati9j" - }, - "kix.6l7crdsfdy3x": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.6l7crdsfdy3x" - }, - "kix.6yygs4bfvvqc": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.625, - "unit": "PT" - } - } - } - }, - "objectId": "kix.6yygs4bfvvqc" - }, - "kix.7y6k49xkw61s": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.7y6k49xkw61s" - }, - "kix.905l4wv25igv": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.905l4wv25igv" - }, - "kix.bcv72rze17ka": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.625, - "unit": "PT" - } - } - } - }, - "objectId": "kix.bcv72rze17ka" - }, - "kix.cnwl556irrz2": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.cnwl556irrz2" - }, - "kix.d3qbsr13ierz": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.d3qbsr13ierz" - }, - "kix.exhi8in1q0vl": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.exhi8in1q0vl" - }, - "kix.flx8r0d8dr2j": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.flx8r0d8dr2j" - }, - "kix.gpsty19g7y9": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/BAy4ec18qf9YTfnfdiCrM6feYpM98CT6HupyX6j0B4Y07icUlyKqIm_WkgJ9xSwg7TRPhDXCxeYbfdbHc2hqNVXpv4AGbPNIr5b7Tw2o9ZjKysXjRw-dgROYZ7U0DYc1l0TshaC5WCsFDk7a5-f7oLI4Nk35qqTn1NKayFZHGBaknWj8OUiDl4kCqlCV4GnlZrBghUlO9pNDaHy1YktZz0d1XLuOw9uDYPg4kvNUWhDCZg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 325.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.gpsty19g7y9" - }, - "kix.id8ngxw4itan": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/ZlQWIqu1obGmE6LPGYU5pjgdnTKDKKJ6_era_r31xvX2LUsPHjE12YI_vYydMRGkIZgKwyxq_pnT5oMROSbqHZ7FPQBK9aFgcv9kRupCnEjGXKvZUVdmKCnJLtUOaZmb_5TPtc0Zz2xVXb9wrbGcR6chUfWRg28zg35QQP-YPAI2v2h_SXe7KBJq_thNUoBTZ9cXpf6cSa25kKKtwFBYzu8PUPIQiIsesIRxD54IZ5FnsA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 282.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.id8ngxw4itan" - }, - "kix.ihxd3eo3cl5p": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ihxd3eo3cl5p" - }, - "kix.iiekv1azpgfs": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/Nm40tqxyBdgpjsvi2tv_wCoQvSU1NS0001n17AQ1yyKBmE5_yEEhjvVCXC3KEf6CzeHrwZ0UM7QpknbcIQGayhYvyoy6onENaSC0dMUzJHkuJfo7_JGoV9S6NGGE1ymopKXleMGKLQkpoYQZkGysZzufKxi-OwTwbVvC1hMJqiyDpl81UHupyKmLAN6CNo1wmGxsUbIfXcwVTZq9simlfw8JmnGkRpguXN28KsUi-gZoaw", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 344.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.iiekv1azpgfs" - }, - "kix.im7tb31r3srk": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/JWguFuthNVbuWSgfxHKUrsaB4aYUh9QF0m76SrWeY362qUqpvr5G620_vl5fwIwhIIIuqNlJoVACdBN0AYUkIlIHugRGNATmy1gHwavXAYW5_epieUtaWw8cHJ-Rph_S2Y23Q2sujWaCWX2k7j_fRDj_PxAI6RWb16Xqj7qYUoPGeNhf0sMs2EVl4aWmUHTyiJOm2yLz3tRrqB4lN45lVtgkdi1_7lsWP86QIlMelg5QDA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 15.75, - "unit": "PT" - } - } - } - }, - "objectId": "kix.im7tb31r3srk" - }, - "kix.itqz39i383il": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/ry3i_1Bp8oNLGfMhcM0AVNeEOzL1obD3LVGng5bdZTCGj8eGszxkdCxOzZ3PwBHiED9c4fFo8HSkRUeeHSWZVZYnov7Dp0eAN7yaIH5Raq45VHNin7Cu17QduqpPwq8wwE1bMxmktgOMJSn0RKpGQ-CE0simtDEGa9XOqnk4NSzeLnhGZPAsoWE2mgg432Onn-vzoKiyDDXx8-kZJAAqBiUyIC1iprTyqQzreq1lioOZnQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 178.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.itqz39i383il" - }, - "kix.jqpd88xm4i34": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.jqpd88xm4i34" - }, - "kix.l68j68myhkq0": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/TxfG1PSDYqXOsIGWlv7kSFhVD9k9lP6Jvv4j2S1U23zqsjblOpFFSZrrPI6Xs3flV2Vp_AEs2jQTi7JcfDGvZFJRmkc0xC26S5PJ_ea8hiKeB8mcDHf2VkDezaB5yg52vy-gtfqzBccYKBxgH_z8Uj8vKCYHnTwg41C-FP1yza1YnnI5rriD4Q60I3HMXUNS3zADrEfwKFMbLIlzN8lco73QE0jomD-uiaexMNO8nIFBdg", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.500000000000002, - "unit": "PT" - }, - "width": { - "magnitude": 15.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.l68j68myhkq0" - }, - "kix.la124mwnolks": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.la124mwnolks" - }, - "kix.n528il6a8xqw": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/4Jg_UoZCpKGye6FsIquSixc7fXjaIokpjyn2G9Gt7tHcM7I3kXFyjVHfsGggyURb1UB0jH_uuSr2B-pvOl4XUJQHaCcbgC95hW9Pefg3PTMfjbtHM0PGQHflRzBx1UMwZlBFbK7fwJZ8LaVucGp-TK5XwV6QrK8xn5dFqs43Fb4IbmuY7BePDkP7fw3sHKGc0A4BOTY_xpBczBzLlCI69pVm8mQfFNj3nwLsZ8FUU-gHsA", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 325.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.n528il6a8xqw" - }, - "kix.ncw20rpxdw0b": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ncw20rpxdw0b" - }, - "kix.oan8p0k9bqo4": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/OLnUi9uoF3Dh6mcsJ_YH2_Co87p86L8vpZteTVoKIYRU2G_7K5qldORSZxpx1ngmLs8fGK7nWiIk5r-TvGNAg1wBCmhJnPy-U2x5ZxhNd8LEHq9O5JFBoxn8m9BEXlpq-6UxIiwcSGWKgKmHZtZnN8XyoL5L9U7PyFUWCMm2A-dTOUhjqkqgsT0FQsg4gvRtd9UpzqxwSpRY901ttwnYnvAjpdBOsc745OvDx7AK-ecyIw", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 325.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.oan8p0k9bqo4" - }, - "kix.ov85hoi1tzln": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ov85hoi1tzln" - }, - "kix.p76r74f2stm5": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.p76r74f2stm5" - }, - "kix.prp9q1hi2jky": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.prp9q1hi2jky" - }, - "kix.prx7fpu8fm7s": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.prx7fpu8fm7s" - }, - "kix.q6ezslfpncxw": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.q6ezslfpncxw" - }, - "kix.qkuo9zsi1plx": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/dj9YAmouWS6msS0mJSdyfqysT1U0xMdNo-YK1aALsDyFKegzjzxL7SHpNdeQiN_k24XmDm2VATiWyogSGpqFq6DDLZ1D60J1XNVwxmEV9C9D9qD821T2LN_GNwuDfSAFyMCACiQcUOEUvzp4G7IzzVgjmlOrML-Bv8aVylbABLNu0TBoNdX3sBTX9MC4yW523Dm1yFGv0Cn_jTQjThoigR8bJSlGz8BHVc1EiZX_PnCoPw", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qkuo9zsi1plx" - }, - "kix.qlezbs828lvb": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/wohtQbGCpDzpyLu867WMC9jr06FRk3Y_61ZAGzjFhEf9KJuSQL43m0PL6WPHKEczt2adUmLI9xg3QQSn6ECJz3UmF0o-Dwnc6y2Zk91BiRbRx1YTx_aOcOk1ioTh49BBwwabChumTf-Y4lFV-SWuI78KqFnplF2qqnCPk3BIX7M7dh0Swsvt_3t7dzXzfMJDDJPu8Z_CuXEXkT9OR1SVA7vcNfLvYVh99pO9bwZ_FeSKnw", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 344.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qlezbs828lvb" - }, - "kix.qqm23wx09aaq": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.qqm23wx09aaq" - }, - "kix.r2xooln1ehwq": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.r2xooln1ehwq" - }, - "kix.twxjmoc118hg": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.twxjmoc118hg" - }, - "kix.u4jxxcyu253f": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.u4jxxcyu253f" - }, - "kix.v1fhcj94h66k": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/dj9YAmouWS6msS0mJSdyfqysT1U0xMdNo-YK1aALsDyFKegzjzxL7SHpNdeQiN_k24XmDm2VATiWyogSGpqFq6DDLZ1D60J1XNVwxmEV9C9D9qD821T2LN_GNwuDfSAFyMCACiQcUOEUvzp4G7IzzVgjmlOrML-Bv8aVylbABLNu0TBoNdX3sBTX9MC4yW523Dm1yFGv0Cn_jTQjThoigR8bJSlGz8BHVc1EiZX_PnCoPw", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 15.0, - "unit": "PT" - }, - "width": { - "magnitude": 20.25, - "unit": "PT" - } - } - } - }, - "objectId": "kix.v1fhcj94h66k" - }, - "kix.vgd17uvaq3je": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.vgd17uvaq3je" - }, - "kix.vjkt6v1dxl7n": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.vjkt6v1dxl7n" - }, - "kix.yt7q6gvt4jq8": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.625, - "unit": "PT" - } - } - } - }, - "objectId": "kix.yt7q6gvt4jq8" - }, - "kix.zdnep4y812hf": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.625, - "unit": "PT" - } - } - } - }, - "objectId": "kix.zdnep4y812hf" - }, - "kix.zi6frmaw30ee": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/txpOvAQOgCmGoFew8uoNTQ1xFVZgEkmmbfc68kzF2R4_P0EdVYGWbEPF8s8JKEChhqAz1HH5mht3d-k8ebar3Tuzp5buX6IokoQBXGRb_qwZAfOGGIn0CLWq2S6IDmRUSjxVpVQIzUl8Py5VyQQjb7S1Z5TgISKNXZsOTKNDGAQmwTRV7n5SHqR3Dp-zLfPjqPQy_yCUMoU1SpBmy9rZP4CGhOGUK-OA-CaqL5h5hpqZrQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 18.0, - "unit": "PT" - }, - "width": { - "magnitude": 17.796897768974304, - "unit": "PT" - } - } - } - }, - "objectId": "kix.zi6frmaw30ee" - } - }, - "lists": { - "kix.15okzfqxl6s1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.22wvuhye0m1y": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "✓", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.30980393, - "green": 0.65882355, - "red": 0.41568628 - } - } - }, - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2dmkaxsauiyk": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.39on5ol0dm32": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3ct1zdwuthfj": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3edx48dmu9mk": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5rjzqb2i1eeb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.78y1n2lze6li": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.914vtheqpxhc": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9epdyhq1em8x": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9kjysrz52yes": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ai8bu9ufnwbc": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.allzalpefm2o": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ap5zctzdpoed": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.c0iuz2cn2ibx": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.c2z0d9oytjgn": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.dwne8gt007xc": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.epgp5tud8j7l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g0uc1tjsv82r": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l040osctr5sd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.lb2dy4ma2es8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ovmu53cxpb3i": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.p76lagvjeokf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rbv433e0ib2q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.seybpammi2pq": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tchx4m9yp6aq": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ukp739wstv7d": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.uz1urpwt6nk8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.yj3c88448q6t": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 20.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 20.0, - "unit": "PT" - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 18.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 16.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 14.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2627451, - "green": 0.2627451, - "red": 0.2627451 - } - } - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 14.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 12.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 3.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 26.0, - "unit": "PT" - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 16.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 15.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - ] - }, - "revisionId": "ANeT5PTXLHKXG1lAJj3yhkAn7dZDQ5Ww_UfYpplXpHEKB1Dl9h-ydCCMTbOf65VfEG5vUbdl8cPdiABSertiiA", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "title": "Using a plugin with a Flutter web app" -} \ No newline at end of file diff --git a/tooling/claat_export_images/test/data/exports/1ihOxu-DK3SBrUYyppRtzKvfwceSIzk4ZWzP9F6nRtnw.json b/tooling/claat_export_images/test/data/exports/1ihOxu-DK3SBrUYyppRtzKvfwceSIzk4ZWzP9F6nRtnw.json deleted file mode 100644 index 44b4dbc680..0000000000 --- a/tooling/claat_export_images/test/data/exports/1ihOxu-DK3SBrUYyppRtzKvfwceSIzk4ZWzP9F6nRtnw.json +++ /dev/null @@ -1,86861 +0,0 @@ -{ - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 31, - "paragraph": { - "elements": [ - { - "endIndex": 30, - "startIndex": 1, - "textRun": { - "content": "Using FFI in a Flutter plugin", - "textStyle": {} - } - }, - { - "endIndex": 31, - "startIndex": 30, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 14.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7sa4zxkhmsum", - "namedStyleType": "TITLE", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1 - }, - { - "endIndex": 32, - "paragraph": { - "elements": [ - { - "endIndex": 32, - "startIndex": 31, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 31 - }, - { - "endIndex": 415, - "startIndex": 32, - "table": { - "columns": 2, - "rows": 9, - "tableRows": [ - { - "endIndex": 185, - "startIndex": 33, - "tableCells": [ - { - "content": [ - { - "endIndex": 43, - "paragraph": { - "elements": [ - { - "endIndex": 43, - "startIndex": 35, - "textRun": { - "content": "Summary\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35 - } - ], - "endIndex": 43, - "startIndex": 34, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 185, - "paragraph": { - "elements": [ - { - "endIndex": 185, - "startIndex": 44, - "textRun": { - "content": "In this codelab, you’ll build a Flutter plugin for both mobile and desktop platforms using FFI to make use of an existing native C library.\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 44 - } - ], - "endIndex": 185, - "startIndex": 43, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 216, - "startIndex": 185, - "tableCells": [ - { - "content": [ - { - "endIndex": 191, - "paragraph": { - "elements": [ - { - "endIndex": 191, - "startIndex": 187, - "textRun": { - "content": "URL\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 187 - } - ], - "endIndex": 191, - "startIndex": 186, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 216, - "paragraph": { - "elements": [ - { - "endIndex": 216, - "startIndex": 192, - "textRun": { - "content": "codelabs/flutter-ffigen\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 192 - } - ], - "endIndex": 216, - "startIndex": 191, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 236, - "startIndex": 216, - "tableCells": [ - { - "content": [ - { - "endIndex": 227, - "paragraph": { - "elements": [ - { - "endIndex": 227, - "startIndex": 218, - "textRun": { - "content": "Category\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 218 - } - ], - "endIndex": 227, - "startIndex": 217, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 236, - "paragraph": { - "elements": [ - { - "endIndex": 236, - "startIndex": 228, - "textRun": { - "content": "Flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 228 - } - ], - "endIndex": 236, - "startIndex": 227, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 255, - "startIndex": 236, - "tableCells": [ - { - "content": [ - { - "endIndex": 250, - "paragraph": { - "elements": [ - { - "endIndex": 250, - "startIndex": 238, - "textRun": { - "content": "Environment\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 238 - } - ], - "endIndex": 250, - "startIndex": 237, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 255, - "paragraph": { - "elements": [ - { - "endIndex": 255, - "startIndex": 251, - "textRun": { - "content": "Web\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 251 - } - ], - "endIndex": 255, - "startIndex": 250, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 271, - "startIndex": 255, - "tableCells": [ - { - "content": [ - { - "endIndex": 264, - "paragraph": { - "elements": [ - { - "endIndex": 264, - "startIndex": 257, - "textRun": { - "content": "Status\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 257 - } - ], - "endIndex": 264, - "startIndex": 256, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 271, - "paragraph": { - "elements": [ - { - "endIndex": 271, - "startIndex": 265, - "textRun": { - "content": "Draft\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 265 - } - ], - "endIndex": 271, - "startIndex": 264, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 330, - "startIndex": 271, - "tableCells": [ - { - "content": [ - { - "endIndex": 287, - "paragraph": { - "elements": [ - { - "endIndex": 287, - "startIndex": 273, - "textRun": { - "content": "Feedback Link\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 273 - } - ], - "endIndex": 287, - "startIndex": 272, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 330, - "paragraph": { - "elements": [ - { - "endIndex": 330, - "startIndex": 288, - "textRun": { - "content": "https://github.com/flutter/flutter/issues\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 288 - } - ], - "endIndex": 330, - "startIndex": 287, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 365, - "startIndex": 330, - "tableCells": [ - { - "content": [ - { - "endIndex": 339, - "paragraph": { - "elements": [ - { - "endIndex": 339, - "startIndex": 332, - "textRun": { - "content": "Author\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 332 - } - ], - "endIndex": 339, - "startIndex": 331, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 365, - "paragraph": { - "elements": [ - { - "endIndex": 365, - "startIndex": 340, - "textRun": { - "content": "Brett Morgan, Maksim Lin\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 340 - } - ], - "endIndex": 365, - "startIndex": 339, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 392, - "startIndex": 365, - "tableCells": [ - { - "content": [ - { - "endIndex": 379, - "paragraph": { - "elements": [ - { - "endIndex": 379, - "startIndex": 367, - "textRun": { - "content": "Author LDAP\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 367 - } - ], - "endIndex": 379, - "startIndex": 366, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 392, - "paragraph": { - "elements": [ - { - "endIndex": 392, - "startIndex": 380, - "textRun": { - "content": "brettmorgan\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 380 - } - ], - "endIndex": 392, - "startIndex": 379, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 414, - "startIndex": 392, - "tableCells": [ - { - "content": [ - { - "endIndex": 412, - "paragraph": { - "elements": [ - { - "endIndex": 412, - "startIndex": 394, - "textRun": { - "content": "Analytics Account\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 394 - } - ], - "endIndex": 412, - "startIndex": 393, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 414, - "paragraph": { - "elements": [ - { - "endIndex": 414, - "startIndex": 413, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 413 - } - ], - "endIndex": 414, - "startIndex": 412, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "width": { - "magnitude": 101.25, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - }, - { - "width": { - "magnitude": 366.75, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - } - ] - } - } - }, - { - "endIndex": 416, - "paragraph": { - "elements": [ - { - "endIndex": 416, - "startIndex": 415, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 415 - }, - { - "endIndex": 417, - "paragraph": { - "elements": [ - { - "endIndex": 417, - "startIndex": 416, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 416 - }, - { - "endIndex": 418, - "paragraph": { - "elements": [ - { - "endIndex": 418, - "startIndex": 417, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 417 - }, - { - "endIndex": 1321, - "startIndex": 418, - "tableOfContents": { - "content": [ - { - "endIndex": 434, - "paragraph": { - "elements": [ - { - "endIndex": 433, - "startIndex": 419, - "textRun": { - "content": "Introduction\t2", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": true, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.ok7k5uux6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 434, - "startIndex": 433, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "link": { - "headingId": "h.ok7k5uux6" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 419 - }, - { - "endIndex": 454, - "paragraph": { - "elements": [ - { - "endIndex": 453, - "startIndex": 434, - "textRun": { - "content": "What you’ll build\t2", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.21yzqg98x7h6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 454, - "startIndex": 453, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.21yzqg98x7h6" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 434 - }, - { - "endIndex": 474, - "paragraph": { - "elements": [ - { - "endIndex": 473, - "startIndex": 454, - "textRun": { - "content": "What you’ll learn\t3", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.hs6hf8vnv2d6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 474, - "startIndex": 473, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.hs6hf8vnv2d6" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 454 - }, - { - "endIndex": 493, - "paragraph": { - "elements": [ - { - "endIndex": 492, - "startIndex": 474, - "textRun": { - "content": "What you’ll need\t4", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.319h1e1sjzdz" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 493, - "startIndex": 492, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.319h1e1sjzdz" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 474 - }, - { - "endIndex": 511, - "paragraph": { - "elements": [ - { - "endIndex": 510, - "startIndex": 493, - "textRun": { - "content": "Getting started\t4", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": true, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.bwo0af2iwk90" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 511, - "startIndex": 510, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "link": { - "headingId": "h.bwo0af2iwk90" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 493 - }, - { - "endIndex": 542, - "paragraph": { - "elements": [ - { - "endIndex": 541, - "startIndex": 511, - "textRun": { - "content": "Generate the plugin template\t5", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": true, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.jdmzwkcs72o" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 542, - "startIndex": 541, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "link": { - "headingId": "h.jdmzwkcs72o" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 511 - }, - { - "endIndex": 592, - "paragraph": { - "elements": [ - { - "endIndex": 591, - "startIndex": 542, - "textRun": { - "content": "Getting started with Flutter plugin development\t5", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.h5jmoth8q3vi" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 592, - "startIndex": 591, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.h5jmoth8q3vi" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 542 - }, - { - "endIndex": 620, - "paragraph": { - "elements": [ - { - "endIndex": 619, - "startIndex": 592, - "textRun": { - "content": "Build and run the example\t7", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": true, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.ot43tirxvs6w" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 620, - "startIndex": 619, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "link": { - "headingId": "h.ot43tirxvs6w" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 592 - }, - { - "endIndex": 630, - "paragraph": { - "elements": [ - { - "endIndex": 629, - "startIndex": 620, - "textRun": { - "content": "Windows\t7", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.ibr0py13rvdx" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 630, - "startIndex": 629, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.ibr0py13rvdx" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 620 - }, - { - "endIndex": 638, - "paragraph": { - "elements": [ - { - "endIndex": 637, - "startIndex": 630, - "textRun": { - "content": "Linux\t8", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.58bl65ten0xh" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 638, - "startIndex": 637, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.58bl65ten0xh" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 630 - }, - { - "endIndex": 649, - "paragraph": { - "elements": [ - { - "endIndex": 648, - "startIndex": 638, - "textRun": { - "content": "Android\t10", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.38tflxafd5oo" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 649, - "startIndex": 648, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.38tflxafd5oo" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 638 - }, - { - "endIndex": 666, - "paragraph": { - "elements": [ - { - "endIndex": 665, - "startIndex": 649, - "textRun": { - "content": "macOS and iOS\t12", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.mvc8qh7ok0mn" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 666, - "startIndex": 665, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.mvc8qh7ok0mn" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 649 - }, - { - "endIndex": 713, - "paragraph": { - "elements": [ - { - "endIndex": 712, - "startIndex": 666, - "textRun": { - "content": "Using Duktape on Windows, Linux and Android\t17", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": true, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.cxlajbi5c0gt" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 713, - "startIndex": 712, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "link": { - "headingId": "h.cxlajbi5c0gt" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 666 - }, - { - "endIndex": 735, - "paragraph": { - "elements": [ - { - "endIndex": 734, - "startIndex": 713, - "textRun": { - "content": "Retrieving Duktape\t17", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.3gjsb7bsa2ua" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 735, - "startIndex": 734, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.3gjsb7bsa2ua" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 713 - }, - { - "endIndex": 754, - "paragraph": { - "elements": [ - { - "endIndex": 753, - "startIndex": 735, - "textRun": { - "content": "Installing LLVM\t19", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.denvsm5fj2dh" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 754, - "startIndex": 753, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.denvsm5fj2dh" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 735 - }, - { - "endIndex": 776, - "paragraph": { - "elements": [ - { - "endIndex": 775, - "startIndex": 754, - "textRun": { - "content": "Configuring ffigen\t20", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.g2fuqh54soj9" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 776, - "startIndex": 775, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.g2fuqh54soj9" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 754 - }, - { - "endIndex": 791, - "paragraph": { - "elements": [ - { - "endIndex": 790, - "startIndex": 776, - "textRun": { - "content": "ffigen.yaml\t21", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.44ekcwgq5esg" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 791, - "startIndex": 790, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.44ekcwgq5esg" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 776 - }, - { - "endIndex": 812, - "paragraph": { - "elements": [ - { - "endIndex": 811, - "startIndex": 791, - "textRun": { - "content": "Configuring CMake\t22", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.3qzynwujl6uj" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 812, - "startIndex": 811, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.3qzynwujl6uj" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 791 - }, - { - "endIndex": 834, - "paragraph": { - "elements": [ - { - "endIndex": 833, - "startIndex": 812, - "textRun": { - "content": "src/CMakeLists.txt\t22", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.87ers97zlebw" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 834, - "startIndex": 833, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.87ers97zlebw" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 812 - }, - { - "endIndex": 857, - "paragraph": { - "elements": [ - { - "endIndex": 856, - "startIndex": 834, - "textRun": { - "content": "lib/ffigen_app.dart\t23", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.qym0awkkkxpc" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 857, - "startIndex": 856, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.qym0awkkkxpc" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 834 - }, - { - "endIndex": 882, - "paragraph": { - "elements": [ - { - "endIndex": 881, - "startIndex": 857, - "textRun": { - "content": "example/lib/main.dart\t25", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.1wuwi2dol5z8" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 882, - "startIndex": 881, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.1wuwi2dol5z8" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 857 - }, - { - "endIndex": 893, - "paragraph": { - "elements": [ - { - "endIndex": 892, - "startIndex": 882, - "textRun": { - "content": "Android\t27", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.tkfrnhfqutrh" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 893, - "startIndex": 892, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.tkfrnhfqutrh" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 882 - }, - { - "endIndex": 927, - "paragraph": { - "elements": [ - { - "endIndex": 926, - "startIndex": 893, - "textRun": { - "content": "Using Duktape on macOS and iOS\t28", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": true, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.j1j5a91z8r17" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 927, - "startIndex": 926, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "link": { - "headingId": "h.j1j5a91z8r17" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 893 - }, - { - "endIndex": 942, - "paragraph": { - "elements": [ - { - "endIndex": 941, - "startIndex": 927, - "textRun": { - "content": "Cleaning Up\t29", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.mudsw5qtg8je" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 942, - "startIndex": 941, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.mudsw5qtg8je" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 927 - }, - { - "endIndex": 951, - "paragraph": { - "elements": [ - { - "endIndex": 950, - "startIndex": 942, - "textRun": { - "content": "macOS\t29", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.cvbstewmkrft" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 951, - "startIndex": 950, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.cvbstewmkrft" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 942 - }, - { - "endIndex": 978, - "paragraph": { - "elements": [ - { - "endIndex": 977, - "startIndex": 951, - "textRun": { - "content": "macos/Classes/duktape.c\t29", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.m5a901tzoxz8" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 978, - "startIndex": 977, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.m5a901tzoxz8" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 951 - }, - { - "endIndex": 985, - "paragraph": { - "elements": [ - { - "endIndex": 984, - "startIndex": 978, - "textRun": { - "content": "iOS\t30", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.736vhp3kbrab" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 985, - "startIndex": 984, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.736vhp3kbrab" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 978 - }, - { - "endIndex": 1010, - "paragraph": { - "elements": [ - { - "endIndex": 1009, - "startIndex": 985, - "textRun": { - "content": "ios/Classes/duktape.c\t30", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.zcvbjkk81pus" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1010, - "startIndex": 1009, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.zcvbjkk81pus" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 985 - }, - { - "endIndex": 1048, - "paragraph": { - "elements": [ - { - "endIndex": 1047, - "startIndex": 1010, - "textRun": { - "content": "Implement the Read Eval Print Loop\t31", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": true, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.wbrvbmbwmw3w" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1048, - "startIndex": 1047, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "link": { - "headingId": "h.wbrvbmbwmw3w" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 1010 - }, - { - "endIndex": 1082, - "paragraph": { - "elements": [ - { - "endIndex": 1081, - "startIndex": 1048, - "textRun": { - "content": "Making things production ready\t32", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.w9eudoi4fgk0" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1082, - "startIndex": 1081, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.w9eudoi4fgk0" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 1048 - }, - { - "endIndex": 1105, - "paragraph": { - "elements": [ - { - "endIndex": 1104, - "startIndex": 1082, - "textRun": { - "content": "lib/ffigen_app.dart\t32", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.u3704r30mqc" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1105, - "startIndex": 1104, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.u3704r30mqc" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 1082 - }, - { - "endIndex": 1124, - "paragraph": { - "elements": [ - { - "endIndex": 1123, - "startIndex": 1105, - "textRun": { - "content": "Adding packages\t34", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.efv6xmx1ee6l" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1124, - "startIndex": 1123, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.efv6xmx1ee6l" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 1105 - }, - { - "endIndex": 1160, - "paragraph": { - "elements": [ - { - "endIndex": 1159, - "startIndex": 1124, - "textRun": { - "content": "example/lib/duktape_message.dart\t35", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.tnhr4op3wzvo" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1160, - "startIndex": 1159, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.tnhr4op3wzvo" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 1124 - }, - { - "endIndex": 1210, - "paragraph": { - "elements": [ - { - "endIndex": 1209, - "startIndex": 1160, - "textRun": { - "content": "example/macos/Runner/DebugProfile.entitlements\t35", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.uhwya0z9ptr8" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1210, - "startIndex": 1209, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.uhwya0z9ptr8" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 1160 - }, - { - "endIndex": 1255, - "paragraph": { - "elements": [ - { - "endIndex": 1254, - "startIndex": 1210, - "textRun": { - "content": "example/macos/Runner/Release.entitlements\t36", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.5u8yy8o6etaz" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1255, - "startIndex": 1254, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.5u8yy8o6etaz" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 1210 - }, - { - "endIndex": 1276, - "paragraph": { - "elements": [ - { - "endIndex": 1275, - "startIndex": 1255, - "textRun": { - "content": "Building the REPL\t36", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.n7m7u2fkje11" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1276, - "startIndex": 1275, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.n7m7u2fkje11" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 1255 - }, - { - "endIndex": 1301, - "paragraph": { - "elements": [ - { - "endIndex": 1300, - "startIndex": 1276, - "textRun": { - "content": "example/lib/main.dart\t36", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.dlc5sples8mi" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1301, - "startIndex": 1300, - "textRun": { - "content": "\n", - "textStyle": { - "link": { - "headingId": "h.dlc5sples8mi" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 1276 - }, - { - "endIndex": 1320, - "paragraph": { - "elements": [ - { - "endIndex": 1319, - "startIndex": 1301, - "textRun": { - "content": "Congratulations\t42", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": true, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "link": { - "headingId": "h.s22qmcj4zu61" - }, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1320, - "startIndex": 1319, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "link": { - "headingId": "h.s22qmcj4zu61" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - }, - "tabStops": [ - { - "alignment": "END", - "offset": { - "magnitude": 600.0, - "unit": "PT" - } - } - ] - } - }, - "startIndex": 1301 - } - ] - } - }, - { - "endIndex": 1322, - "paragraph": { - "elements": [ - { - "endIndex": 1322, - "startIndex": 1321, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1321 - }, - { - "endIndex": 1323, - "paragraph": { - "elements": [ - { - "endIndex": 1323, - "startIndex": 1322, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1322 - }, - { - "endIndex": 1325, - "paragraph": { - "elements": [ - { - "endIndex": 1324, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 1323 - }, - { - "endIndex": 1325, - "startIndex": 1324, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1323 - }, - { - "endIndex": 1338, - "paragraph": { - "elements": [ - { - "endIndex": 1338, - "startIndex": 1325, - "textRun": { - "content": "Introduction\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ok7k5uux6", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1325 - }, - { - "endIndex": 1339, - "paragraph": { - "elements": [ - { - "endIndex": 1339, - "startIndex": 1338, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1338 - }, - { - "endIndex": 1618, - "paragraph": { - "elements": [ - { - "endIndex": 1346, - "startIndex": 1339, - "textRun": { - "content": "Dart's ", - "textStyle": {} - } - }, - { - "endIndex": 1378, - "startIndex": 1346, - "textRun": { - "content": "FFI (foreign function interface)", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://dart.dev/guides/libraries/c-interop" - }, - "underline": true - } - } - }, - { - "endIndex": 1402, - "startIndex": 1378, - "textRun": { - "content": " allows Flutter apps to ", - "textStyle": {} - } - }, - { - "endIndex": 1459, - "startIndex": 1402, - "textRun": { - "content": "make use of existing native libraries that expose a C API", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/development/platform-integration/android/c-interop" - }, - "underline": true - } - } - }, - { - "endIndex": 1618, - "startIndex": 1459, - "textRun": { - "content": ". Dart supports FFI on Android, iOS, Windows, macOS, and Linux. For the web, Dart supports JavaScript interop, but that subject isn’t covered in this codelab.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1339 - }, - { - "endIndex": 1636, - "paragraph": { - "elements": [ - { - "endIndex": 1636, - "startIndex": 1618, - "textRun": { - "content": "What you’ll build\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.21yzqg98x7h6", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 1618 - }, - { - "endIndex": 1637, - "paragraph": { - "elements": [ - { - "endIndex": 1637, - "startIndex": 1636, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1636 - }, - { - "endIndex": 1820, - "paragraph": { - "elements": [ - { - "endIndex": 1820, - "startIndex": 1637, - "textRun": { - "content": "In this codelab, you build a mobile and desktop plugin that uses a C library. With this API, you’ll write a simple example app that makes use of the plugin. Your plugin and app will:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1637 - }, - { - "endIndex": 1821, - "paragraph": { - "elements": [ - { - "endIndex": 1821, - "startIndex": 1820, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1820 - }, - { - "endIndex": 1883, - "paragraph": { - "bullet": { - "listId": "kix.yf8kk4f6f5pg", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 1883, - "startIndex": 1821, - "textRun": { - "content": "Import the C library source code into your new Flutter plugin\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 1821 - }, - { - "endIndex": 1965, - "paragraph": { - "bullet": { - "listId": "kix.yf8kk4f6f5pg", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 1965, - "startIndex": 1883, - "textRun": { - "content": "Customize the plugin to allow it build on Windows, macOS, Linux, Android, and iOS\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 1883 - }, - { - "endIndex": 2054, - "paragraph": { - "bullet": { - "listId": "kix.yf8kk4f6f5pg", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 2024, - "startIndex": 1965, - "textRun": { - "content": "Build an application that uses the plugin for a JavaScript ", - "textStyle": {} - } - }, - { - "endIndex": 2053, - "startIndex": 2024, - "textRun": { - "content": "REPL (read reveal print loop)", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop" - }, - "underline": true - } - } - }, - { - "endIndex": 2054, - "startIndex": 2053, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 1965 - }, - { - "endIndex": 2055, - "paragraph": { - "elements": [ - { - "endIndex": 2055, - "startIndex": 2054, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2054 - }, - { - "endIndex": 2056, - "paragraph": { - "elements": [ - { - "endIndex": 2056, - "startIndex": 2055, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2055 - }, - { - "endIndex": 2057, - "paragraph": { - "elements": [ - { - "endIndex": 2057, - "startIndex": 2056, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2056 - }, - { - "endIndex": 2059, - "paragraph": { - "elements": [ - { - "endIndex": 2058, - "inlineObjectElement": { - "inlineObjectId": "kix.kgkq7uquvg67", - "textStyle": {} - }, - "startIndex": 2057 - }, - { - "endIndex": 2059, - "startIndex": 2058, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "CENTER", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2057 - }, - { - "endIndex": 2060, - "paragraph": { - "elements": [ - { - "endIndex": 2060, - "startIndex": 2059, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2059 - }, - { - "endIndex": 2078, - "paragraph": { - "elements": [ - { - "endIndex": 2078, - "startIndex": 2060, - "textRun": { - "content": "What you’ll learn\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hs6hf8vnv2d6", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 2060 - }, - { - "endIndex": 2226, - "paragraph": { - "elements": [ - { - "endIndex": 2226, - "startIndex": 2078, - "textRun": { - "content": "In this codelab you’ll learn the practical knowledge required to build an FFI-based Flutter plugin on both desktop and mobile platforms, including:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2078 - }, - { - "endIndex": 2278, - "paragraph": { - "bullet": { - "listId": "kix.ubrus5wzbuvt", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 2239, - "startIndex": 2226, - "textRun": { - "content": "Generating a ", - "textStyle": {} - } - }, - { - "endIndex": 2247, - "startIndex": 2239, - "textRun": { - "content": "Dart FFI", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://dart.dev/guides/libraries/c-interop" - }, - "underline": true - } - } - }, - { - "endIndex": 2278, - "startIndex": 2247, - "textRun": { - "content": " based Flutter plugin template\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2226 - }, - { - "endIndex": 2344, - "paragraph": { - "bullet": { - "listId": "kix.ubrus5wzbuvt", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 2288, - "startIndex": 2278, - "textRun": { - "content": "Using the ", - "textStyle": {} - } - }, - { - "endIndex": 2294, - "startIndex": 2288, - "textRun": { - "content": "ffigen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 2344, - "startIndex": 2294, - "textRun": { - "content": " package to generate binding code for a C library\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2278 - }, - { - "endIndex": 2418, - "paragraph": { - "bullet": { - "listId": "kix.ubrus5wzbuvt", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 2386, - "startIndex": 2344, - "textRun": { - "content": "Using CMake to build a Flutter FFI plugin ", - "textStyle": {} - } - }, - { - "endIndex": 2397, - "startIndex": 2386, - "textRun": { - "content": "for Android", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/development/platform-integration/android/c-interop" - }, - "underline": true - } - } - }, - { - "endIndex": 2407, - "startIndex": 2397, - "textRun": { - "content": ", Windows,", - "textStyle": {} - } - }, - { - "endIndex": 2418, - "startIndex": 2407, - "textRun": { - "content": " and Linux\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2344 - }, - { - "endIndex": 2482, - "paragraph": { - "bullet": { - "listId": "kix.ubrus5wzbuvt", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 2482, - "startIndex": 2418, - "textRun": { - "content": "Using CocoaPods to build a Flutter FFI plugin for iOS and macOS\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2418 - }, - { - "endIndex": 2483, - "paragraph": { - "elements": [ - { - "endIndex": 2483, - "startIndex": 2482, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2482 - }, - { - "endIndex": 2500, - "paragraph": { - "elements": [ - { - "endIndex": 2500, - "startIndex": 2483, - "textRun": { - "content": "What you’ll need\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.319h1e1sjzdz", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 2483 - }, - { - "endIndex": 2552, - "paragraph": { - "bullet": { - "listId": "kix.an6zxid0uolo", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2552, - "startIndex": 2500, - "textRun": { - "content": "Android Studio 4.1 or later for Android development\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2500 - }, - { - "endIndex": 2600, - "paragraph": { - "bullet": { - "listId": "kix.an6zxid0uolo", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2600, - "startIndex": 2552, - "textRun": { - "content": "Xcode 13 or later for iOS and macOS development\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2552 - }, - { - "endIndex": 2734, - "paragraph": { - "bullet": { - "listId": "kix.an6zxid0uolo", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 2734, - "startIndex": 2600, - "textRun": { - "content": "Visual Studio 2022 or Visual Studio Build Tools 2022 with the “Desktop development with C++” workload for Windows desktop development\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2600 - }, - { - "endIndex": 2746, - "paragraph": { - "bullet": { - "listId": "kix.an6zxid0uolo", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2745, - "startIndex": 2734, - "textRun": { - "content": "Flutter SDK", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.dev/docs/get-started/install" - }, - "underline": true - } - } - }, - { - "endIndex": 2746, - "startIndex": 2745, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2734 - }, - { - "endIndex": 2860, - "paragraph": { - "bullet": { - "listId": "kix.an6zxid0uolo", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2860, - "startIndex": 2746, - "textRun": { - "content": "Any required build tools for the platforms you will be developing on (for example, CMake, CocoaPods, and so on). \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2746 - }, - { - "endIndex": 3027, - "paragraph": { - "bullet": { - "listId": "kix.an6zxid0uolo", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2908, - "startIndex": 2860, - "textRun": { - "content": "LLVM for the platforms you will be developing on", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/ffigen#installing-llvm" - }, - "underline": true - } - } - }, - { - "endIndex": 2950, - "startIndex": 2908, - "textRun": { - "content": ". The LLVM compiler tool suite is used by ", - "textStyle": {} - } - }, - { - "endIndex": 2956, - "startIndex": 2950, - "textRun": { - "content": "ffigen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 3025, - "startIndex": 2956, - "textRun": { - "content": " to parse the C header file to build the FFI binding exposed in Dart.", - "textStyle": {} - } - }, - { - "endIndex": 3027, - "startIndex": 3025, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2860 - }, - { - "endIndex": 3070, - "paragraph": { - "bullet": { - "listId": "kix.an6zxid0uolo", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 3050, - "startIndex": 3027, - "textRun": { - "content": "A code editor, such as ", - "textStyle": {} - } - }, - { - "endIndex": 3068, - "startIndex": 3050, - "textRun": { - "content": "Visual Studio Code", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/get-started/editor?tab=vscode" - }, - "underline": true - } - } - }, - { - "endIndex": 3070, - "startIndex": 3068, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3027 - }, - { - "endIndex": 3071, - "paragraph": { - "elements": [ - { - "endIndex": 3071, - "startIndex": 3070, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3070 - }, - { - "endIndex": 3073, - "paragraph": { - "elements": [ - { - "endIndex": 3072, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 3071 - }, - { - "endIndex": 3073, - "startIndex": 3072, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3071 - }, - { - "endIndex": 3074, - "paragraph": { - "elements": [ - { - "endIndex": 3074, - "startIndex": 3073, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3073 - }, - { - "endIndex": 3090, - "paragraph": { - "elements": [ - { - "endIndex": 3090, - "startIndex": 3074, - "textRun": { - "content": "Getting started\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.bwo0af2iwk90", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 3074 - }, - { - "endIndex": 3091, - "paragraph": { - "elements": [ - { - "endIndex": 3091, - "startIndex": 3090, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3090 - }, - { - "endIndex": 3263, - "paragraph": { - "elements": [ - { - "endIndex": 3095, - "startIndex": 3091, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 3101, - "startIndex": 3095, - "textRun": { - "content": "ffigen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 3263, - "startIndex": 3101, - "textRun": { - "content": " tooling is a recent addition to Flutter. You can confirm that your Flutter installation is running the current stable release by running the following command. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3091 - }, - { - "endIndex": 3264, - "paragraph": { - "elements": [ - { - "endIndex": 3264, - "startIndex": 3263, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3263 - }, - { - "endIndex": 3792, - "startIndex": 3264, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 3791, - "startIndex": 3265, - "tableCells": [ - { - "content": [ - { - "endIndex": 3284, - "paragraph": { - "elements": [ - { - "endIndex": 3284, - "startIndex": 3267, - "textRun": { - "content": "$ flutter doctor\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3267 - }, - { - "endIndex": 3344, - "paragraph": { - "elements": [ - { - "endIndex": 3344, - "startIndex": 3284, - "textRun": { - "content": "Doctor summary (to see all details, run flutter doctor -v):\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3284 - }, - { - "endIndex": 3423, - "paragraph": { - "elements": [ - { - "endIndex": 3423, - "startIndex": 3344, - "textRun": { - "content": "[✓] Flutter (Channel stable, 3.3.9, on macOS 13.1 22C65 darwin-arm, locale en)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3344 - }, - { - "endIndex": 3504, - "paragraph": { - "elements": [ - { - "endIndex": 3504, - "startIndex": 3423, - "textRun": { - "content": "[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3423 - }, - { - "endIndex": 3555, - "paragraph": { - "elements": [ - { - "endIndex": 3555, - "startIndex": 3504, - "textRun": { - "content": "[✓] Xcode - develop for iOS and macOS (Xcode 14.1)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3504 - }, - { - "endIndex": 3588, - "paragraph": { - "elements": [ - { - "endIndex": 3588, - "startIndex": 3555, - "textRun": { - "content": "[✓] Chrome - develop for the web\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3555 - }, - { - "endIndex": 3624, - "paragraph": { - "elements": [ - { - "endIndex": 3624, - "startIndex": 3588, - "textRun": { - "content": "[✓] Android Studio (version 2021.2)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3588 - }, - { - "endIndex": 3679, - "paragraph": { - "elements": [ - { - "endIndex": 3679, - "startIndex": 3624, - "textRun": { - "content": "[✓] IntelliJ IDEA Community Edition (version 2022.2.2)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3624 - }, - { - "endIndex": 3708, - "paragraph": { - "elements": [ - { - "endIndex": 3708, - "startIndex": 3679, - "textRun": { - "content": "[✓] VS Code (version 1.74.0)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3679 - }, - { - "endIndex": 3743, - "paragraph": { - "elements": [ - { - "endIndex": 3743, - "startIndex": 3708, - "textRun": { - "content": "[✓] Connected device (2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3708 - }, - { - "endIndex": 3770, - "paragraph": { - "elements": [ - { - "endIndex": 3770, - "startIndex": 3743, - "textRun": { - "content": "[✓] HTTP Host Availability\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3743 - }, - { - "endIndex": 3771, - "paragraph": { - "elements": [ - { - "endIndex": 3771, - "startIndex": 3770, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3770 - }, - { - "endIndex": 3790, - "paragraph": { - "elements": [ - { - "endIndex": 3790, - "startIndex": 3771, - "textRun": { - "content": "• No issues found!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3771 - }, - { - "endIndex": 3791, - "paragraph": { - "elements": [ - { - "endIndex": 3791, - "startIndex": 3790, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3790 - } - ], - "endIndex": 3791, - "startIndex": 3266, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 22.5, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 3793, - "paragraph": { - "elements": [ - { - "endIndex": 3793, - "startIndex": 3792, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3792 - }, - { - "endIndex": 4088, - "paragraph": { - "elements": [ - { - "endIndex": 3810, - "startIndex": 3793, - "textRun": { - "content": "Confirm that the ", - "textStyle": {} - } - }, - { - "endIndex": 3824, - "startIndex": 3810, - "textRun": { - "content": "flutter doctor", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 4088, - "startIndex": 3824, - "textRun": { - "content": " output states that you are on the stable channel, and that there aren’t more recent stable Flutter releases available. If you aren’t on stable, or there are more recent releases available, run the following two commands to bring your Flutter tooling up to speed.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 3793 - }, - { - "endIndex": 4089, - "paragraph": { - "elements": [ - { - "endIndex": 4089, - "startIndex": 4088, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4088 - }, - { - "endIndex": 4090, - "paragraph": { - "elements": [ - { - "endIndex": 4090, - "startIndex": 4089, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4089 - }, - { - "endIndex": 4137, - "startIndex": 4090, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4136, - "startIndex": 4091, - "tableCells": [ - { - "content": [ - { - "endIndex": 4118, - "paragraph": { - "elements": [ - { - "endIndex": 4118, - "startIndex": 4093, - "textRun": { - "content": "$ flutter channel stable\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4093 - }, - { - "endIndex": 4136, - "paragraph": { - "elements": [ - { - "endIndex": 4136, - "startIndex": 4118, - "textRun": { - "content": "$ flutter upgrade\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4118 - } - ], - "endIndex": 4136, - "startIndex": 4092, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 22.5, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4138, - "paragraph": { - "elements": [ - { - "endIndex": 4138, - "startIndex": 4137, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4137 - }, - { - "endIndex": 4203, - "paragraph": { - "elements": [ - { - "endIndex": 4203, - "startIndex": 4138, - "textRun": { - "content": "You can run the code in this codelab using any of these devices:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4138 - }, - { - "endIndex": 4204, - "paragraph": { - "elements": [ - { - "endIndex": 4204, - "startIndex": 4203, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4203 - }, - { - "endIndex": 4282, - "paragraph": { - "bullet": { - "listId": "kix.ra2ysajgerzk", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 4282, - "startIndex": 4204, - "textRun": { - "content": "Your development computer (for desktop builds of your plugin and example app)\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4204 - }, - { - "endIndex": 4368, - "paragraph": { - "bullet": { - "listId": "kix.ra2ysajgerzk", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 4368, - "startIndex": 4282, - "textRun": { - "content": "A physical Android or iOS device connected to your computer and set to Developer mode\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4282 - }, - { - "endIndex": 4420, - "paragraph": { - "bullet": { - "listId": "kix.ra2ysajgerzk", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 4420, - "startIndex": 4368, - "textRun": { - "content": "The iOS simulator (requires installing Xcode tools)\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4368 - }, - { - "endIndex": 4476, - "paragraph": { - "bullet": { - "listId": "kix.ra2ysajgerzk", - "textStyle": { - "underline": false - } - }, - "elements": [ - { - "endIndex": 4476, - "startIndex": 4420, - "textRun": { - "content": "The Android Emulator (requires setup in Android Studio)\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4420 - }, - { - "endIndex": 4477, - "paragraph": { - "elements": [ - { - "endIndex": 4477, - "startIndex": 4476, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4476 - }, - { - "endIndex": 4479, - "paragraph": { - "elements": [ - { - "endIndex": 4478, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 4477 - }, - { - "endIndex": 4479, - "startIndex": 4478, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4477 - }, - { - "endIndex": 4508, - "paragraph": { - "elements": [ - { - "endIndex": 4507, - "startIndex": 4479, - "textRun": { - "content": "Generate the plugin template", - "textStyle": {} - } - }, - { - "endIndex": 4508, - "startIndex": 4507, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.jdmzwkcs72o", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 4479 - }, - { - "endIndex": 4556, - "paragraph": { - "elements": [ - { - "endIndex": 4555, - "startIndex": 4508, - "textRun": { - "content": "Getting started with Flutter plugin development", - "textStyle": {} - } - }, - { - "endIndex": 4556, - "startIndex": 4555, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.h5jmoth8q3vi", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 4508 - }, - { - "endIndex": 4719, - "paragraph": { - "elements": [ - { - "endIndex": 4575, - "startIndex": 4556, - "textRun": { - "content": "Flutter ships with ", - "textStyle": {} - } - }, - { - "endIndex": 4596, - "startIndex": 4575, - "textRun": { - "content": "templates for plugins", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/development/packages-and-plugins/developing-packages#plugin-ffi" - }, - "underline": true - } - } - }, - { - "endIndex": 4719, - "startIndex": 4596, - "textRun": { - "content": " that make it easy to get started. When you generate the plugin template, you can specify which language you want to use. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4556 - }, - { - "endIndex": 4720, - "paragraph": { - "elements": [ - { - "endIndex": 4720, - "startIndex": 4719, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4719 - }, - { - "endIndex": 4822, - "paragraph": { - "elements": [ - { - "endIndex": 4822, - "startIndex": 4720, - "textRun": { - "content": "Run the following command in your working directory to create your project using the plugin template:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4720 - }, - { - "endIndex": 4823, - "paragraph": { - "elements": [ - { - "endIndex": 4823, - "startIndex": 4822, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4822 - }, - { - "endIndex": 4925, - "startIndex": 4823, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4924, - "startIndex": 4824, - "tableCells": [ - { - "content": [ - { - "endIndex": 4867, - "paragraph": { - "elements": [ - { - "endIndex": 4828, - "startIndex": 4826, - "textRun": { - "content": "$ ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 4867, - "startIndex": 4828, - "textRun": { - "content": "flutter create --template=plugin_ffi \\\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4826 - }, - { - "endIndex": 4924, - "paragraph": { - "elements": [ - { - "endIndex": 4924, - "startIndex": 4867, - "textRun": { - "content": " --platforms=android,ios,linux,macos,windows ffigen_app\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4867 - } - ], - "endIndex": 4924, - "startIndex": 4825, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 22.5, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4926, - "paragraph": { - "elements": [ - { - "endIndex": 4926, - "startIndex": 4925, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4925 - }, - { - "endIndex": 5004, - "paragraph": { - "elements": [ - { - "endIndex": 4930, - "startIndex": 4926, - "textRun": { - "content": "The ", - "textStyle": {} - } - }, - { - "endIndex": 4941, - "startIndex": 4930, - "textRun": { - "content": "--platforms", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 5004, - "startIndex": 4941, - "textRun": { - "content": " parameter specifies which platforms your plugin will support.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 4926 - }, - { - "endIndex": 5005, - "paragraph": { - "elements": [ - { - "endIndex": 5005, - "startIndex": 5004, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5004 - }, - { - "endIndex": 5128, - "paragraph": { - "elements": [ - { - "endIndex": 5067, - "startIndex": 5005, - "textRun": { - "content": "You can inspect the layout of the generated project using the ", - "textStyle": {} - } - }, - { - "endIndex": 5071, - "startIndex": 5067, - "textRun": { - "content": "tree", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 5128, - "startIndex": 5071, - "textRun": { - "content": " command, or the file explorer of your operating system.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 5005 - }, - { - "endIndex": 5129, - "paragraph": { - "elements": [ - { - "endIndex": 5129, - "startIndex": 5128, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5128 - }, - { - "endIndex": 5994, - "startIndex": 5129, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 5993, - "startIndex": 5130, - "tableCells": [ - { - "content": [ - { - "endIndex": 5155, - "paragraph": { - "elements": [ - { - "endIndex": 5155, - "startIndex": 5132, - "textRun": { - "content": "$ tree -L 2 ffigen_app\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5132 - }, - { - "endIndex": 5166, - "paragraph": { - "elements": [ - { - "endIndex": 5166, - "startIndex": 5155, - "textRun": { - "content": "ffigen_app\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5155 - }, - { - "endIndex": 5183, - "paragraph": { - "elements": [ - { - "endIndex": 5183, - "startIndex": 5166, - "textRun": { - "content": "├── CHANGELOG.md\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5166 - }, - { - "endIndex": 5195, - "paragraph": { - "elements": [ - { - "endIndex": 5195, - "startIndex": 5183, - "textRun": { - "content": "├── LICENSE\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5183 - }, - { - "endIndex": 5209, - "paragraph": { - "elements": [ - { - "endIndex": 5209, - "startIndex": 5195, - "textRun": { - "content": "├── README.md\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5195 - }, - { - "endIndex": 5235, - "paragraph": { - "elements": [ - { - "endIndex": 5235, - "startIndex": 5209, - "textRun": { - "content": "├── analysis_options.yaml\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5209 - }, - { - "endIndex": 5247, - "paragraph": { - "elements": [ - { - "endIndex": 5247, - "startIndex": 5235, - "textRun": { - "content": "├── android\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5235 - }, - { - "endIndex": 5268, - "paragraph": { - "elements": [ - { - "endIndex": 5268, - "startIndex": 5247, - "textRun": { - "content": "│ ├── build.gradle\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5247 - }, - { - "endIndex": 5299, - "paragraph": { - "elements": [ - { - "endIndex": 5299, - "startIndex": 5268, - "textRun": { - "content": "│ ├── ffigen_app_android.iml\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5268 - }, - { - "endIndex": 5324, - "paragraph": { - "elements": [ - { - "endIndex": 5324, - "startIndex": 5299, - "textRun": { - "content": "│ ├── local.properties\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5299 - }, - { - "endIndex": 5348, - "paragraph": { - "elements": [ - { - "endIndex": 5348, - "startIndex": 5324, - "textRun": { - "content": "│ ├── settings.gradle\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5324 - }, - { - "endIndex": 5360, - "paragraph": { - "elements": [ - { - "endIndex": 5360, - "startIndex": 5348, - "textRun": { - "content": "│ └── src\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5348 - }, - { - "endIndex": 5372, - "paragraph": { - "elements": [ - { - "endIndex": 5372, - "startIndex": 5360, - "textRun": { - "content": "├── example\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5360 - }, - { - "endIndex": 5390, - "paragraph": { - "elements": [ - { - "endIndex": 5390, - "startIndex": 5372, - "textRun": { - "content": "│ ├── README.md\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5372 - }, - { - "endIndex": 5420, - "paragraph": { - "elements": [ - { - "endIndex": 5420, - "startIndex": 5390, - "textRun": { - "content": "│ ├── analysis_options.yaml\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5390 - }, - { - "endIndex": 5436, - "paragraph": { - "elements": [ - { - "endIndex": 5436, - "startIndex": 5420, - "textRun": { - "content": "│ ├── android\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5420 - }, - { - "endIndex": 5467, - "paragraph": { - "elements": [ - { - "endIndex": 5467, - "startIndex": 5436, - "textRun": { - "content": "│ ├── ffigen_app_example.iml\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5436 - }, - { - "endIndex": 5479, - "paragraph": { - "elements": [ - { - "endIndex": 5479, - "startIndex": 5467, - "textRun": { - "content": "│ ├── ios\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5467 - }, - { - "endIndex": 5491, - "paragraph": { - "elements": [ - { - "endIndex": 5491, - "startIndex": 5479, - "textRun": { - "content": "│ ├── lib\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5479 - }, - { - "endIndex": 5505, - "paragraph": { - "elements": [ - { - "endIndex": 5505, - "startIndex": 5491, - "textRun": { - "content": "│ ├── linux\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5491 - }, - { - "endIndex": 5519, - "paragraph": { - "elements": [ - { - "endIndex": 5519, - "startIndex": 5505, - "textRun": { - "content": "│ ├── macos\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5505 - }, - { - "endIndex": 5540, - "paragraph": { - "elements": [ - { - "endIndex": 5540, - "startIndex": 5519, - "textRun": { - "content": "│ ├── pubspec.lock\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5519 - }, - { - "endIndex": 5561, - "paragraph": { - "elements": [ - { - "endIndex": 5561, - "startIndex": 5540, - "textRun": { - "content": "│ ├── pubspec.yaml\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5540 - }, - { - "endIndex": 5577, - "paragraph": { - "elements": [ - { - "endIndex": 5577, - "startIndex": 5561, - "textRun": { - "content": "│ └── windows\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5561 - }, - { - "endIndex": 5593, - "paragraph": { - "elements": [ - { - "endIndex": 5593, - "startIndex": 5577, - "textRun": { - "content": "├── ffigen.yaml\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5577 - }, - { - "endIndex": 5612, - "paragraph": { - "elements": [ - { - "endIndex": 5612, - "startIndex": 5593, - "textRun": { - "content": "├── ffigen_app.iml\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5593 - }, - { - "endIndex": 5620, - "paragraph": { - "elements": [ - { - "endIndex": 5620, - "startIndex": 5612, - "textRun": { - "content": "├── ios\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5612 - }, - { - "endIndex": 5636, - "paragraph": { - "elements": [ - { - "endIndex": 5636, - "startIndex": 5620, - "textRun": { - "content": "│ ├── Classes\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5620 - }, - { - "endIndex": 5663, - "paragraph": { - "elements": [ - { - "endIndex": 5663, - "startIndex": 5636, - "textRun": { - "content": "│ └── ffigen_app.podspec\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5636 - }, - { - "endIndex": 5671, - "paragraph": { - "elements": [ - { - "endIndex": 5671, - "startIndex": 5663, - "textRun": { - "content": "├── lib\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5663 - }, - { - "endIndex": 5695, - "paragraph": { - "elements": [ - { - "endIndex": 5695, - "startIndex": 5671, - "textRun": { - "content": "│ ├── ffigen_app.dart\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5671 - }, - { - "endIndex": 5738, - "paragraph": { - "elements": [ - { - "endIndex": 5738, - "startIndex": 5695, - "textRun": { - "content": "│ └── ffigen_app_bindings_generated.dart\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5695 - }, - { - "endIndex": 5748, - "paragraph": { - "elements": [ - { - "endIndex": 5748, - "startIndex": 5738, - "textRun": { - "content": "├── linux\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5738 - }, - { - "endIndex": 5771, - "paragraph": { - "elements": [ - { - "endIndex": 5771, - "startIndex": 5748, - "textRun": { - "content": "│ └── CMakeLists.txt\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5748 - }, - { - "endIndex": 5781, - "paragraph": { - "elements": [ - { - "endIndex": 5781, - "startIndex": 5771, - "textRun": { - "content": "├── macos\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5771 - }, - { - "endIndex": 5797, - "paragraph": { - "elements": [ - { - "endIndex": 5797, - "startIndex": 5781, - "textRun": { - "content": "│ ├── Classes\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5781 - }, - { - "endIndex": 5824, - "paragraph": { - "elements": [ - { - "endIndex": 5824, - "startIndex": 5797, - "textRun": { - "content": "│ └── ffigen_app.podspec\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5797 - }, - { - "endIndex": 5841, - "paragraph": { - "elements": [ - { - "endIndex": 5841, - "startIndex": 5824, - "textRun": { - "content": "├── pubspec.lock\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5824 - }, - { - "endIndex": 5858, - "paragraph": { - "elements": [ - { - "endIndex": 5858, - "startIndex": 5841, - "textRun": { - "content": "├── pubspec.yaml\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5841 - }, - { - "endIndex": 5866, - "paragraph": { - "elements": [ - { - "endIndex": 5866, - "startIndex": 5858, - "textRun": { - "content": "├── src\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5858 - }, - { - "endIndex": 5889, - "paragraph": { - "elements": [ - { - "endIndex": 5889, - "startIndex": 5866, - "textRun": { - "content": "│ ├── CMakeLists.txt\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5866 - }, - { - "endIndex": 5910, - "paragraph": { - "elements": [ - { - "endIndex": 5910, - "startIndex": 5889, - "textRun": { - "content": "│ ├── ffigen_app.c\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5889 - }, - { - "endIndex": 5931, - "paragraph": { - "elements": [ - { - "endIndex": 5931, - "startIndex": 5910, - "textRun": { - "content": "│ └── ffigen_app.h\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5910 - }, - { - "endIndex": 5943, - "paragraph": { - "elements": [ - { - "endIndex": 5943, - "startIndex": 5931, - "textRun": { - "content": "└── windows\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5931 - }, - { - "endIndex": 5966, - "paragraph": { - "elements": [ - { - "endIndex": 5966, - "startIndex": 5943, - "textRun": { - "content": " └── CMakeLists.txt\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5943 - }, - { - "endIndex": 5967, - "paragraph": { - "elements": [ - { - "endIndex": 5967, - "startIndex": 5966, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5966 - }, - { - "endIndex": 5993, - "paragraph": { - "elements": [ - { - "endIndex": 5993, - "startIndex": 5967, - "textRun": { - "content": "17 directories, 26 files \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5967 - } - ], - "endIndex": 5993, - "startIndex": 5131, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "width": { - "magnitude": 468.75, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - } - ] - } - } - }, - { - "endIndex": 5995, - "paragraph": { - "elements": [ - { - "endIndex": 5995, - "startIndex": 5994, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5994 - }, - { - "endIndex": 6319, - "paragraph": { - "elements": [ - { - "endIndex": 6131, - "startIndex": 5995, - "textRun": { - "content": "It’s worth spending a moment looking at the directory structure to get a feeling for what has been created, and where it’s located. The ", - "textStyle": {} - } - }, - { - "endIndex": 6141, - "startIndex": 6131, - "textRun": { - "content": "plugin_ffi", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6193, - "startIndex": 6141, - "textRun": { - "content": " template places the Dart code for the plugin under ", - "textStyle": {} - } - }, - { - "endIndex": 6196, - "startIndex": 6193, - "textRun": { - "content": "lib", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6234, - "startIndex": 6196, - "textRun": { - "content": ", platform-specific directories named ", - "textStyle": {} - } - }, - { - "endIndex": 6241, - "startIndex": 6234, - "textRun": { - "content": "android", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6243, - "startIndex": 6241, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 6246, - "startIndex": 6243, - "textRun": { - "content": "ios", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6248, - "startIndex": 6246, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 6253, - "startIndex": 6248, - "textRun": { - "content": "linux", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6255, - "startIndex": 6253, - "textRun": { - "content": ", ", - "textStyle": {} - } - }, - { - "endIndex": 6260, - "startIndex": 6255, - "textRun": { - "content": "macos", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6266, - "startIndex": 6260, - "textRun": { - "content": ", and ", - "textStyle": {} - } - }, - { - "endIndex": 6273, - "startIndex": 6266, - "textRun": { - "content": "windows", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6300, - "startIndex": 6273, - "textRun": { - "content": " and, most importantly, an ", - "textStyle": {} - } - }, - { - "endIndex": 6307, - "startIndex": 6300, - "textRun": { - "content": "example", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6319, - "startIndex": 6307, - "textRun": { - "content": " directory.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 5995 - }, - { - "endIndex": 6320, - "paragraph": { - "elements": [ - { - "endIndex": 6320, - "startIndex": 6319, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6319 - }, - { - "endIndex": 6620, - "paragraph": { - "elements": [ - { - "endIndex": 6563, - "startIndex": 6320, - "textRun": { - "content": "For a developer used to normal Flutter development, this structure might feel strange, in that there is no executable defined at the top level. A plugin is meant to be included in other Flutter projects, but you will flesh out the code in the ", - "textStyle": {} - } - }, - { - "endIndex": 6570, - "startIndex": 6563, - "textRun": { - "content": "example", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 6620, - "startIndex": 6570, - "textRun": { - "content": " directory to ensure that your plugin code works.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6320 - }, - { - "endIndex": 6621, - "paragraph": { - "elements": [ - { - "endIndex": 6621, - "startIndex": 6620, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6620 - }, - { - "endIndex": 6647, - "paragraph": { - "elements": [ - { - "endIndex": 6647, - "startIndex": 6621, - "textRun": { - "content": "It’s time to get started!\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6621 - }, - { - "endIndex": 6648, - "paragraph": { - "elements": [ - { - "endIndex": 6648, - "startIndex": 6647, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6647 - }, - { - "endIndex": 6649, - "paragraph": { - "elements": [ - { - "endIndex": 6649, - "startIndex": 6648, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6648 - }, - { - "endIndex": 6650, - "paragraph": { - "elements": [ - { - "endIndex": 6650, - "startIndex": 6649, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6649 - }, - { - "endIndex": 6651, - "paragraph": { - "elements": [ - { - "endIndex": 6651, - "startIndex": 6650, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 6650 - }, - { - "endIndex": 6653, - "paragraph": { - "elements": [ - { - "endIndex": 6652, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 6651 - }, - { - "endIndex": 6653, - "startIndex": 6652, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 6651 - }, - { - "endIndex": 6679, - "paragraph": { - "elements": [ - { - "endIndex": 6679, - "startIndex": 6653, - "textRun": { - "content": "Build and run the example\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ot43tirxvs6w", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 6653 - }, - { - "endIndex": 6680, - "paragraph": { - "elements": [ - { - "endIndex": 6680, - "startIndex": 6679, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6679 - }, - { - "endIndex": 6852, - "paragraph": { - "elements": [ - { - "endIndex": 6852, - "startIndex": 6680, - "textRun": { - "content": "To make sure that the build system and prerequisites are correctly installed and work for each supported platform, build and run the generated example app for each target.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6680 - }, - { - "endIndex": 6853, - "paragraph": { - "elements": [ - { - "endIndex": 6853, - "startIndex": 6852, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 6852 - }, - { - "endIndex": 6861, - "paragraph": { - "elements": [ - { - "endIndex": 6861, - "startIndex": 6853, - "textRun": { - "content": "Windows\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ibr0py13rvdx", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 6853 - }, - { - "endIndex": 6979, - "paragraph": { - "elements": [ - { - "endIndex": 6979, - "startIndex": 6861, - "textRun": { - "content": "Ensure that you are using a supported version of Windows. This codelab is known to work on Windows 10 and Windows 11.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6861 - }, - { - "endIndex": 6980, - "paragraph": { - "elements": [ - { - "endIndex": 6980, - "startIndex": 6979, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6979 - }, - { - "endIndex": 7071, - "paragraph": { - "elements": [ - { - "endIndex": 7071, - "startIndex": 6980, - "textRun": { - "content": "You can either build the application from within your code editor, or on the command line.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6980 - }, - { - "endIndex": 7072, - "paragraph": { - "elements": [ - { - "endIndex": 7072, - "startIndex": 7071, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7071 - }, - { - "endIndex": 7904, - "startIndex": 7072, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 7903, - "startIndex": 7073, - "tableCells": [ - { - "content": [ - { - "endIndex": 7129, - "paragraph": { - "elements": [ - { - "endIndex": 7129, - "startIndex": 7075, - "textRun": { - "content": "PS C:\\Users\\brett\\Documents> cd .\\ffigen_app\\example\\\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7075 - }, - { - "endIndex": 7200, - "paragraph": { - "elements": [ - { - "endIndex": 7200, - "startIndex": 7129, - "textRun": { - "content": "PS C:\\Users\\brett\\Documents\\ffigen_app\\example> flutter run -d windows\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7129 - }, - { - "endIndex": 7324, - "paragraph": { - "elements": [ - { - "endIndex": 7324, - "startIndex": 7200, - "textRun": { - "content": "Launching lib\\main.dart on Windows in debug mode...Building Windows application... \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7200 - }, - { - "endIndex": 7397, - "paragraph": { - "elements": [ - { - "endIndex": 7397, - "startIndex": 7324, - "textRun": { - "content": "Syncing files to device Windows... 160ms\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7324 - }, - { - "endIndex": 7398, - "paragraph": { - "elements": [ - { - "endIndex": 7398, - "startIndex": 7397, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7397 - }, - { - "endIndex": 7424, - "paragraph": { - "elements": [ - { - "endIndex": 7424, - "startIndex": 7398, - "textRun": { - "content": "Flutter run key commands.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7398 - }, - { - "endIndex": 7439, - "paragraph": { - "elements": [ - { - "endIndex": 7439, - "startIndex": 7424, - "textRun": { - "content": "r Hot reload. \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7424 - }, - { - "endIndex": 7454, - "paragraph": { - "elements": [ - { - "endIndex": 7454, - "startIndex": 7439, - "textRun": { - "content": "R Hot restart.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7439 - }, - { - "endIndex": 7497, - "paragraph": { - "elements": [ - { - "endIndex": 7497, - "startIndex": 7454, - "textRun": { - "content": "h List all available interactive commands.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7454 - }, - { - "endIndex": 7563, - "paragraph": { - "elements": [ - { - "endIndex": 7563, - "startIndex": 7497, - "textRun": { - "content": "d Detach (terminate \"flutter run\" but leave application running).\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7497 - }, - { - "endIndex": 7582, - "paragraph": { - "elements": [ - { - "endIndex": 7582, - "startIndex": 7563, - "textRun": { - "content": "c Clear the screen\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7563 - }, - { - "endIndex": 7632, - "paragraph": { - "elements": [ - { - "endIndex": 7632, - "startIndex": 7582, - "textRun": { - "content": "q Quit (terminate the application on the device).\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7582 - }, - { - "endIndex": 7633, - "paragraph": { - "elements": [ - { - "endIndex": 7633, - "startIndex": 7632, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7632 - }, - { - "endIndex": 7666, - "paragraph": { - "elements": [ - { - "endIndex": 7666, - "startIndex": 7633, - "textRun": { - "content": " Running with sound null safety \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7633 - }, - { - "endIndex": 7667, - "paragraph": { - "elements": [ - { - "endIndex": 7667, - "startIndex": 7666, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7666 - }, - { - "endIndex": 7769, - "paragraph": { - "elements": [ - { - "endIndex": 7769, - "startIndex": 7667, - "textRun": { - "content": "An Observatory debugger and profiler on Windows is available at: http://127.0.0.1:53317/OiKWpyHXxHI=/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7667 - }, - { - "endIndex": 7840, - "paragraph": { - "elements": [ - { - "endIndex": 7840, - "startIndex": 7769, - "textRun": { - "content": "The Flutter DevTools debugger and profiler on Windows is available at:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7769 - }, - { - "endIndex": 7903, - "paragraph": { - "elements": [ - { - "endIndex": 7902, - "startIndex": 7840, - "textRun": { - "content": "http://127.0.0.1:9100?uri=http://127.0.0.1:53317/OiKWpyHXxHI=/", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 7903, - "startIndex": 7902, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 7840 - } - ], - "endIndex": 7903, - "startIndex": 7074, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 7905, - "paragraph": { - "elements": [ - { - "endIndex": 7905, - "startIndex": 7904, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7904 - }, - { - "endIndex": 7961, - "paragraph": { - "elements": [ - { - "endIndex": 7961, - "startIndex": 7905, - "textRun": { - "content": "You should see a running app window like the following:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7905 - }, - { - "endIndex": 7962, - "paragraph": { - "elements": [ - { - "endIndex": 7962, - "startIndex": 7961, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7961 - }, - { - "endIndex": 7964, - "paragraph": { - "elements": [ - { - "endIndex": 7963, - "inlineObjectElement": { - "inlineObjectId": "kix.kbfmzdwg6giq", - "textStyle": {} - }, - "startIndex": 7962 - }, - { - "endIndex": 7964, - "startIndex": 7963, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7962 - }, - { - "endIndex": 7965, - "paragraph": { - "elements": [ - { - "endIndex": 7965, - "startIndex": 7964, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7964 - }, - { - "endIndex": 7971, - "paragraph": { - "elements": [ - { - "endIndex": 7971, - "startIndex": 7965, - "textRun": { - "content": "Linux\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.58bl65ten0xh", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 7965 - }, - { - "endIndex": 7972, - "paragraph": { - "elements": [ - { - "endIndex": 7972, - "startIndex": 7971, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7971 - }, - { - "endIndex": 8062, - "paragraph": { - "elements": [ - { - "endIndex": 8046, - "startIndex": 7972, - "textRun": { - "content": "Ensure that you are using a supported version of Linux. This codelab uses ", - "textStyle": {} - } - }, - { - "endIndex": 8060, - "startIndex": 8046, - "textRun": { - "content": "Ubuntu 22.04.1", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8062, - "startIndex": 8060, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7972 - }, - { - "endIndex": 8063, - "paragraph": { - "elements": [ - { - "endIndex": 8063, - "startIndex": 8062, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8062 - }, - { - "endIndex": 8170, - "paragraph": { - "elements": [ - { - "endIndex": 8170, - "startIndex": 8063, - "textRun": { - "content": "Once you have installed all the prerequisites listed in Step 2, run the following commands in a terminal: \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8063 - }, - { - "endIndex": 8171, - "paragraph": { - "elements": [ - { - "endIndex": 8171, - "startIndex": 8170, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8170 - }, - { - "endIndex": 8931, - "startIndex": 8171, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 8930, - "startIndex": 8172, - "tableCells": [ - { - "content": [ - { - "endIndex": 8198, - "paragraph": { - "elements": [ - { - "endIndex": 8198, - "startIndex": 8174, - "textRun": { - "content": "$ cd ffigen_app/example\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8174 - }, - { - "endIndex": 8221, - "paragraph": { - "elements": [ - { - "endIndex": 8221, - "startIndex": 8198, - "textRun": { - "content": "$ flutter run -d linux\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8198 - }, - { - "endIndex": 8271, - "paragraph": { - "elements": [ - { - "endIndex": 8271, - "startIndex": 8221, - "textRun": { - "content": "Launching lib/main.dart on Linux in debug mode...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8221 - }, - { - "endIndex": 8344, - "paragraph": { - "elements": [ - { - "endIndex": 8344, - "startIndex": 8271, - "textRun": { - "content": "Building Linux application... \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8271 - }, - { - "endIndex": 8417, - "paragraph": { - "elements": [ - { - "endIndex": 8417, - "startIndex": 8344, - "textRun": { - "content": "Syncing files to device Linux... 504ms\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8344 - }, - { - "endIndex": 8418, - "paragraph": { - "elements": [ - { - "endIndex": 8418, - "startIndex": 8417, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8417 - }, - { - "endIndex": 8444, - "paragraph": { - "elements": [ - { - "endIndex": 8444, - "startIndex": 8418, - "textRun": { - "content": "Flutter run key commands.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8418 - }, - { - "endIndex": 8465, - "paragraph": { - "elements": [ - { - "endIndex": 8465, - "startIndex": 8444, - "textRun": { - "content": "r Hot reload. 🔥🔥🔥\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8444 - }, - { - "endIndex": 8480, - "paragraph": { - "elements": [ - { - "endIndex": 8480, - "startIndex": 8465, - "textRun": { - "content": "R Hot restart.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8465 - }, - { - "endIndex": 8523, - "paragraph": { - "elements": [ - { - "endIndex": 8523, - "startIndex": 8480, - "textRun": { - "content": "h List all available interactive commands.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8480 - }, - { - "endIndex": 8589, - "paragraph": { - "elements": [ - { - "endIndex": 8589, - "startIndex": 8523, - "textRun": { - "content": "d Detach (terminate \"flutter run\" but leave application running).\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8523 - }, - { - "endIndex": 8608, - "paragraph": { - "elements": [ - { - "endIndex": 8608, - "startIndex": 8589, - "textRun": { - "content": "c Clear the screen\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8589 - }, - { - "endIndex": 8658, - "paragraph": { - "elements": [ - { - "endIndex": 8658, - "startIndex": 8608, - "textRun": { - "content": "q Quit (terminate the application on the device).\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8608 - }, - { - "endIndex": 8659, - "paragraph": { - "elements": [ - { - "endIndex": 8659, - "startIndex": 8658, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8658 - }, - { - "endIndex": 8696, - "paragraph": { - "elements": [ - { - "endIndex": 8696, - "startIndex": 8659, - "textRun": { - "content": "💪 Running with sound null safety 💪\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8659 - }, - { - "endIndex": 8697, - "paragraph": { - "elements": [ - { - "endIndex": 8697, - "startIndex": 8696, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8696 - }, - { - "endIndex": 8797, - "paragraph": { - "elements": [ - { - "endIndex": 8797, - "startIndex": 8697, - "textRun": { - "content": "An Observatory debugger and profiler on Linux is available at: http://127.0.0.1:36653/Wgek1JGag48=/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8697 - }, - { - "endIndex": 8866, - "paragraph": { - "elements": [ - { - "endIndex": 8866, - "startIndex": 8797, - "textRun": { - "content": "The Flutter DevTools debugger and profiler on Linux is available at:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8797 - }, - { - "endIndex": 8929, - "paragraph": { - "elements": [ - { - "endIndex": 8929, - "startIndex": 8866, - "textRun": { - "content": "http://127.0.0.1:9103?uri=http://127.0.0.1:36653/Wgek1JGag48=/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8866 - }, - { - "endIndex": 8930, - "paragraph": { - "elements": [ - { - "endIndex": 8930, - "startIndex": 8929, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8929 - } - ], - "endIndex": 8930, - "startIndex": 8173, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 39.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 8932, - "paragraph": { - "elements": [ - { - "endIndex": 8932, - "startIndex": 8931, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8931 - }, - { - "endIndex": 8988, - "paragraph": { - "elements": [ - { - "endIndex": 8988, - "startIndex": 8932, - "textRun": { - "content": "You should see a running app window like the following:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8932 - }, - { - "endIndex": 8989, - "paragraph": { - "elements": [ - { - "endIndex": 8989, - "startIndex": 8988, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8988 - }, - { - "endIndex": 8991, - "paragraph": { - "elements": [ - { - "endIndex": 8990, - "inlineObjectElement": { - "inlineObjectId": "kix.knvcb3oh1tup", - "textStyle": {} - }, - "startIndex": 8989 - }, - { - "endIndex": 8991, - "startIndex": 8990, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8989 - }, - { - "endIndex": 8999, - "paragraph": { - "elements": [ - { - "endIndex": 8999, - "startIndex": 8991, - "textRun": { - "content": "Android\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.38tflxafd5oo", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 8991 - }, - { - "endIndex": 9000, - "paragraph": { - "elements": [ - { - "endIndex": 9000, - "startIndex": 8999, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 8999 - }, - { - "endIndex": 9308, - "paragraph": { - "elements": [ - { - "endIndex": 9308, - "startIndex": 9000, - "textRun": { - "content": "For Android you can use Windows, macOS, or Linux for compilation. First, make sure you have an Android device connected to your development computer or are running an Android Emulator (AVD) instance. Confirm that Flutter is able to connect to either the Android device or emulator by running the following: \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9000 - }, - { - "endIndex": 9310, - "paragraph": { - "elements": [ - { - "endIndex": 9310, - "startIndex": 9308, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9308 - }, - { - "endIndex": 9630, - "startIndex": 9310, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 9629, - "startIndex": 9311, - "tableCells": [ - { - "content": [ - { - "endIndex": 9331, - "paragraph": { - "elements": [ - { - "endIndex": 9331, - "startIndex": 9313, - "textRun": { - "content": "$ flutter devices\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9313 - }, - { - "endIndex": 9352, - "paragraph": { - "elements": [ - { - "endIndex": 9352, - "startIndex": 9331, - "textRun": { - "content": "3 connected devices:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9331 - }, - { - "endIndex": 9353, - "paragraph": { - "elements": [ - { - "endIndex": 9353, - "startIndex": 9352, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9352 - }, - { - "endIndex": 9447, - "paragraph": { - "elements": [ - { - "endIndex": 9447, - "startIndex": 9353, - "textRun": { - "content": "sdk gphone64 arm64 (mobile) • emulator-5554 • android-arm64 • Android 12 (API 32) (emulator)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9353 - }, - { - "endIndex": 9538, - "paragraph": { - "elements": [ - { - "endIndex": 9538, - "startIndex": 9447, - "textRun": { - "content": "macOS (desktop) • macos • darwin-arm64 • macOS 13.1 22C65 darwin-arm\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9447 - }, - { - "endIndex": 9629, - "paragraph": { - "elements": [ - { - "endIndex": 9629, - "startIndex": 9538, - "textRun": { - "content": "Chrome (web) • chrome • web-javascript • Google Chrome 108.0.5359.98\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9538 - } - ], - "endIndex": 9629, - "startIndex": 9312, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 39.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 9631, - "paragraph": { - "elements": [ - { - "endIndex": 9631, - "startIndex": 9630, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9630 - }, - { - "endIndex": 9633, - "paragraph": { - "elements": [ - { - "endIndex": 9632, - "inlineObjectElement": { - "inlineObjectId": "kix.63kf7zqqmu8n", - "textStyle": {} - }, - "startIndex": 9631 - }, - { - "endIndex": 9633, - "startIndex": 9632, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9631 - }, - { - "endIndex": 9647, - "paragraph": { - "elements": [ - { - "endIndex": 9647, - "startIndex": 9633, - "textRun": { - "content": "macOS and iOS\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.mvc8qh7ok0mn", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 9633 - }, - { - "endIndex": 9648, - "paragraph": { - "elements": [ - { - "endIndex": 9648, - "startIndex": 9647, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9647 - }, - { - "endIndex": 9718, - "paragraph": { - "elements": [ - { - "endIndex": 9718, - "startIndex": 9648, - "textRun": { - "content": "For macOS and iOS Flutter development, you must use a macOS computer.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9648 - }, - { - "endIndex": 9808, - "paragraph": { - "elements": [ - { - "endIndex": 9808, - "startIndex": 9718, - "textRun": { - "content": "Start with running the example app on macOS. Again confirm the devices that Flutter sees:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9718 - }, - { - "endIndex": 9809, - "paragraph": { - "elements": [ - { - "endIndex": 9809, - "startIndex": 9808, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9808 - }, - { - "endIndex": 9997, - "startIndex": 9809, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 9996, - "startIndex": 9810, - "tableCells": [ - { - "content": [ - { - "endIndex": 9830, - "paragraph": { - "elements": [ - { - "endIndex": 9830, - "startIndex": 9812, - "textRun": { - "content": "$ flutter devices\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9812 - }, - { - "endIndex": 9851, - "paragraph": { - "elements": [ - { - "endIndex": 9851, - "startIndex": 9830, - "textRun": { - "content": "2 connected devices:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9830 - }, - { - "endIndex": 9852, - "paragraph": { - "elements": [ - { - "endIndex": 9852, - "startIndex": 9851, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9851 - }, - { - "endIndex": 9924, - "paragraph": { - "elements": [ - { - "endIndex": 9924, - "startIndex": 9852, - "textRun": { - "content": "macOS (desktop) • macos • darwin-arm64 • macOS 13.1 22C65 darwin-arm\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9852 - }, - { - "endIndex": 9996, - "paragraph": { - "elements": [ - { - "endIndex": 9996, - "startIndex": 9924, - "textRun": { - "content": "Chrome (web) • chrome • web-javascript • Google Chrome 108.0.5359.98\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9924 - } - ], - "endIndex": 9996, - "startIndex": 9811, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 39.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 9998, - "paragraph": { - "elements": [ - { - "endIndex": 9998, - "startIndex": 9997, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9997 - }, - { - "endIndex": 9999, - "paragraph": { - "elements": [ - { - "endIndex": 9999, - "startIndex": 9998, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9998 - }, - { - "endIndex": 10055, - "paragraph": { - "elements": [ - { - "endIndex": 10055, - "startIndex": 9999, - "textRun": { - "content": "Run the example app using the generated plugin project:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 9999 - }, - { - "endIndex": 10056, - "paragraph": { - "elements": [ - { - "endIndex": 10056, - "startIndex": 10055, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10055 - }, - { - "endIndex": 10107, - "startIndex": 10056, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 10106, - "startIndex": 10057, - "tableCells": [ - { - "content": [ - { - "endIndex": 10083, - "paragraph": { - "elements": [ - { - "endIndex": 10083, - "startIndex": 10059, - "textRun": { - "content": "$ cd ffigen_app/example\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10059 - }, - { - "endIndex": 10106, - "paragraph": { - "elements": [ - { - "endIndex": 10106, - "startIndex": 10083, - "textRun": { - "content": "$ flutter run -d macos\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10083 - } - ], - "endIndex": 10106, - "startIndex": 10058, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 24.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 10108, - "paragraph": { - "elements": [ - { - "endIndex": 10108, - "startIndex": 10107, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10107 - }, - { - "endIndex": 10164, - "paragraph": { - "elements": [ - { - "endIndex": 10164, - "startIndex": 10108, - "textRun": { - "content": "You should see a running app window like the following:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10108 - }, - { - "endIndex": 10165, - "paragraph": { - "elements": [ - { - "endIndex": 10165, - "startIndex": 10164, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10164 - }, - { - "endIndex": 10167, - "paragraph": { - "elements": [ - { - "endIndex": 10166, - "inlineObjectElement": { - "inlineObjectId": "kix.tptap0mx1kzg", - "textStyle": {} - }, - "startIndex": 10165 - }, - { - "endIndex": 10167, - "startIndex": 10166, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10165 - }, - { - "endIndex": 10168, - "paragraph": { - "elements": [ - { - "endIndex": 10168, - "startIndex": 10167, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10167 - }, - { - "endIndex": 10366, - "paragraph": { - "elements": [ - { - "endIndex": 10285, - "startIndex": 10168, - "textRun": { - "content": "For iOS you can use the simulator or a real hardware device. If using the simulator, first launch the simulator. The ", - "textStyle": {} - } - }, - { - "endIndex": 10300, - "startIndex": 10285, - "textRun": { - "content": "flutter devices", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10366, - "startIndex": 10300, - "textRun": { - "content": " command now lists the simulator as one of its available devices.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10168 - }, - { - "endIndex": 10367, - "paragraph": { - "elements": [ - { - "endIndex": 10367, - "startIndex": 10366, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10366 - }, - { - "endIndex": 10368, - "paragraph": { - "elements": [ - { - "endIndex": 10368, - "startIndex": 10367, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10367 - }, - { - "endIndex": 10806, - "startIndex": 10368, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 10805, - "startIndex": 10369, - "tableCells": [ - { - "content": [ - { - "endIndex": 10389, - "paragraph": { - "elements": [ - { - "endIndex": 10389, - "startIndex": 10371, - "textRun": { - "content": "$ flutter devices\n", - "textStyle": { - "fontSize": { - "magnitude": 6.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10371 - }, - { - "endIndex": 10410, - "paragraph": { - "elements": [ - { - "endIndex": 10410, - "startIndex": 10389, - "textRun": { - "content": "3 connected devices:\n", - "textStyle": { - "fontSize": { - "magnitude": 6.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10389 - }, - { - "endIndex": 10411, - "paragraph": { - "elements": [ - { - "endIndex": 10411, - "startIndex": 10410, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 6.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10410 - }, - { - "endIndex": 10561, - "paragraph": { - "elements": [ - { - "endIndex": 10561, - "startIndex": 10411, - "textRun": { - "content": "iPhone SE (3rd generation) (mobile) • 1BCBE334-7EC4-433A-90FD-1BC14F3BA41F • ios • com.apple.CoreSimulator.SimRuntime.iOS-16-1 (simulator)\n", - "textStyle": { - "fontSize": { - "magnitude": 6.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10411 - }, - { - "endIndex": 10683, - "paragraph": { - "elements": [ - { - "endIndex": 10683, - "startIndex": 10561, - "textRun": { - "content": "macOS (desktop) • macos • darwin-arm64 • macOS 13.1 22C65 darwin-arm\n", - "textStyle": { - "fontSize": { - "magnitude": 6.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10561 - }, - { - "endIndex": 10805, - "paragraph": { - "elements": [ - { - "endIndex": 10805, - "startIndex": 10683, - "textRun": { - "content": "Chrome (web) • chrome • web-javascript • Google Chrome 108.0.5359.98\n", - "textStyle": { - "fontSize": { - "magnitude": 6.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10683 - } - ], - "endIndex": 10805, - "startIndex": 10370, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 10807, - "paragraph": { - "elements": [ - { - "endIndex": 10807, - "startIndex": 10806, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10806 - }, - { - "endIndex": 10808, - "paragraph": { - "elements": [ - { - "endIndex": 10808, - "startIndex": 10807, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10807 - }, - { - "endIndex": 10857, - "paragraph": { - "elements": [ - { - "endIndex": 10844, - "startIndex": 10808, - "textRun": { - "content": "Once the simulator is started, run: ", - "textStyle": {} - } - }, - { - "endIndex": 10855, - "startIndex": 10844, - "textRun": { - "content": "flutter run", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10857, - "startIndex": 10855, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10808 - }, - { - "endIndex": 10858, - "paragraph": { - "elements": [ - { - "endIndex": 10858, - "startIndex": 10857, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10857 - }, - { - "endIndex": 10910, - "startIndex": 10858, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 10909, - "startIndex": 10859, - "tableCells": [ - { - "content": [ - { - "endIndex": 10885, - "paragraph": { - "elements": [ - { - "endIndex": 10885, - "startIndex": 10861, - "textRun": { - "content": "$ cd ffigen_app/example\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10861 - }, - { - "endIndex": 10909, - "paragraph": { - "elements": [ - { - "endIndex": 10909, - "startIndex": 10885, - "textRun": { - "content": "$ flutter run -d iphone\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10885 - } - ], - "endIndex": 10909, - "startIndex": 10860, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 24.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 10911, - "paragraph": { - "elements": [ - { - "endIndex": 10911, - "startIndex": 10910, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10910 - }, - { - "endIndex": 10913, - "paragraph": { - "elements": [ - { - "endIndex": 10912, - "inlineObjectElement": { - "inlineObjectId": "kix.siedlpab3lfj", - "textStyle": {} - }, - "startIndex": 10911 - }, - { - "endIndex": 10913, - "startIndex": 10912, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10911 - }, - { - "endIndex": 10914, - "paragraph": { - "elements": [ - { - "endIndex": 10914, - "startIndex": 10913, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10913 - }, - { - "endIndex": 11031, - "paragraph": { - "elements": [ - { - "endIndex": 11017, - "startIndex": 10914, - "textRun": { - "content": "The iOS simulator takes precedence over the macOS target, so you can skip specifying a device with the ", - "textStyle": {} - } - }, - { - "endIndex": 11019, - "startIndex": 11017, - "textRun": { - "content": "-d", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11031, - "startIndex": 11019, - "textRun": { - "content": " parameter.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10914 - }, - { - "endIndex": 11032, - "paragraph": { - "elements": [ - { - "endIndex": 11032, - "startIndex": 11031, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11031 - }, - { - "endIndex": 11219, - "paragraph": { - "elements": [ - { - "endIndex": 11219, - "startIndex": 11032, - "textRun": { - "content": "Congratulations, you have successfully built and run an application on five different operating systems. Next up, building the native plugin and interfacing with it from Dart using FFI. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11032 - }, - { - "endIndex": 11220, - "paragraph": { - "elements": [ - { - "endIndex": 11220, - "startIndex": 11219, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11219 - }, - { - "endIndex": 11221, - "paragraph": { - "elements": [ - { - "endIndex": 11221, - "startIndex": 11220, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11220 - }, - { - "endIndex": 11223, - "paragraph": { - "elements": [ - { - "endIndex": 11222, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 11221 - }, - { - "endIndex": 11223, - "startIndex": 11222, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 11221 - }, - { - "endIndex": 11225, - "paragraph": { - "elements": [ - { - "endIndex": 11224, - "pageBreak": { - "textStyle": {} - }, - "startIndex": 11223 - }, - { - "endIndex": 11225, - "startIndex": 11224, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 11223 - }, - { - "endIndex": 11270, - "paragraph": { - "elements": [ - { - "endIndex": 11270, - "startIndex": 11225, - "textRun": { - "content": "Using Duktape on Windows, Linux, and Android\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.cxlajbi5c0gt", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 11225 - }, - { - "endIndex": 11271, - "paragraph": { - "elements": [ - { - "endIndex": 11271, - "startIndex": 11270, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11270 - }, - { - "endIndex": 11567, - "paragraph": { - "elements": [ - { - "endIndex": 11325, - "startIndex": 11271, - "textRun": { - "content": "The C library that you’ll be using in this codelab is ", - "textStyle": {} - } - }, - { - "endIndex": 11332, - "startIndex": 11325, - "textRun": { - "content": "Duktape", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://duktape.org/" - }, - "underline": true - } - } - }, - { - "endIndex": 11567, - "startIndex": 11332, - "textRun": { - "content": ". Duktape is an embeddable Javascript engine, with a focus on portability and a compact footprint. In this step, you’ll configure the plugin to compile the Duktape library, link it to your plugin, and then access it using Dart’s FFI. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11271 - }, - { - "endIndex": 11568, - "paragraph": { - "elements": [ - { - "endIndex": 11568, - "startIndex": 11567, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11567 - }, - { - "endIndex": 11883, - "paragraph": { - "elements": [ - { - "endIndex": 11883, - "startIndex": 11568, - "textRun": { - "content": "This step configures the integration to work on Windows, Linux, and Android. The iOS and macOS integration requires additional configuration (beyond what is detailed in this step) to include the compiled library into the final Flutter executable. The additional required configuration is covered in the next step. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11568 - }, - { - "endIndex": 11902, - "paragraph": { - "elements": [ - { - "endIndex": 11902, - "startIndex": 11883, - "textRun": { - "content": "Retrieving Duktape\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.3gjsb7bsa2ua", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 11883 - }, - { - "endIndex": 11903, - "paragraph": { - "elements": [ - { - "endIndex": 11903, - "startIndex": 11902, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11902 - }, - { - "endIndex": 11997, - "paragraph": { - "elements": [ - { - "endIndex": 11928, - "startIndex": 11903, - "textRun": { - "content": "First, get a copy of the ", - "textStyle": {} - } - }, - { - "endIndex": 11935, - "startIndex": 11928, - "textRun": { - "content": "duktape", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11951, - "startIndex": 11935, - "textRun": { - "content": " source code by ", - "textStyle": {} - } - }, - { - "endIndex": 11986, - "startIndex": 11951, - "textRun": { - "content": "downloading it from the duktape.org", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://duktape.org/download.html" - }, - "underline": true - } - } - }, - { - "endIndex": 11997, - "startIndex": 11986, - "textRun": { - "content": " website. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11903 - }, - { - "endIndex": 11998, - "paragraph": { - "elements": [ - { - "endIndex": 11998, - "startIndex": 11997, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11997 - }, - { - "endIndex": 12057, - "paragraph": { - "elements": [ - { - "endIndex": 12038, - "startIndex": 11998, - "textRun": { - "content": "For Windows you can use PowerShell with ", - "textStyle": {} - } - }, - { - "endIndex": 12055, - "startIndex": 12038, - "textRun": { - "content": "Invoke-WebRequest", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12057, - "startIndex": 12055, - "textRun": { - "content": ":\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11998 - }, - { - "endIndex": 12058, - "paragraph": { - "elements": [ - { - "endIndex": 12058, - "startIndex": 12057, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12057 - }, - { - "endIndex": 12160, - "startIndex": 12058, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 12159, - "startIndex": 12059, - "tableCells": [ - { - "content": [ - { - "endIndex": 12159, - "paragraph": { - "elements": [ - { - "endIndex": 12159, - "startIndex": 12061, - "textRun": { - "content": "PS> Invoke-WebRequest -Uri https://duktape.org/duktape-2.7.0.tar.xz -OutFile duktape-2.7.0.tar.xz\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12061 - } - ], - "endIndex": 12159, - "startIndex": 12060, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 12161, - "paragraph": { - "elements": [ - { - "endIndex": 12161, - "startIndex": 12160, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12160 - }, - { - "endIndex": 12195, - "paragraph": { - "elements": [ - { - "endIndex": 12172, - "startIndex": 12161, - "textRun": { - "content": "For Linux, ", - "textStyle": {} - } - }, - { - "endIndex": 12176, - "startIndex": 12172, - "textRun": { - "content": "wget", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12177, - "startIndex": 12176, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 12195, - "startIndex": 12177, - "textRun": { - "content": "is a good choice.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12161 - }, - { - "endIndex": 12196, - "paragraph": { - "elements": [ - { - "endIndex": 12196, - "startIndex": 12195, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12195 - }, - { - "endIndex": 12723, - "startIndex": 12196, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 12722, - "startIndex": 12197, - "tableCells": [ - { - "content": [ - { - "endIndex": 12247, - "paragraph": { - "elements": [ - { - "endIndex": 12247, - "startIndex": 12199, - "textRun": { - "content": "$ wget https://duktape.org/duktape-2.7.0.tar.xz\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12199 - }, - { - "endIndex": 12313, - "paragraph": { - "elements": [ - { - "endIndex": 12313, - "startIndex": 12247, - "textRun": { - "content": "--2022-12-22 16:21:39-- https://duktape.org/duktape-2.7.0.tar.xz\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12247 - }, - { - "endIndex": 12366, - "paragraph": { - "elements": [ - { - "endIndex": 12366, - "startIndex": 12313, - "textRun": { - "content": "Resolving duktape.org (duktape.org)... 104.198.14.52\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12313 - }, - { - "endIndex": 12439, - "paragraph": { - "elements": [ - { - "endIndex": 12439, - "startIndex": 12366, - "textRun": { - "content": "Connecting to duktape.org (duktape.org)|104.198.14.52|:443... connected.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12366 - }, - { - "endIndex": 12486, - "paragraph": { - "elements": [ - { - "endIndex": 12486, - "startIndex": 12439, - "textRun": { - "content": "HTTP request sent, awaiting response... 200 OK\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12439 - }, - { - "endIndex": 12529, - "paragraph": { - "elements": [ - { - "endIndex": 12529, - "startIndex": 12486, - "textRun": { - "content": "Length: 1026524 (1002K) [application/x-xz]\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12486 - }, - { - "endIndex": 12563, - "paragraph": { - "elements": [ - { - "endIndex": 12563, - "startIndex": 12529, - "textRun": { - "content": "Saving to: ‘duktape-2.7.0.tar.xz’\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12529 - }, - { - "endIndex": 12564, - "paragraph": { - "elements": [ - { - "endIndex": 12564, - "startIndex": 12563, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12563 - }, - { - "endIndex": 12640, - "paragraph": { - "elements": [ - { - "endIndex": 12640, - "startIndex": 12564, - "textRun": { - "content": "duktape-2.7.0.tar.x 100%[===================>] 1002K 1.01MB/s in 1.0s\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12564 - }, - { - "endIndex": 12641, - "paragraph": { - "elements": [ - { - "endIndex": 12641, - "startIndex": 12640, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12640 - }, - { - "endIndex": 12722, - "paragraph": { - "elements": [ - { - "endIndex": 12722, - "startIndex": 12641, - "textRun": { - "content": "2022-12-22 16:21:41 (1.01 MB/s) - ‘duktape-2.7.0.tar.xz’ saved [1026524/1026524]\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12641 - } - ], - "endIndex": 12722, - "startIndex": 12198, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 12725, - "paragraph": { - "elements": [ - { - "endIndex": 12725, - "startIndex": 12723, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12723 - }, - { - "endIndex": 12834, - "paragraph": { - "elements": [ - { - "endIndex": 12739, - "startIndex": 12725, - "textRun": { - "content": "The file is a ", - "textStyle": {} - } - }, - { - "endIndex": 12745, - "startIndex": 12739, - "textRun": { - "content": "tar.xz", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 12785, - "startIndex": 12745, - "textRun": { - "content": " archive. On Windows, one option is to ", - "textStyle": {} - } - }, - { - "endIndex": 12808, - "startIndex": 12785, - "textRun": { - "content": "download the 7Zip tools", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.7-zip.org/download.html" - }, - "underline": true - } - } - }, - { - "endIndex": 12834, - "startIndex": 12808, - "textRun": { - "content": ", and use it as follows. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12725 - }, - { - "endIndex": 12835, - "paragraph": { - "elements": [ - { - "endIndex": 12835, - "startIndex": 12834, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 12834 - }, - { - "endIndex": 13226, - "startIndex": 12835, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 13225, - "startIndex": 12836, - "tableCells": [ - { - "content": [ - { - "endIndex": 12870, - "paragraph": { - "elements": [ - { - "endIndex": 12870, - "startIndex": 12838, - "textRun": { - "content": "PS> 7z x .\\duktape-2.7.0.tar.xz\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12838 - }, - { - "endIndex": 12871, - "paragraph": { - "elements": [ - { - "endIndex": 12871, - "startIndex": 12870, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12870 - }, - { - "endIndex": 12940, - "paragraph": { - "elements": [ - { - "endIndex": 12940, - "startIndex": 12871, - "textRun": { - "content": "7-Zip 22.01 (x64) : Copyright (c) 1999-2022 Igor Pavlov : 2022-07-15\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12871 - }, - { - "endIndex": 12941, - "paragraph": { - "elements": [ - { - "endIndex": 12941, - "startIndex": 12940, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12940 - }, - { - "endIndex": 12974, - "paragraph": { - "elements": [ - { - "endIndex": 12974, - "startIndex": 12941, - "textRun": { - "content": "Scanning the drive for archives:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12941 - }, - { - "endIndex": 13007, - "paragraph": { - "elements": [ - { - "endIndex": 13007, - "startIndex": 12974, - "textRun": { - "content": "1 file, 1026524 bytes (1003 KiB)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12974 - }, - { - "endIndex": 13008, - "paragraph": { - "elements": [ - { - "endIndex": 13008, - "startIndex": 13007, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13007 - }, - { - "endIndex": 13051, - "paragraph": { - "elements": [ - { - "endIndex": 13051, - "startIndex": 13008, - "textRun": { - "content": "Extracting archive: .\\duktape-2.7.0.tar.xz\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13008 - }, - { - "endIndex": 13054, - "paragraph": { - "elements": [ - { - "endIndex": 13054, - "startIndex": 13051, - "textRun": { - "content": "--\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13051 - }, - { - "endIndex": 13084, - "paragraph": { - "elements": [ - { - "endIndex": 13084, - "startIndex": 13054, - "textRun": { - "content": "Path = .\\duktape-2.7.0.tar.xz\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13054 - }, - { - "endIndex": 13094, - "paragraph": { - "elements": [ - { - "endIndex": 13094, - "startIndex": 13084, - "textRun": { - "content": "Type = xz\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13084 - }, - { - "endIndex": 13118, - "paragraph": { - "elements": [ - { - "endIndex": 13118, - "startIndex": 13094, - "textRun": { - "content": "Physical Size = 1026524\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13094 - }, - { - "endIndex": 13142, - "paragraph": { - "elements": [ - { - "endIndex": 13142, - "startIndex": 13118, - "textRun": { - "content": "Method = LZMA2:26 CRC64\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13118 - }, - { - "endIndex": 13154, - "paragraph": { - "elements": [ - { - "endIndex": 13154, - "startIndex": 13142, - "textRun": { - "content": "Streams = 1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13142 - }, - { - "endIndex": 13165, - "paragraph": { - "elements": [ - { - "endIndex": 13165, - "startIndex": 13154, - "textRun": { - "content": "Blocks = 1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13154 - }, - { - "endIndex": 13166, - "paragraph": { - "elements": [ - { - "endIndex": 13166, - "startIndex": 13165, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13165 - }, - { - "endIndex": 13183, - "paragraph": { - "elements": [ - { - "endIndex": 13183, - "startIndex": 13166, - "textRun": { - "content": "Everything is Ok\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13166 - }, - { - "endIndex": 13184, - "paragraph": { - "elements": [ - { - "endIndex": 13184, - "startIndex": 13183, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13183 - }, - { - "endIndex": 13205, - "paragraph": { - "elements": [ - { - "endIndex": 13205, - "startIndex": 13184, - "textRun": { - "content": "Size: 19087360\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13184 - }, - { - "endIndex": 13225, - "paragraph": { - "elements": [ - { - "endIndex": 13225, - "startIndex": 13205, - "textRun": { - "content": "Compressed: 1026524\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13205 - } - ], - "endIndex": 13225, - "startIndex": 12837, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 13227, - "paragraph": { - "elements": [ - { - "endIndex": 13227, - "startIndex": 13226, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13226 - }, - { - "endIndex": 13326, - "paragraph": { - "elements": [ - { - "endIndex": 13326, - "startIndex": 13227, - "textRun": { - "content": "You need to run 7z twice, first to unarchive the xz compression, second to expand the tar archive.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13227 - }, - { - "endIndex": 13327, - "paragraph": { - "elements": [ - { - "endIndex": 13327, - "startIndex": 13326, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13326 - }, - { - "endIndex": 13756, - "startIndex": 13327, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 13755, - "startIndex": 13328, - "tableCells": [ - { - "content": [ - { - "endIndex": 13359, - "paragraph": { - "elements": [ - { - "endIndex": 13359, - "startIndex": 13330, - "textRun": { - "content": "PS> 7z x .\\duktape-2.7.0.tar\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13330 - }, - { - "endIndex": 13360, - "paragraph": { - "elements": [ - { - "endIndex": 13360, - "startIndex": 13359, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13359 - }, - { - "endIndex": 13429, - "paragraph": { - "elements": [ - { - "endIndex": 13429, - "startIndex": 13360, - "textRun": { - "content": "7-Zip 22.01 (x64) : Copyright (c) 1999-2022 Igor Pavlov : 2022-07-15\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13360 - }, - { - "endIndex": 13430, - "paragraph": { - "elements": [ - { - "endIndex": 13430, - "startIndex": 13429, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13429 - }, - { - "endIndex": 13463, - "paragraph": { - "elements": [ - { - "endIndex": 13463, - "startIndex": 13430, - "textRun": { - "content": "Scanning the drive for archives:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13430 - }, - { - "endIndex": 13495, - "paragraph": { - "elements": [ - { - "endIndex": 13495, - "startIndex": 13463, - "textRun": { - "content": "1 file, 19087360 bytes (19 MiB)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13463 - }, - { - "endIndex": 13496, - "paragraph": { - "elements": [ - { - "endIndex": 13496, - "startIndex": 13495, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13495 - }, - { - "endIndex": 13536, - "paragraph": { - "elements": [ - { - "endIndex": 13536, - "startIndex": 13496, - "textRun": { - "content": "Extracting archive: .\\duktape-2.7.0.tar\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13496 - }, - { - "endIndex": 13539, - "paragraph": { - "elements": [ - { - "endIndex": 13539, - "startIndex": 13536, - "textRun": { - "content": "--\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13536 - }, - { - "endIndex": 13566, - "paragraph": { - "elements": [ - { - "endIndex": 13566, - "startIndex": 13539, - "textRun": { - "content": "Path = .\\duktape-2.7.0.tar\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13539 - }, - { - "endIndex": 13577, - "paragraph": { - "elements": [ - { - "endIndex": 13577, - "startIndex": 13566, - "textRun": { - "content": "Type = tar\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13566 - }, - { - "endIndex": 13602, - "paragraph": { - "elements": [ - { - "endIndex": 13602, - "startIndex": 13577, - "textRun": { - "content": "Physical Size = 19087360\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13577 - }, - { - "endIndex": 13624, - "paragraph": { - "elements": [ - { - "endIndex": 13624, - "startIndex": 13602, - "textRun": { - "content": "Headers Size = 543232\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13602 - }, - { - "endIndex": 13642, - "paragraph": { - "elements": [ - { - "endIndex": 13642, - "startIndex": 13624, - "textRun": { - "content": "Code Page = UTF-8\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13624 - }, - { - "endIndex": 13670, - "paragraph": { - "elements": [ - { - "endIndex": 13670, - "startIndex": 13642, - "textRun": { - "content": "Characteristics = GNU ASCII\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13642 - }, - { - "endIndex": 13671, - "paragraph": { - "elements": [ - { - "endIndex": 13671, - "startIndex": 13670, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13670 - }, - { - "endIndex": 13688, - "paragraph": { - "elements": [ - { - "endIndex": 13688, - "startIndex": 13671, - "textRun": { - "content": "Everything is Ok\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13671 - }, - { - "endIndex": 13689, - "paragraph": { - "elements": [ - { - "endIndex": 13689, - "startIndex": 13688, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13688 - }, - { - "endIndex": 13701, - "paragraph": { - "elements": [ - { - "endIndex": 13701, - "startIndex": 13689, - "textRun": { - "content": "Folders: 46\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13689 - }, - { - "endIndex": 13713, - "paragraph": { - "elements": [ - { - "endIndex": 13713, - "startIndex": 13701, - "textRun": { - "content": "Files: 1004\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13701 - }, - { - "endIndex": 13734, - "paragraph": { - "elements": [ - { - "endIndex": 13734, - "startIndex": 13713, - "textRun": { - "content": "Size: 18281564\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13713 - }, - { - "endIndex": 13755, - "paragraph": { - "elements": [ - { - "endIndex": 13755, - "startIndex": 13734, - "textRun": { - "content": "Compressed: 19087360\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13734 - } - ], - "endIndex": 13755, - "startIndex": 13329, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 13757, - "paragraph": { - "elements": [ - { - "endIndex": 13757, - "startIndex": 13756, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13756 - }, - { - "endIndex": 13837, - "paragraph": { - "elements": [ - { - "endIndex": 13787, - "startIndex": 13757, - "textRun": { - "content": "On modern linux environments, ", - "textStyle": {} - } - }, - { - "endIndex": 13790, - "startIndex": 13787, - "textRun": { - "content": "tar", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13837, - "startIndex": 13790, - "textRun": { - "content": " extracts the contents in one step as follows.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13757 - }, - { - "endIndex": 13838, - "paragraph": { - "elements": [ - { - "endIndex": 13838, - "startIndex": 13837, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13837 - }, - { - "endIndex": 14252, - "startIndex": 13838, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 14251, - "startIndex": 13839, - "tableCells": [ - { - "content": [ - { - "endIndex": 13873, - "paragraph": { - "elements": [ - { - "endIndex": 13873, - "startIndex": 13841, - "textRun": { - "content": "$ tar xvf duktape-2.7.0.tar.xz \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13841 - }, - { - "endIndex": 13890, - "paragraph": { - "elements": [ - { - "endIndex": 13890, - "startIndex": 13873, - "textRun": { - "content": "x duktape-2.7.0/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13873 - }, - { - "endIndex": 13917, - "paragraph": { - "elements": [ - { - "endIndex": 13917, - "startIndex": 13890, - "textRun": { - "content": "x duktape-2.7.0/README.rst\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13890 - }, - { - "endIndex": 13956, - "paragraph": { - "elements": [ - { - "endIndex": 13956, - "startIndex": 13917, - "textRun": { - "content": "x duktape-2.7.0/Makefile.sharedlibrary\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13917 - }, - { - "endIndex": 13988, - "paragraph": { - "elements": [ - { - "endIndex": 13988, - "startIndex": 13956, - "textRun": { - "content": "x duktape-2.7.0/Makefile.coffee\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13956 - }, - { - "endIndex": 14012, - "paragraph": { - "elements": [ - { - "endIndex": 14012, - "startIndex": 13988, - "textRun": { - "content": "x duktape-2.7.0/extras/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13988 - }, - { - "endIndex": 14046, - "paragraph": { - "elements": [ - { - "endIndex": 14046, - "startIndex": 14012, - "textRun": { - "content": "x duktape-2.7.0/extras/README.rst\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14012 - }, - { - "endIndex": 14082, - "paragraph": { - "elements": [ - { - "endIndex": 14082, - "startIndex": 14046, - "textRun": { - "content": "x duktape-2.7.0/extras/module-node/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14046 - }, - { - "endIndex": 14128, - "paragraph": { - "elements": [ - { - "endIndex": 14128, - "startIndex": 14082, - "textRun": { - "content": "x duktape-2.7.0/extras/module-node/README.rst\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14082 - }, - { - "endIndex": 14181, - "paragraph": { - "elements": [ - { - "endIndex": 14181, - "startIndex": 14128, - "textRun": { - "content": "x duktape-2.7.0/extras/module-node/duk_module_node.h\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14128 - }, - { - "endIndex": 14225, - "paragraph": { - "elements": [ - { - "endIndex": 14225, - "startIndex": 14181, - "textRun": { - "content": "x duktape-2.7.0/extras/module-node/Makefile\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14181 - }, - { - "endIndex": 14251, - "paragraph": { - "elements": [ - { - "endIndex": 14251, - "startIndex": 14225, - "textRun": { - "content": "[... and many more files]\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14225 - } - ], - "endIndex": 14251, - "startIndex": 13840, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 14253, - "paragraph": { - "elements": [ - { - "endIndex": 14253, - "startIndex": 14252, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 14252 - }, - { - "endIndex": 14269, - "paragraph": { - "elements": [ - { - "endIndex": 14268, - "startIndex": 14253, - "textRun": { - "content": "Installing LLVM", - "textStyle": {} - } - }, - { - "endIndex": 14269, - "startIndex": 14268, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.denvsm5fj2dh", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 14253 - }, - { - "endIndex": 14270, - "paragraph": { - "elements": [ - { - "endIndex": 14270, - "startIndex": 14269, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14269 - }, - { - "endIndex": 14388, - "paragraph": { - "elements": [ - { - "endIndex": 14277, - "startIndex": 14270, - "textRun": { - "content": "To use ", - "textStyle": {} - } - }, - { - "endIndex": 14283, - "startIndex": 14277, - "textRun": { - "content": "ffigen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14297, - "startIndex": 14283, - "textRun": { - "content": ", you need to ", - "textStyle": {} - } - }, - { - "endIndex": 14309, - "startIndex": 14297, - "textRun": { - "content": "install LLVM", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/ffigen#installing-llvm" - }, - "underline": true - } - } - }, - { - "endIndex": 14310, - "startIndex": 14309, - "textRun": { - "content": ",", - "textStyle": {} - } - }, - { - "endIndex": 14316, - "startIndex": 14310, - "textRun": { - "content": " which", - "textStyle": {} - } - }, - { - "endIndex": 14317, - "startIndex": 14316, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 14324, - "startIndex": 14317, - "textRun": { - "content": "ffigen ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 14388, - "startIndex": 14324, - "textRun": { - "content": "uses to parse C headers. On Windows, run the following command.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14270 - }, - { - "endIndex": 14389, - "paragraph": { - "elements": [ - { - "endIndex": 14389, - "startIndex": 14388, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14388 - }, - { - "endIndex": 14853, - "startIndex": 14389, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 14852, - "startIndex": 14390, - "tableCells": [ - { - "content": [ - { - "endIndex": 14429, - "paragraph": { - "elements": [ - { - "endIndex": 14429, - "startIndex": 14392, - "textRun": { - "content": "PS> winget install -e --id LLVM.LLVM\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14392 - }, - { - "endIndex": 14467, - "paragraph": { - "elements": [ - { - "endIndex": 14467, - "startIndex": 14429, - "textRun": { - "content": "Found LLVM [LLVM.LLVM] Version 15.0.5\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14429 - }, - { - "endIndex": 14517, - "paragraph": { - "elements": [ - { - "endIndex": 14517, - "startIndex": 14467, - "textRun": { - "content": "This application is licensed to you by its owner.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14467 - }, - { - "endIndex": 14608, - "paragraph": { - "elements": [ - { - "endIndex": 14608, - "startIndex": 14517, - "textRun": { - "content": "Microsoft is not responsible for, nor does it grant any licenses to, third-party packages.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14517 - }, - { - "endIndex": 14712, - "paragraph": { - "elements": [ - { - "endIndex": 14712, - "startIndex": 14608, - "textRun": { - "content": "Downloading https://github.com/llvm/llvm-project/releases/download/llvmorg-15.0.5/LLVM-15.0.5-win64.exe\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14608 - }, - { - "endIndex": 14764, - "paragraph": { - "elements": [ - { - "endIndex": 14764, - "startIndex": 14712, - "textRun": { - "content": " ██████████████████████████████ 277 MB / 277 MB\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14712 - }, - { - "endIndex": 14801, - "paragraph": { - "elements": [ - { - "endIndex": 14801, - "startIndex": 14764, - "textRun": { - "content": "Successfully verified installer hash\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14764 - }, - { - "endIndex": 14829, - "paragraph": { - "elements": [ - { - "endIndex": 14829, - "startIndex": 14801, - "textRun": { - "content": "Starting package install...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14801 - }, - { - "endIndex": 14852, - "paragraph": { - "elements": [ - { - "endIndex": 14852, - "startIndex": 14829, - "textRun": { - "content": "Successfully installed\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 14829 - } - ], - "endIndex": 14852, - "startIndex": 14391, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 14854, - "paragraph": { - "elements": [ - { - "endIndex": 14854, - "startIndex": 14853, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14853 - }, - { - "endIndex": 15062, - "paragraph": { - "elements": [ - { - "endIndex": 14889, - "startIndex": 14854, - "textRun": { - "content": "Configure your system paths to add ", - "textStyle": {} - } - }, - { - "endIndex": 14914, - "startIndex": 14889, - "textRun": { - "content": "C:\\Program Files\\LLVM\\bin", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 15062, - "startIndex": 14914, - "textRun": { - "content": " to your binary search path to complete the installation of LLVM on your Windows machine. You can test if it’s been correctly installed as follows.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14854 - }, - { - "endIndex": 15063, - "paragraph": { - "elements": [ - { - "endIndex": 15063, - "startIndex": 15062, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15062 - }, - { - "endIndex": 15199, - "startIndex": 15063, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 15198, - "startIndex": 15064, - "tableCells": [ - { - "content": [ - { - "endIndex": 15086, - "paragraph": { - "elements": [ - { - "endIndex": 15086, - "startIndex": 15066, - "textRun": { - "content": "PS> clang --version\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15066 - }, - { - "endIndex": 15107, - "paragraph": { - "elements": [ - { - "endIndex": 15107, - "startIndex": 15086, - "textRun": { - "content": "clang version 15.0.5\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15086 - }, - { - "endIndex": 15138, - "paragraph": { - "elements": [ - { - "endIndex": 15138, - "startIndex": 15107, - "textRun": { - "content": "Target: x86_64-pc-windows-msvc\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15107 - }, - { - "endIndex": 15158, - "paragraph": { - "elements": [ - { - "endIndex": 15158, - "startIndex": 15138, - "textRun": { - "content": "Thread model: posix\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15138 - }, - { - "endIndex": 15198, - "paragraph": { - "elements": [ - { - "endIndex": 15198, - "startIndex": 15158, - "textRun": { - "content": "InstalledDir: C:\\Program Files\\LLVM\\bin\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15158 - } - ], - "endIndex": 15198, - "startIndex": 15065, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 15200, - "paragraph": { - "elements": [ - { - "endIndex": 15200, - "startIndex": 15199, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15199 - }, - { - "endIndex": 15333, - "paragraph": { - "elements": [ - { - "endIndex": 15333, - "startIndex": 15200, - "textRun": { - "content": "For Ubuntu, the LLVM dependency can be installed as follows. Other Linux distributions have similar dependencies for LLVM and Clang.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15200 - }, - { - "endIndex": 15334, - "paragraph": { - "elements": [ - { - "endIndex": 15334, - "startIndex": 15333, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 15333 - }, - { - "endIndex": 16681, - "startIndex": 15334, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16680, - "startIndex": 15335, - "tableCells": [ - { - "content": [ - { - "endIndex": 15369, - "paragraph": { - "elements": [ - { - "endIndex": 15369, - "startIndex": 15337, - "textRun": { - "content": "$ sudo apt install libclang-dev\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15337 - }, - { - "endIndex": 15397, - "paragraph": { - "elements": [ - { - "endIndex": 15397, - "startIndex": 15369, - "textRun": { - "content": "[sudo] password for brett: \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15369 - }, - { - "endIndex": 15427, - "paragraph": { - "elements": [ - { - "endIndex": 15427, - "startIndex": 15397, - "textRun": { - "content": "Reading package lists... Done\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15397 - }, - { - "endIndex": 15460, - "paragraph": { - "elements": [ - { - "endIndex": 15460, - "startIndex": 15427, - "textRun": { - "content": "Building dependency tree... Done\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15427 - }, - { - "endIndex": 15494, - "paragraph": { - "elements": [ - { - "endIndex": 15494, - "startIndex": 15460, - "textRun": { - "content": "Reading state information... Done\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15460 - }, - { - "endIndex": 15547, - "paragraph": { - "elements": [ - { - "endIndex": 15547, - "startIndex": 15494, - "textRun": { - "content": "The following additional packages will be installed:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15494 - }, - { - "endIndex": 15565, - "paragraph": { - "elements": [ - { - "endIndex": 15565, - "startIndex": 15547, - "textRun": { - "content": " libclang-15-dev\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15547 - }, - { - "endIndex": 15611, - "paragraph": { - "elements": [ - { - "endIndex": 15611, - "startIndex": 15565, - "textRun": { - "content": "The following NEW packages will be installed:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15565 - }, - { - "endIndex": 15642, - "paragraph": { - "elements": [ - { - "endIndex": 15642, - "startIndex": 15611, - "textRun": { - "content": " libclang-15-dev libclang-dev\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15611 - }, - { - "endIndex": 15705, - "paragraph": { - "elements": [ - { - "endIndex": 15705, - "startIndex": 15642, - "textRun": { - "content": "0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15642 - }, - { - "endIndex": 15738, - "paragraph": { - "elements": [ - { - "endIndex": 15738, - "startIndex": 15705, - "textRun": { - "content": "Need to get 26.1 MB of archives.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15705 - }, - { - "endIndex": 15806, - "paragraph": { - "elements": [ - { - "endIndex": 15806, - "startIndex": 15738, - "textRun": { - "content": "After this operation, 260 MB of additional disk space will be used.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15738 - }, - { - "endIndex": 15839, - "paragraph": { - "elements": [ - { - "endIndex": 15839, - "startIndex": 15806, - "textRun": { - "content": "Do you want to continue? [Y/n] y\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15806 - }, - { - "endIndex": 15944, - "paragraph": { - "elements": [ - { - "endIndex": 15944, - "startIndex": 15839, - "textRun": { - "content": "Get:1 http://archive.ubuntu.com/ubuntu kinetic/universe amd64 libclang-15-dev amd64 1:15.0.2-1 [26.1 MB]\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15839 - }, - { - "endIndex": 16059, - "paragraph": { - "elements": [ - { - "endIndex": 16059, - "startIndex": 15944, - "textRun": { - "content": "Get:2 http://archive.ubuntu.com/ubuntu kinetic/universe amd64 libclang-dev amd64 1:15.0-55.1ubuntu1 [2962 B] \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 15944 - }, - { - "endIndex": 16174, - "paragraph": { - "elements": [ - { - "endIndex": 16174, - "startIndex": 16059, - "textRun": { - "content": "Fetched 26.1 MB in 7s (3748 kB/s) \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16059 - }, - { - "endIndex": 16231, - "paragraph": { - "elements": [ - { - "endIndex": 16231, - "startIndex": 16174, - "textRun": { - "content": "Selecting previously unselected package libclang-15-dev.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16174 - }, - { - "endIndex": 16303, - "paragraph": { - "elements": [ - { - "endIndex": 16303, - "startIndex": 16231, - "textRun": { - "content": "(Reading database ... 85898 files and directories currently installed.)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16231 - }, - { - "endIndex": 16370, - "paragraph": { - "elements": [ - { - "endIndex": 16370, - "startIndex": 16303, - "textRun": { - "content": "Preparing to unpack .../libclang-15-dev_1%3a15.0.2-1_amd64.deb ...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16303 - }, - { - "endIndex": 16413, - "paragraph": { - "elements": [ - { - "endIndex": 16413, - "startIndex": 16370, - "textRun": { - "content": "Unpacking libclang-15-dev (1:15.0.2-1) ...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16370 - }, - { - "endIndex": 16467, - "paragraph": { - "elements": [ - { - "endIndex": 16467, - "startIndex": 16413, - "textRun": { - "content": "Selecting previously unselected package libclang-dev.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16413 - }, - { - "endIndex": 16539, - "paragraph": { - "elements": [ - { - "endIndex": 16539, - "startIndex": 16467, - "textRun": { - "content": "Preparing to unpack .../libclang-dev_1%3a15.0-55.1ubuntu1_amd64.deb ...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16467 - }, - { - "endIndex": 16587, - "paragraph": { - "elements": [ - { - "endIndex": 16587, - "startIndex": 16539, - "textRun": { - "content": "Unpacking libclang-dev (1:15.0-55.1ubuntu1) ...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16539 - }, - { - "endIndex": 16631, - "paragraph": { - "elements": [ - { - "endIndex": 16631, - "startIndex": 16587, - "textRun": { - "content": "Setting up libclang-15-dev (1:15.0.2-1) ...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16587 - }, - { - "endIndex": 16680, - "paragraph": { - "elements": [ - { - "endIndex": 16679, - "startIndex": 16631, - "textRun": { - "content": "Setting up libclang-dev (1:15.0-55.1ubuntu1) ...", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 16680, - "startIndex": 16679, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16631 - } - ], - "endIndex": 16680, - "startIndex": 15336, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16682, - "paragraph": { - "elements": [ - { - "endIndex": 16682, - "startIndex": 16681, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 16681 - }, - { - "endIndex": 16749, - "paragraph": { - "elements": [ - { - "endIndex": 16749, - "startIndex": 16682, - "textRun": { - "content": "As above, you can test your LLVM installation on Linux as follows.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 16682 - }, - { - "endIndex": 16750, - "paragraph": { - "elements": [ - { - "endIndex": 16750, - "startIndex": 16749, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 16749 - }, - { - "endIndex": 16873, - "startIndex": 16750, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16872, - "startIndex": 16751, - "tableCells": [ - { - "content": [ - { - "endIndex": 16771, - "paragraph": { - "elements": [ - { - "endIndex": 16771, - "startIndex": 16753, - "textRun": { - "content": "$ clang --version\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16753 - }, - { - "endIndex": 16801, - "paragraph": { - "elements": [ - { - "endIndex": 16801, - "startIndex": 16771, - "textRun": { - "content": "Ubuntu clang version 15.0.2-1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16771 - }, - { - "endIndex": 16829, - "paragraph": { - "elements": [ - { - "endIndex": 16829, - "startIndex": 16801, - "textRun": { - "content": "Target: x86_64-pc-linux-gnu\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16801 - }, - { - "endIndex": 16849, - "paragraph": { - "elements": [ - { - "endIndex": 16849, - "startIndex": 16829, - "textRun": { - "content": "Thread model: posix\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16829 - }, - { - "endIndex": 16872, - "paragraph": { - "elements": [ - { - "endIndex": 16872, - "startIndex": 16849, - "textRun": { - "content": "InstalledDir: /usr/bin\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16849 - } - ], - "endIndex": 16872, - "startIndex": 16752, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16874, - "paragraph": { - "elements": [ - { - "endIndex": 16874, - "startIndex": 16873, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 16873 - }, - { - "endIndex": 16893, - "paragraph": { - "elements": [ - { - "endIndex": 16886, - "startIndex": 16874, - "textRun": { - "content": "Configuring ", - "textStyle": {} - } - }, - { - "endIndex": 16893, - "startIndex": 16886, - "textRun": { - "content": "ffigen\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.g2fuqh54soj9", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 16874 - }, - { - "endIndex": 16894, - "paragraph": { - "elements": [ - { - "endIndex": 16894, - "startIndex": 16893, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 16893 - }, - { - "endIndex": 17073, - "paragraph": { - "elements": [ - { - "endIndex": 16927, - "startIndex": 16894, - "textRun": { - "content": "The template generated top-level ", - "textStyle": {} - } - }, - { - "endIndex": 16939, - "startIndex": 16927, - "textRun": { - "content": "pubpsec.yaml", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16976, - "startIndex": 16939, - "textRun": { - "content": " might have outdated versions of the ", - "textStyle": {} - } - }, - { - "endIndex": 16982, - "startIndex": 16976, - "textRun": { - "content": "ffigen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17073, - "startIndex": 16982, - "textRun": { - "content": " package. Run the following command to update the Dart dependencies in the plugin project:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16894 - }, - { - "endIndex": 17074, - "paragraph": { - "elements": [ - { - "endIndex": 17074, - "startIndex": 17073, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17073 - }, - { - "endIndex": 17117, - "startIndex": 17074, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 17116, - "startIndex": 17075, - "tableCells": [ - { - "content": [ - { - "endIndex": 17116, - "paragraph": { - "elements": [ - { - "endIndex": 17116, - "startIndex": 17077, - "textRun": { - "content": "$ flutter pub upgrade --major-versions\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17077 - } - ], - "endIndex": 17116, - "startIndex": 17076, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 30.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 17118, - "paragraph": { - "elements": [ - { - "endIndex": 17118, - "startIndex": 17117, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 17117 - }, - { - "endIndex": 17319, - "paragraph": { - "elements": [ - { - "endIndex": 17131, - "startIndex": 17118, - "textRun": { - "content": "Now that the ", - "textStyle": {} - } - }, - { - "endIndex": 17137, - "startIndex": 17131, - "textRun": { - "content": "ffigen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17188, - "startIndex": 17137, - "textRun": { - "content": " package is up-to-date, next configure which files ", - "textStyle": {} - } - }, - { - "endIndex": 17194, - "startIndex": 17188, - "textRun": { - "content": "ffigen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17278, - "startIndex": 17194, - "textRun": { - "content": " will consume to generate the binding files. Modify the contents of your project’s ", - "textStyle": {} - } - }, - { - "endIndex": 17289, - "startIndex": 17278, - "textRun": { - "content": "ffigen.yaml", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 17319, - "startIndex": 17289, - "textRun": { - "content": " file to match the following.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 17118 - }, - { - "endIndex": 17331, - "paragraph": { - "elements": [ - { - "endIndex": 17330, - "startIndex": 17319, - "textRun": { - "content": "ffigen.yaml", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/ffigen_codelab/step_05/ffigen.yaml" - }, - "underline": true - } - } - }, - { - "endIndex": 17331, - "startIndex": 17330, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.44ekcwgq5esg", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 17319 - }, - { - "endIndex": 17858, - "startIndex": 17331, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 17857, - "startIndex": 17332, - "tableCells": [ - { - "content": [ - { - "endIndex": 17392, - "paragraph": { - "elements": [ - { - "endIndex": 17392, - "startIndex": 17334, - "textRun": { - "content": "# Run with `flutter pub run ffigen --config ffigen.yaml`.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17334 - }, - { - "endIndex": 17414, - "paragraph": { - "elements": [ - { - "endIndex": 17414, - "startIndex": 17392, - "textRun": { - "content": "name: DuktapeBindings\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17392 - }, - { - "endIndex": 17429, - "paragraph": { - "elements": [ - { - "endIndex": 17429, - "startIndex": 17414, - "textRun": { - "content": "description: |\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17414 - }, - { - "endIndex": 17461, - "paragraph": { - "elements": [ - { - "endIndex": 17461, - "startIndex": 17429, - "textRun": { - "content": " Bindings for `src/duktape.h`.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17429 - }, - { - "endIndex": 17462, - "paragraph": { - "elements": [ - { - "endIndex": 17462, - "startIndex": 17461, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17461 - }, - { - "endIndex": 17536, - "paragraph": { - "elements": [ - { - "endIndex": 17536, - "startIndex": 17462, - "textRun": { - "content": " Regenerate bindings with `flutter pub run ffigen --config ffigen.yaml`.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17462 - }, - { - "endIndex": 17582, - "paragraph": { - "elements": [ - { - "endIndex": 17582, - "startIndex": 17536, - "textRun": { - "content": "output: 'lib/duktape_bindings_generated.dart'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17536 - }, - { - "endIndex": 17591, - "paragraph": { - "elements": [ - { - "endIndex": 17591, - "startIndex": 17582, - "textRun": { - "content": "headers:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17582 - }, - { - "endIndex": 17607, - "paragraph": { - "elements": [ - { - "endIndex": 17607, - "startIndex": 17591, - "textRun": { - "content": " entry-points:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17591 - }, - { - "endIndex": 17629, - "paragraph": { - "elements": [ - { - "endIndex": 17629, - "startIndex": 17607, - "textRun": { - "content": " - 'src/duktape.h'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17607 - }, - { - "endIndex": 17651, - "paragraph": { - "elements": [ - { - "endIndex": 17651, - "startIndex": 17629, - "textRun": { - "content": " include-directives:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17629 - }, - { - "endIndex": 17673, - "paragraph": { - "elements": [ - { - "endIndex": 17673, - "startIndex": 17651, - "textRun": { - "content": " - 'src/duktape.h'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17651 - }, - { - "endIndex": 17685, - "paragraph": { - "elements": [ - { - "endIndex": 17685, - "startIndex": 17673, - "textRun": { - "content": "preamble: |\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17673 - }, - { - "endIndex": 17728, - "paragraph": { - "elements": [ - { - "endIndex": 17728, - "startIndex": 17685, - "textRun": { - "content": " // ignore_for_file: always_specify_types\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17685 - }, - { - "endIndex": 17767, - "paragraph": { - "elements": [ - { - "endIndex": 17767, - "startIndex": 17728, - "textRun": { - "content": " // ignore_for_file: camel_case_types\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17728 - }, - { - "endIndex": 17819, - "paragraph": { - "elements": [ - { - "endIndex": 17819, - "startIndex": 17767, - "textRun": { - "content": " // ignore_for_file: non_constant_identifier_names\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17767 - }, - { - "endIndex": 17829, - "paragraph": { - "elements": [ - { - "endIndex": 17829, - "startIndex": 17819, - "textRun": { - "content": "comments:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17819 - }, - { - "endIndex": 17842, - "paragraph": { - "elements": [ - { - "endIndex": 17842, - "startIndex": 17829, - "textRun": { - "content": " style: any\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17829 - }, - { - "endIndex": 17857, - "paragraph": { - "elements": [ - { - "endIndex": 17857, - "startIndex": 17842, - "textRun": { - "content": " length: full\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17842 - } - ], - "endIndex": 17857, - "startIndex": 17333, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 33.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 17859, - "paragraph": { - "elements": [ - { - "endIndex": 17859, - "startIndex": 17858, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 17858 - }, - { - "endIndex": 18122, - "paragraph": { - "elements": [ - { - "endIndex": 18057, - "startIndex": 17859, - "textRun": { - "content": "This configuration includes the C header file to pass to LLVM, the output file to generate, the description to put at the top of the file, and a preamble section used to add a lint warning. See the ", - "textStyle": {} - } - }, - { - "endIndex": 18063, - "startIndex": 18057, - "textRun": { - "content": "ffigen", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/ffigen#configurations" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18077, - "startIndex": 18063, - "textRun": { - "content": " documentation", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/ffigen#configurations" - }, - "underline": true - } - } - }, - { - "endIndex": 18122, - "startIndex": 18077, - "textRun": { - "content": " for further details on the keys and values.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 17859 - }, - { - "endIndex": 18123, - "paragraph": { - "elements": [ - { - "endIndex": 18123, - "startIndex": 18122, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18122 - }, - { - "endIndex": 18253, - "paragraph": { - "elements": [ - { - "endIndex": 18217, - "startIndex": 18123, - "textRun": { - "content": "You need to copy specific Duktape files from the Duktape distribution into the location where ", - "textStyle": {} - } - }, - { - "endIndex": 18223, - "startIndex": 18217, - "textRun": { - "content": "ffigen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18238, - "startIndex": 18223, - "textRun": { - "content": " is configured ", - "textStyle": {} - } - }, - { - "endIndex": 18253, - "startIndex": 18238, - "textRun": { - "content": "to find them. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18123 - }, - { - "endIndex": 18254, - "paragraph": { - "elements": [ - { - "endIndex": 18254, - "startIndex": 18253, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18253 - }, - { - "endIndex": 18375, - "startIndex": 18254, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 18374, - "startIndex": 18255, - "tableCells": [ - { - "content": [ - { - "endIndex": 18295, - "paragraph": { - "elements": [ - { - "endIndex": 18295, - "startIndex": 18257, - "textRun": { - "content": "$ cp duktape-2.7.0/src/duktape.c src/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18257 - }, - { - "endIndex": 18333, - "paragraph": { - "elements": [ - { - "endIndex": 18333, - "startIndex": 18295, - "textRun": { - "content": "$ cp duktape-2.7.0/src/duktape.h src/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18295 - }, - { - "endIndex": 18374, - "paragraph": { - "elements": [ - { - "endIndex": 18374, - "startIndex": 18333, - "textRun": { - "content": "$ cp duktape-2.7.0/src/duk_config.h src/\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18333 - } - ], - "endIndex": 18374, - "startIndex": 18256, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 18376, - "paragraph": { - "elements": [ - { - "endIndex": 18376, - "startIndex": 18375, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18375 - }, - { - "endIndex": 18561, - "paragraph": { - "elements": [ - { - "endIndex": 18418, - "startIndex": 18376, - "textRun": { - "content": "Technically, you only need to copy across ", - "textStyle": {} - } - }, - { - "endIndex": 18427, - "startIndex": 18418, - "textRun": { - "content": "duktape.h", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18432, - "startIndex": 18427, - "textRun": { - "content": " for ", - "textStyle": {} - } - }, - { - "endIndex": 18438, - "startIndex": 18432, - "textRun": { - "content": "ffigen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18524, - "startIndex": 18438, - "textRun": { - "content": ", but you are about to configure CMake to build the library that needs all three. Run ", - "textStyle": {} - } - }, - { - "endIndex": 18530, - "startIndex": 18524, - "textRun": { - "content": "ffigen", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 18560, - "startIndex": 18530, - "textRun": { - "content": " to generate the new binding: ", - "textStyle": {} - } - }, - { - "endIndex": 18561, - "startIndex": 18560, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18376 - }, - { - "endIndex": 18562, - "paragraph": { - "elements": [ - { - "endIndex": 18562, - "startIndex": 18561, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18561 - }, - { - "endIndex": 19305, - "startIndex": 18562, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 19304, - "startIndex": 18563, - "tableCells": [ - { - "content": [ - { - "endIndex": 18612, - "paragraph": { - "elements": [ - { - "endIndex": 18612, - "startIndex": 18565, - "textRun": { - "content": "$ flutter pub run ffigen --config ffigen.yaml \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18565 - }, - { - "endIndex": 18687, - "paragraph": { - "elements": [ - { - "endIndex": 18687, - "startIndex": 18612, - "textRun": { - "content": "Running in Directory: '/home/brett/GitHub/codelabs/ffigen_codelab/step_05'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18612 - }, - { - "endIndex": 18720, - "paragraph": { - "elements": [ - { - "endIndex": 18720, - "startIndex": 18687, - "textRun": { - "content": "Input Headers: [./src/duktape.h]\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18687 - }, - { - "endIndex": 18903, - "paragraph": { - "elements": [ - { - "endIndex": 18903, - "startIndex": 18720, - "textRun": { - "content": "[WARNING]: No definition found for declaration - (Cursor) spelling: duk_hthread, kind: 2, kindSpelling: StructDecl, type: 105, typeSpelling: struct duk_hthread, usr: c:@S@duk_hthread\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18720 - }, - { - "endIndex": 19086, - "paragraph": { - "elements": [ - { - "endIndex": 19086, - "startIndex": 18903, - "textRun": { - "content": "[WARNING]: No definition found for declaration - (Cursor) spelling: duk_hthread, kind: 2, kindSpelling: StructDecl, type: 105, typeSpelling: struct duk_hthread, usr: c:@S@duk_hthread\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 18903 - }, - { - "endIndex": 19183, - "paragraph": { - "elements": [ - { - "endIndex": 19183, - "startIndex": 19086, - "textRun": { - "content": "[WARNING]: Generated declaration '__va_list_tag' start's with '_' and therefore will be private.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19086 - }, - { - "endIndex": 19304, - "paragraph": { - "elements": [ - { - "endIndex": 19304, - "startIndex": 19183, - "textRun": { - "content": "Finished, Bindings generated in /home/brett/GitHub/codelabs/ffigen_codelab/step_05/./lib/duktape_bindings_generated.dart\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19183 - } - ], - "endIndex": 19304, - "startIndex": 18564, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 84.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 19306, - "paragraph": { - "elements": [ - { - "endIndex": 19306, - "startIndex": 19305, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19305 - }, - { - "endIndex": 19473, - "paragraph": { - "elements": [ - { - "endIndex": 19436, - "startIndex": 19306, - "textRun": { - "content": "You will see different warnings on each operating system. You can ignore these for now, as Duktape 2.7.0 is known to compile with ", - "textStyle": {} - } - }, - { - "endIndex": 19441, - "startIndex": 19436, - "textRun": { - "content": "clang", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19473, - "startIndex": 19441, - "textRun": { - "content": " on Windows, Linux, and macOS. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19306 - }, - { - "endIndex": 19491, - "paragraph": { - "elements": [ - { - "endIndex": 19491, - "startIndex": 19473, - "textRun": { - "content": "Configuring CMake\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.3qzynwujl6uj", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 19473 - }, - { - "endIndex": 19492, - "paragraph": { - "elements": [ - { - "endIndex": 19492, - "startIndex": 19491, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 19491 - }, - { - "endIndex": 19753, - "paragraph": { - "elements": [ - { - "endIndex": 19497, - "startIndex": 19492, - "textRun": { - "content": "CMake", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://cmake.org/" - }, - "underline": true - } - } - }, - { - "endIndex": 19498, - "startIndex": 19497, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 19753, - "startIndex": 19498, - "textRun": { - "content": "is a build system generation system. This plugin uses CMake to generate the build system for Android, Windows, and Linux to include Duktape into the generated Flutter binary. You need to modify the template generated CMake configuration file as follows. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19492 - }, - { - "endIndex": 19772, - "paragraph": { - "elements": [ - { - "endIndex": 19771, - "startIndex": 19753, - "textRun": { - "content": "src/CMakeLists.txt", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/ffigen_codelab/step_05/src/CMakeLists.txt" - }, - "underline": true - } - } - }, - { - "endIndex": 19772, - "startIndex": 19771, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.87ers97zlebw", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 19753 - }, - { - "endIndex": 20303, - "startIndex": 19772, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 20302, - "startIndex": 19773, - "tableCells": [ - { - "content": [ - { - "endIndex": 19812, - "paragraph": { - "elements": [ - { - "endIndex": 19812, - "startIndex": 19775, - "textRun": { - "content": "cmake_minimum_required(VERSION 3.10)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19775 - }, - { - "endIndex": 19813, - "paragraph": { - "elements": [ - { - "endIndex": 19813, - "startIndex": 19812, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19812 - }, - { - "endIndex": 19867, - "paragraph": { - "elements": [ - { - "endIndex": 19867, - "startIndex": 19813, - "textRun": { - "content": "project(ffigen_app_library VERSION 0.0.1 LANGUAGES C)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19813 - }, - { - "endIndex": 19868, - "paragraph": { - "elements": [ - { - "endIndex": 19868, - "startIndex": 19867, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19867 - }, - { - "endIndex": 19898, - "paragraph": { - "elements": [ - { - "endIndex": 19898, - "startIndex": 19868, - "textRun": { - "content": "add_library(ffigen_app SHARED\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19868 - }, - { - "endIndex": 19939, - "paragraph": { - "elements": [ - { - "endIndex": 19939, - "startIndex": 19898, - "textRun": { - "content": " duktape.c # Modify\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19898 - }, - { - "endIndex": 19941, - "paragraph": { - "elements": [ - { - "endIndex": 19941, - "startIndex": 19939, - "textRun": { - "content": ")\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19939 - }, - { - "endIndex": 19942, - "paragraph": { - "elements": [ - { - "endIndex": 19942, - "startIndex": 19941, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19941 - }, - { - "endIndex": 19986, - "paragraph": { - "elements": [ - { - "endIndex": 19986, - "startIndex": 19942, - "textRun": { - "content": "set_target_properties(ffigen_app PROPERTIES\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19942 - }, - { - "endIndex": 20027, - "paragraph": { - "elements": [ - { - "endIndex": 20027, - "startIndex": 19986, - "textRun": { - "content": " PUBLIC_HEADER duktape.h # Modify\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 19986 - }, - { - "endIndex": 20065, - "paragraph": { - "elements": [ - { - "endIndex": 20065, - "startIndex": 20027, - "textRun": { - "content": " PRIVATE_HEADER duk_config.h # Add\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20027 - }, - { - "endIndex": 20103, - "paragraph": { - "elements": [ - { - "endIndex": 20103, - "startIndex": 20065, - "textRun": { - "content": " OUTPUT_NAME \"ffigen_app\" # Add\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20065 - }, - { - "endIndex": 20105, - "paragraph": { - "elements": [ - { - "endIndex": 20105, - "startIndex": 20103, - "textRun": { - "content": ")\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20103 - }, - { - "endIndex": 20106, - "paragraph": { - "elements": [ - { - "endIndex": 20106, - "startIndex": 20105, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20105 - }, - { - "endIndex": 20123, - "paragraph": { - "elements": [ - { - "endIndex": 20123, - "startIndex": 20106, - "textRun": { - "content": "# Add from here…\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20106 - }, - { - "endIndex": 20134, - "paragraph": { - "elements": [ - { - "endIndex": 20134, - "startIndex": 20123, - "textRun": { - "content": "if (WIN32)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20123 - }, - { - "endIndex": 20178, - "paragraph": { - "elements": [ - { - "endIndex": 20178, - "startIndex": 20134, - "textRun": { - "content": "set_target_properties(ffigen_app PROPERTIES\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20134 - }, - { - "endIndex": 20210, - "paragraph": { - "elements": [ - { - "endIndex": 20210, - "startIndex": 20178, - "textRun": { - "content": " WINDOWS_EXPORT_ALL_SYMBOLS ON\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20178 - }, - { - "endIndex": 20212, - "paragraph": { - "elements": [ - { - "endIndex": 20212, - "startIndex": 20210, - "textRun": { - "content": ")\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20210 - }, - { - "endIndex": 20226, - "paragraph": { - "elements": [ - { - "endIndex": 20226, - "startIndex": 20212, - "textRun": { - "content": "endif (WIN32)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20212 - }, - { - "endIndex": 20239, - "paragraph": { - "elements": [ - { - "endIndex": 20239, - "startIndex": 20226, - "textRun": { - "content": "# … to here.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20226 - }, - { - "endIndex": 20240, - "paragraph": { - "elements": [ - { - "endIndex": 20240, - "startIndex": 20239, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20239 - }, - { - "endIndex": 20302, - "paragraph": { - "elements": [ - { - "endIndex": 20302, - "startIndex": 20240, - "textRun": { - "content": "target_compile_definitions(ffigen_app PUBLIC DART_SHARED_LIB)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20240 - } - ], - "endIndex": 20302, - "startIndex": 19774, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 27.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 20304, - "paragraph": { - "elements": [ - { - "endIndex": 20304, - "startIndex": 20303, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20303 - }, - { - "endIndex": 20593, - "paragraph": { - "elements": [ - { - "endIndex": 20593, - "startIndex": 20304, - "textRun": { - "content": "The CMake configuration adds the source files, and more importantly, modifies the default behavior of the generated library file on Windows to export all of the C symbols by default. This is a CMake work around to help port Unix-style libraries, which Duktape is, to the world of Windows.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 20304 - }, - { - "endIndex": 20594, - "paragraph": { - "elements": [ - { - "endIndex": 20594, - "startIndex": 20593, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20593 - }, - { - "endIndex": 20662, - "paragraph": { - "elements": [ - { - "endIndex": 20622, - "startIndex": 20594, - "textRun": { - "content": "Replace the contents of the ", - "textStyle": {} - } - }, - { - "endIndex": 20641, - "startIndex": 20622, - "textRun": { - "content": "lib/ffigen_app.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20662, - "startIndex": 20641, - "textRun": { - "content": " with the following.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 20594 - }, - { - "endIndex": 20682, - "paragraph": { - "elements": [ - { - "endIndex": 20681, - "startIndex": 20662, - "textRun": { - "content": "lib/ffigen_app.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/ffigen_codelab/step_05/lib/ffigen_app.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 20682, - "startIndex": 20681, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.qym0awkkkxpc", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 20662 - }, - { - "endIndex": 22015, - "startIndex": 20682, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 22014, - "startIndex": 20683, - "tableCells": [ - { - "content": [ - { - "endIndex": 20704, - "paragraph": { - "elements": [ - { - "endIndex": 20704, - "startIndex": 20685, - "textRun": { - "content": "import 'dart:ffi';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20685 - }, - { - "endIndex": 20722, - "paragraph": { - "elements": [ - { - "endIndex": 20722, - "startIndex": 20704, - "textRun": { - "content": "import 'dart:io';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20704 - }, - { - "endIndex": 20760, - "paragraph": { - "elements": [ - { - "endIndex": 20760, - "startIndex": 20722, - "textRun": { - "content": "import 'package:ffi/ffi.dart' as ffi;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20722 - }, - { - "endIndex": 20761, - "paragraph": { - "elements": [ - { - "endIndex": 20761, - "startIndex": 20760, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20760 - }, - { - "endIndex": 20803, - "paragraph": { - "elements": [ - { - "endIndex": 20803, - "startIndex": 20761, - "textRun": { - "content": "import 'duktape_bindings_generated.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20761 - }, - { - "endIndex": 20804, - "paragraph": { - "elements": [ - { - "endIndex": 20804, - "startIndex": 20803, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20803 - }, - { - "endIndex": 20842, - "paragraph": { - "elements": [ - { - "endIndex": 20842, - "startIndex": 20804, - "textRun": { - "content": "const String _libName = 'ffigen_app';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20804 - }, - { - "endIndex": 20843, - "paragraph": { - "elements": [ - { - "endIndex": 20843, - "startIndex": 20842, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20842 - }, - { - "endIndex": 20878, - "paragraph": { - "elements": [ - { - "endIndex": 20878, - "startIndex": 20843, - "textRun": { - "content": "final DynamicLibrary _dylib = () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20843 - }, - { - "endIndex": 20922, - "paragraph": { - "elements": [ - { - "endIndex": 20922, - "startIndex": 20878, - "textRun": { - "content": " if (Platform.isMacOS || Platform.isIOS) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20878 - }, - { - "endIndex": 20987, - "paragraph": { - "elements": [ - { - "endIndex": 20987, - "startIndex": 20922, - "textRun": { - "content": " return DynamicLibrary.open('$_libName.framework/$_libName');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20922 - }, - { - "endIndex": 20991, - "paragraph": { - "elements": [ - { - "endIndex": 20991, - "startIndex": 20987, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20987 - }, - { - "endIndex": 21039, - "paragraph": { - "elements": [ - { - "endIndex": 21039, - "startIndex": 20991, - "textRun": { - "content": " if (Platform.isAndroid || Platform.isLinux) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 20991 - }, - { - "endIndex": 21090, - "paragraph": { - "elements": [ - { - "endIndex": 21090, - "startIndex": 21039, - "textRun": { - "content": " return DynamicLibrary.open('lib$_libName.so');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21039 - }, - { - "endIndex": 21094, - "paragraph": { - "elements": [ - { - "endIndex": 21094, - "startIndex": 21090, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21090 - }, - { - "endIndex": 21122, - "paragraph": { - "elements": [ - { - "endIndex": 21122, - "startIndex": 21094, - "textRun": { - "content": " if (Platform.isWindows) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21094 - }, - { - "endIndex": 21171, - "paragraph": { - "elements": [ - { - "endIndex": 21171, - "startIndex": 21122, - "textRun": { - "content": " return DynamicLibrary.open('$_libName.dll');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21122 - }, - { - "endIndex": 21175, - "paragraph": { - "elements": [ - { - "endIndex": 21175, - "startIndex": 21171, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21171 - }, - { - "endIndex": 21250, - "paragraph": { - "elements": [ - { - "endIndex": 21250, - "startIndex": 21175, - "textRun": { - "content": " throw UnsupportedError('Unknown platform: ${Platform.operatingSystem}');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21175 - }, - { - "endIndex": 21255, - "paragraph": { - "elements": [ - { - "endIndex": 21255, - "startIndex": 21250, - "textRun": { - "content": "}();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21250 - }, - { - "endIndex": 21256, - "paragraph": { - "elements": [ - { - "endIndex": 21256, - "startIndex": 21255, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21255 - }, - { - "endIndex": 21315, - "paragraph": { - "elements": [ - { - "endIndex": 21315, - "startIndex": 21256, - "textRun": { - "content": "final DuktapeBindings _bindings = DuktapeBindings(_dylib);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21256 - }, - { - "endIndex": 21316, - "paragraph": { - "elements": [ - { - "endIndex": 21316, - "startIndex": 21315, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21315 - }, - { - "endIndex": 21332, - "paragraph": { - "elements": [ - { - "endIndex": 21332, - "startIndex": 21316, - "textRun": { - "content": "class Duktape {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21316 - }, - { - "endIndex": 21346, - "paragraph": { - "elements": [ - { - "endIndex": 21346, - "startIndex": 21332, - "textRun": { - "content": " Duktape() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21332 - }, - { - "endIndex": 21356, - "paragraph": { - "elements": [ - { - "endIndex": 21356, - "startIndex": 21346, - "textRun": { - "content": " ctx =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21346 - }, - { - "endIndex": 21436, - "paragraph": { - "elements": [ - { - "endIndex": 21436, - "startIndex": 21356, - "textRun": { - "content": " _bindings.duk_create_heap(nullptr, nullptr, nullptr, nullptr, nullptr);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21356 - }, - { - "endIndex": 21440, - "paragraph": { - "elements": [ - { - "endIndex": 21440, - "startIndex": 21436, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21436 - }, - { - "endIndex": 21441, - "paragraph": { - "elements": [ - { - "endIndex": 21441, - "startIndex": 21440, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21440 - }, - { - "endIndex": 21476, - "paragraph": { - "elements": [ - { - "endIndex": 21476, - "startIndex": 21441, - "textRun": { - "content": " void evalString(String jsCode) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21441 - }, - { - "endIndex": 21520, - "paragraph": { - "elements": [ - { - "endIndex": 21520, - "startIndex": 21476, - "textRun": { - "content": " var nativeUtf8 = jsCode.toNativeUtf8();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21476 - }, - { - "endIndex": 21548, - "paragraph": { - "elements": [ - { - "endIndex": 21548, - "startIndex": 21520, - "textRun": { - "content": " _bindings.duk_eval_raw(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21520 - }, - { - "endIndex": 21561, - "paragraph": { - "elements": [ - { - "endIndex": 21561, - "startIndex": 21548, - "textRun": { - "content": " ctx,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21548 - }, - { - "endIndex": 21594, - "paragraph": { - "elements": [ - { - "endIndex": 21594, - "startIndex": 21561, - "textRun": { - "content": " nativeUtf8.cast(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21561 - }, - { - "endIndex": 21605, - "paragraph": { - "elements": [ - { - "endIndex": 21605, - "startIndex": 21594, - "textRun": { - "content": " 0,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21594 - }, - { - "endIndex": 21617, - "paragraph": { - "elements": [ - { - "endIndex": 21617, - "startIndex": 21605, - "textRun": { - "content": " 0 |\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21605 - }, - { - "endIndex": 21648, - "paragraph": { - "elements": [ - { - "endIndex": 21648, - "startIndex": 21617, - "textRun": { - "content": " DUK_COMPILE_EVAL |\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21617 - }, - { - "endIndex": 21679, - "paragraph": { - "elements": [ - { - "endIndex": 21679, - "startIndex": 21648, - "textRun": { - "content": " DUK_COMPILE_SAFE |\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21648 - }, - { - "endIndex": 21714, - "paragraph": { - "elements": [ - { - "endIndex": 21714, - "startIndex": 21679, - "textRun": { - "content": " DUK_COMPILE_NOSOURCE |\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21679 - }, - { - "endIndex": 21747, - "paragraph": { - "elements": [ - { - "endIndex": 21747, - "startIndex": 21714, - "textRun": { - "content": " DUK_COMPILE_STRLEN |\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21714 - }, - { - "endIndex": 21784, - "paragraph": { - "elements": [ - { - "endIndex": 21784, - "startIndex": 21747, - "textRun": { - "content": " DUK_COMPILE_NOFILENAME);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21747 - }, - { - "endIndex": 21817, - "paragraph": { - "elements": [ - { - "endIndex": 21817, - "startIndex": 21784, - "textRun": { - "content": " ffi.malloc.free(nativeUtf8);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21784 - }, - { - "endIndex": 21821, - "paragraph": { - "elements": [ - { - "endIndex": 21821, - "startIndex": 21817, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21817 - }, - { - "endIndex": 21822, - "paragraph": { - "elements": [ - { - "endIndex": 21822, - "startIndex": 21821, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21821 - }, - { - "endIndex": 21848, - "paragraph": { - "elements": [ - { - "endIndex": 21848, - "startIndex": 21822, - "textRun": { - "content": " int getInt(int index) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21822 - }, - { - "endIndex": 21894, - "paragraph": { - "elements": [ - { - "endIndex": 21894, - "startIndex": 21848, - "textRun": { - "content": " return _bindings.duk_get_int(ctx, index);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21848 - }, - { - "endIndex": 21898, - "paragraph": { - "elements": [ - { - "endIndex": 21898, - "startIndex": 21894, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21894 - }, - { - "endIndex": 21899, - "paragraph": { - "elements": [ - { - "endIndex": 21899, - "startIndex": 21898, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21898 - }, - { - "endIndex": 21918, - "paragraph": { - "elements": [ - { - "endIndex": 21918, - "startIndex": 21899, - "textRun": { - "content": " void dispose() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21899 - }, - { - "endIndex": 21955, - "paragraph": { - "elements": [ - { - "endIndex": 21955, - "startIndex": 21918, - "textRun": { - "content": " _bindings.duk_destroy_heap(ctx);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21918 - }, - { - "endIndex": 21974, - "paragraph": { - "elements": [ - { - "endIndex": 21974, - "startIndex": 21955, - "textRun": { - "content": " ctx = nullptr;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21955 - }, - { - "endIndex": 21978, - "paragraph": { - "elements": [ - { - "endIndex": 21978, - "startIndex": 21974, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21974 - }, - { - "endIndex": 21979, - "paragraph": { - "elements": [ - { - "endIndex": 21979, - "startIndex": 21978, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21978 - }, - { - "endIndex": 22012, - "paragraph": { - "elements": [ - { - "endIndex": 22012, - "startIndex": 21979, - "textRun": { - "content": " late Pointer ctx;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21979 - }, - { - "endIndex": 22014, - "paragraph": { - "elements": [ - { - "endIndex": 22014, - "startIndex": 22012, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22012 - } - ], - "endIndex": 22014, - "startIndex": 20684, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 27.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 22016, - "paragraph": { - "elements": [ - { - "endIndex": 22016, - "startIndex": 22015, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22015 - }, - { - "endIndex": 22229, - "paragraph": { - "elements": [ - { - "endIndex": 22084, - "startIndex": 22016, - "textRun": { - "content": "This file is responsible for loading the dynamic link library file (", - "textStyle": {} - } - }, - { - "endIndex": 22087, - "startIndex": 22084, - "textRun": { - "content": ".so", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22111, - "startIndex": 22087, - "textRun": { - "content": " for Linux and Android, ", - "textStyle": {} - } - }, - { - "endIndex": 22115, - "startIndex": 22111, - "textRun": { - "content": ".dll", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22229, - "startIndex": 22115, - "textRun": { - "content": " for Windows) and for providing a wrapper that exposes a more Dart idiomatic interface to the underlying C code. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22016 - }, - { - "endIndex": 22230, - "paragraph": { - "elements": [ - { - "endIndex": 22230, - "startIndex": 22229, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22229 - }, - { - "endIndex": 22298, - "paragraph": { - "elements": [ - { - "endIndex": 22268, - "startIndex": 22230, - "textRun": { - "content": "Replace the contents of the example’s ", - "textStyle": {} - } - }, - { - "endIndex": 22277, - "startIndex": 22268, - "textRun": { - "content": "main.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 22298, - "startIndex": 22277, - "textRun": { - "content": " with the following.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22230 - }, - { - "endIndex": 22320, - "paragraph": { - "elements": [ - { - "endIndex": 22319, - "startIndex": 22298, - "textRun": { - "content": "example/lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/ffigen_codelab/step_05/example/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 22320, - "startIndex": 22319, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.1wuwi2dol5z8", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 22298 - }, - { - "endIndex": 23985, - "startIndex": 22320, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 23984, - "startIndex": 22321, - "tableCells": [ - { - "content": [ - { - "endIndex": 22368, - "paragraph": { - "elements": [ - { - "endIndex": 22368, - "startIndex": 22323, - "textRun": { - "content": "import 'package:ffigen_app/ffigen_app.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22323 - }, - { - "endIndex": 22408, - "paragraph": { - "elements": [ - { - "endIndex": 22408, - "startIndex": 22368, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22368 - }, - { - "endIndex": 22409, - "paragraph": { - "elements": [ - { - "endIndex": 22409, - "startIndex": 22408, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22408 - }, - { - "endIndex": 22438, - "paragraph": { - "elements": [ - { - "endIndex": 22438, - "startIndex": 22409, - "textRun": { - "content": "const String jsCode = '1+2';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22409 - }, - { - "endIndex": 22439, - "paragraph": { - "elements": [ - { - "endIndex": 22439, - "startIndex": 22438, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22438 - }, - { - "endIndex": 22453, - "paragraph": { - "elements": [ - { - "endIndex": 22453, - "startIndex": 22439, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22439 - }, - { - "endIndex": 22478, - "paragraph": { - "elements": [ - { - "endIndex": 22478, - "startIndex": 22453, - "textRun": { - "content": " runApp(const MyApp());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22453 - }, - { - "endIndex": 22480, - "paragraph": { - "elements": [ - { - "endIndex": 22480, - "startIndex": 22478, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22478 - }, - { - "endIndex": 22481, - "paragraph": { - "elements": [ - { - "endIndex": 22481, - "startIndex": 22480, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22480 - }, - { - "endIndex": 22518, - "paragraph": { - "elements": [ - { - "endIndex": 22518, - "startIndex": 22481, - "textRun": { - "content": "class MyApp extends StatefulWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22481 - }, - { - "endIndex": 22546, - "paragraph": { - "elements": [ - { - "endIndex": 22546, - "startIndex": 22518, - "textRun": { - "content": " const MyApp({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22518 - }, - { - "endIndex": 22547, - "paragraph": { - "elements": [ - { - "endIndex": 22547, - "startIndex": 22546, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22546 - }, - { - "endIndex": 22559, - "paragraph": { - "elements": [ - { - "endIndex": 22559, - "startIndex": 22547, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22547 - }, - { - "endIndex": 22606, - "paragraph": { - "elements": [ - { - "endIndex": 22606, - "startIndex": 22559, - "textRun": { - "content": " State createState() => _MyAppState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22559 - }, - { - "endIndex": 22608, - "paragraph": { - "elements": [ - { - "endIndex": 22608, - "startIndex": 22606, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22606 - }, - { - "endIndex": 22609, - "paragraph": { - "elements": [ - { - "endIndex": 22609, - "startIndex": 22608, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22608 - }, - { - "endIndex": 22650, - "paragraph": { - "elements": [ - { - "endIndex": 22650, - "startIndex": 22609, - "textRun": { - "content": "class _MyAppState extends State {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22609 - }, - { - "endIndex": 22674, - "paragraph": { - "elements": [ - { - "endIndex": 22674, - "startIndex": 22650, - "textRun": { - "content": " late Duktape duktape;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22650 - }, - { - "endIndex": 22696, - "paragraph": { - "elements": [ - { - "endIndex": 22696, - "startIndex": 22674, - "textRun": { - "content": " String output = '';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22674 - }, - { - "endIndex": 22697, - "paragraph": { - "elements": [ - { - "endIndex": 22697, - "startIndex": 22696, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22696 - }, - { - "endIndex": 22709, - "paragraph": { - "elements": [ - { - "endIndex": 22709, - "startIndex": 22697, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22697 - }, - { - "endIndex": 22730, - "paragraph": { - "elements": [ - { - "endIndex": 22730, - "startIndex": 22709, - "textRun": { - "content": " void initState() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22709 - }, - { - "endIndex": 22753, - "paragraph": { - "elements": [ - { - "endIndex": 22753, - "startIndex": 22730, - "textRun": { - "content": " super.initState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22730 - }, - { - "endIndex": 22778, - "paragraph": { - "elements": [ - { - "endIndex": 22778, - "startIndex": 22753, - "textRun": { - "content": " duktape = Duktape();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22753 - }, - { - "endIndex": 22796, - "paragraph": { - "elements": [ - { - "endIndex": 22796, - "startIndex": 22778, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22778 - }, - { - "endIndex": 22834, - "paragraph": { - "elements": [ - { - "endIndex": 22834, - "startIndex": 22796, - "textRun": { - "content": " output = 'Initialized Duktape';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22796 - }, - { - "endIndex": 22842, - "paragraph": { - "elements": [ - { - "endIndex": 22842, - "startIndex": 22834, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22834 - }, - { - "endIndex": 22846, - "paragraph": { - "elements": [ - { - "endIndex": 22846, - "startIndex": 22842, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22842 - }, - { - "endIndex": 22847, - "paragraph": { - "elements": [ - { - "endIndex": 22847, - "startIndex": 22846, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22846 - }, - { - "endIndex": 22859, - "paragraph": { - "elements": [ - { - "endIndex": 22859, - "startIndex": 22847, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22847 - }, - { - "endIndex": 22878, - "paragraph": { - "elements": [ - { - "endIndex": 22878, - "startIndex": 22859, - "textRun": { - "content": " void dispose() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22859 - }, - { - "endIndex": 22901, - "paragraph": { - "elements": [ - { - "endIndex": 22901, - "startIndex": 22878, - "textRun": { - "content": " duktape.dispose();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22878 - }, - { - "endIndex": 22922, - "paragraph": { - "elements": [ - { - "endIndex": 22922, - "startIndex": 22901, - "textRun": { - "content": " super.dispose();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22901 - }, - { - "endIndex": 22926, - "paragraph": { - "elements": [ - { - "endIndex": 22926, - "startIndex": 22922, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22922 - }, - { - "endIndex": 22927, - "paragraph": { - "elements": [ - { - "endIndex": 22927, - "startIndex": 22926, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22926 - }, - { - "endIndex": 22939, - "paragraph": { - "elements": [ - { - "endIndex": 22939, - "startIndex": 22927, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22927 - }, - { - "endIndex": 22978, - "paragraph": { - "elements": [ - { - "endIndex": 22978, - "startIndex": 22939, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22939 - }, - { - "endIndex": 23025, - "paragraph": { - "elements": [ - { - "endIndex": 23025, - "startIndex": 22978, - "textRun": { - "content": " const textStyle = TextStyle(fontSize: 25);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 22978 - }, - { - "endIndex": 23071, - "paragraph": { - "elements": [ - { - "endIndex": 23071, - "startIndex": 23025, - "textRun": { - "content": " const spacerSmall = SizedBox(height: 10);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23025 - }, - { - "endIndex": 23095, - "paragraph": { - "elements": [ - { - "endIndex": 23095, - "startIndex": 23071, - "textRun": { - "content": " return MaterialApp(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23071 - }, - { - "endIndex": 23117, - "paragraph": { - "elements": [ - { - "endIndex": 23117, - "startIndex": 23095, - "textRun": { - "content": " home: Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23095 - }, - { - "endIndex": 23141, - "paragraph": { - "elements": [ - { - "endIndex": 23141, - "startIndex": 23117, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23117 - }, - { - "endIndex": 23186, - "paragraph": { - "elements": [ - { - "endIndex": 23186, - "startIndex": 23141, - "textRun": { - "content": " title: const Text('Duktape Test'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23141 - }, - { - "endIndex": 23197, - "paragraph": { - "elements": [ - { - "endIndex": 23197, - "startIndex": 23186, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23186 - }, - { - "endIndex": 23219, - "paragraph": { - "elements": [ - { - "endIndex": 23219, - "startIndex": 23197, - "textRun": { - "content": " body: Center(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23197 - }, - { - "endIndex": 23247, - "paragraph": { - "elements": [ - { - "endIndex": 23247, - "startIndex": 23219, - "textRun": { - "content": " child: Container(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23219 - }, - { - "endIndex": 23294, - "paragraph": { - "elements": [ - { - "endIndex": 23294, - "startIndex": 23247, - "textRun": { - "content": " padding: const EdgeInsets.all(10),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23247 - }, - { - "endIndex": 23321, - "paragraph": { - "elements": [ - { - "endIndex": 23321, - "startIndex": 23294, - "textRun": { - "content": " child: Column(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23294 - }, - { - "endIndex": 23367, - "paragraph": { - "elements": [ - { - "endIndex": 23367, - "startIndex": 23321, - "textRun": { - "content": " mainAxisSize: MainAxisSize.min,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23321 - }, - { - "endIndex": 23393, - "paragraph": { - "elements": [ - { - "endIndex": 23393, - "startIndex": 23367, - "textRun": { - "content": " children: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23367 - }, - { - "endIndex": 23415, - "paragraph": { - "elements": [ - { - "endIndex": 23415, - "startIndex": 23393, - "textRun": { - "content": " Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23393 - }, - { - "endIndex": 23441, - "paragraph": { - "elements": [ - { - "endIndex": 23441, - "startIndex": 23415, - "textRun": { - "content": " output,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23415 - }, - { - "endIndex": 23477, - "paragraph": { - "elements": [ - { - "endIndex": 23477, - "startIndex": 23441, - "textRun": { - "content": " style: textStyle,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23441 - }, - { - "endIndex": 23524, - "paragraph": { - "elements": [ - { - "endIndex": 23524, - "startIndex": 23477, - "textRun": { - "content": " textAlign: TextAlign.center,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23477 - }, - { - "endIndex": 23543, - "paragraph": { - "elements": [ - { - "endIndex": 23543, - "startIndex": 23524, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23524 - }, - { - "endIndex": 23572, - "paragraph": { - "elements": [ - { - "endIndex": 23572, - "startIndex": 23543, - "textRun": { - "content": " spacerSmall,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23543 - }, - { - "endIndex": 23604, - "paragraph": { - "elements": [ - { - "endIndex": 23604, - "startIndex": 23572, - "textRun": { - "content": " ElevatedButton(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23572 - }, - { - "endIndex": 23659, - "paragraph": { - "elements": [ - { - "endIndex": 23659, - "startIndex": 23604, - "textRun": { - "content": " child: const Text('Run JavaScript'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23604 - }, - { - "endIndex": 23693, - "paragraph": { - "elements": [ - { - "endIndex": 23693, - "startIndex": 23659, - "textRun": { - "content": " onPressed: () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23659 - }, - { - "endIndex": 23741, - "paragraph": { - "elements": [ - { - "endIndex": 23741, - "startIndex": 23693, - "textRun": { - "content": " duktape.evalString(jsCode);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23693 - }, - { - "endIndex": 23775, - "paragraph": { - "elements": [ - { - "endIndex": 23775, - "startIndex": 23741, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23741 - }, - { - "endIndex": 23842, - "paragraph": { - "elements": [ - { - "endIndex": 23842, - "startIndex": 23775, - "textRun": { - "content": " output = '$jsCode => ${duktape.getInt(-1)}';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23775 - }, - { - "endIndex": 23866, - "paragraph": { - "elements": [ - { - "endIndex": 23866, - "startIndex": 23842, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23842 - }, - { - "endIndex": 23887, - "paragraph": { - "elements": [ - { - "endIndex": 23887, - "startIndex": 23866, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23866 - }, - { - "endIndex": 23906, - "paragraph": { - "elements": [ - { - "endIndex": 23906, - "startIndex": 23887, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23887 - }, - { - "endIndex": 23923, - "paragraph": { - "elements": [ - { - "endIndex": 23923, - "startIndex": 23906, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23906 - }, - { - "endIndex": 23938, - "paragraph": { - "elements": [ - { - "endIndex": 23938, - "startIndex": 23923, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23923 - }, - { - "endIndex": 23951, - "paragraph": { - "elements": [ - { - "endIndex": 23951, - "startIndex": 23938, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23938 - }, - { - "endIndex": 23962, - "paragraph": { - "elements": [ - { - "endIndex": 23962, - "startIndex": 23951, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23951 - }, - { - "endIndex": 23971, - "paragraph": { - "elements": [ - { - "endIndex": 23971, - "startIndex": 23962, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23962 - }, - { - "endIndex": 23978, - "paragraph": { - "elements": [ - { - "endIndex": 23978, - "startIndex": 23971, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23971 - }, - { - "endIndex": 23982, - "paragraph": { - "elements": [ - { - "endIndex": 23982, - "startIndex": 23978, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23978 - }, - { - "endIndex": 23984, - "paragraph": { - "elements": [ - { - "endIndex": 23984, - "startIndex": 23982, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23982 - } - ], - "endIndex": 23984, - "startIndex": 22322, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 27.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 23986, - "paragraph": { - "elements": [ - { - "endIndex": 23986, - "startIndex": 23985, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 23985 - }, - { - "endIndex": 24031, - "paragraph": { - "elements": [ - { - "endIndex": 24031, - "startIndex": 23986, - "textRun": { - "content": "You can now run the example app again using:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 23986 - }, - { - "endIndex": 24032, - "paragraph": { - "elements": [ - { - "endIndex": 24032, - "startIndex": 24031, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24031 - }, - { - "endIndex": 24063, - "startIndex": 24032, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 24062, - "startIndex": 24033, - "tableCells": [ - { - "content": [ - { - "endIndex": 24048, - "paragraph": { - "elements": [ - { - "endIndex": 24048, - "startIndex": 24035, - "textRun": { - "content": "$ cd example\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24035 - }, - { - "endIndex": 24062, - "paragraph": { - "elements": [ - { - "endIndex": 24062, - "startIndex": 24048, - "textRun": { - "content": "$ flutter run\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24048 - } - ], - "endIndex": 24062, - "startIndex": 24034, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 27.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 24064, - "paragraph": { - "elements": [ - { - "endIndex": 24064, - "startIndex": 24063, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 24063 - }, - { - "endIndex": 24104, - "paragraph": { - "elements": [ - { - "endIndex": 24104, - "startIndex": 24064, - "textRun": { - "content": "You should see the app running like so:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 24064 - }, - { - "endIndex": 24105, - "paragraph": { - "elements": [ - { - "endIndex": 24105, - "startIndex": 24104, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 24104 - }, - { - "endIndex": 24106, - "paragraph": { - "elements": [ - { - "endIndex": 24106, - "startIndex": 24105, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 24105 - }, - { - "endIndex": 24115, - "startIndex": 24106, - "table": { - "columns": 2, - "rows": 1, - "tableRows": [ - { - "endIndex": 24114, - "startIndex": 24107, - "tableCells": [ - { - "content": [ - { - "endIndex": 24111, - "paragraph": { - "elements": [ - { - "endIndex": 24110, - "inlineObjectElement": { - "inlineObjectId": "kix.8f801gtaqhg3", - "textStyle": {} - }, - "startIndex": 24109 - }, - { - "endIndex": 24111, - "startIndex": 24110, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24109 - } - ], - "endIndex": 24111, - "startIndex": 24108, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 24114, - "paragraph": { - "elements": [ - { - "endIndex": 24113, - "inlineObjectElement": { - "inlineObjectId": "kix.9klzb3jr1dtm", - "textStyle": {} - }, - "startIndex": 24112 - }, - { - "endIndex": 24114, - "startIndex": 24113, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24112 - } - ], - "endIndex": 24114, - "startIndex": 24111, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 24116, - "paragraph": { - "elements": [ - { - "endIndex": 24116, - "startIndex": 24115, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 24115 - }, - { - "endIndex": 24292, - "paragraph": { - "elements": [ - { - "endIndex": 24179, - "startIndex": 24116, - "textRun": { - "content": "These two screenshots show the before and after of pressing the", - "textStyle": {} - } - }, - { - "endIndex": 24194, - "startIndex": 24179, - "textRun": { - "content": " Run JavaScript", - "textStyle": { - "bold": true - } - } - }, - { - "endIndex": 24292, - "startIndex": 24194, - "textRun": { - "content": " button. This demonstrates executing JavaScript code from Dart and showing the result on screen. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 24116 - }, - { - "endIndex": 24293, - "paragraph": { - "elements": [ - { - "endIndex": 24293, - "startIndex": 24292, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 24292 - }, - { - "endIndex": 24301, - "paragraph": { - "elements": [ - { - "endIndex": 24301, - "startIndex": 24293, - "textRun": { - "content": "Android\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.tkfrnhfqutrh", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 24293 - }, - { - "endIndex": 24302, - "paragraph": { - "elements": [ - { - "endIndex": 24302, - "startIndex": 24301, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 24301 - }, - { - "endIndex": 24612, - "paragraph": { - "elements": [ - { - "endIndex": 24612, - "startIndex": 24302, - "textRun": { - "content": "Android is a Linux, kernel-based OS and is somewhat similar to desktop Linux distributions. The CMake build system can hide most of the differences between the two platforms. To build and run on Android, make sure the Android emulator is running (or the Android device is connected). Run the app. For example:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24302 - }, - { - "endIndex": 24613, - "paragraph": { - "elements": [ - { - "endIndex": 24613, - "startIndex": 24612, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24612 - }, - { - "endIndex": 24661, - "startIndex": 24613, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 24660, - "startIndex": 24614, - "tableCells": [ - { - "content": [ - { - "endIndex": 24629, - "paragraph": { - "elements": [ - { - "endIndex": 24629, - "startIndex": 24616, - "textRun": { - "content": "$ cd example\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24616 - }, - { - "endIndex": 24660, - "paragraph": { - "elements": [ - { - "endIndex": 24660, - "startIndex": 24629, - "textRun": { - "content": "$ flutter run -d emulator-5554\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24629 - } - ], - "endIndex": 24660, - "startIndex": 24615, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 27.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 24662, - "paragraph": { - "elements": [ - { - "endIndex": 24662, - "startIndex": 24661, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24661 - }, - { - "endIndex": 24717, - "paragraph": { - "elements": [ - { - "endIndex": 24717, - "startIndex": 24662, - "textRun": { - "content": "You should now see the example app running on Android:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24662 - }, - { - "endIndex": 24718, - "paragraph": { - "elements": [ - { - "endIndex": 24718, - "startIndex": 24717, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 24717 - }, - { - "endIndex": 24727, - "startIndex": 24718, - "table": { - "columns": 2, - "rows": 1, - "tableRows": [ - { - "endIndex": 24726, - "startIndex": 24719, - "tableCells": [ - { - "content": [ - { - "endIndex": 24723, - "paragraph": { - "elements": [ - { - "endIndex": 24722, - "inlineObjectElement": { - "inlineObjectId": "kix.n6geu88pcaje", - "textStyle": {} - }, - "startIndex": 24721 - }, - { - "endIndex": 24723, - "startIndex": 24722, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24721 - } - ], - "endIndex": 24723, - "startIndex": 24720, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 24726, - "paragraph": { - "elements": [ - { - "endIndex": 24725, - "inlineObjectElement": { - "inlineObjectId": "kix.oj3ebqd3ke3o", - "textStyle": {} - }, - "startIndex": 24724 - }, - { - "endIndex": 24726, - "startIndex": 24725, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24724 - } - ], - "endIndex": 24726, - "startIndex": 24723, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 24728, - "paragraph": { - "elements": [ - { - "endIndex": 24728, - "startIndex": 24727, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 24727 - }, - { - "endIndex": 24730, - "paragraph": { - "elements": [ - { - "endIndex": 24729, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 24728 - }, - { - "endIndex": 24730, - "startIndex": 24729, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24728 - }, - { - "endIndex": 24731, - "paragraph": { - "elements": [ - { - "endIndex": 24731, - "startIndex": 24730, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 24730 - }, - { - "endIndex": 24762, - "paragraph": { - "elements": [ - { - "endIndex": 24762, - "startIndex": 24731, - "textRun": { - "content": "Using Duktape on macOS and iOS\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.j1j5a91z8r17", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 24731 - }, - { - "endIndex": 24763, - "paragraph": { - "elements": [ - { - "endIndex": 24763, - "startIndex": 24762, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 24762 - }, - { - "endIndex": 25037, - "paragraph": { - "elements": [ - { - "endIndex": 25037, - "startIndex": 24763, - "textRun": { - "content": "It’s now time to get your plugin working on macOS and iOS, two closely related operating systems. Start with macOS. While CMake supports macOS and iOS, you won’t reuse the work you did for Linux & Android, as Flutter on macOS and iOS uses CocoaPods for importing libraries.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 24763 - }, - { - "endIndex": 25049, - "paragraph": { - "elements": [ - { - "endIndex": 25049, - "startIndex": 25037, - "textRun": { - "content": "Cleaning Up\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.mudsw5qtg8je", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 25037 - }, - { - "endIndex": 25268, - "paragraph": { - "elements": [ - { - "endIndex": 25268, - "startIndex": 25049, - "textRun": { - "content": "In the previous step you built a working application for Android, Windows, and Linux. However, there are a couple of files left over from the original template that you now need to clean up. Remove them now as follows.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25049 - }, - { - "endIndex": 25269, - "paragraph": { - "elements": [ - { - "endIndex": 25269, - "startIndex": 25268, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25268 - }, - { - "endIndex": 25379, - "startIndex": 25269, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 25378, - "startIndex": 25270, - "tableCells": [ - { - "content": [ - { - "endIndex": 25294, - "paragraph": { - "elements": [ - { - "endIndex": 25294, - "startIndex": 25272, - "textRun": { - "content": "$ rm src/ffigen_app.c\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25272 - }, - { - "endIndex": 25316, - "paragraph": { - "elements": [ - { - "endIndex": 25316, - "startIndex": 25294, - "textRun": { - "content": "$ rm src/ffigen_app.h\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25294 - }, - { - "endIndex": 25346, - "paragraph": { - "elements": [ - { - "endIndex": 25346, - "startIndex": 25316, - "textRun": { - "content": "$ rm ios/Classes/ffigen_app.c\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25316 - }, - { - "endIndex": 25378, - "paragraph": { - "elements": [ - { - "endIndex": 25378, - "startIndex": 25346, - "textRun": { - "content": "$ rm macos/Classes/ffigen_app.c\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25346 - } - ], - "endIndex": 25378, - "startIndex": 25271, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 27.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 25381, - "paragraph": { - "elements": [ - { - "endIndex": 25381, - "startIndex": 25379, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25379 - }, - { - "endIndex": 25387, - "paragraph": { - "elements": [ - { - "endIndex": 25387, - "startIndex": 25381, - "textRun": { - "content": "macOS\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.cvbstewmkrft", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 25381 - }, - { - "endIndex": 25728, - "paragraph": { - "elements": [ - { - "endIndex": 25728, - "startIndex": 25387, - "textRun": { - "content": "Flutter on the macOS platform uses CocoaPods to import C and C++ code. This means that this package needs to be integrated into the CocoaPods build infrastructure. To enable re-use of the C code you have already configured to build with CMake in the previous step, you will need to add a single forwarding file in the macOS platform runner.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25387 - }, - { - "endIndex": 25752, - "paragraph": { - "elements": [ - { - "endIndex": 25751, - "startIndex": 25728, - "textRun": { - "content": "macos/Classes/duktape.c", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/ffigen_codelab/step_06/macos/Classes/duktape.c" - }, - "underline": true - } - } - }, - { - "endIndex": 25752, - "startIndex": 25751, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.m5a901tzoxz8", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 25728 - }, - { - "endIndex": 25787, - "startIndex": 25752, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 25786, - "startIndex": 25753, - "tableCells": [ - { - "content": [ - { - "endIndex": 25786, - "paragraph": { - "elements": [ - { - "endIndex": 25786, - "startIndex": 25755, - "textRun": { - "content": "#include \"../../src/duktape.c\"\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25755 - } - ], - "endIndex": 25786, - "startIndex": 25754, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 27.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 25788, - "paragraph": { - "elements": [ - { - "endIndex": 25788, - "startIndex": 25787, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25787 - }, - { - "endIndex": 25987, - "paragraph": { - "elements": [ - { - "endIndex": 25927, - "startIndex": 25788, - "textRun": { - "content": "This file uses the power of the C preprocessor to include the source code from the native source code you set up in the previous step. See ", - "textStyle": {} - } - }, - { - "endIndex": 25951, - "startIndex": 25927, - "textRun": { - "content": "macos/ffigen_app.podspec", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/ffigen_codelab/step_06/macos/ffigen_app.podspec" - }, - "underline": true - } - } - }, - { - "endIndex": 25987, - "startIndex": 25951, - "textRun": { - "content": " for more detail on how this works.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25788 - }, - { - "endIndex": 25988, - "paragraph": { - "elements": [ - { - "endIndex": 25988, - "startIndex": 25987, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25987 - }, - { - "endIndex": 26076, - "paragraph": { - "elements": [ - { - "endIndex": 26076, - "startIndex": 25988, - "textRun": { - "content": "Running this application now follows the same pattern you’ve seen on Windows and Linux.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 25988 - }, - { - "endIndex": 26077, - "paragraph": { - "elements": [ - { - "endIndex": 26077, - "startIndex": 26076, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26076 - }, - { - "endIndex": 26117, - "startIndex": 26077, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 26116, - "startIndex": 26078, - "tableCells": [ - { - "content": [ - { - "endIndex": 26093, - "paragraph": { - "elements": [ - { - "endIndex": 26093, - "startIndex": 26080, - "textRun": { - "content": "$ cd example\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26080 - }, - { - "endIndex": 26116, - "paragraph": { - "elements": [ - { - "endIndex": 26116, - "startIndex": 26093, - "textRun": { - "content": "$ flutter run -d macos\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26093 - } - ], - "endIndex": 26116, - "startIndex": 26079, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 26118, - "paragraph": { - "elements": [ - { - "endIndex": 26118, - "startIndex": 26117, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26117 - }, - { - "endIndex": 26119, - "paragraph": { - "elements": [ - { - "endIndex": 26119, - "startIndex": 26118, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 26118 - }, - { - "endIndex": 26128, - "startIndex": 26119, - "table": { - "columns": 2, - "rows": 1, - "tableRows": [ - { - "endIndex": 26127, - "startIndex": 26120, - "tableCells": [ - { - "content": [ - { - "endIndex": 26124, - "paragraph": { - "elements": [ - { - "endIndex": 26123, - "inlineObjectElement": { - "inlineObjectId": "kix.thggcaspdiw", - "textStyle": {} - }, - "startIndex": 26122 - }, - { - "endIndex": 26124, - "startIndex": 26123, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26122 - } - ], - "endIndex": 26124, - "startIndex": 26121, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 26127, - "paragraph": { - "elements": [ - { - "endIndex": 26126, - "inlineObjectElement": { - "inlineObjectId": "kix.jrk5ydgv078y", - "textStyle": {} - }, - "startIndex": 26125 - }, - { - "endIndex": 26127, - "startIndex": 26126, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26125 - } - ], - "endIndex": 26127, - "startIndex": 26124, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 26129, - "paragraph": { - "elements": [ - { - "endIndex": 26129, - "startIndex": 26128, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 26128 - }, - { - "endIndex": 26130, - "paragraph": { - "elements": [ - { - "endIndex": 26130, - "startIndex": 26129, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 26129 - }, - { - "endIndex": 26134, - "paragraph": { - "elements": [ - { - "endIndex": 26134, - "startIndex": 26130, - "textRun": { - "content": "iOS\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.736vhp3kbrab", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 26130 - }, - { - "endIndex": 26135, - "paragraph": { - "elements": [ - { - "endIndex": 26135, - "startIndex": 26134, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 26134 - }, - { - "endIndex": 26218, - "paragraph": { - "elements": [ - { - "endIndex": 26218, - "startIndex": 26135, - "textRun": { - "content": "Similar to the macOS setup, iOS requires a single forwarding C file added as well.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 26135 - }, - { - "endIndex": 26240, - "paragraph": { - "elements": [ - { - "endIndex": 26239, - "startIndex": 26218, - "textRun": { - "content": "ios/Classes/duktape.c", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/ffigen_codelab/step_06/ios/Classes/duktape.c" - }, - "underline": true - } - } - }, - { - "endIndex": 26240, - "startIndex": 26239, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.zcvbjkk81pus", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 26218 - }, - { - "endIndex": 26275, - "startIndex": 26240, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 26274, - "startIndex": 26241, - "tableCells": [ - { - "content": [ - { - "endIndex": 26274, - "paragraph": { - "elements": [ - { - "endIndex": 26244, - "startIndex": 26243, - "textRun": { - "content": "#", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.18431373, - "green": 0.16078432, - "red": 0.14117648 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 26251, - "startIndex": 26244, - "textRun": { - "content": "include", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 26252, - "startIndex": 26251, - "textRun": { - "content": " ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.18431373, - "green": 0.16078432, - "red": 0.14117648 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 26273, - "startIndex": 26252, - "textRun": { - "content": "\"../../src/duktape.c\"", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 26274, - "startIndex": 26273, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26243 - } - ], - "endIndex": 26274, - "startIndex": 26242, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 27.75, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 26276, - "paragraph": { - "elements": [ - { - "endIndex": 26276, - "startIndex": 26275, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26275 - }, - { - "endIndex": 26366, - "paragraph": { - "elements": [ - { - "endIndex": 26366, - "startIndex": 26276, - "textRun": { - "content": "With this single file, your plugin is now also configured to run on iOS. Run it as usual.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26276 - }, - { - "endIndex": 26367, - "paragraph": { - "elements": [ - { - "endIndex": 26367, - "startIndex": 26366, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26366 - }, - { - "endIndex": 26395, - "startIndex": 26367, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 26394, - "startIndex": 26368, - "tableCells": [ - { - "content": [ - { - "endIndex": 26394, - "paragraph": { - "elements": [ - { - "endIndex": 26394, - "startIndex": 26370, - "textRun": { - "content": "$ flutter run -d iPhone\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26370 - } - ], - "endIndex": 26394, - "startIndex": 26369, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 28.5, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 26396, - "paragraph": { - "elements": [ - { - "endIndex": 26396, - "startIndex": 26395, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26395 - }, - { - "endIndex": 26397, - "paragraph": { - "elements": [ - { - "endIndex": 26397, - "startIndex": 26396, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26396 - }, - { - "endIndex": 26406, - "startIndex": 26397, - "table": { - "columns": 2, - "rows": 1, - "tableRows": [ - { - "endIndex": 26405, - "startIndex": 26398, - "tableCells": [ - { - "content": [ - { - "endIndex": 26402, - "paragraph": { - "elements": [ - { - "endIndex": 26401, - "inlineObjectElement": { - "inlineObjectId": "kix.gcvwi61viaiv", - "textStyle": {} - }, - "startIndex": 26400 - }, - { - "endIndex": 26402, - "startIndex": 26401, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26400 - } - ], - "endIndex": 26402, - "startIndex": 26399, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 26405, - "paragraph": { - "elements": [ - { - "endIndex": 26404, - "inlineObjectElement": { - "inlineObjectId": "kix.xjk6qmu0mck1", - "textStyle": {} - }, - "startIndex": 26403 - }, - { - "endIndex": 26405, - "startIndex": 26404, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 26403 - } - ], - "endIndex": 26405, - "startIndex": 26402, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 26407, - "paragraph": { - "elements": [ - { - "endIndex": 26407, - "startIndex": 26406, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26406 - }, - { - "endIndex": 26605, - "paragraph": { - "elements": [ - { - "endIndex": 26605, - "startIndex": 26407, - "textRun": { - "content": "Congratulations! You have successfully integrated native code on five platforms. This is grounds for a celebration! Maybe even a more functional user interface, which you’ll build in the next step.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26407 - }, - { - "endIndex": 26606, - "paragraph": { - "elements": [ - { - "endIndex": 26606, - "startIndex": 26605, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 26605 - }, - { - "endIndex": 26608, - "paragraph": { - "elements": [ - { - "endIndex": 26607, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 26606 - }, - { - "endIndex": 26608, - "startIndex": 26607, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 26606 - }, - { - "endIndex": 26644, - "paragraph": { - "elements": [ - { - "endIndex": 26644, - "startIndex": 26608, - "textRun": { - "content": "Implement the Read Eval Print Loop \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.wbrvbmbwmw3w", - "namedStyleType": "HEADING_1" - } - }, - "startIndex": 26608 - }, - { - "endIndex": 26645, - "paragraph": { - "elements": [ - { - "endIndex": 26645, - "startIndex": 26644, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 26644 - }, - { - "endIndex": 26902, - "paragraph": { - "elements": [ - { - "endIndex": 26902, - "startIndex": 26645, - "textRun": { - "content": "Interacting with a programming language is a lot more fun in a quick interactive environment. The original implementation of such an environment was LISP’s Read Eval Print Loop (REPL). You are going to implement something similar with Duktape in this step.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 26645 - }, - { - "endIndex": 26903, - "paragraph": { - "elements": [ - { - "endIndex": 26903, - "startIndex": 26902, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 26902 - }, - { - "endIndex": 26934, - "paragraph": { - "elements": [ - { - "endIndex": 26934, - "startIndex": 26903, - "textRun": { - "content": "Making things production ready\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.w9eudoi4fgk0", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 26903 - }, - { - "endIndex": 26935, - "paragraph": { - "elements": [ - { - "endIndex": 26935, - "startIndex": 26934, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 26934 - }, - { - "endIndex": 27198, - "paragraph": { - "elements": [ - { - "endIndex": 27177, - "startIndex": 26935, - "textRun": { - "content": "The current code that interacts with the Duktape C library assumes nothing can go wrong. Oh, and it doesn’t load the Duktape dynamic link libraries when under test. To make this integration production ready, you need to make a few changes to ", - "textStyle": {} - } - }, - { - "endIndex": 27196, - "startIndex": 27177, - "textRun": { - "content": "lib/ffigen_app.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 27198, - "startIndex": 27196, - "textRun": { - "content": ".\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 26935 - }, - { - "endIndex": 27199, - "paragraph": { - "elements": [ - { - "endIndex": 27199, - "startIndex": 27198, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 27198 - }, - { - "endIndex": 27219, - "paragraph": { - "elements": [ - { - "endIndex": 27218, - "startIndex": 27199, - "textRun": { - "content": "lib/ffigen_app.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/ffigen_codelab/step_07/lib/ffigen_app.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 27219, - "startIndex": 27218, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.u3704r30mqc", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 27199 - }, - { - "endIndex": 29721, - "startIndex": 27219, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 29720, - "startIndex": 27220, - "tableCells": [ - { - "content": [ - { - "endIndex": 27241, - "paragraph": { - "elements": [ - { - "endIndex": 27241, - "startIndex": 27222, - "textRun": { - "content": "import 'dart:ffi';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27222 - }, - { - "endIndex": 27259, - "paragraph": { - "elements": [ - { - "endIndex": 27259, - "startIndex": 27241, - "textRun": { - "content": "import 'dart:io';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27241 - }, - { - "endIndex": 27297, - "paragraph": { - "elements": [ - { - "endIndex": 27297, - "startIndex": 27259, - "textRun": { - "content": "import 'package:ffi/ffi.dart' as ffi;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27259 - }, - { - "endIndex": 27366, - "paragraph": { - "elements": [ - { - "endIndex": 27366, - "startIndex": 27297, - "textRun": { - "content": "import 'package:path/path.dart' as p; // Add this import\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27297 - }, - { - "endIndex": 27367, - "paragraph": { - "elements": [ - { - "endIndex": 27367, - "startIndex": 27366, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27366 - }, - { - "endIndex": 27409, - "paragraph": { - "elements": [ - { - "endIndex": 27409, - "startIndex": 27367, - "textRun": { - "content": "import 'duktape_bindings_generated.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27367 - }, - { - "endIndex": 27410, - "paragraph": { - "elements": [ - { - "endIndex": 27410, - "startIndex": 27409, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27409 - }, - { - "endIndex": 27448, - "paragraph": { - "elements": [ - { - "endIndex": 27448, - "startIndex": 27410, - "textRun": { - "content": "const String _libName = 'ffigen_app';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27410 - }, - { - "endIndex": 27449, - "paragraph": { - "elements": [ - { - "endIndex": 27449, - "startIndex": 27448, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27448 - }, - { - "endIndex": 27484, - "paragraph": { - "elements": [ - { - "endIndex": 27484, - "startIndex": 27449, - "textRun": { - "content": "final DynamicLibrary _dylib = () {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27449 - }, - { - "endIndex": 27528, - "paragraph": { - "elements": [ - { - "endIndex": 27528, - "startIndex": 27484, - "textRun": { - "content": " if (Platform.isMacOS || Platform.isIOS) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27484 - }, - { - "endIndex": 27550, - "paragraph": { - "elements": [ - { - "endIndex": 27550, - "startIndex": 27528, - "textRun": { - "content": " // Add from here…\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27528 - }, - { - "endIndex": 27610, - "paragraph": { - "elements": [ - { - "endIndex": 27610, - "startIndex": 27550, - "textRun": { - "content": " if (Platform.environment.containsKey('FLUTTER_TEST')) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27550 - }, - { - "endIndex": 27678, - "paragraph": { - "elements": [ - { - "endIndex": 27678, - "startIndex": 27610, - "textRun": { - "content": " return DynamicLibrary.open('build/macos/Build/Products/Debug'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27610 - }, - { - "endIndex": 27733, - "paragraph": { - "elements": [ - { - "endIndex": 27733, - "startIndex": 27678, - "textRun": { - "content": " '/$_libName/$_libName.framework/$_libName');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27678 - }, - { - "endIndex": 27739, - "paragraph": { - "elements": [ - { - "endIndex": 27739, - "startIndex": 27733, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27733 - }, - { - "endIndex": 27756, - "paragraph": { - "elements": [ - { - "endIndex": 27756, - "startIndex": 27739, - "textRun": { - "content": " // …to here.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27739 - }, - { - "endIndex": 27821, - "paragraph": { - "elements": [ - { - "endIndex": 27821, - "startIndex": 27756, - "textRun": { - "content": " return DynamicLibrary.open('$_libName.framework/$_libName');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27756 - }, - { - "endIndex": 27825, - "paragraph": { - "elements": [ - { - "endIndex": 27825, - "startIndex": 27821, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27821 - }, - { - "endIndex": 27873, - "paragraph": { - "elements": [ - { - "endIndex": 27873, - "startIndex": 27825, - "textRun": { - "content": " if (Platform.isAndroid || Platform.isLinux) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27825 - }, - { - "endIndex": 27895, - "paragraph": { - "elements": [ - { - "endIndex": 27895, - "startIndex": 27873, - "textRun": { - "content": " // Add from here…\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27873 - }, - { - "endIndex": 27955, - "paragraph": { - "elements": [ - { - "endIndex": 27955, - "startIndex": 27895, - "textRun": { - "content": " if (Platform.environment.containsKey('FLUTTER_TEST')) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27895 - }, - { - "endIndex": 27989, - "paragraph": { - "elements": [ - { - "endIndex": 27989, - "startIndex": 27955, - "textRun": { - "content": " return DynamicLibrary.open(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27955 - }, - { - "endIndex": 28052, - "paragraph": { - "elements": [ - { - "endIndex": 28052, - "startIndex": 27989, - "textRun": { - "content": " 'build/linux/x64/debug/bundle/lib/lib$_libName.so');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 27989 - }, - { - "endIndex": 28058, - "paragraph": { - "elements": [ - { - "endIndex": 28058, - "startIndex": 28052, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28052 - }, - { - "endIndex": 28075, - "paragraph": { - "elements": [ - { - "endIndex": 28075, - "startIndex": 28058, - "textRun": { - "content": " // …to here.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28058 - }, - { - "endIndex": 28126, - "paragraph": { - "elements": [ - { - "endIndex": 28126, - "startIndex": 28075, - "textRun": { - "content": " return DynamicLibrary.open('lib$_libName.so');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28075 - }, - { - "endIndex": 28130, - "paragraph": { - "elements": [ - { - "endIndex": 28130, - "startIndex": 28126, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28126 - }, - { - "endIndex": 28158, - "paragraph": { - "elements": [ - { - "endIndex": 28158, - "startIndex": 28130, - "textRun": { - "content": " if (Platform.isWindows) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28130 - }, - { - "endIndex": 28180, - "paragraph": { - "elements": [ - { - "endIndex": 28180, - "startIndex": 28158, - "textRun": { - "content": " // Add from here…\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28158 - }, - { - "endIndex": 28240, - "paragraph": { - "elements": [ - { - "endIndex": 28240, - "startIndex": 28180, - "textRun": { - "content": " if (Platform.environment.containsKey('FLUTTER_TEST')) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28180 - }, - { - "endIndex": 28289, - "paragraph": { - "elements": [ - { - "endIndex": 28289, - "startIndex": 28240, - "textRun": { - "content": " return DynamicLibrary.open(p.canonicalize(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28240 - }, - { - "endIndex": 28357, - "paragraph": { - "elements": [ - { - "endIndex": 28357, - "startIndex": 28289, - "textRun": { - "content": " p.join(r'build\\windows\\runner\\Debug', '$_libName.dll')));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28289 - }, - { - "endIndex": 28363, - "paragraph": { - "elements": [ - { - "endIndex": 28363, - "startIndex": 28357, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28357 - }, - { - "endIndex": 28380, - "paragraph": { - "elements": [ - { - "endIndex": 28380, - "startIndex": 28363, - "textRun": { - "content": " // …to here.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28363 - }, - { - "endIndex": 28429, - "paragraph": { - "elements": [ - { - "endIndex": 28429, - "startIndex": 28380, - "textRun": { - "content": " return DynamicLibrary.open('$_libName.dll');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28380 - }, - { - "endIndex": 28433, - "paragraph": { - "elements": [ - { - "endIndex": 28433, - "startIndex": 28429, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28429 - }, - { - "endIndex": 28508, - "paragraph": { - "elements": [ - { - "endIndex": 28508, - "startIndex": 28433, - "textRun": { - "content": " throw UnsupportedError('Unknown platform: ${Platform.operatingSystem}');\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28433 - }, - { - "endIndex": 28513, - "paragraph": { - "elements": [ - { - "endIndex": 28513, - "startIndex": 28508, - "textRun": { - "content": "}();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28508 - }, - { - "endIndex": 28514, - "paragraph": { - "elements": [ - { - "endIndex": 28514, - "startIndex": 28513, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28513 - }, - { - "endIndex": 28573, - "paragraph": { - "elements": [ - { - "endIndex": 28573, - "startIndex": 28514, - "textRun": { - "content": "final DuktapeBindings _bindings = DuktapeBindings(_dylib);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28514 - }, - { - "endIndex": 28574, - "paragraph": { - "elements": [ - { - "endIndex": 28574, - "startIndex": 28573, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28573 - }, - { - "endIndex": 28590, - "paragraph": { - "elements": [ - { - "endIndex": 28590, - "startIndex": 28574, - "textRun": { - "content": "class Duktape {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28574 - }, - { - "endIndex": 28604, - "paragraph": { - "elements": [ - { - "endIndex": 28604, - "startIndex": 28590, - "textRun": { - "content": " Duktape() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28590 - }, - { - "endIndex": 28614, - "paragraph": { - "elements": [ - { - "endIndex": 28614, - "startIndex": 28604, - "textRun": { - "content": " ctx =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28604 - }, - { - "endIndex": 28694, - "paragraph": { - "elements": [ - { - "endIndex": 28694, - "startIndex": 28614, - "textRun": { - "content": " _bindings.duk_create_heap(nullptr, nullptr, nullptr, nullptr, nullptr);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28614 - }, - { - "endIndex": 28698, - "paragraph": { - "elements": [ - { - "endIndex": 28698, - "startIndex": 28694, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28694 - }, - { - "endIndex": 28699, - "paragraph": { - "elements": [ - { - "endIndex": 28699, - "startIndex": 28698, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28698 - }, - { - "endIndex": 28725, - "paragraph": { - "elements": [ - { - "endIndex": 28725, - "startIndex": 28699, - "textRun": { - "content": " // Modify this function\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28699 - }, - { - "endIndex": 28762, - "paragraph": { - "elements": [ - { - "endIndex": 28762, - "startIndex": 28725, - "textRun": { - "content": " String evalString(String jsCode) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28725 - }, - { - "endIndex": 28806, - "paragraph": { - "elements": [ - { - "endIndex": 28806, - "startIndex": 28762, - "textRun": { - "content": " var nativeUtf8 = jsCode.toNativeUtf8();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28762 - }, - { - "endIndex": 28853, - "paragraph": { - "elements": [ - { - "endIndex": 28853, - "startIndex": 28806, - "textRun": { - "content": " final evalResult = _bindings.duk_eval_raw(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28806 - }, - { - "endIndex": 28866, - "paragraph": { - "elements": [ - { - "endIndex": 28866, - "startIndex": 28853, - "textRun": { - "content": " ctx,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28853 - }, - { - "endIndex": 28899, - "paragraph": { - "elements": [ - { - "endIndex": 28899, - "startIndex": 28866, - "textRun": { - "content": " nativeUtf8.cast(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28866 - }, - { - "endIndex": 28910, - "paragraph": { - "elements": [ - { - "endIndex": 28910, - "startIndex": 28899, - "textRun": { - "content": " 0,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28899 - }, - { - "endIndex": 28922, - "paragraph": { - "elements": [ - { - "endIndex": 28922, - "startIndex": 28910, - "textRun": { - "content": " 0 |\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28910 - }, - { - "endIndex": 28953, - "paragraph": { - "elements": [ - { - "endIndex": 28953, - "startIndex": 28922, - "textRun": { - "content": " DUK_COMPILE_EVAL |\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28922 - }, - { - "endIndex": 28984, - "paragraph": { - "elements": [ - { - "endIndex": 28984, - "startIndex": 28953, - "textRun": { - "content": " DUK_COMPILE_SAFE |\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28953 - }, - { - "endIndex": 29019, - "paragraph": { - "elements": [ - { - "endIndex": 29019, - "startIndex": 28984, - "textRun": { - "content": " DUK_COMPILE_NOSOURCE |\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 28984 - }, - { - "endIndex": 29052, - "paragraph": { - "elements": [ - { - "endIndex": 29052, - "startIndex": 29019, - "textRun": { - "content": " DUK_COMPILE_STRLEN |\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29019 - }, - { - "endIndex": 29089, - "paragraph": { - "elements": [ - { - "endIndex": 29089, - "startIndex": 29052, - "textRun": { - "content": " DUK_COMPILE_NOFILENAME);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29052 - }, - { - "endIndex": 29122, - "paragraph": { - "elements": [ - { - "endIndex": 29122, - "startIndex": 29089, - "textRun": { - "content": " ffi.malloc.free(nativeUtf8);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29089 - }, - { - "endIndex": 29123, - "paragraph": { - "elements": [ - { - "endIndex": 29123, - "startIndex": 29122, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29122 - }, - { - "endIndex": 29150, - "paragraph": { - "elements": [ - { - "endIndex": 29150, - "startIndex": 29123, - "textRun": { - "content": " if (evalResult != 0) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29123 - }, - { - "endIndex": 29193, - "paragraph": { - "elements": [ - { - "endIndex": 29193, - "startIndex": 29150, - "textRun": { - "content": " throw _retrieveTopOfStackAsString();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29150 - }, - { - "endIndex": 29199, - "paragraph": { - "elements": [ - { - "endIndex": 29199, - "startIndex": 29193, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29193 - }, - { - "endIndex": 29200, - "paragraph": { - "elements": [ - { - "endIndex": 29200, - "startIndex": 29199, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29199 - }, - { - "endIndex": 29242, - "paragraph": { - "elements": [ - { - "endIndex": 29242, - "startIndex": 29200, - "textRun": { - "content": " return _retrieveTopOfStackAsString();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29200 - }, - { - "endIndex": 29246, - "paragraph": { - "elements": [ - { - "endIndex": 29246, - "startIndex": 29242, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29242 - }, - { - "endIndex": 29247, - "paragraph": { - "elements": [ - { - "endIndex": 29247, - "startIndex": 29246, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29246 - }, - { - "endIndex": 29270, - "paragraph": { - "elements": [ - { - "endIndex": 29270, - "startIndex": 29247, - "textRun": { - "content": " // Add this function\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29247 - }, - { - "endIndex": 29311, - "paragraph": { - "elements": [ - { - "endIndex": 29311, - "startIndex": 29270, - "textRun": { - "content": " String _retrieveTopOfStackAsString() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29270 - }, - { - "endIndex": 29364, - "paragraph": { - "elements": [ - { - "endIndex": 29364, - "startIndex": 29311, - "textRun": { - "content": " Pointer outLengthPtr = ffi.calloc();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29311 - }, - { - "endIndex": 29442, - "paragraph": { - "elements": [ - { - "endIndex": 29442, - "startIndex": 29364, - "textRun": { - "content": " final errorStrPtr = _bindings.duk_safe_to_lstring(ctx, -1, outLengthPtr);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29364 - }, - { - "endIndex": 29464, - "paragraph": { - "elements": [ - { - "endIndex": 29464, - "startIndex": 29442, - "textRun": { - "content": " final returnVal =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29442 - }, - { - "endIndex": 29543, - "paragraph": { - "elements": [ - { - "endIndex": 29543, - "startIndex": 29464, - "textRun": { - "content": " errorStrPtr.cast().toDartString(length: outLengthPtr.value);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29464 - }, - { - "endIndex": 29578, - "paragraph": { - "elements": [ - { - "endIndex": 29578, - "startIndex": 29543, - "textRun": { - "content": " ffi.calloc.free(outLengthPtr);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29543 - }, - { - "endIndex": 29600, - "paragraph": { - "elements": [ - { - "endIndex": 29600, - "startIndex": 29578, - "textRun": { - "content": " return returnVal;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29578 - }, - { - "endIndex": 29604, - "paragraph": { - "elements": [ - { - "endIndex": 29604, - "startIndex": 29600, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29600 - }, - { - "endIndex": 29605, - "paragraph": { - "elements": [ - { - "endIndex": 29605, - "startIndex": 29604, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29604 - }, - { - "endIndex": 29624, - "paragraph": { - "elements": [ - { - "endIndex": 29624, - "startIndex": 29605, - "textRun": { - "content": " void dispose() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29605 - }, - { - "endIndex": 29661, - "paragraph": { - "elements": [ - { - "endIndex": 29661, - "startIndex": 29624, - "textRun": { - "content": " _bindings.duk_destroy_heap(ctx);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29624 - }, - { - "endIndex": 29680, - "paragraph": { - "elements": [ - { - "endIndex": 29680, - "startIndex": 29661, - "textRun": { - "content": " ctx = nullptr;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29661 - }, - { - "endIndex": 29684, - "paragraph": { - "elements": [ - { - "endIndex": 29684, - "startIndex": 29680, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29680 - }, - { - "endIndex": 29685, - "paragraph": { - "elements": [ - { - "endIndex": 29685, - "startIndex": 29684, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29684 - }, - { - "endIndex": 29718, - "paragraph": { - "elements": [ - { - "endIndex": 29718, - "startIndex": 29685, - "textRun": { - "content": " late Pointer ctx;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29685 - }, - { - "endIndex": 29720, - "paragraph": { - "elements": [ - { - "endIndex": 29720, - "startIndex": 29718, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29718 - } - ], - "endIndex": 29720, - "startIndex": 27221, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 28.5, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 29722, - "paragraph": { - "elements": [ - { - "endIndex": 29722, - "startIndex": 29721, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29721 - }, - { - "endIndex": 29723, - "paragraph": { - "elements": [ - { - "endIndex": 29723, - "startIndex": 29722, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29722 - }, - { - "endIndex": 30226, - "paragraph": { - "elements": [ - { - "endIndex": 30226, - "startIndex": 29723, - "textRun": { - "content": "The code to load the dynamic link library has been extended to handle the case where the plugin is being used in a test runner. This enables an integration test to be written that exercises this API as a Flutter test. The code to evaluate a string of JavaScript code has been extended to correctly handle error conditions, for example incomplete or incorrect code. This additional code shows how to handle situations where strings are returned as byte arrays and need to be converted into Dart strings.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 29723 - }, - { - "endIndex": 30242, - "paragraph": { - "elements": [ - { - "endIndex": 30242, - "startIndex": 30226, - "textRun": { - "content": "Adding packages\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.efv6xmx1ee6l", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 30226 - }, - { - "endIndex": 30658, - "paragraph": { - "elements": [ - { - "endIndex": 30467, - "startIndex": 30242, - "textRun": { - "content": "In creating a REPL, you’ll display an interaction between the user and the Duktape JavaScript engine. The user enters lines of code, and Duktape responds with either the result of the computation, or an exception. You’ll use ", - "textStyle": {} - } - }, - { - "endIndex": 30474, - "startIndex": 30467, - "textRun": { - "content": "freezed", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/freezed" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30551, - "startIndex": 30474, - "textRun": { - "content": " to reduce the amount of boilerplate code you need to write. You’ll also use ", - "textStyle": {} - } - }, - { - "endIndex": 30563, - "startIndex": 30551, - "textRun": { - "content": "google_fonts", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/google_fonts" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30619, - "startIndex": 30563, - "textRun": { - "content": " to make the displayed content a bit more on theme, and ", - "textStyle": {} - } - }, - { - "endIndex": 30635, - "startIndex": 30619, - "textRun": { - "content": "flutter_riverpod", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/flutter_riverpod" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 30658, - "startIndex": 30635, - "textRun": { - "content": " for state management.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 30242 - }, - { - "endIndex": 30659, - "paragraph": { - "elements": [ - { - "endIndex": 30659, - "startIndex": 30658, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 30658 - }, - { - "endIndex": 30709, - "paragraph": { - "elements": [ - { - "endIndex": 30709, - "startIndex": 30659, - "textRun": { - "content": "Add the required dependencies to the example app:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 30659 - }, - { - "endIndex": 30710, - "paragraph": { - "elements": [ - { - "endIndex": 30710, - "startIndex": 30709, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30709 - }, - { - "endIndex": 30836, - "startIndex": 30710, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 30835, - "startIndex": 30711, - "tableCells": [ - { - "content": [ - { - "endIndex": 30726, - "paragraph": { - "elements": [ - { - "endIndex": 30726, - "startIndex": 30713, - "textRun": { - "content": "$ cd example\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30713 - }, - { - "endIndex": 30793, - "paragraph": { - "elements": [ - { - "endIndex": 30793, - "startIndex": 30726, - "textRun": { - "content": "$ flutter pub add flutter_riverpod freezed_annotation google_fonts\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30726 - }, - { - "endIndex": 30835, - "paragraph": { - "elements": [ - { - "endIndex": 30835, - "startIndex": 30793, - "textRun": { - "content": "$ flutter pub add -d build_runner freezed\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30793 - } - ], - "endIndex": 30835, - "startIndex": 30712, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 28.5, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 30837, - "paragraph": { - "elements": [ - { - "endIndex": 30837, - "startIndex": 30836, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30836 - }, - { - "endIndex": 30889, - "paragraph": { - "elements": [ - { - "endIndex": 30889, - "startIndex": 30837, - "textRun": { - "content": "Next, create a file to record the REPL interaction:\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30837 - }, - { - "endIndex": 30922, - "paragraph": { - "elements": [ - { - "endIndex": 30921, - "startIndex": 30889, - "textRun": { - "content": "example/lib/duktape_message.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/ffigen_codelab/step_07/example/lib/duktape_message.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 30922, - "startIndex": 30921, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.tnhr4op3wzvo", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 30889 - }, - { - "endIndex": 31292, - "startIndex": 30922, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 31291, - "startIndex": 30923, - "tableCells": [ - { - "content": [ - { - "endIndex": 30986, - "paragraph": { - "elements": [ - { - "endIndex": 30986, - "startIndex": 30925, - "textRun": { - "content": "import 'package:freezed_annotation/freezed_annotation.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30925 - }, - { - "endIndex": 30987, - "paragraph": { - "elements": [ - { - "endIndex": 30987, - "startIndex": 30986, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30986 - }, - { - "endIndex": 31024, - "paragraph": { - "elements": [ - { - "endIndex": 31024, - "startIndex": 30987, - "textRun": { - "content": "part 'duktape_message.freezed.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 30987 - }, - { - "endIndex": 31025, - "paragraph": { - "elements": [ - { - "endIndex": 31025, - "startIndex": 31024, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31024 - }, - { - "endIndex": 31034, - "paragraph": { - "elements": [ - { - "endIndex": 31034, - "startIndex": 31025, - "textRun": { - "content": "@freezed\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31025 - }, - { - "endIndex": 31079, - "paragraph": { - "elements": [ - { - "endIndex": 31079, - "startIndex": 31034, - "textRun": { - "content": "class DuktapeMessage with _$DuktapeMessage {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31034 - }, - { - "endIndex": 31148, - "paragraph": { - "elements": [ - { - "endIndex": 31148, - "startIndex": 31079, - "textRun": { - "content": " factory DuktapeMessage.evaluate(String code) = DuktapeMessageCode;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31079 - }, - { - "endIndex": 31223, - "paragraph": { - "elements": [ - { - "endIndex": 31223, - "startIndex": 31148, - "textRun": { - "content": " factory DuktapeMessage.response(String result) = DuktapeMessageResponse;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31148 - }, - { - "endIndex": 31289, - "paragraph": { - "elements": [ - { - "endIndex": 31289, - "startIndex": 31223, - "textRun": { - "content": " factory DuktapeMessage.error(String log) = DuktapeMessageError;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31223 - }, - { - "endIndex": 31291, - "paragraph": { - "elements": [ - { - "endIndex": 31291, - "startIndex": 31289, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31289 - } - ], - "endIndex": 31291, - "startIndex": 30924, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "magnitude": 28.5, - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 31293, - "paragraph": { - "elements": [ - { - "endIndex": 31293, - "startIndex": 31292, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31292 - }, - { - "endIndex": 31593, - "paragraph": { - "elements": [ - { - "endIndex": 31309, - "startIndex": 31293, - "textRun": { - "content": "This class uses ", - "textStyle": {} - } - }, - { - "endIndex": 31316, - "startIndex": 31309, - "textRun": { - "content": "freezed", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/freezed#union-types-and-sealed-classes" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 31337, - "startIndex": 31316, - "textRun": { - "content": "’s union type feature", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/freezed#union-types-and-sealed-classes" - }, - "underline": true - } - } - }, - { - "endIndex": 31593, - "startIndex": 31337, - "textRun": { - "content": " to enable easy expression of the shape of each line displayed in the REPL as one of three types. At this point, your code probably is showing some form of error on this code, as there is additional code that needs to be generated. Do that now as follows.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31293 - }, - { - "endIndex": 31594, - "paragraph": { - "elements": [ - { - "endIndex": 31594, - "startIndex": 31593, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31593 - }, - { - "endIndex": 31635, - "startIndex": 31594, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 31634, - "startIndex": 31595, - "tableCells": [ - { - "content": [ - { - "endIndex": 31634, - "paragraph": { - "elements": [ - { - "endIndex": 31634, - "startIndex": 31597, - "textRun": { - "content": "$ flutter pub run build_runner build\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31597 - } - ], - "endIndex": 31634, - "startIndex": 31596, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 31636, - "paragraph": { - "elements": [ - { - "endIndex": 31636, - "startIndex": 31635, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31635 - }, - { - "endIndex": 31745, - "paragraph": { - "elements": [ - { - "endIndex": 31655, - "startIndex": 31636, - "textRun": { - "content": "This generates the ", - "textStyle": {} - } - }, - { - "endIndex": 31695, - "startIndex": 31655, - "textRun": { - "content": "example/lib/duktape_message.freezed.dart", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 31745, - "startIndex": 31695, - "textRun": { - "content": " file, which the code you just typed relies upon.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31636 - }, - { - "endIndex": 31746, - "paragraph": { - "elements": [ - { - "endIndex": 31746, - "startIndex": 31745, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31745 - }, - { - "endIndex": 31893, - "paragraph": { - "elements": [ - { - "endIndex": 31839, - "startIndex": 31746, - "textRun": { - "content": "Next, you’ll need to make a pair of modifications to the macOS configuration files to enable ", - "textStyle": {} - } - }, - { - "endIndex": 31851, - "startIndex": 31839, - "textRun": { - "content": "google_fonts", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 31893, - "startIndex": 31851, - "textRun": { - "content": " to make network requests for font data. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 31746 - }, - { - "endIndex": 31940, - "paragraph": { - "elements": [ - { - "endIndex": 31939, - "startIndex": 31893, - "textRun": { - "content": "example/macos/Runner/DebugProfile.entitlements", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/ffigen_codelab/step_07/example/macos/Runner/DebugProfile.entitlements" - }, - "underline": true - } - } - }, - { - "endIndex": 31940, - "startIndex": 31939, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.uhwya0z9ptr8", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 31893 - }, - { - "endIndex": 32391, - "startIndex": 31940, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 32390, - "startIndex": 31941, - "tableCells": [ - { - "content": [ - { - "endIndex": 31982, - "paragraph": { - "elements": [ - { - "endIndex": 31982, - "startIndex": 31943, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31943 - }, - { - "endIndex": 32085, - "paragraph": { - "elements": [ - { - "endIndex": 32085, - "startIndex": 31982, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 31982 - }, - { - "endIndex": 32107, - "paragraph": { - "elements": [ - { - "endIndex": 32107, - "startIndex": 32085, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32085 - }, - { - "endIndex": 32114, - "paragraph": { - "elements": [ - { - "endIndex": 32114, - "startIndex": 32107, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32107 - }, - { - "endIndex": 32157, - "paragraph": { - "elements": [ - { - "endIndex": 32157, - "startIndex": 32114, - "textRun": { - "content": "\tcom.apple.security.app-sandbox\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32114 - }, - { - "endIndex": 32166, - "paragraph": { - "elements": [ - { - "endIndex": 32166, - "startIndex": 32157, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32157 - }, - { - "endIndex": 32210, - "paragraph": { - "elements": [ - { - "endIndex": 32210, - "startIndex": 32166, - "textRun": { - "content": "\tcom.apple.security.cs.allow-jit\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32166 - }, - { - "endIndex": 32219, - "paragraph": { - "elements": [ - { - "endIndex": 32219, - "startIndex": 32210, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32210 - }, - { - "endIndex": 32265, - "paragraph": { - "elements": [ - { - "endIndex": 32265, - "startIndex": 32219, - "textRun": { - "content": "\tcom.apple.security.network.server\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32219 - }, - { - "endIndex": 32274, - "paragraph": { - "elements": [ - { - "endIndex": 32274, - "startIndex": 32265, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32265 - }, - { - "endIndex": 32299, - "paragraph": { - "elements": [ - { - "endIndex": 32299, - "startIndex": 32274, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32274 - }, - { - "endIndex": 32345, - "paragraph": { - "elements": [ - { - "endIndex": 32345, - "startIndex": 32299, - "textRun": { - "content": "\tcom.apple.security.network.client\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32299 - }, - { - "endIndex": 32354, - "paragraph": { - "elements": [ - { - "endIndex": 32354, - "startIndex": 32345, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32345 - }, - { - "endIndex": 32373, - "paragraph": { - "elements": [ - { - "endIndex": 32373, - "startIndex": 32354, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32354 - }, - { - "endIndex": 32381, - "paragraph": { - "elements": [ - { - "endIndex": 32381, - "startIndex": 32373, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32373 - }, - { - "endIndex": 32390, - "paragraph": { - "elements": [ - { - "endIndex": 32389, - "startIndex": 32381, - "textRun": { - "content": "", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 32390, - "startIndex": 32389, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32381 - } - ], - "endIndex": 32390, - "startIndex": 31942, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 32392, - "paragraph": { - "elements": [ - { - "endIndex": 32392, - "startIndex": 32391, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32391 - }, - { - "endIndex": 32434, - "paragraph": { - "elements": [ - { - "endIndex": 32433, - "startIndex": 32392, - "textRun": { - "content": "example/macos/Runner/Release.entitlements", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/ffigen_codelab/step_07/example/macos/Runner/Release.entitlements" - }, - "underline": true - } - } - }, - { - "endIndex": 32434, - "startIndex": 32433, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.5u8yy8o6etaz", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 32392 - }, - { - "endIndex": 32777, - "startIndex": 32434, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 32776, - "startIndex": 32435, - "tableCells": [ - { - "content": [ - { - "endIndex": 32476, - "paragraph": { - "elements": [ - { - "endIndex": 32476, - "startIndex": 32437, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32437 - }, - { - "endIndex": 32579, - "paragraph": { - "elements": [ - { - "endIndex": 32579, - "startIndex": 32476, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32476 - }, - { - "endIndex": 32601, - "paragraph": { - "elements": [ - { - "endIndex": 32601, - "startIndex": 32579, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32579 - }, - { - "endIndex": 32608, - "paragraph": { - "elements": [ - { - "endIndex": 32608, - "startIndex": 32601, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32601 - }, - { - "endIndex": 32651, - "paragraph": { - "elements": [ - { - "endIndex": 32651, - "startIndex": 32608, - "textRun": { - "content": "\tcom.apple.security.app-sandbox\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32608 - }, - { - "endIndex": 32660, - "paragraph": { - "elements": [ - { - "endIndex": 32660, - "startIndex": 32651, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32651 - }, - { - "endIndex": 32685, - "paragraph": { - "elements": [ - { - "endIndex": 32685, - "startIndex": 32660, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32660 - }, - { - "endIndex": 32731, - "paragraph": { - "elements": [ - { - "endIndex": 32731, - "startIndex": 32685, - "textRun": { - "content": "\tcom.apple.security.network.client\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32685 - }, - { - "endIndex": 32740, - "paragraph": { - "elements": [ - { - "endIndex": 32740, - "startIndex": 32731, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32731 - }, - { - "endIndex": 32759, - "paragraph": { - "elements": [ - { - "endIndex": 32759, - "startIndex": 32740, - "textRun": { - "content": "\t\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32740 - }, - { - "endIndex": 32767, - "paragraph": { - "elements": [ - { - "endIndex": 32767, - "startIndex": 32759, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32759 - }, - { - "endIndex": 32776, - "paragraph": { - "elements": [ - { - "endIndex": 32776, - "startIndex": 32767, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 32767 - } - ], - "endIndex": 32776, - "startIndex": 32436, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 32778, - "paragraph": { - "elements": [ - { - "endIndex": 32778, - "startIndex": 32777, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 32777 - }, - { - "endIndex": 32796, - "paragraph": { - "elements": [ - { - "endIndex": 32796, - "startIndex": 32778, - "textRun": { - "content": "Building the REPL\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.n7m7u2fkje11", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 32778 - }, - { - "endIndex": 32797, - "paragraph": { - "elements": [ - { - "endIndex": 32797, - "startIndex": 32796, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 32796 - }, - { - "endIndex": 32978, - "paragraph": { - "elements": [ - { - "endIndex": 32978, - "startIndex": 32797, - "textRun": { - "content": "Now that you have updated the integration layer to handle errors, and you have built a data representation for the interaction, it’s time to build the example app’s user interface.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 32797 - }, - { - "endIndex": 33000, - "paragraph": { - "elements": [ - { - "endIndex": 32999, - "startIndex": 32978, - "textRun": { - "content": "example/lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/main/ffigen_codelab/step_07/example/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 33000, - "startIndex": 32999, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.dlc5sples8mi", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 32978 - }, - { - "endIndex": 38607, - "startIndex": 33000, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 38606, - "startIndex": 33001, - "tableCells": [ - { - "content": [ - { - "endIndex": 33048, - "paragraph": { - "elements": [ - { - "endIndex": 33048, - "startIndex": 33003, - "textRun": { - "content": "import 'package:ffigen_app/ffigen_app.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33003 - }, - { - "endIndex": 33088, - "paragraph": { - "elements": [ - { - "endIndex": 33088, - "startIndex": 33048, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33048 - }, - { - "endIndex": 33145, - "paragraph": { - "elements": [ - { - "endIndex": 33145, - "startIndex": 33088, - "textRun": { - "content": "import 'package:flutter_riverpod/flutter_riverpod.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33088 - }, - { - "endIndex": 33194, - "paragraph": { - "elements": [ - { - "endIndex": 33194, - "startIndex": 33145, - "textRun": { - "content": "import 'package:google_fonts/google_fonts.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33145 - }, - { - "endIndex": 33195, - "paragraph": { - "elements": [ - { - "endIndex": 33195, - "startIndex": 33194, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33194 - }, - { - "endIndex": 33226, - "paragraph": { - "elements": [ - { - "endIndex": 33226, - "startIndex": 33195, - "textRun": { - "content": "import 'duktape_message.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33195 - }, - { - "endIndex": 33227, - "paragraph": { - "elements": [ - { - "endIndex": 33227, - "startIndex": 33226, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33226 - }, - { - "endIndex": 33241, - "paragraph": { - "elements": [ - { - "endIndex": 33241, - "startIndex": 33227, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33227 - }, - { - "endIndex": 33293, - "paragraph": { - "elements": [ - { - "endIndex": 33293, - "startIndex": 33241, - "textRun": { - "content": " runApp(const ProviderScope(child: DuktapeApp()));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33241 - }, - { - "endIndex": 33295, - "paragraph": { - "elements": [ - { - "endIndex": 33295, - "startIndex": 33293, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33293 - }, - { - "endIndex": 33296, - "paragraph": { - "elements": [ - { - "endIndex": 33296, - "startIndex": 33295, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33295 - }, - { - "endIndex": 33328, - "paragraph": { - "elements": [ - { - "endIndex": 33328, - "startIndex": 33296, - "textRun": { - "content": "final duktapeMessagesProvider =\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33296 - }, - { - "endIndex": 33408, - "paragraph": { - "elements": [ - { - "endIndex": 33408, - "startIndex": 33328, - "textRun": { - "content": " StateNotifierProvider>((ref) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33328 - }, - { - "endIndex": 33471, - "paragraph": { - "elements": [ - { - "endIndex": 33471, - "startIndex": 33408, - "textRun": { - "content": " return DuktapeMessageNotifier(messages: []);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33408 - }, - { - "endIndex": 33475, - "paragraph": { - "elements": [ - { - "endIndex": 33475, - "startIndex": 33471, - "textRun": { - "content": "});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33471 - }, - { - "endIndex": 33476, - "paragraph": { - "elements": [ - { - "endIndex": 33476, - "startIndex": 33475, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33475 - }, - { - "endIndex": 33551, - "paragraph": { - "elements": [ - { - "endIndex": 33551, - "startIndex": 33476, - "textRun": { - "content": "class DuktapeMessageNotifier extends StateNotifier> {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33476 - }, - { - "endIndex": 33618, - "paragraph": { - "elements": [ - { - "endIndex": 33618, - "startIndex": 33551, - "textRun": { - "content": " DuktapeMessageNotifier({required List messages})\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33551 - }, - { - "endIndex": 33647, - "paragraph": { - "elements": [ - { - "endIndex": 33647, - "startIndex": 33618, - "textRun": { - "content": " : duktape = Duktape(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33618 - }, - { - "endIndex": 33672, - "paragraph": { - "elements": [ - { - "endIndex": 33672, - "startIndex": 33647, - "textRun": { - "content": " super(messages);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33647 - }, - { - "endIndex": 33697, - "paragraph": { - "elements": [ - { - "endIndex": 33697, - "startIndex": 33672, - "textRun": { - "content": " final Duktape duktape;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33672 - }, - { - "endIndex": 33698, - "paragraph": { - "elements": [ - { - "endIndex": 33698, - "startIndex": 33697, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33697 - }, - { - "endIndex": 33725, - "paragraph": { - "elements": [ - { - "endIndex": 33725, - "startIndex": 33698, - "textRun": { - "content": " void eval(String code) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33698 - }, - { - "endIndex": 33739, - "paragraph": { - "elements": [ - { - "endIndex": 33739, - "startIndex": 33725, - "textRun": { - "content": " state = [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33725 - }, - { - "endIndex": 33776, - "paragraph": { - "elements": [ - { - "endIndex": 33776, - "startIndex": 33739, - "textRun": { - "content": " DuktapeMessage.evaluate(code),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33739 - }, - { - "endIndex": 33792, - "paragraph": { - "elements": [ - { - "endIndex": 33792, - "startIndex": 33776, - "textRun": { - "content": " ...state,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33776 - }, - { - "endIndex": 33799, - "paragraph": { - "elements": [ - { - "endIndex": 33799, - "startIndex": 33792, - "textRun": { - "content": " ];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33792 - }, - { - "endIndex": 33809, - "paragraph": { - "elements": [ - { - "endIndex": 33809, - "startIndex": 33799, - "textRun": { - "content": " try {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33799 - }, - { - "endIndex": 33858, - "paragraph": { - "elements": [ - { - "endIndex": 33858, - "startIndex": 33809, - "textRun": { - "content": " final response = duktape.evalString(code);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33809 - }, - { - "endIndex": 33874, - "paragraph": { - "elements": [ - { - "endIndex": 33874, - "startIndex": 33858, - "textRun": { - "content": " state = [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33858 - }, - { - "endIndex": 33917, - "paragraph": { - "elements": [ - { - "endIndex": 33917, - "startIndex": 33874, - "textRun": { - "content": " DuktapeMessage.response(response),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33874 - }, - { - "endIndex": 33935, - "paragraph": { - "elements": [ - { - "endIndex": 33935, - "startIndex": 33917, - "textRun": { - "content": " ...state,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33917 - }, - { - "endIndex": 33944, - "paragraph": { - "elements": [ - { - "endIndex": 33944, - "startIndex": 33935, - "textRun": { - "content": " ];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33935 - }, - { - "endIndex": 33962, - "paragraph": { - "elements": [ - { - "endIndex": 33962, - "startIndex": 33944, - "textRun": { - "content": " } catch (e) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33944 - }, - { - "endIndex": 33978, - "paragraph": { - "elements": [ - { - "endIndex": 33978, - "startIndex": 33962, - "textRun": { - "content": " state = [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33962 - }, - { - "endIndex": 34014, - "paragraph": { - "elements": [ - { - "endIndex": 34014, - "startIndex": 33978, - "textRun": { - "content": " DuktapeMessage.error('$e'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 33978 - }, - { - "endIndex": 34032, - "paragraph": { - "elements": [ - { - "endIndex": 34032, - "startIndex": 34014, - "textRun": { - "content": " ...state,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34014 - }, - { - "endIndex": 34041, - "paragraph": { - "elements": [ - { - "endIndex": 34041, - "startIndex": 34032, - "textRun": { - "content": " ];\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34032 - }, - { - "endIndex": 34047, - "paragraph": { - "elements": [ - { - "endIndex": 34047, - "startIndex": 34041, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34041 - }, - { - "endIndex": 34051, - "paragraph": { - "elements": [ - { - "endIndex": 34051, - "startIndex": 34047, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34047 - }, - { - "endIndex": 34053, - "paragraph": { - "elements": [ - { - "endIndex": 34053, - "startIndex": 34051, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34051 - }, - { - "endIndex": 34054, - "paragraph": { - "elements": [ - { - "endIndex": 34054, - "startIndex": 34053, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34053 - }, - { - "endIndex": 34097, - "paragraph": { - "elements": [ - { - "endIndex": 34097, - "startIndex": 34054, - "textRun": { - "content": "class DuktapeApp extends StatelessWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34054 - }, - { - "endIndex": 34130, - "paragraph": { - "elements": [ - { - "endIndex": 34130, - "startIndex": 34097, - "textRun": { - "content": " const DuktapeApp({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34097 - }, - { - "endIndex": 34131, - "paragraph": { - "elements": [ - { - "endIndex": 34131, - "startIndex": 34130, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34130 - }, - { - "endIndex": 34143, - "paragraph": { - "elements": [ - { - "endIndex": 34143, - "startIndex": 34131, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34131 - }, - { - "endIndex": 34182, - "paragraph": { - "elements": [ - { - "endIndex": 34182, - "startIndex": 34143, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34143 - }, - { - "endIndex": 34212, - "paragraph": { - "elements": [ - { - "endIndex": 34212, - "startIndex": 34182, - "textRun": { - "content": " return const MaterialApp(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34182 - }, - { - "endIndex": 34240, - "paragraph": { - "elements": [ - { - "endIndex": 34240, - "startIndex": 34212, - "textRun": { - "content": " title: 'Duktape App',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34212 - }, - { - "endIndex": 34267, - "paragraph": { - "elements": [ - { - "endIndex": 34267, - "startIndex": 34240, - "textRun": { - "content": " home: DuktapeRepl(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34240 - }, - { - "endIndex": 34274, - "paragraph": { - "elements": [ - { - "endIndex": 34274, - "startIndex": 34267, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34267 - }, - { - "endIndex": 34278, - "paragraph": { - "elements": [ - { - "endIndex": 34278, - "startIndex": 34274, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34274 - }, - { - "endIndex": 34280, - "paragraph": { - "elements": [ - { - "endIndex": 34280, - "startIndex": 34278, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34278 - }, - { - "endIndex": 34281, - "paragraph": { - "elements": [ - { - "endIndex": 34281, - "startIndex": 34280, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34280 - }, - { - "endIndex": 34332, - "paragraph": { - "elements": [ - { - "endIndex": 34332, - "startIndex": 34281, - "textRun": { - "content": "class DuktapeRepl extends ConsumerStatefulWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34281 - }, - { - "endIndex": 34354, - "paragraph": { - "elements": [ - { - "endIndex": 34354, - "startIndex": 34332, - "textRun": { - "content": " const DuktapeRepl({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34332 - }, - { - "endIndex": 34369, - "paragraph": { - "elements": [ - { - "endIndex": 34369, - "startIndex": 34354, - "textRun": { - "content": " super.key,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34354 - }, - { - "endIndex": 34375, - "paragraph": { - "elements": [ - { - "endIndex": 34375, - "startIndex": 34369, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34369 - }, - { - "endIndex": 34376, - "paragraph": { - "elements": [ - { - "endIndex": 34376, - "startIndex": 34375, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34375 - }, - { - "endIndex": 34388, - "paragraph": { - "elements": [ - { - "endIndex": 34388, - "startIndex": 34376, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34376 - }, - { - "endIndex": 34455, - "paragraph": { - "elements": [ - { - "endIndex": 34455, - "startIndex": 34388, - "textRun": { - "content": " ConsumerState createState() => _DuktapeReplState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34388 - }, - { - "endIndex": 34457, - "paragraph": { - "elements": [ - { - "endIndex": 34457, - "startIndex": 34455, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34455 - }, - { - "endIndex": 34458, - "paragraph": { - "elements": [ - { - "endIndex": 34458, - "startIndex": 34457, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34457 - }, - { - "endIndex": 34519, - "paragraph": { - "elements": [ - { - "endIndex": 34519, - "startIndex": 34458, - "textRun": { - "content": "class _DuktapeReplState extends ConsumerState {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34458 - }, - { - "endIndex": 34566, - "paragraph": { - "elements": [ - { - "endIndex": 34566, - "startIndex": 34519, - "textRun": { - "content": " final _controller = TextEditingController();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34519 - }, - { - "endIndex": 34600, - "paragraph": { - "elements": [ - { - "endIndex": 34600, - "startIndex": 34566, - "textRun": { - "content": " final _focusNode = FocusNode();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34566 - }, - { - "endIndex": 34628, - "paragraph": { - "elements": [ - { - "endIndex": 34628, - "startIndex": 34600, - "textRun": { - "content": " var _isComposing = false;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34600 - }, - { - "endIndex": 34629, - "paragraph": { - "elements": [ - { - "endIndex": 34629, - "startIndex": 34628, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34628 - }, - { - "endIndex": 34668, - "paragraph": { - "elements": [ - { - "endIndex": 34668, - "startIndex": 34629, - "textRun": { - "content": " void _handleSubmitted(String text) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34629 - }, - { - "endIndex": 34693, - "paragraph": { - "elements": [ - { - "endIndex": 34693, - "startIndex": 34668, - "textRun": { - "content": " _controller.clear();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34668 - }, - { - "endIndex": 34711, - "paragraph": { - "elements": [ - { - "endIndex": 34711, - "startIndex": 34693, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34693 - }, - { - "endIndex": 34739, - "paragraph": { - "elements": [ - { - "endIndex": 34739, - "startIndex": 34711, - "textRun": { - "content": " _isComposing = false;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34711 - }, - { - "endIndex": 34747, - "paragraph": { - "elements": [ - { - "endIndex": 34747, - "startIndex": 34739, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34739 - }, - { - "endIndex": 34765, - "paragraph": { - "elements": [ - { - "endIndex": 34765, - "startIndex": 34747, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34747 - }, - { - "endIndex": 34826, - "paragraph": { - "elements": [ - { - "endIndex": 34826, - "startIndex": 34765, - "textRun": { - "content": " ref.read(duktapeMessagesProvider.notifier).eval(text);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34765 - }, - { - "endIndex": 34834, - "paragraph": { - "elements": [ - { - "endIndex": 34834, - "startIndex": 34826, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34826 - }, - { - "endIndex": 34865, - "paragraph": { - "elements": [ - { - "endIndex": 34865, - "startIndex": 34834, - "textRun": { - "content": " _focusNode.requestFocus();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34834 - }, - { - "endIndex": 34869, - "paragraph": { - "elements": [ - { - "endIndex": 34869, - "startIndex": 34865, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34865 - }, - { - "endIndex": 34870, - "paragraph": { - "elements": [ - { - "endIndex": 34870, - "startIndex": 34869, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34869 - }, - { - "endIndex": 34882, - "paragraph": { - "elements": [ - { - "endIndex": 34882, - "startIndex": 34870, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34870 - }, - { - "endIndex": 34921, - "paragraph": { - "elements": [ - { - "endIndex": 34921, - "startIndex": 34882, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34882 - }, - { - "endIndex": 34978, - "paragraph": { - "elements": [ - { - "endIndex": 34978, - "startIndex": 34921, - "textRun": { - "content": " final messages = ref.watch(duktapeMessagesProvider);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34921 - }, - { - "endIndex": 34999, - "paragraph": { - "elements": [ - { - "endIndex": 34999, - "startIndex": 34978, - "textRun": { - "content": " return Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34978 - }, - { - "endIndex": 35036, - "paragraph": { - "elements": [ - { - "endIndex": 35036, - "startIndex": 34999, - "textRun": { - "content": " backgroundColor: Colors.white,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 34999 - }, - { - "endIndex": 35058, - "paragraph": { - "elements": [ - { - "endIndex": 35058, - "startIndex": 35036, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35036 - }, - { - "endIndex": 35101, - "paragraph": { - "elements": [ - { - "endIndex": 35101, - "startIndex": 35058, - "textRun": { - "content": " title: const Text('Duktape REPL'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35058 - }, - { - "endIndex": 35182, - "paragraph": { - "elements": [ - { - "endIndex": 35182, - "startIndex": 35101, - "textRun": { - "content": " elevation: Theme.of(context).platform == TargetPlatform.iOS ? 0.0 : 4.0,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35101 - }, - { - "endIndex": 35191, - "paragraph": { - "elements": [ - { - "endIndex": 35191, - "startIndex": 35182, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35182 - }, - { - "endIndex": 35211, - "paragraph": { - "elements": [ - { - "endIndex": 35211, - "startIndex": 35191, - "textRun": { - "content": " body: Column(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35191 - }, - { - "endIndex": 35231, - "paragraph": { - "elements": [ - { - "endIndex": 35231, - "startIndex": 35211, - "textRun": { - "content": " children: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35211 - }, - { - "endIndex": 35251, - "paragraph": { - "elements": [ - { - "endIndex": 35251, - "startIndex": 35231, - "textRun": { - "content": " Flexible(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35231 - }, - { - "endIndex": 35275, - "paragraph": { - "elements": [ - { - "endIndex": 35275, - "startIndex": 35251, - "textRun": { - "content": " child: Ink(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35251 - }, - { - "endIndex": 35339, - "paragraph": { - "elements": [ - { - "endIndex": 35339, - "startIndex": 35275, - "textRun": { - "content": " color: Theme.of(context).scaffoldBackgroundColor,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35275 - }, - { - "endIndex": 35370, - "paragraph": { - "elements": [ - { - "endIndex": 35370, - "startIndex": 35339, - "textRun": { - "content": " child: SafeArea(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35339 - }, - { - "endIndex": 35401, - "paragraph": { - "elements": [ - { - "endIndex": 35401, - "startIndex": 35370, - "textRun": { - "content": " bottom: false,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35370 - }, - { - "endIndex": 35442, - "paragraph": { - "elements": [ - { - "endIndex": 35442, - "startIndex": 35401, - "textRun": { - "content": " child: ListView.builder(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35401 - }, - { - "endIndex": 35496, - "paragraph": { - "elements": [ - { - "endIndex": 35496, - "startIndex": 35442, - "textRun": { - "content": " padding: const EdgeInsets.all(8.0),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35442 - }, - { - "endIndex": 35529, - "paragraph": { - "elements": [ - { - "endIndex": 35529, - "startIndex": 35496, - "textRun": { - "content": " reverse: true,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35496 - }, - { - "endIndex": 35598, - "paragraph": { - "elements": [ - { - "endIndex": 35598, - "startIndex": 35529, - "textRun": { - "content": " itemBuilder: (context, idx) => messages[idx].when(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35529 - }, - { - "endIndex": 35646, - "paragraph": { - "elements": [ - { - "endIndex": 35646, - "startIndex": 35598, - "textRun": { - "content": " evaluate: (str) => Padding(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35598 - }, - { - "endIndex": 35718, - "paragraph": { - "elements": [ - { - "endIndex": 35718, - "startIndex": 35646, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(vertical: 2),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35646 - }, - { - "endIndex": 35753, - "paragraph": { - "elements": [ - { - "endIndex": 35753, - "startIndex": 35718, - "textRun": { - "content": " child: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35718 - }, - { - "endIndex": 35787, - "paragraph": { - "elements": [ - { - "endIndex": 35787, - "startIndex": 35753, - "textRun": { - "content": " '> $str',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35753 - }, - { - "endIndex": 35840, - "paragraph": { - "elements": [ - { - "endIndex": 35840, - "startIndex": 35787, - "textRun": { - "content": " style: GoogleFonts.firaCode(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35787 - }, - { - "endIndex": 35918, - "paragraph": { - "elements": [ - { - "endIndex": 35918, - "startIndex": 35840, - "textRun": { - "content": " textStyle: Theme.of(context).textTheme.titleMedium,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35840 - }, - { - "endIndex": 35945, - "paragraph": { - "elements": [ - { - "endIndex": 35945, - "startIndex": 35918, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35918 - }, - { - "endIndex": 35970, - "paragraph": { - "elements": [ - { - "endIndex": 35970, - "startIndex": 35945, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35945 - }, - { - "endIndex": 35993, - "paragraph": { - "elements": [ - { - "endIndex": 35993, - "startIndex": 35970, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35970 - }, - { - "endIndex": 36041, - "paragraph": { - "elements": [ - { - "endIndex": 36041, - "startIndex": 35993, - "textRun": { - "content": " response: (str) => Padding(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 35993 - }, - { - "endIndex": 36113, - "paragraph": { - "elements": [ - { - "endIndex": 36113, - "startIndex": 36041, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(vertical: 2),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36041 - }, - { - "endIndex": 36148, - "paragraph": { - "elements": [ - { - "endIndex": 36148, - "startIndex": 36113, - "textRun": { - "content": " child: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36113 - }, - { - "endIndex": 36182, - "paragraph": { - "elements": [ - { - "endIndex": 36182, - "startIndex": 36148, - "textRun": { - "content": " '= $str',\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36148 - }, - { - "endIndex": 36235, - "paragraph": { - "elements": [ - { - "endIndex": 36235, - "startIndex": 36182, - "textRun": { - "content": " style: GoogleFonts.firaCode(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36182 - }, - { - "endIndex": 36313, - "paragraph": { - "elements": [ - { - "endIndex": 36313, - "startIndex": 36235, - "textRun": { - "content": " textStyle: Theme.of(context).textTheme.titleMedium,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36235 - }, - { - "endIndex": 36364, - "paragraph": { - "elements": [ - { - "endIndex": 36364, - "startIndex": 36313, - "textRun": { - "content": " color: Colors.blue[800],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36313 - }, - { - "endIndex": 36391, - "paragraph": { - "elements": [ - { - "endIndex": 36391, - "startIndex": 36364, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36364 - }, - { - "endIndex": 36416, - "paragraph": { - "elements": [ - { - "endIndex": 36416, - "startIndex": 36391, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36391 - }, - { - "endIndex": 36439, - "paragraph": { - "elements": [ - { - "endIndex": 36439, - "startIndex": 36416, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36416 - }, - { - "endIndex": 36484, - "paragraph": { - "elements": [ - { - "endIndex": 36484, - "startIndex": 36439, - "textRun": { - "content": " error: (str) => Padding(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36439 - }, - { - "endIndex": 36556, - "paragraph": { - "elements": [ - { - "endIndex": 36556, - "startIndex": 36484, - "textRun": { - "content": " padding: const EdgeInsets.symmetric(vertical: 2),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36484 - }, - { - "endIndex": 36591, - "paragraph": { - "elements": [ - { - "endIndex": 36591, - "startIndex": 36556, - "textRun": { - "content": " child: Text(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36556 - }, - { - "endIndex": 36620, - "paragraph": { - "elements": [ - { - "endIndex": 36620, - "startIndex": 36591, - "textRun": { - "content": " str,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36591 - }, - { - "endIndex": 36673, - "paragraph": { - "elements": [ - { - "endIndex": 36673, - "startIndex": 36620, - "textRun": { - "content": " style: GoogleFonts.firaCode(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36620 - }, - { - "endIndex": 36750, - "paragraph": { - "elements": [ - { - "endIndex": 36750, - "startIndex": 36673, - "textRun": { - "content": " textStyle: Theme.of(context).textTheme.titleSmall,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36673 - }, - { - "endIndex": 36800, - "paragraph": { - "elements": [ - { - "endIndex": 36800, - "startIndex": 36750, - "textRun": { - "content": " color: Colors.red[800],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36750 - }, - { - "endIndex": 36855, - "paragraph": { - "elements": [ - { - "endIndex": 36855, - "startIndex": 36800, - "textRun": { - "content": " fontWeight: FontWeight.bold,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36800 - }, - { - "endIndex": 36882, - "paragraph": { - "elements": [ - { - "endIndex": 36882, - "startIndex": 36855, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36855 - }, - { - "endIndex": 36907, - "paragraph": { - "elements": [ - { - "endIndex": 36907, - "startIndex": 36882, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36882 - }, - { - "endIndex": 36930, - "paragraph": { - "elements": [ - { - "endIndex": 36930, - "startIndex": 36907, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36907 - }, - { - "endIndex": 36951, - "paragraph": { - "elements": [ - { - "endIndex": 36951, - "startIndex": 36930, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36930 - }, - { - "endIndex": 36997, - "paragraph": { - "elements": [ - { - "endIndex": 36997, - "startIndex": 36951, - "textRun": { - "content": " itemCount: messages.length,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36951 - }, - { - "endIndex": 37016, - "paragraph": { - "elements": [ - { - "endIndex": 37016, - "startIndex": 36997, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 36997 - }, - { - "endIndex": 37033, - "paragraph": { - "elements": [ - { - "endIndex": 37033, - "startIndex": 37016, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37016 - }, - { - "endIndex": 37048, - "paragraph": { - "elements": [ - { - "endIndex": 37048, - "startIndex": 37033, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37033 - }, - { - "endIndex": 37061, - "paragraph": { - "elements": [ - { - "endIndex": 37061, - "startIndex": 37048, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37048 - }, - { - "endIndex": 37099, - "paragraph": { - "elements": [ - { - "endIndex": 37099, - "startIndex": 37061, - "textRun": { - "content": " const Divider(height: 1.0),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37061 - }, - { - "endIndex": 37119, - "paragraph": { - "elements": [ - { - "endIndex": 37119, - "startIndex": 37099, - "textRun": { - "content": " SafeArea(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37099 - }, - { - "endIndex": 37143, - "paragraph": { - "elements": [ - { - "endIndex": 37143, - "startIndex": 37119, - "textRun": { - "content": " top: false,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37119 - }, - { - "endIndex": 37173, - "paragraph": { - "elements": [ - { - "endIndex": 37173, - "startIndex": 37143, - "textRun": { - "content": " child: Container(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37143 - }, - { - "endIndex": 37250, - "paragraph": { - "elements": [ - { - "endIndex": 37250, - "startIndex": 37173, - "textRun": { - "content": " decoration: BoxDecoration(color: Theme.of(context).cardColor),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37173 - }, - { - "endIndex": 37293, - "paragraph": { - "elements": [ - { - "endIndex": 37293, - "startIndex": 37250, - "textRun": { - "content": " child: _buildTextComposer(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37250 - }, - { - "endIndex": 37308, - "paragraph": { - "elements": [ - { - "endIndex": 37308, - "startIndex": 37293, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37293 - }, - { - "endIndex": 37321, - "paragraph": { - "elements": [ - { - "endIndex": 37321, - "startIndex": 37308, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37308 - }, - { - "endIndex": 37332, - "paragraph": { - "elements": [ - { - "endIndex": 37332, - "startIndex": 37321, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37321 - }, - { - "endIndex": 37341, - "paragraph": { - "elements": [ - { - "endIndex": 37341, - "startIndex": 37332, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37332 - }, - { - "endIndex": 37348, - "paragraph": { - "elements": [ - { - "endIndex": 37348, - "startIndex": 37341, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37341 - }, - { - "endIndex": 37352, - "paragraph": { - "elements": [ - { - "endIndex": 37352, - "startIndex": 37348, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37348 - }, - { - "endIndex": 37353, - "paragraph": { - "elements": [ - { - "endIndex": 37353, - "startIndex": 37352, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37352 - }, - { - "endIndex": 37385, - "paragraph": { - "elements": [ - { - "endIndex": 37385, - "startIndex": 37353, - "textRun": { - "content": " Widget _buildTextComposer() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37353 - }, - { - "endIndex": 37407, - "paragraph": { - "elements": [ - { - "endIndex": 37407, - "startIndex": 37385, - "textRun": { - "content": " return IconTheme(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37385 - }, - { - "endIndex": 37482, - "paragraph": { - "elements": [ - { - "endIndex": 37482, - "startIndex": 37407, - "textRun": { - "content": " data: IconThemeData(color: Theme.of(context).colorScheme.secondary),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37407 - }, - { - "endIndex": 37506, - "paragraph": { - "elements": [ - { - "endIndex": 37506, - "startIndex": 37482, - "textRun": { - "content": " child: Container(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37482 - }, - { - "endIndex": 37567, - "paragraph": { - "elements": [ - { - "endIndex": 37567, - "startIndex": 37506, - "textRun": { - "content": " margin: const EdgeInsets.symmetric(horizontal: 8.0),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37506 - }, - { - "endIndex": 37587, - "paragraph": { - "elements": [ - { - "endIndex": 37587, - "startIndex": 37567, - "textRun": { - "content": " child: Row(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37567 - }, - { - "endIndex": 37609, - "paragraph": { - "elements": [ - { - "endIndex": 37609, - "startIndex": 37587, - "textRun": { - "content": " children: [\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37587 - }, - { - "endIndex": 37680, - "paragraph": { - "elements": [ - { - "endIndex": 37680, - "startIndex": 37609, - "textRun": { - "content": " Text('>', style: Theme.of(context).textTheme.titleMedium),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37609 - }, - { - "endIndex": 37718, - "paragraph": { - "elements": [ - { - "endIndex": 37718, - "startIndex": 37680, - "textRun": { - "content": " const SizedBox(width: 4),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37680 - }, - { - "endIndex": 37740, - "paragraph": { - "elements": [ - { - "endIndex": 37740, - "startIndex": 37718, - "textRun": { - "content": " Flexible(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37718 - }, - { - "endIndex": 37772, - "paragraph": { - "elements": [ - { - "endIndex": 37772, - "startIndex": 37740, - "textRun": { - "content": " child: TextField(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37740 - }, - { - "endIndex": 37813, - "paragraph": { - "elements": [ - { - "endIndex": 37813, - "startIndex": 37772, - "textRun": { - "content": " controller: _controller,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37772 - }, - { - "endIndex": 37864, - "paragraph": { - "elements": [ - { - "endIndex": 37864, - "startIndex": 37813, - "textRun": { - "content": " decoration: const InputDecoration(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37813 - }, - { - "endIndex": 37908, - "paragraph": { - "elements": [ - { - "endIndex": 37908, - "startIndex": 37864, - "textRun": { - "content": " border: InputBorder.none,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37864 - }, - { - "endIndex": 37927, - "paragraph": { - "elements": [ - { - "endIndex": 37927, - "startIndex": 37908, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37908 - }, - { - "endIndex": 37963, - "paragraph": { - "elements": [ - { - "endIndex": 37963, - "startIndex": 37927, - "textRun": { - "content": " onChanged: (text) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37927 - }, - { - "endIndex": 37995, - "paragraph": { - "elements": [ - { - "endIndex": 37995, - "startIndex": 37963, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37963 - }, - { - "endIndex": 38047, - "paragraph": { - "elements": [ - { - "endIndex": 38047, - "startIndex": 37995, - "textRun": { - "content": " _isComposing = text.isNotEmpty;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 37995 - }, - { - "endIndex": 38069, - "paragraph": { - "elements": [ - { - "endIndex": 38069, - "startIndex": 38047, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38047 - }, - { - "endIndex": 38088, - "paragraph": { - "elements": [ - { - "endIndex": 38088, - "startIndex": 38069, - "textRun": { - "content": " },\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38069 - }, - { - "endIndex": 38157, - "paragraph": { - "elements": [ - { - "endIndex": 38157, - "startIndex": 38088, - "textRun": { - "content": " onSubmitted: _isComposing ? _handleSubmitted : null,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38088 - }, - { - "endIndex": 38196, - "paragraph": { - "elements": [ - { - "endIndex": 38196, - "startIndex": 38157, - "textRun": { - "content": " focusNode: _focusNode,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38157 - }, - { - "endIndex": 38213, - "paragraph": { - "elements": [ - { - "endIndex": 38213, - "startIndex": 38196, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38196 - }, - { - "endIndex": 38228, - "paragraph": { - "elements": [ - { - "endIndex": 38228, - "startIndex": 38213, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38213 - }, - { - "endIndex": 38251, - "paragraph": { - "elements": [ - { - "endIndex": 38251, - "startIndex": 38228, - "textRun": { - "content": " Container(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38228 - }, - { - "endIndex": 38318, - "paragraph": { - "elements": [ - { - "endIndex": 38318, - "startIndex": 38251, - "textRun": { - "content": " margin: const EdgeInsets.symmetric(horizontal: 4.0),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38251 - }, - { - "endIndex": 38351, - "paragraph": { - "elements": [ - { - "endIndex": 38351, - "startIndex": 38318, - "textRun": { - "content": " child: IconButton(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38318 - }, - { - "endIndex": 38397, - "paragraph": { - "elements": [ - { - "endIndex": 38397, - "startIndex": 38351, - "textRun": { - "content": " icon: const Icon(Icons.send),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38351 - }, - { - "endIndex": 38437, - "paragraph": { - "elements": [ - { - "endIndex": 38437, - "startIndex": 38397, - "textRun": { - "content": " onPressed: _isComposing\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38397 - }, - { - "endIndex": 38500, - "paragraph": { - "elements": [ - { - "endIndex": 38500, - "startIndex": 38437, - "textRun": { - "content": " ? () => _handleSubmitted(_controller.text)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38437 - }, - { - "endIndex": 38528, - "paragraph": { - "elements": [ - { - "endIndex": 38528, - "startIndex": 38500, - "textRun": { - "content": " : null,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38500 - }, - { - "endIndex": 38545, - "paragraph": { - "elements": [ - { - "endIndex": 38545, - "startIndex": 38528, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38528 - }, - { - "endIndex": 38560, - "paragraph": { - "elements": [ - { - "endIndex": 38560, - "startIndex": 38545, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38545 - }, - { - "endIndex": 38573, - "paragraph": { - "elements": [ - { - "endIndex": 38573, - "startIndex": 38560, - "textRun": { - "content": " ],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38560 - }, - { - "endIndex": 38584, - "paragraph": { - "elements": [ - { - "endIndex": 38584, - "startIndex": 38573, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38573 - }, - { - "endIndex": 38593, - "paragraph": { - "elements": [ - { - "endIndex": 38593, - "startIndex": 38584, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38584 - }, - { - "endIndex": 38600, - "paragraph": { - "elements": [ - { - "endIndex": 38600, - "startIndex": 38593, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38593 - }, - { - "endIndex": 38604, - "paragraph": { - "elements": [ - { - "endIndex": 38604, - "startIndex": 38600, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38600 - }, - { - "endIndex": 38606, - "paragraph": { - "elements": [ - { - "endIndex": 38606, - "startIndex": 38604, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38604 - } - ], - "endIndex": 38606, - "startIndex": 33002, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 38608, - "paragraph": { - "elements": [ - { - "endIndex": 38608, - "startIndex": 38607, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 38607 - }, - { - "endIndex": 38824, - "paragraph": { - "elements": [ - { - "endIndex": 38824, - "startIndex": 38608, - "textRun": { - "content": "There is a lot going on in this code, but it’s beyond the scope of this codelab to explain it all. I suggest you run the code, and then make modifications to the code, after reviewing the appropriate documentation. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 38608 - }, - { - "endIndex": 38825, - "paragraph": { - "elements": [ - { - "endIndex": 38825, - "startIndex": 38824, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 38824 - }, - { - "endIndex": 38856, - "startIndex": 38825, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 38855, - "startIndex": 38826, - "tableCells": [ - { - "content": [ - { - "endIndex": 38841, - "paragraph": { - "elements": [ - { - "endIndex": 38841, - "startIndex": 38828, - "textRun": { - "content": "$ cd example\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38828 - }, - { - "endIndex": 38855, - "paragraph": { - "elements": [ - { - "endIndex": 38855, - "startIndex": 38841, - "textRun": { - "content": "$ flutter run\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38841 - } - ], - "endIndex": 38855, - "startIndex": 38827, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 38857, - "paragraph": { - "elements": [ - { - "endIndex": 38857, - "startIndex": 38856, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 38856 - }, - { - "endIndex": 38858, - "paragraph": { - "elements": [ - { - "endIndex": 38858, - "startIndex": 38857, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 38857 - }, - { - "endIndex": 38875, - "startIndex": 38858, - "table": { - "columns": 2, - "rows": 2, - "tableRows": [ - { - "endIndex": 38867, - "startIndex": 38859, - "tableCells": [ - { - "content": [ - { - "endIndex": 38863, - "paragraph": { - "elements": [ - { - "endIndex": 38862, - "inlineObjectElement": { - "inlineObjectId": "kix.2qirfxe8l9dq", - "textStyle": {} - }, - "startIndex": 38861 - }, - { - "endIndex": 38863, - "startIndex": 38862, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38861 - } - ], - "endIndex": 38863, - "startIndex": 38860, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 38865, - "paragraph": { - "elements": [ - { - "endIndex": 38865, - "startIndex": 38864, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38864 - }, - { - "endIndex": 38867, - "paragraph": { - "elements": [ - { - "endIndex": 38866, - "inlineObjectElement": { - "inlineObjectId": "kix.h2qadu3hoiuw", - "textStyle": {} - }, - "startIndex": 38865 - }, - { - "endIndex": 38867, - "startIndex": 38866, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38865 - } - ], - "endIndex": 38867, - "startIndex": 38863, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 38874, - "startIndex": 38867, - "tableCells": [ - { - "content": [ - { - "endIndex": 38871, - "paragraph": { - "elements": [ - { - "endIndex": 38870, - "inlineObjectElement": { - "inlineObjectId": "kix.j3ncza8qn8by", - "textStyle": {} - }, - "startIndex": 38869 - }, - { - "endIndex": 38871, - "startIndex": 38870, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38869 - } - ], - "endIndex": 38871, - "startIndex": 38868, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 38874, - "paragraph": { - "elements": [ - { - "endIndex": 38873, - "inlineObjectElement": { - "inlineObjectId": "kix.3d0twwirn6bn", - "textStyle": {} - }, - "startIndex": 38872 - }, - { - "endIndex": 38874, - "startIndex": 38873, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 38872 - } - ], - "endIndex": 38874, - "startIndex": 38871, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 38876, - "paragraph": { - "elements": [ - { - "endIndex": 38876, - "startIndex": 38875, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 38875 - }, - { - "endIndex": 38878, - "paragraph": { - "elements": [ - { - "endIndex": 38877, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 38876 - }, - { - "endIndex": 38878, - "startIndex": 38877, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 38876 - }, - { - "endIndex": 38879, - "paragraph": { - "elements": [ - { - "endIndex": 38879, - "startIndex": 38878, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 38878 - }, - { - "endIndex": 38895, - "paragraph": { - "elements": [ - { - "endIndex": 38895, - "startIndex": 38879, - "textRun": { - "content": "Congratulations\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.s22qmcj4zu61", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 38879 - }, - { - "endIndex": 38896, - "paragraph": { - "elements": [ - { - "endIndex": 38896, - "startIndex": 38895, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 38895 - }, - { - "endIndex": 39016, - "paragraph": { - "elements": [ - { - "endIndex": 39015, - "startIndex": 38896, - "textRun": { - "content": "Congratulations! You have successfully created a Flutter FFI-based plugin for Windows, macOS, Linux, Android, and iOS! ", - "textStyle": {} - } - }, - { - "endIndex": 39016, - "startIndex": 39015, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 38896 - }, - { - "endIndex": 39017, - "paragraph": { - "elements": [ - { - "endIndex": 39017, - "startIndex": 39016, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39016 - }, - { - "endIndex": 39210, - "paragraph": { - "elements": [ - { - "endIndex": 39170, - "startIndex": 39017, - "textRun": { - "content": "After you create a plugin, you might want to share it online so that others can use it. You can find the full documentation on publishing your plugin to ", - "textStyle": {} - } - }, - { - "endIndex": 39177, - "startIndex": 39170, - "textRun": { - "content": "pub.dev", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev" - }, - "underline": true - } - } - }, - { - "endIndex": 39181, - "startIndex": 39177, - "textRun": { - "content": " in ", - "textStyle": {} - } - }, - { - "endIndex": 39207, - "startIndex": 39181, - "textRun": { - "content": "Developing plugin packages", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://docs.flutter.dev/development/packages-and-plugins/developing-packages" - }, - "underline": true - } - } - }, - { - "endIndex": 39210, - "startIndex": 39207, - "textRun": { - "content": ". \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39017 - }, - { - "endIndex": 39211, - "paragraph": { - "elements": [ - { - "endIndex": 39211, - "startIndex": 39210, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39210 - }, - { - "endIndex": 39212, - "paragraph": { - "elements": [ - { - "endIndex": 39212, - "startIndex": 39211, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39211 - }, - { - "endIndex": 39213, - "paragraph": { - "elements": [ - { - "endIndex": 39213, - "startIndex": 39212, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.30980393, - "green": 0.65882355, - "red": 0.41568628 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39212 - }, - { - "endIndex": 39214, - "paragraph": { - "elements": [ - { - "endIndex": 39214, - "startIndex": 39213, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.30980393, - "green": 0.65882355, - "red": 0.41568628 - } - } - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 39213 - }, - { - "endIndex": 39215, - "paragraph": { - "elements": [ - { - "endIndex": 39215, - "startIndex": 39214, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.30980393, - "green": 0.65882355, - "red": 0.41568628 - } - } - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 39214 - } - ] - }, - "documentId": "1ihOxu-DK3SBrUYyppRtzKvfwceSIzk4ZWzP9F6nRtnw", - "documentStyle": { - "background": { - "color": {} - }, - "marginBottom": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72.0, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792.0, - "unit": "PT" - }, - "width": { - "magnitude": 612.0, - "unit": "PT" - } - } - }, - "inlineObjects": { - "kix.2qirfxe8l9dq": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/nwdHcL7bCYAc1TCOuslrc_7pceTla2Yh2wk_Sd_OGiB8aU4Q-MEiLOf88qKc5D6h5aPYRh3BrmpQ1_APkrpBN0MN-Ctikh2uFF8rbv9I4Bauw4Tye6_o7v9YEGwf4QAx4qTBKND2QA9SBoT8umhUN3NjJeHFKjl_P9tZVbTMjaG9au2tTclPG7t0Mw0So3IBuLmQig2f", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 212.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.2qirfxe8l9dq" - }, - "kix.3d0twwirn6bn": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/XgCE9uxcRV0JUEqVi5tE-1aEzu7141cE9bV7OA5sl4P_CvcQmWwUcH91FaQGdpqVoMGJfQWyJfQpR94UPCCl5O55pB9gg7uTqfcE47sayVEO0OemNnpv7LLpuIoW-UN0SgIfw_Z8fN6LP66m12tucSMe3_54Q7X7vUrME9d2vV4Injvw6qNf0rhGBeLXocV4e1JwtM9C", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 447.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.3d0twwirn6bn" - }, - "kix.63kf7zqqmu8n": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/QfuQEhOQGutOW5LMFOde7-1zJ4HS2gTCZrjhpMw42uPV869PPq2kP3Vs_DKdWohniVQH9tF6K6G4KTUVYDS8NvEe_PqQSIgYSjdbPc5P9popFtb9Vgxu5g3mp6oVVmZpV-h4JevQa0F544i0_CxJiOvGfTkVeD2eMFhMmUrzxM-nODCwOl1jwN3fqokfORdeaAOkg_N_", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 566.0, - "unit": "PT" - }, - "width": { - "magnitude": 309.81052631578945, - "unit": "PT" - } - } - } - }, - "objectId": "kix.63kf7zqqmu8n" - }, - "kix.8f801gtaqhg3": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/AJtwO53l2XzuY2dyJA5TzEi0CjpdZ5sUQIlVDsFp0cAK8PhiQWJfZUOLY3uW6TfJYFU_I2lu3ud_RiqZ5T0Z1HRaTunDcGYkw45SiikLjq7EswMwBCPx6fFnzzreLtmTDky85r_GvHSbnmIkKdBq80CUoSe3nh0wSKff6TJVSUM10E8OSjEOLuTc2GZMgwLysju5EO-r", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 199.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.8f801gtaqhg3" - }, - "kix.9klzb3jr1dtm": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/SYUjrzNbfx57Nb3So2BdZv71tRlOfxArj0FR8TyAEdkVFylHiYGhdLCezKM5SPBRqRMRyjvOvdd8pGxZkG7JHptJ5rw6J_00eB9QgjUW8k5XwQIaRzElKi0cwwp6lmTMg1tQxSYiO2BJW1p2X12BDx4xBla4_BnsR5AAJQGW00EHmXrOfdIqQDJgt9_k9ER1ueqHblyb", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 199.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.9klzb3jr1dtm" - }, - "kix.gcvwi61viaiv": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/HB7tVWJKI10dXT10oGb-zizA5gW-bmtJkMPK9U5zNZGZg_VmAAehyu9w8YsbXt0ZToVvQbZCh7RLJu9hDLiQ67g0HSGQUwivOCVpJzUBdyh_kc1Lrj6TP-vLVpNjgHVsnXfdOgj4d7YBh0gs_6p8I0pefHfNsA6SfbcL_Q1jakRoFu4Anx7DnuDc9xjOvg6UtngmEXS8", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 425.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.gcvwi61viaiv" - }, - "kix.h2qadu3hoiuw": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/J8XdYh0ylZvy0br4VYqpbbHqTszGvCKdjWkT11PkfgQlr8p_-6y8TktEikLFRxKo2A0ztPvBvkBPpdKoRYeMcXJAinfGpQeK9BUzlC_kKcBcJiTsuTvAU8VdM9Z8Hc4FsbruzQFYLen8MyBF-LLUVKnGcavM7E4KnYB1YEnLCGpaK4msxBlKbnmQOGZ3LX4306P_YoHu", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 165.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.h2qadu3hoiuw" - }, - "kix.j3ncza8qn8by": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/9sFNVUGZkCsDKrEsJtcWFh0tP7yFpacz-OH_Rx56mwXh5FqDeQ0y0BYKCiJTlJvXLY_853lvVZYkb-Fulvjd2M5Q7yWvKm4XfK3jn9G1MHXPvgqhpAlFv3bMJBkaJe_9D1EjFG6pvie9pJP5syPfwJB1UqJt09-odTfWxgZoiRLeCkLG2FZRVjjMK3nvbGL4gQytD92G", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 425.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.j3ncza8qn8by" - }, - "kix.jrk5ydgv078y": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/uJkipgM_puO4TmQuFLgBjzgDV2g8jaaVJ_8yhrxvShEqNJgt0xHierPR-mfr_gHQ0rszdKm-Ey7ijrDg1WUX_wlrcG921JklYf1t32Ri26V5FgTGwO3vZu_1H6UhfWhOERvdbVRTBcCqkNKMRsNZc8yqb1jth3EIb6NlWxLjziHe_naaUO92nFNHP3jFVHiP2aEGltN7", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 185.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.jrk5ydgv078y" - }, - "kix.kbfmzdwg6giq": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/HoGhxIZTXMgdMPPlOIlBYQKN3LRPj5CuDO792dFvSuLmEqxvVYnqbrhfyssXRpNg4U1PZwffYN9vNW6-hmZX41SHPRCWf_OTBG5aE23EJqwKoH4iNn4MFyhlCFul77-msFp4ZpKCADaALzErSrjDue6dfCuoMn-qPK0rwuLx5yPwz5JALCy-0-iHX7ilZnajB4ysISlX", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 364.87319711538464, - "unit": "PT" - }, - "width": { - "magnitude": 381.375, - "unit": "PT" - } - } - } - }, - "objectId": "kix.kbfmzdwg6giq" - }, - "kix.kgkq7uquvg67": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/btQO67__vjctRDah_CC0wa3bk_3XjG6OqCSwygURthyLHNcrUZQl4tykQSHF6LJ76poyN1QxcN4FzBta43oLy7uPIntUABbnwQBwHqJ_BrEOlA2TqKuljWiSqe8V_4JmMS5rxwVU_7RPKR31CQYpowqcOSnlLHFy5gNZ0sqkahdjWvTuj7faoO7MMQ156ASNQ5yJCzU6", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 516.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.kgkq7uquvg67" - }, - "kix.knvcb3oh1tup": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/gUlbbXijDySDJXhY_URC8AH0ZwdFf7LIqmpX27eTZUvIsEHUsE6YC3oS8qDwDUdLlr7dJn_k8Ty4R-2V5fmJUUwUZlcEpypWAbuoNwy_T6_VQYNyvrfR9fYxKiVjr02G6EJTpTq8HsdDrwx9CdCWYs8iV8xjWJr9JhACkg-1g3JK9P9qVX8onvFJQttGbh1bvNIPO6rF", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 379.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.knvcb3oh1tup" - }, - "kix.n6geu88pcaje": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/8R0U-tF5B8O-a4PBXnKUrtBDGfEod9fb8P37zxUxkHKzc-DyJ6MskealMXbfeCmtHqCxMdWxZhoS6jlgAW5QCxBInMQmQDKfPV18s9uhMabSI4cz01B5Z02gSc0tx0wjL-V98K6DVb4rw8Pt8X-FArpmR1UJvMIYLwGLJPmKTqM5caG4g-N-QckvepnKlkajoo0fO5vR", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 447.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.n6geu88pcaje" - }, - "kix.oj3ebqd3ke3o": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/MSP7wLslbqv3No2mNBBhaWYJpBrHl1e-tkH-3WTVhwrMxJRg4eoPoeddIFZzTnerOkAHX3KFhmsMxoFiKhomZF9sD6jw7ht24ig9oUAXePaQMOffGDzR4DGpijrJXzonqGqEGHvtEIgiQAPtyVhIFhq007xeL-JtFh4dNNv6KSt-jS0mxDMjewmSfDYIJNzEKk0Haoan", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 447.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.oj3ebqd3ke3o" - }, - "kix.siedlpab3lfj": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/BYNjt64TcfM_pfSOPFEKgbDmyQV9km8EvP7CVCNQU92Uoanlt_kOnOWKm4CcYkPs3GRdRA99ZqVcgHOI--ckNhPfCPkiSUBp_NP0w1gGdYri8xXiDUJ4v5YoUUXcramqenM9TgFAxGLMoHnCDpd_tkUtGV2kLeDHP1kflAF8oLj2fpgPP3A1IGrAV5PeQci17VDL1iQq", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 645.0, - "unit": "PT" - }, - "width": { - "magnitude": 339.0732940185341, - "unit": "PT" - } - } - } - }, - "objectId": "kix.siedlpab3lfj" - }, - "kix.thggcaspdiw": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh5.googleusercontent.com/9E6r2pot7hfRASL-vGoFPqnXUy5radmPKd9e7qnU4X9KQFLt8e1bqoiIw3pLuh_d4ImvvmRw5oQdDuHS9gEdhafu_ih57cYjSvTA9Hyu9VmvLS89jRPArGK5ZCbkU3IrqNxogeg5jFURAFqUqCh7a12l28Cc829h-8-cXgxSStHEboIZ2-JyBhPGeq_T2EPFqou996If", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 185.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.thggcaspdiw" - }, - "kix.tptap0mx1kzg": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/KdAgH3zU3fe6NF2Zob1ea-XtBoSYe9GDtwsjnKAh03KV3sOWMrMr0PlmhbE14-4W_QQPrfFmBRhjQSs3a6SQfKKlsGxKBroMd38-KS6je0RSmWpQLKUlFDZZ0bpvKQQL-9W3IWLKRsb78WdGArLxqbbVupiNBDkcPrpj4XOVhjLO2xX9dY6ECditJwXfZUDEItHcHWPR", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 420.0, - "unit": "PT" - }, - "width": { - "magnitude": 468.0, - "unit": "PT" - } - } - } - }, - "objectId": "kix.tptap0mx1kzg" - }, - "kix.xjk6qmu0mck1": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh3.googleusercontent.com/J4Txc0PauIlZ1SuMMv4gYh-_Thp8J-6-dOlsnoSmbDJgpseeSZq9JEKF-GmNMQLYjvni92hsPi-PAhCMoAlJnm8qiKHMrdUZqGBJtUKhK0Shjo94aiuJ9g3uxONjD0X9iyaoTFBhM6_i7QoknabIz_cENRAK2OtbbGgmb866ZKx5559hBL0ZV_6to0BJ1YxraaqB3o8M", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 425.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.xjk6qmu0mck1" - } - }, - "lists": { - "kix.1j7yepp0owz5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.1tjhv41sn0xa": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.1ztzk92hrth8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2ctr6ys6ni0e": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2gaihzs8s2ee": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2jnyqucbt2t6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2whi3gkwlssd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3cjxume1ox5j": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3dvia6cjfor2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3l2774habcsr": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3ow5k7pnx7ga": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.44qekcxi1w0q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4ojr2d3yr7nz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4x1zl3kbw569": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4yb7edsq6e7h": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5hb992swn8xf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5jdr984vfzt1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5q2x329ym1hh": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.26666668, - "green": 0.26666668, - "red": 0.26666668 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5xnshm3wa472": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6f05htw8422z": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6i1on1k3iuin": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6j918luqnpw7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6m37iee3p8wg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7or0vngkfvx7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7uh5pgoi33tb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7unw3ed52cvl": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.83lp1z9knfuo": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.8bm96xhzoe5y": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.98e48u1wcy7a": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.98vmteiu60y4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9pk2r7tbztni": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9u3cg917bqs8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9ueckdtpugb1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9uhh20xkbn6m": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9z83l2c17pcu": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.agpmvda4vr7h": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.an6zxid0uolo": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.anq6omciu13j": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.b7qotwh7gtna": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.bmk2w9stijyg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.c7ejcv2rhol9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cbv3p81ktfkm": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cvq51i3qoyu5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cw1c2jqsuto": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cxasg6ivb43i": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.f3mtn21egf47": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.f9bz4vrobr4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fa4ji89str8f": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fg889guo8ue2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fj7194xw5fjn": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g5c0si454ulw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g801zwj9tdo5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g846847cbhgd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g8ukrj6l25im": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.gawmxw84fbl": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.gpkppvve7lf6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.h91oxjavbxs": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.hnxe8uaki5ye": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.huc4gmkwuq3u": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ighvy8mje2ni": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 342.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 360.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 378.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 396.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 414.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 432.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.imsafi72ulmz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.j2ckn4bxfuh7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jhke3wkzan7s": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jkp7jly57b9l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jus06vdmlro7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.k0g7fgw2pxb9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.k644zz41ai58": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kh0gu8ggzrfl": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kjyum9q5klsd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kmgukliniasp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l2nxb9cf1l7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l9tvvj4pt5te": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.lgekdwzh9r79": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.nw9e0rbdtf2n": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.o6y9eyfrksu6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.o72pyift6jdv": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.oerq1n8ypay0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.orlmx6e2glni": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.pcizye4e9dah": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.phibiqsq7jjd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.pvf8i7z50kj2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.q5glzqgk6j58": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.q5h44jiozc91": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.q759u59r2yjj": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qk785s5gz3e7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qnkbj287noea": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qvkatskfprp3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qx7bo6w9dag0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.r51tyrttcax1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.r8m6khspk25u": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ra2ysajgerzk": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rla1petjmkkw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rrgd3s9e8n6q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rup19lwpb96r": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.s154rj5xcbab": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.s3ytlwab2m4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.sbrgqgu1eihb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.slxd9egkb7ci": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.sqqfdjlv2hm9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.swc20l9iro9p": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.t0z3ko6guoqz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.t55mzdddlz10": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tismz98me1tb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tobmpp8mbh7q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tsgw4oeo22hd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ubrus5wzbuvt": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ulxzvayuxl7p": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.uye62wdrnhk7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.v58qrdjinxbw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vadk2zy8evv7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vc2fcwdxd37v": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vwvs454chlx5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wa0nkis9zlxf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wvtqhihdjvtw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wvu40wq536ni": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.x2xqmh4hm4pa": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.xj4zd89gdvlp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.y4auuiny9mus": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 342.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 360.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 378.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 396.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.yf8kk4f6f5pg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z0z9vrpqlm6j": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z1u1i7qvii2l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z25dkq3ogzpp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z2hyt12r7kc1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z46ih1vlabol": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6fjw6cht0bf", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ecgsg25eeya7", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.4pgk284l6s7z", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.9ujhi55jbp4b", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_4", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.yjfswb1t0sub", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_5", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.91dfhsx5n4l3", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_6", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.uvzknuxefxg9", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "TITLE", - "pageBreakBefore": false - }, - "textStyle": { - "fontSize": { - "magnitude": 21.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - ] - }, - "revisionId": "ANeT5PT1_kkcXPW10x-Ro30qrIEiNMQRpKeRy-3mVV_ClLacsqISih5WKVSUZgk1oDqeYxxz6e4IM5ARgfubbg", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "title": "FFI Codelab - Using FFI in a Flutter plugin" -} \ No newline at end of file diff --git a/tooling/claat_export_images/test/data/exports/1kwYB2RE1EXYMOt7F5fm-0nrY6BA1AyWsBXz2vlfTfxA.json b/tooling/claat_export_images/test/data/exports/1kwYB2RE1EXYMOt7F5fm-0nrY6BA1AyWsBXz2vlfTfxA.json deleted file mode 100644 index 55ace62e10..0000000000 --- a/tooling/claat_export_images/test/data/exports/1kwYB2RE1EXYMOt7F5fm-0nrY6BA1AyWsBXz2vlfTfxA.json +++ /dev/null @@ -1,50929 +0,0 @@ -{ - "body": { - "content": [ - { - "endIndex": 1, - "sectionBreak": { - "sectionStyle": { - "columnSeparatorStyle": "NONE", - "contentDirection": "LEFT_TO_RIGHT", - "sectionType": "CONTINUOUS" - } - } - }, - { - "endIndex": 37, - "paragraph": { - "elements": [ - { - "endIndex": 37, - "startIndex": 1, - "textRun": { - "content": "Adding Google Maps to a Flutter app\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.7sa4zxkhmsum", - "namedStyleType": "TITLE", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1 - }, - { - "endIndex": 38, - "paragraph": { - "elements": [ - { - "endIndex": 38, - "startIndex": 37, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 37 - }, - { - "endIndex": 68, - "paragraph": { - "elements": [ - { - "endIndex": 67, - "startIndex": 38, - "textRun": { - "content": "Last update: 6/13/2020, brett", - "textStyle": { - "fontSize": { - "magnitude": 8.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 68, - "startIndex": 67, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "END", - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 38 - }, - { - "endIndex": 561, - "startIndex": 68, - "table": { - "columns": 2, - "rows": 7, - "tableRows": [ - { - "endIndex": 242, - "startIndex": 69, - "tableCells": [ - { - "content": [ - { - "endIndex": 79, - "paragraph": { - "elements": [ - { - "endIndex": 79, - "startIndex": 71, - "textRun": { - "content": "Summary\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 71 - } - ], - "endIndex": 79, - "startIndex": 70, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 242, - "paragraph": { - "elements": [ - { - "endIndex": 242, - "startIndex": 80, - "textRun": { - "content": "In this codelab, you’ll build a Google Maps experience using the Flutter mobile app SDK for crafting high-quality native experiences on iOS, Android and the web.\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 80 - } - ], - "endIndex": 242, - "startIndex": 79, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 281, - "startIndex": 242, - "tableCells": [ - { - "content": [ - { - "endIndex": 248, - "paragraph": { - "elements": [ - { - "endIndex": 248, - "startIndex": 244, - "textRun": { - "content": "URL\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 244 - } - ], - "endIndex": 248, - "startIndex": 243, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 281, - "paragraph": { - "elements": [ - { - "endIndex": 281, - "startIndex": 249, - "textRun": { - "content": "codelabs/google-maps-in-flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 249 - } - ], - "endIndex": 281, - "startIndex": 248, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 314, - "startIndex": 281, - "tableCells": [ - { - "content": [ - { - "endIndex": 292, - "paragraph": { - "elements": [ - { - "endIndex": 292, - "startIndex": 283, - "textRun": { - "content": "Category\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 283 - } - ], - "endIndex": 292, - "startIndex": 282, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 314, - "paragraph": { - "elements": [ - { - "endIndex": 314, - "startIndex": 293, - "textRun": { - "content": "flutter,mapsplatform\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 293 - } - ], - "endIndex": 314, - "startIndex": 292, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 437, - "startIndex": 314, - "tableCells": [ - { - "content": [ - { - "endIndex": 325, - "paragraph": { - "elements": [ - { - "endIndex": 325, - "startIndex": 316, - "textRun": { - "content": "Keywords\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 316 - } - ], - "endIndex": 325, - "startIndex": 315, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 437, - "paragraph": { - "elements": [ - { - "endIndex": 437, - "startIndex": 326, - "textRun": { - "content": "product:Flutter,product:GoogleMapsPlatform,docType:Codelab,language:DartLang,skill:Beginner,skill:Introductory\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 326 - } - ], - "endIndex": 437, - "startIndex": 325, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 457, - "startIndex": 437, - "tableCells": [ - { - "content": [ - { - "endIndex": 446, - "paragraph": { - "elements": [ - { - "endIndex": 446, - "startIndex": 439, - "textRun": { - "content": "Status\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 439 - } - ], - "endIndex": 446, - "startIndex": 438, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 457, - "paragraph": { - "elements": [ - { - "endIndex": 457, - "startIndex": 447, - "textRun": { - "content": "Published\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 447 - } - ], - "endIndex": 457, - "startIndex": 446, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 538, - "startIndex": 457, - "tableCells": [ - { - "content": [ - { - "endIndex": 473, - "paragraph": { - "elements": [ - { - "endIndex": 473, - "startIndex": 459, - "textRun": { - "content": "Feedback Link\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 459 - } - ], - "endIndex": 473, - "startIndex": 458, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 538, - "paragraph": { - "elements": [ - { - "endIndex": 538, - "startIndex": 474, - "textRun": { - "content": "https://github.com/googlecodelabs/google-maps-in-flutter/issues\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 474 - } - ], - "endIndex": 538, - "startIndex": 473, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - }, - { - "endIndex": 560, - "startIndex": 538, - "tableCells": [ - { - "content": [ - { - "endIndex": 547, - "paragraph": { - "elements": [ - { - "endIndex": 547, - "startIndex": 540, - "textRun": { - "content": "Author\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 540 - } - ], - "endIndex": 547, - "startIndex": 539, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.9529412, - "red": 0.9529412 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 560, - "paragraph": { - "elements": [ - { - "endIndex": 560, - "startIndex": 548, - "textRun": { - "content": "brettmorgan\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 548 - } - ], - "endIndex": 560, - "startIndex": 547, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "width": { - "magnitude": 101.25, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - }, - { - "width": { - "magnitude": 366.75, - "unit": "PT" - }, - "widthType": "FIXED_WIDTH" - } - ] - } - } - }, - { - "endIndex": 562, - "paragraph": { - "elements": [ - { - "endIndex": 562, - "startIndex": 561, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 561 - }, - { - "endIndex": 563, - "paragraph": { - "elements": [ - { - "endIndex": 563, - "startIndex": 562, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 562 - }, - { - "endIndex": 1349, - "startIndex": 563, - "tableOfContents": { - "content": [ - { - "endIndex": 577, - "paragraph": { - "elements": [ - { - "endIndex": 576, - "startIndex": 564, - "textRun": { - "content": "Introduction", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ok7k5uux6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 577, - "startIndex": 576, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.ok7k5uux6" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 564 - }, - { - "endIndex": 595, - "paragraph": { - "elements": [ - { - "endIndex": 594, - "startIndex": 577, - "textRun": { - "content": "What you’ll build", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.21yzqg98x7h6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 595, - "startIndex": 594, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.21yzqg98x7h6" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 577 - }, - { - "endIndex": 612, - "paragraph": { - "elements": [ - { - "endIndex": 611, - "startIndex": 595, - "textRun": { - "content": "What is Flutter?", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.sew7rv6ox3j6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 612, - "startIndex": 611, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.sew7rv6ox3j6" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 595 - }, - { - "endIndex": 630, - "paragraph": { - "elements": [ - { - "endIndex": 629, - "startIndex": 612, - "textRun": { - "content": "What you’ll learn", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.hs6hf8vnv2d6" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 630, - "startIndex": 629, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.hs6hf8vnv2d6" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 612 - }, - { - "endIndex": 678, - "paragraph": { - "elements": [ - { - "endIndex": 677, - "startIndex": 630, - "textRun": { - "content": "What would you like to learn from this codelab?", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.b7nxsg514qu3" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 678, - "startIndex": 677, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.b7nxsg514qu3" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 54.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 630 - }, - { - "endIndex": 710, - "paragraph": { - "elements": [ - { - "endIndex": 709, - "startIndex": 678, - "textRun": { - "content": "Set up your Flutter environment", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.s4w3ehenj8fg" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 710, - "startIndex": 709, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.s4w3ehenj8fg" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 678 - }, - { - "endIndex": 726, - "paragraph": { - "elements": [ - { - "endIndex": 725, - "startIndex": 710, - "textRun": { - "content": "Getting started", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.bwo0af2iwk90" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 726, - "startIndex": 725, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.bwo0af2iwk90" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 710 - }, - { - "endIndex": 755, - "paragraph": { - "elements": [ - { - "endIndex": 754, - "startIndex": 726, - "textRun": { - "content": "Getting started with Flutter", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.sflrq0mndtt9" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 755, - "startIndex": 754, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.sflrq0mndtt9" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 726 - }, - { - "endIndex": 805, - "paragraph": { - "elements": [ - { - "endIndex": 804, - "startIndex": 755, - "textRun": { - "content": "Adding Google Maps Flutter plugin as a dependency", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.qnhfwr145a0q" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 805, - "startIndex": 804, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.qnhfwr145a0q" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 755 - }, - { - "endIndex": 830, - "paragraph": { - "elements": [ - { - "endIndex": 829, - "startIndex": 805, - "textRun": { - "content": "Configuring iOS platform", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.mqcx88xuw5gw" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 830, - "startIndex": 829, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.mqcx88xuw5gw" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 805 - }, - { - "endIndex": 842, - "paragraph": { - "elements": [ - { - "endIndex": 841, - "startIndex": 830, - "textRun": { - "content": "ios/Podfile", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.ybyba458ho0a" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 842, - "startIndex": 841, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.ybyba458ho0a" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 830 - }, - { - "endIndex": 869, - "paragraph": { - "elements": [ - { - "endIndex": 868, - "startIndex": 842, - "textRun": { - "content": "Configuring Android minSDK", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.p7onrogu5vjj" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 869, - "startIndex": 868, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.p7onrogu5vjj" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 842 - }, - { - "endIndex": 894, - "paragraph": { - "elements": [ - { - "endIndex": 893, - "startIndex": 869, - "textRun": { - "content": "android/app/build.gradle", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.slg6aay3y610" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 894, - "startIndex": 893, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.slg6aay3y610" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 869 - }, - { - "endIndex": 924, - "paragraph": { - "elements": [ - { - "endIndex": 923, - "startIndex": 894, - "textRun": { - "content": "Adding Google Maps to the app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.btmxwf909kks" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 924, - "startIndex": 923, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.btmxwf909kks" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 894 - }, - { - "endIndex": 952, - "paragraph": { - "elements": [ - { - "endIndex": 951, - "startIndex": 924, - "textRun": { - "content": "It’s all about the API keys", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.en66mhmr1ijb" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 952, - "startIndex": 951, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.en66mhmr1ijb" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 924 - }, - { - "endIndex": 989, - "paragraph": { - "elements": [ - { - "endIndex": 988, - "startIndex": 952, - "textRun": { - "content": "Adding an API key for an Android app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.434ea4sutt6b" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 989, - "startIndex": 988, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.434ea4sutt6b" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 952 - }, - { - "endIndex": 1030, - "paragraph": { - "elements": [ - { - "endIndex": 1029, - "startIndex": 989, - "textRun": { - "content": "android/app/src/main/AndroidManifest.xml", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.o4cuz5mt8mgq" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1030, - "startIndex": 1029, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.o4cuz5mt8mgq" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 989 - }, - { - "endIndex": 1063, - "paragraph": { - "elements": [ - { - "endIndex": 1062, - "startIndex": 1030, - "textRun": { - "content": "Adding an API key for an iOS app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.rwumwtdz8sbu" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1063, - "startIndex": 1062, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.rwumwtdz8sbu" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1030 - }, - { - "endIndex": 1092, - "paragraph": { - "elements": [ - { - "endIndex": 1091, - "startIndex": 1063, - "textRun": { - "content": "ios/Runner/AppDelegate.swift", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.anteseqrbtav" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1092, - "startIndex": 1091, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.anteseqrbtav" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1063 - }, - { - "endIndex": 1124, - "paragraph": { - "elements": [ - { - "endIndex": 1123, - "startIndex": 1092, - "textRun": { - "content": "Adding an API key for a Web app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.5yc7m5vpgm3a" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1124, - "startIndex": 1123, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.5yc7m5vpgm3a" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1092 - }, - { - "endIndex": 1139, - "paragraph": { - "elements": [ - { - "endIndex": 1138, - "startIndex": 1124, - "textRun": { - "content": "web/index.html", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.5qlnpoq6oucx" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1139, - "startIndex": 1138, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.5qlnpoq6oucx" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1124 - }, - { - "endIndex": 1167, - "paragraph": { - "elements": [ - { - "endIndex": 1166, - "startIndex": 1139, - "textRun": { - "content": "Putting a map on the screen", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.siyd9f71otj" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1167, - "startIndex": 1166, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.siyd9f71otj" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1139 - }, - { - "endIndex": 1181, - "paragraph": { - "elements": [ - { - "endIndex": 1180, - "startIndex": 1167, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.aqw5fitml1t2" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1181, - "startIndex": 1180, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.aqw5fitml1t2" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1167 - }, - { - "endIndex": 1197, - "paragraph": { - "elements": [ - { - "endIndex": 1196, - "startIndex": 1181, - "textRun": { - "content": "Running the app", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.g24cz77tf7tj" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1197, - "startIndex": 1196, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.g24cz77tf7tj" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1181 - }, - { - "endIndex": 1219, - "paragraph": { - "elements": [ - { - "endIndex": 1218, - "startIndex": 1197, - "textRun": { - "content": "Put Google on the Map", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.c60hsrd97hl2" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1219, - "startIndex": 1218, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.c60hsrd97hl2" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1197 - }, - { - "endIndex": 1253, - "paragraph": { - "elements": [ - { - "endIndex": 1252, - "startIndex": 1219, - "textRun": { - "content": "Parsing JSON with code generation", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.lrs79x3jn1mo" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1253, - "startIndex": 1252, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.lrs79x3jn1mo" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1219 - }, - { - "endIndex": 1276, - "paragraph": { - "elements": [ - { - "endIndex": 1275, - "startIndex": 1253, - "textRun": { - "content": "lib/src/locations.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.vcffge4pgdix" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1276, - "startIndex": 1275, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.vcffge4pgdix" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1253 - }, - { - "endIndex": 1289, - "paragraph": { - "elements": [ - { - "endIndex": 1288, - "startIndex": 1276, - "textRun": { - "content": "pubspec.yaml", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.z6mljexlaggc" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 1289, - "startIndex": 1288, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.z6mljexlaggc" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1276 - }, - { - "endIndex": 1303, - "paragraph": { - "elements": [ - { - "endIndex": 1302, - "startIndex": 1289, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.tkosencotov2" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1303, - "startIndex": 1302, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.tkosencotov2" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1289 - }, - { - "endIndex": 1314, - "paragraph": { - "elements": [ - { - "endIndex": 1313, - "startIndex": 1303, - "textRun": { - "content": "Next steps", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.wyjmgdlwi2kp" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1314, - "startIndex": 1313, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.wyjmgdlwi2kp" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1303 - }, - { - "endIndex": 1331, - "paragraph": { - "elements": [ - { - "endIndex": 1330, - "startIndex": 1314, - "textRun": { - "content": "Congratulations!", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.4w8rovwn8ql" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1331, - "startIndex": 1330, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.4w8rovwn8ql" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1314 - }, - { - "endIndex": 1348, - "paragraph": { - "elements": [ - { - "endIndex": 1347, - "startIndex": 1331, - "textRun": { - "content": "Other next steps", - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "italic": false, - "link": { - "headingId": "h.8ahw5cvmt2v7" - }, - "smallCaps": false, - "strikethrough": false, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - } - }, - { - "endIndex": 1348, - "startIndex": 1347, - "textRun": { - "content": "\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "headingId": "h.8ahw5cvmt2v7" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 18.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceAbove": { - "magnitude": 3.0, - "unit": "PT" - } - } - }, - "startIndex": 1331 - } - ] - } - }, - { - "endIndex": 1350, - "paragraph": { - "elements": [ - { - "endIndex": 1350, - "startIndex": 1349, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1349 - }, - { - "endIndex": 1352, - "paragraph": { - "elements": [ - { - "endIndex": 1351, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 1350 - }, - { - "endIndex": 1352, - "startIndex": 1351, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1350 - }, - { - "endIndex": 1353, - "paragraph": { - "elements": [ - { - "endIndex": 1353, - "startIndex": 1352, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 10.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Verdana", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1352 - }, - { - "endIndex": 1366, - "paragraph": { - "elements": [ - { - "endIndex": 1366, - "startIndex": 1353, - "textRun": { - "content": "Introduction\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ok7k5uux6", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1353 - }, - { - "endIndex": 1481, - "paragraph": { - "elements": [ - { - "endIndex": 1481, - "startIndex": 1366, - "textRun": { - "content": "Flutter is Google’s mobile app SDK for crafting high-quality native experiences on iOS and Android in record time.\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1366 - }, - { - "endIndex": 1482, - "paragraph": { - "elements": [ - { - "endIndex": 1482, - "startIndex": 1481, - "textRun": { - "content": "\n", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1481 - }, - { - "endIndex": 1867, - "paragraph": { - "elements": [ - { - "endIndex": 1491, - "startIndex": 1482, - "textRun": { - "content": "With the ", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - } - } - } - }, - { - "endIndex": 1517, - "startIndex": 1491, - "textRun": { - "content": "Google Maps Flutter plugin", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dartlang.org/packages/google_maps_flutter" - }, - "underline": true - } - } - }, - { - "endIndex": 1518, - "startIndex": 1517, - "textRun": { - "content": ",", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - } - } - } - }, - { - "endIndex": 1866, - "startIndex": 1518, - "textRun": { - "content": " you can add maps based on Google maps data to your application. The plugin automatically handles access to the Google Maps servers, map display, and response to user gestures such as clicks and drags. You can also add markers to your map. These objects provide additional information for map locations, and allow the user to interact with the map.", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - } - } - } - }, - { - "endIndex": 1867, - "startIndex": 1866, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 1482 - }, - { - "endIndex": 1885, - "paragraph": { - "elements": [ - { - "endIndex": 1885, - "startIndex": 1867, - "textRun": { - "content": "What you’ll build\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.21yzqg98x7h6", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 1867 - }, - { - "endIndex": 1886, - "paragraph": { - "elements": [ - { - "endIndex": 1886, - "startIndex": 1885, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 1885 - }, - { - "endIndex": 2096, - "startIndex": 1886, - "table": { - "columns": 2, - "rows": 1, - "tableRows": [ - { - "endIndex": 2095, - "startIndex": 1887, - "tableCells": [ - { - "content": [ - { - "endIndex": 1993, - "paragraph": { - "elements": [ - { - "endIndex": 1993, - "startIndex": 1889, - "textRun": { - "content": "In this codelab, you'll build a mobile app featuring a Google Map using the Flutter SDK. Your app will:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 163.63637, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 1889 - }, - { - "endIndex": 2014, - "paragraph": { - "bullet": { - "listId": "kix.k0g7fgw2pxb9", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2014, - "startIndex": 1993, - "textRun": { - "content": "Display a Google Map\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 1993 - }, - { - "endIndex": 2051, - "paragraph": { - "bullet": { - "listId": "kix.k0g7fgw2pxb9", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2051, - "startIndex": 2014, - "textRun": { - "content": "Retrieve map data from a web service\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2014 - }, - { - "endIndex": 2091, - "paragraph": { - "bullet": { - "listId": "kix.k0g7fgw2pxb9", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2091, - "startIndex": 2051, - "textRun": { - "content": "Display this data as markers on the Map\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2051 - }, - { - "endIndex": 2092, - "paragraph": { - "elements": [ - { - "endIndex": 2092, - "startIndex": 2091, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 36.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2091 - } - ], - "endIndex": 2092, - "startIndex": 1888, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 2095, - "paragraph": { - "elements": [ - { - "endIndex": 2094, - "inlineObjectElement": { - "inlineObjectId": "kix.1p75kdspyuxq", - "textStyle": {} - }, - "startIndex": 2093 - }, - { - "endIndex": 2095, - "startIndex": 2094, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2093 - } - ], - "endIndex": 2095, - "startIndex": 2092, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 2097, - "paragraph": { - "elements": [ - { - "endIndex": 2097, - "startIndex": 2096, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2096 - }, - { - "endIndex": 2114, - "paragraph": { - "elements": [ - { - "endIndex": 2114, - "startIndex": 2097, - "textRun": { - "content": "What is Flutter?\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.sew7rv6ox3j6", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 2097 - }, - { - "endIndex": 2115, - "paragraph": { - "elements": [ - { - "endIndex": 2115, - "startIndex": 2114, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 2114 - }, - { - "endIndex": 2152, - "paragraph": { - "elements": [ - { - "endIndex": 2152, - "startIndex": 2115, - "textRun": { - "content": "Flutter has three core capabilities.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 163.63637, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2115 - }, - { - "endIndex": 2251, - "paragraph": { - "bullet": { - "listId": "kix.6f05htw8422z", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2167, - "startIndex": 2152, - "textRun": { - "content": "Fast to develop", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2168, - "startIndex": 2167, - "textRun": { - "content": ":", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2251, - "startIndex": 2168, - "textRun": { - "content": " Build your Android and iOS applications in milliseconds with Stateful Hot Reload.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 150.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2152 - }, - { - "endIndex": 2343, - "paragraph": { - "bullet": { - "listId": "kix.6f05htw8422z", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2274, - "startIndex": 2251, - "textRun": { - "content": "Expressive and flexible", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2275, - "startIndex": 2274, - "textRun": { - "content": ":", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2276, - "startIndex": 2275, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2341, - "startIndex": 2276, - "textRun": { - "content": "Quickly ship features with a focus on native end-user experiences", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - } - } - } - }, - { - "endIndex": 2343, - "startIndex": 2341, - "textRun": { - "content": ".\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 150.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2251 - }, - { - "endIndex": 2539, - "paragraph": { - "bullet": { - "listId": "kix.6f05htw8422z", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2385, - "startIndex": 2343, - "textRun": { - "content": "Native performance on both iOS and Android", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2386, - "startIndex": 2385, - "textRun": { - "content": ":", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2387, - "startIndex": 2386, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2537, - "startIndex": 2387, - "textRun": { - "content": "Flutter’s widgets incorporate all critical platform differences — such as scrolling, navigation, icons, and fonts — to provide full native performance", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - } - } - } - }, - { - "endIndex": 2539, - "startIndex": 2537, - "textRun": { - "content": ".\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 150.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2343 - }, - { - "endIndex": 2556, - "paragraph": { - "elements": [ - { - "endIndex": 2556, - "startIndex": 2539, - "textRun": { - "content": "Google Maps has:\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 163.63637, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2539 - }, - { - "endIndex": 2663, - "paragraph": { - "bullet": { - "listId": "kix.6f05htw8422z", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2581, - "startIndex": 2556, - "textRun": { - "content": "99% coverage of the world", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2582, - "startIndex": 2581, - "textRun": { - "content": ":", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2663, - "startIndex": 2582, - "textRun": { - "content": " Build with reliable, comprehensive data for over 200 countries and territories.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 150.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2556 - }, - { - "endIndex": 2740, - "paragraph": { - "bullet": { - "listId": "kix.6f05htw8422z", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2687, - "startIndex": 2663, - "textRun": { - "content": "25 million updates daily", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2688, - "startIndex": 2687, - "textRun": { - "content": ":", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2689, - "startIndex": 2688, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2738, - "startIndex": 2689, - "textRun": { - "content": "Count on accurate, real-time location information", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - } - } - } - }, - { - "endIndex": 2740, - "startIndex": 2738, - "textRun": { - "content": ".\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 150.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2663 - }, - { - "endIndex": 2830, - "paragraph": { - "bullet": { - "listId": "kix.6f05htw8422z", - "textStyle": {} - }, - "elements": [ - { - "endIndex": 2770, - "startIndex": 2740, - "textRun": { - "content": "1 billion monthly active users", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2771, - "startIndex": 2770, - "textRun": { - "content": ":", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2772, - "startIndex": 2771, - "textRun": { - "content": " ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2828, - "startIndex": 2772, - "textRun": { - "content": "Scale confidently, backed by Google Maps’ infrastructure", - "textStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 1.0, - "green": 1.0, - "red": 1.0 - } - } - }, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.2901961, - "green": 0.2901961, - "red": 0.2901961 - } - } - } - } - } - }, - { - "endIndex": 2830, - "startIndex": 2828, - "textRun": { - "content": ".\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 150.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2740 - }, - { - "endIndex": 2831, - "paragraph": { - "elements": [ - { - "endIndex": 2831, - "startIndex": 2830, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2830 - }, - { - "endIndex": 2939, - "paragraph": { - "elements": [ - { - "endIndex": 2938, - "startIndex": 2831, - "textRun": { - "content": "This codelab walks you through creating a Google Maps experience in a Flutter app for both iOS and Android.", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 2939, - "startIndex": 2938, - "textRun": { - "content": "\n", - "textStyle": { - "bold": false - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 163.63637, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2831 - }, - { - "endIndex": 2940, - "paragraph": { - "elements": [ - { - "endIndex": 2940, - "startIndex": 2939, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 2939 - }, - { - "endIndex": 2958, - "paragraph": { - "elements": [ - { - "endIndex": 2958, - "startIndex": 2940, - "textRun": { - "content": "What you’ll learn\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.hs6hf8vnv2d6", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 2940 - }, - { - "endIndex": 2959, - "paragraph": { - "elements": [ - { - "endIndex": 2959, - "startIndex": 2958, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 2958 - }, - { - "endIndex": 3000, - "paragraph": { - "bullet": { - "listId": "kix.qx7bo6w9dag0", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3000, - "startIndex": 2959, - "textRun": { - "content": "How to create a new Flutter application.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 150.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 2959 - }, - { - "endIndex": 3047, - "paragraph": { - "bullet": { - "listId": "kix.qx7bo6w9dag0", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3047, - "startIndex": 3000, - "textRun": { - "content": "How to configure a Google Maps Flutter plugin.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 150.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3000 - }, - { - "endIndex": 3116, - "paragraph": { - "bullet": { - "listId": "kix.qx7bo6w9dag0", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3116, - "startIndex": 3047, - "textRun": { - "content": "How to add Markers to a map, using location data from a web service.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 150.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceBelow": { - "magnitude": 27.0, - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3047 - }, - { - "endIndex": 3284, - "paragraph": { - "elements": [ - { - "endIndex": 3284, - "startIndex": 3116, - "textRun": { - "content": "This codelab focuses on adding a Google map to a Flutter app. Non-relevant concepts and code blocks are glossed over and are provided for you to simply copy and paste.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 3116 - }, - { - "endIndex": 3285, - "paragraph": { - "elements": [ - { - "endIndex": 3285, - "startIndex": 3284, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 3284 - }, - { - "endIndex": 3286, - "paragraph": { - "elements": [ - { - "endIndex": 3286, - "startIndex": 3285, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3285 - }, - { - "endIndex": 3552, - "startIndex": 3286, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 3551, - "startIndex": 3287, - "tableCells": [ - { - "content": [ - { - "endIndex": 3337, - "paragraph": { - "elements": [ - { - "endIndex": 3337, - "startIndex": 3289, - "textRun": { - "content": "What would you like to learn from this codelab?\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.b7nxsg514qu3", - "namedStyleType": "HEADING_4", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 14.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 4.0, - "unit": "PT" - } - } - }, - "startIndex": 3289 - }, - { - "endIndex": 3387, - "paragraph": { - "bullet": { - "listId": "kix.lwtrs6k81vg0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3387, - "startIndex": 3337, - "textRun": { - "content": "I'm new to the topic, and I want a good overview.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3337 - }, - { - "endIndex": 3446, - "paragraph": { - "bullet": { - "listId": "kix.lwtrs6k81vg0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3446, - "startIndex": 3387, - "textRun": { - "content": "I know something about this topic, but I want a refresher.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3387 - }, - { - "endIndex": 3497, - "paragraph": { - "bullet": { - "listId": "kix.lwtrs6k81vg0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3497, - "startIndex": 3446, - "textRun": { - "content": "I'm looking for example code to use in my project.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3446 - }, - { - "endIndex": 3551, - "paragraph": { - "bullet": { - "listId": "kix.lwtrs6k81vg0", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3551, - "startIndex": 3497, - "textRun": { - "content": "I'm looking for an explanation of something specific.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3497 - } - ], - "endIndex": 3551, - "startIndex": 3288, - "tableCellStyle": { - "backgroundColor": { - "color": { - "rgbColor": { - "blue": 0.9529412, - "green": 0.8862745, - "red": 0.8117647 - } - } - }, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 3553, - "paragraph": { - "elements": [ - { - "endIndex": 3553, - "startIndex": 3552, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 3552 - }, - { - "endIndex": 3555, - "paragraph": { - "elements": [ - { - "endIndex": 3554, - "horizontalRule": { - "textStyle": {} - }, - "startIndex": 3553 - }, - { - "endIndex": 3555, - "startIndex": 3554, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 3553 - }, - { - "endIndex": 3587, - "paragraph": { - "elements": [ - { - "endIndex": 3587, - "startIndex": 3555, - "textRun": { - "content": "Set up your Flutter environment\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.s4w3ehenj8fg", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 3555 - }, - { - "endIndex": 3603, - "paragraph": { - "elements": [ - { - "endIndex": 3603, - "startIndex": 3587, - "textRun": { - "content": "Duration: 10:00\n", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3587 - }, - { - "endIndex": 3620, - "paragraph": { - "elements": [ - { - "endIndex": 3619, - "startIndex": 3603, - "textRun": { - "content": "Environment: web", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3620, - "startIndex": 3619, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3603 - }, - { - "endIndex": 3621, - "paragraph": { - "elements": [ - { - "endIndex": 3621, - "startIndex": 3620, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3620 - }, - { - "endIndex": 3783, - "paragraph": { - "elements": [ - { - "endIndex": 3679, - "startIndex": 3621, - "textRun": { - "content": "You need two pieces of software to complete this lab: the ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3690, - "startIndex": 3679, - "textRun": { - "content": "Flutter SDK", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.io/get-started/install/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3696, - "startIndex": 3690, - "textRun": { - "content": ", and ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3705, - "startIndex": 3696, - "textRun": { - "content": "an editor", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://flutter.io/get-started/editor/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3783, - "startIndex": 3705, - "textRun": { - "content": ". This codelab assumes Android Studio, but you can use your preferred editor.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3621 - }, - { - "endIndex": 3784, - "paragraph": { - "elements": [ - { - "endIndex": 3784, - "startIndex": 3783, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3783 - }, - { - "endIndex": 3845, - "paragraph": { - "elements": [ - { - "endIndex": 3845, - "startIndex": 3784, - "textRun": { - "content": "You can run this codelab using any of the following devices:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3784 - }, - { - "endIndex": 3846, - "paragraph": { - "elements": [ - { - "endIndex": 3846, - "startIndex": 3845, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 3845 - }, - { - "endIndex": 3935, - "paragraph": { - "bullet": { - "listId": "kix.yadiw4lw6xu2", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3935, - "startIndex": 3846, - "textRun": { - "content": "A physical device (Android or iOS) connected to your computer and set to developer mode.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3846 - }, - { - "endIndex": 3990, - "paragraph": { - "bullet": { - "listId": "kix.yadiw4lw6xu2", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 3965, - "startIndex": 3935, - "textRun": { - "content": "The iOS simulator. (Requires ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3987, - "startIndex": 3965, - "textRun": { - "content": "installing Xcode tools", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://apps.apple.com/us/app/xcode/id497799835" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 3990, - "startIndex": 3987, - "textRun": { - "content": ".)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3935 - }, - { - "endIndex": 4048, - "paragraph": { - "bullet": { - "listId": "kix.yadiw4lw6xu2", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 4031, - "startIndex": 3990, - "textRun": { - "content": "The Android emulator. (Requires setup in ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 4045, - "startIndex": 4031, - "textRun": { - "content": "Android Studio", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://developer.android.com/studio/install" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 4048, - "startIndex": 4045, - "textRun": { - "content": ".)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 3990 - }, - { - "endIndex": 4049, - "paragraph": { - "elements": [ - { - "endIndex": 4049, - "startIndex": 4048, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4048 - }, - { - "endIndex": 4065, - "paragraph": { - "elements": [ - { - "endIndex": 4065, - "startIndex": 4049, - "textRun": { - "content": "Getting started\n", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.bwo0af2iwk90", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4049 - }, - { - "endIndex": 4080, - "paragraph": { - "elements": [ - { - "endIndex": 4079, - "startIndex": 4065, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 4080, - "startIndex": 4079, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4065 - }, - { - "endIndex": 4081, - "paragraph": { - "elements": [ - { - "endIndex": 4081, - "startIndex": 4080, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 4080 - }, - { - "endIndex": 4110, - "paragraph": { - "elements": [ - { - "endIndex": 4110, - "startIndex": 4081, - "textRun": { - "content": "Getting started with Flutter\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.sflrq0mndtt9", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4081 - }, - { - "endIndex": 4268, - "paragraph": { - "elements": [ - { - "endIndex": 4268, - "startIndex": 4110, - "textRun": { - "content": "The easiest way to get started with Flutter is to use the flutter command line tool to create all the required code for a simple getting started experience. \n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4110 - }, - { - "endIndex": 4269, - "paragraph": { - "elements": [ - { - "endIndex": 4269, - "startIndex": 4268, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4268 - }, - { - "endIndex": 4638, - "startIndex": 4269, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 4637, - "startIndex": 4270, - "tableCells": [ - { - "content": [ - { - "endIndex": 4340, - "paragraph": { - "elements": [ - { - "endIndex": 4340, - "startIndex": 4272, - "textRun": { - "content": "$ flutter create google_maps_in_flutter --platforms android,ios,web\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4272 - }, - { - "endIndex": 4383, - "paragraph": { - "elements": [ - { - "endIndex": 4383, - "startIndex": 4340, - "textRun": { - "content": "Creating project google_maps_in_flutter...\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4340 - }, - { - "endIndex": 4456, - "paragraph": { - "elements": [ - { - "endIndex": 4456, - "startIndex": 4383, - "textRun": { - "content": "Running \"flutter pub get\" in google_maps_in_flutter... 1,612ms\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4383 - }, - { - "endIndex": 4472, - "paragraph": { - "elements": [ - { - "endIndex": 4472, - "startIndex": 4456, - "textRun": { - "content": "Wrote 80 files.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4456 - }, - { - "endIndex": 4473, - "paragraph": { - "elements": [ - { - "endIndex": 4473, - "startIndex": 4472, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4472 - }, - { - "endIndex": 4483, - "paragraph": { - "elements": [ - { - "endIndex": 4483, - "startIndex": 4473, - "textRun": { - "content": "All done!\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4473 - }, - { - "endIndex": 4523, - "paragraph": { - "elements": [ - { - "endIndex": 4523, - "startIndex": 4483, - "textRun": { - "content": "In order to run your application, type:\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4483 - }, - { - "endIndex": 4524, - "paragraph": { - "elements": [ - { - "endIndex": 4524, - "startIndex": 4523, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4523 - }, - { - "endIndex": 4554, - "paragraph": { - "elements": [ - { - "endIndex": 4554, - "startIndex": 4524, - "textRun": { - "content": " $ cd google_maps_in_flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4524 - }, - { - "endIndex": 4570, - "paragraph": { - "elements": [ - { - "endIndex": 4570, - "startIndex": 4554, - "textRun": { - "content": " $ flutter run\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4554 - }, - { - "endIndex": 4571, - "paragraph": { - "elements": [ - { - "endIndex": 4571, - "startIndex": 4570, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4570 - }, - { - "endIndex": 4637, - "paragraph": { - "elements": [ - { - "endIndex": 4637, - "startIndex": 4571, - "textRun": { - "content": "Your application code is in google_maps_in_flutter/lib/main.dart.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4571 - } - ], - "endIndex": 4637, - "startIndex": 4271, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 4639, - "paragraph": { - "elements": [ - { - "endIndex": 4639, - "startIndex": 4638, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4638 - }, - { - "endIndex": 4689, - "paragraph": { - "elements": [ - { - "endIndex": 4689, - "startIndex": 4639, - "textRun": { - "content": "Adding Google Maps Flutter plugin as a dependency\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "headingId": "h.qnhfwr145a0q", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4639 - }, - { - "endIndex": 4885, - "paragraph": { - "elements": [ - { - "endIndex": 4749, - "startIndex": 4689, - "textRun": { - "content": "Adding additional capability to a Flutter app is easy using ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 4761, - "startIndex": 4749, - "textRun": { - "content": "Pub packages", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dartlang.org/flutter" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 4797, - "startIndex": 4761, - "textRun": { - "content": ". In this codelab you introduce the ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 4823, - "startIndex": 4797, - "textRun": { - "content": "Google Maps Flutter plugin", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dartlang.org/packages/google_maps_flutter" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 4885, - "startIndex": 4823, - "textRun": { - "content": " by running the following command from the project directory.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 4689 - }, - { - "endIndex": 4886, - "paragraph": { - "elements": [ - { - "endIndex": 4886, - "startIndex": 4885, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.3eliymc4sjl0", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 4885 - }, - { - "endIndex": 5622, - "startIndex": 4886, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 5621, - "startIndex": 4887, - "tableCells": [ - { - "content": [ - { - "endIndex": 4917, - "paragraph": { - "elements": [ - { - "endIndex": 4917, - "startIndex": 4889, - "textRun": { - "content": "$ cd google_maps_in_flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4889 - }, - { - "endIndex": 4955, - "paragraph": { - "elements": [ - { - "endIndex": 4955, - "startIndex": 4917, - "textRun": { - "content": "$ flutter pub add google_maps_flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4917 - }, - { - "endIndex": 4981, - "paragraph": { - "elements": [ - { - "endIndex": 4981, - "startIndex": 4955, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4955 - }, - { - "endIndex": 5013, - "paragraph": { - "elements": [ - { - "endIndex": 5013, - "startIndex": 4981, - "textRun": { - "content": " async 2.8.2 (2.9.0 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 4981 - }, - { - "endIndex": 5050, - "paragraph": { - "elements": [ - { - "endIndex": 5050, - "startIndex": 5013, - "textRun": { - "content": " characters 1.2.0 (1.2.1 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5013 - }, - { - "endIndex": 5082, - "paragraph": { - "elements": [ - { - "endIndex": 5082, - "startIndex": 5050, - "textRun": { - "content": " clock 1.1.0 (1.1.1 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5050 - }, - { - "endIndex": 5119, - "paragraph": { - "elements": [ - { - "endIndex": 5119, - "startIndex": 5082, - "textRun": { - "content": " fake_async 1.3.0 (1.3.1 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5082 - }, - { - "endIndex": 5160, - "paragraph": { - "elements": [ - { - "endIndex": 5160, - "startIndex": 5119, - "textRun": { - "content": "+ flutter_plugin_android_lifecycle 2.0.6\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5119 - }, - { - "endIndex": 5188, - "paragraph": { - "elements": [ - { - "endIndex": 5188, - "startIndex": 5160, - "textRun": { - "content": "+ google_maps_flutter 2.1.8\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5160 - }, - { - "endIndex": 5235, - "paragraph": { - "elements": [ - { - "endIndex": 5235, - "startIndex": 5188, - "textRun": { - "content": "+ google_maps_flutter_platform_interface 2.2.0\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5188 - }, - { - "endIndex": 5273, - "paragraph": { - "elements": [ - { - "endIndex": 5273, - "startIndex": 5235, - "textRun": { - "content": " matcher 0.12.11 (0.12.12 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5235 - }, - { - "endIndex": 5324, - "paragraph": { - "elements": [ - { - "endIndex": 5324, - "startIndex": 5273, - "textRun": { - "content": " material_color_utilities 0.1.4 (0.1.5 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5273 - }, - { - "endIndex": 5355, - "paragraph": { - "elements": [ - { - "endIndex": 5355, - "startIndex": 5324, - "textRun": { - "content": " meta 1.7.0 (1.8.0 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5324 - }, - { - "endIndex": 5386, - "paragraph": { - "elements": [ - { - "endIndex": 5386, - "startIndex": 5355, - "textRun": { - "content": " path 1.8.1 (1.8.2 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5355 - }, - { - "endIndex": 5420, - "paragraph": { - "elements": [ - { - "endIndex": 5420, - "startIndex": 5386, - "textRun": { - "content": "+ plugin_platform_interface 2.1.2\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5386 - }, - { - "endIndex": 5458, - "paragraph": { - "elements": [ - { - "endIndex": 5458, - "startIndex": 5420, - "textRun": { - "content": " source_span 1.8.2 (1.9.0 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5420 - }, - { - "endIndex": 5483, - "paragraph": { - "elements": [ - { - "endIndex": 5483, - "startIndex": 5458, - "textRun": { - "content": "+ stream_transform 2.0.0\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5458 - }, - { - "endIndex": 5524, - "paragraph": { - "elements": [ - { - "endIndex": 5524, - "startIndex": 5483, - "textRun": { - "content": " string_scanner 1.1.0 (1.1.1 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5483 - }, - { - "endIndex": 5561, - "paragraph": { - "elements": [ - { - "endIndex": 5561, - "startIndex": 5524, - "textRun": { - "content": " term_glyph 1.2.0 (1.2.1 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5524 - }, - { - "endIndex": 5597, - "paragraph": { - "elements": [ - { - "endIndex": 5597, - "startIndex": 5561, - "textRun": { - "content": " test_api 0.4.9 (0.4.12 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5561 - }, - { - "endIndex": 5621, - "paragraph": { - "elements": [ - { - "endIndex": 5621, - "startIndex": 5597, - "textRun": { - "content": "Changed 5 dependencies!\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5597 - } - ], - "endIndex": 5621, - "startIndex": 4888, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 5623, - "paragraph": { - "elements": [ - { - "endIndex": 5623, - "startIndex": 5622, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 5622 - }, - { - "endIndex": 5806, - "paragraph": { - "elements": [ - { - "endIndex": 5806, - "startIndex": 5623, - "textRun": { - "content": "This codelab will also be covering how to use Google Maps in Flutter for Web. However, the Web version of the plugin is not yet federated, so you need to also add it to your project.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - } - } - }, - "startIndex": 5623 - }, - { - "endIndex": 5807, - "paragraph": { - "elements": [ - { - "endIndex": 5807, - "startIndex": 5806, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ap7742sx96fh", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 5806 - }, - { - "endIndex": 6573, - "startIndex": 5807, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 6572, - "startIndex": 5808, - "tableCells": [ - { - "content": [ - { - "endIndex": 5852, - "paragraph": { - "elements": [ - { - "endIndex": 5852, - "startIndex": 5810, - "textRun": { - "content": "$ flutter pub add google_maps_flutter_web\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5810 - }, - { - "endIndex": 5878, - "paragraph": { - "elements": [ - { - "endIndex": 5878, - "startIndex": 5852, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5852 - }, - { - "endIndex": 5910, - "paragraph": { - "elements": [ - { - "endIndex": 5910, - "startIndex": 5878, - "textRun": { - "content": " async 2.8.2 (2.9.0 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5878 - }, - { - "endIndex": 5947, - "paragraph": { - "elements": [ - { - "endIndex": 5947, - "startIndex": 5910, - "textRun": { - "content": " characters 1.2.0 (1.2.1 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5910 - }, - { - "endIndex": 5979, - "paragraph": { - "elements": [ - { - "endIndex": 5979, - "startIndex": 5947, - "textRun": { - "content": " clock 1.1.0 (1.1.1 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5947 - }, - { - "endIndex": 5995, - "paragraph": { - "elements": [ - { - "endIndex": 5995, - "startIndex": 5979, - "textRun": { - "content": "+ csslib 0.17.2\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5979 - }, - { - "endIndex": 6032, - "paragraph": { - "elements": [ - { - "endIndex": 6032, - "startIndex": 5995, - "textRun": { - "content": " fake_async 1.3.0 (1.3.1 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 5995 - }, - { - "endIndex": 6077, - "paragraph": { - "elements": [ - { - "endIndex": 6077, - "startIndex": 6032, - "textRun": { - "content": "+ flutter_web_plugins 0.0.0 from sdk flutter\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6032 - }, - { - "endIndex": 6097, - "paragraph": { - "elements": [ - { - "endIndex": 6097, - "startIndex": 6077, - "textRun": { - "content": "+ google_maps 6.2.0\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6077 - }, - { - "endIndex": 6131, - "paragraph": { - "elements": [ - { - "endIndex": 6131, - "startIndex": 6097, - "textRun": { - "content": "+ google_maps_flutter_web 0.4.0+1\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6097 - }, - { - "endIndex": 6145, - "paragraph": { - "elements": [ - { - "endIndex": 6145, - "startIndex": 6131, - "textRun": { - "content": "+ html 0.15.0\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6131 - }, - { - "endIndex": 6156, - "paragraph": { - "elements": [ - { - "endIndex": 6156, - "startIndex": 6145, - "textRun": { - "content": "+ js 0.6.4\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6145 - }, - { - "endIndex": 6176, - "paragraph": { - "elements": [ - { - "endIndex": 6176, - "startIndex": 6156, - "textRun": { - "content": "+ js_wrapping 0.7.4\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6156 - }, - { - "endIndex": 6214, - "paragraph": { - "elements": [ - { - "endIndex": 6214, - "startIndex": 6176, - "textRun": { - "content": " matcher 0.12.11 (0.12.12 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6176 - }, - { - "endIndex": 6265, - "paragraph": { - "elements": [ - { - "endIndex": 6265, - "startIndex": 6214, - "textRun": { - "content": " material_color_utilities 0.1.4 (0.1.5 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6214 - }, - { - "endIndex": 6296, - "paragraph": { - "elements": [ - { - "endIndex": 6296, - "startIndex": 6265, - "textRun": { - "content": " meta 1.7.0 (1.8.0 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6265 - }, - { - "endIndex": 6327, - "paragraph": { - "elements": [ - { - "endIndex": 6327, - "startIndex": 6296, - "textRun": { - "content": " path 1.8.1 (1.8.2 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6296 - }, - { - "endIndex": 6349, - "paragraph": { - "elements": [ - { - "endIndex": 6349, - "startIndex": 6327, - "textRun": { - "content": "+ sanitize_html 2.0.0\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6327 - }, - { - "endIndex": 6387, - "paragraph": { - "elements": [ - { - "endIndex": 6387, - "startIndex": 6349, - "textRun": { - "content": " source_span 1.8.2 (1.9.0 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6349 - }, - { - "endIndex": 6428, - "paragraph": { - "elements": [ - { - "endIndex": 6428, - "startIndex": 6387, - "textRun": { - "content": " string_scanner 1.1.0 (1.1.1 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6387 - }, - { - "endIndex": 6465, - "paragraph": { - "elements": [ - { - "endIndex": 6465, - "startIndex": 6428, - "textRun": { - "content": " term_glyph 1.2.0 (1.2.1 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6428 - }, - { - "endIndex": 6501, - "paragraph": { - "elements": [ - { - "endIndex": 6501, - "startIndex": 6465, - "textRun": { - "content": " test_api 0.4.9 (0.4.12 available)\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6465 - }, - { - "endIndex": 6548, - "paragraph": { - "elements": [ - { - "endIndex": 6548, - "startIndex": 6501, - "textRun": { - "content": "Downloading google_maps_flutter_web 0.4.0+1...\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6501 - }, - { - "endIndex": 6572, - "paragraph": { - "elements": [ - { - "endIndex": 6572, - "startIndex": 6548, - "textRun": { - "content": "Changed 8 dependencies!\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 6548 - } - ], - "endIndex": 6572, - "startIndex": 5809, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6574, - "paragraph": { - "elements": [ - { - "endIndex": 6574, - "startIndex": 6573, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6573 - }, - { - "endIndex": 6599, - "paragraph": { - "elements": [ - { - "endIndex": 6590, - "startIndex": 6574, - "textRun": { - "content": "Configuring iOS ", - "textStyle": {} - } - }, - { - "endIndex": 6599, - "startIndex": 6590, - "textRun": { - "content": "platform\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.mqcx88xuw5gw", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 6574 - }, - { - "endIndex": 6737, - "paragraph": { - "elements": [ - { - "endIndex": 6655, - "startIndex": 6599, - "textRun": { - "content": "To get the latest version of the Google Maps SDK on iOS ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 6700, - "startIndex": 6655, - "textRun": { - "content": "requires a platform minimum version of iOS 13", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://developers.google.com/maps/documentation/ios-sdk/overview#supported_platforms" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 6737, - "startIndex": 6700, - "textRun": { - "content": ". Modify the ios/Podfile as follows.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6599 - }, - { - "endIndex": 6750, - "paragraph": { - "elements": [ - { - "endIndex": 6748, - "startIndex": 6737, - "textRun": { - "content": "ios/Podfile", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/google-maps-in-flutter/step_3/ios/Podfile" - }, - "underline": true - } - } - }, - { - "endIndex": 6750, - "startIndex": 6748, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ybyba458ho0a", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 6737 - }, - { - "endIndex": 6989, - "startIndex": 6750, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 6988, - "startIndex": 6751, - "tableCells": [ - { - "content": [ - { - "endIndex": 6809, - "paragraph": { - "elements": [ - { - "endIndex": 6809, - "startIndex": 6753, - "textRun": { - "content": "# Set platform to 13.0 to enable latest Google Maps SDK\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6753 - }, - { - "endIndex": 6858, - "paragraph": { - "elements": [ - { - "endIndex": 6858, - "startIndex": 6809, - "textRun": { - "content": "platform :ios, '13.0' # Uncomment and set to 13.\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6809 - }, - { - "endIndex": 6859, - "paragraph": { - "elements": [ - { - "endIndex": 6859, - "startIndex": 6858, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6858 - }, - { - "endIndex": 6948, - "paragraph": { - "elements": [ - { - "endIndex": 6948, - "startIndex": 6859, - "textRun": { - "content": "# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6859 - }, - { - "endIndex": 6988, - "paragraph": { - "elements": [ - { - "endIndex": 6988, - "startIndex": 6948, - "textRun": { - "content": "ENV['COCOAPODS_DISABLE_STATS'] = 'true'\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6948 - } - ], - "endIndex": 6988, - "startIndex": 6752, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 6990, - "paragraph": { - "elements": [ - { - "endIndex": 6990, - "startIndex": 6989, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6989 - }, - { - "endIndex": 6991, - "paragraph": { - "elements": [ - { - "endIndex": 6991, - "startIndex": 6990, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 6990 - }, - { - "endIndex": 7018, - "paragraph": { - "elements": [ - { - "endIndex": 7011, - "startIndex": 6991, - "textRun": { - "content": "Configuring Android ", - "textStyle": {} - } - }, - { - "endIndex": 7018, - "startIndex": 7011, - "textRun": { - "content": "minSDK\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.p7onrogu5vjj", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 6991 - }, - { - "endIndex": 7135, - "paragraph": { - "elements": [ - { - "endIndex": 7073, - "startIndex": 7018, - "textRun": { - "content": "To use Google Maps SDK on Android requires setting the ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7079, - "startIndex": 7073, - "textRun": { - "content": "minSDK", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7135, - "startIndex": 7079, - "textRun": { - "content": " to 20. Modify the android/app/build.gradle as follows.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7018 - }, - { - "endIndex": 7160, - "paragraph": { - "elements": [ - { - "endIndex": 7159, - "startIndex": 7135, - "textRun": { - "content": "android/app/build.gradle", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/google-maps-in-flutter/step_3/android/app/build.gradle" - }, - "underline": true - } - } - }, - { - "endIndex": 7160, - "startIndex": 7159, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.slg6aay3y610", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 7135 - }, - { - "endIndex": 7582, - "startIndex": 7160, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 7581, - "startIndex": 7161, - "tableCells": [ - { - "content": [ - { - "endIndex": 7173, - "paragraph": { - "elements": [ - { - "endIndex": 7173, - "startIndex": 7163, - "textRun": { - "content": "android {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7163 - }, - { - "endIndex": 7193, - "paragraph": { - "elements": [ - { - "endIndex": 7193, - "startIndex": 7173, - "textRun": { - "content": " defaultConfig {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7173 - }, - { - "endIndex": 7315, - "paragraph": { - "elements": [ - { - "endIndex": 7315, - "startIndex": 7193, - "textRun": { - "content": " // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7193 - }, - { - "endIndex": 7374, - "paragraph": { - "elements": [ - { - "endIndex": 7374, - "startIndex": 7315, - "textRun": { - "content": " applicationId \"com.example.google_maps_in_flutter\"\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7315 - }, - { - "endIndex": 7433, - "paragraph": { - "elements": [ - { - "endIndex": 7382, - "startIndex": 7374, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7433, - "startIndex": 7382, - "textRun": { - "content": "minSdkVersion 20 // Set to 20\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7374 - }, - { - "endIndex": 7483, - "paragraph": { - "elements": [ - { - "endIndex": 7483, - "startIndex": 7433, - "textRun": { - "content": " targetSdkVersion flutter.targetSdkVersion\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7433 - }, - { - "endIndex": 7534, - "paragraph": { - "elements": [ - { - "endIndex": 7534, - "startIndex": 7483, - "textRun": { - "content": " versionCode flutterVersionCode.toInteger()\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7483 - }, - { - "endIndex": 7573, - "paragraph": { - "elements": [ - { - "endIndex": 7573, - "startIndex": 7534, - "textRun": { - "content": " versionName flutterVersionName\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7534 - }, - { - "endIndex": 7579, - "paragraph": { - "elements": [ - { - "endIndex": 7579, - "startIndex": 7573, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7573 - }, - { - "endIndex": 7581, - "paragraph": { - "elements": [ - { - "endIndex": 7580, - "startIndex": 7579, - "textRun": { - "content": "}", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 7581, - "startIndex": 7580, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7579 - } - ], - "endIndex": 7581, - "startIndex": 7162, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 7584, - "paragraph": { - "elements": [ - { - "endIndex": 7584, - "startIndex": 7582, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.tamuknk0p2u6", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 7582 - }, - { - "endIndex": 7585, - "paragraph": { - "elements": [ - { - "endIndex": 7585, - "startIndex": 7584, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 7584 - }, - { - "endIndex": 7615, - "paragraph": { - "elements": [ - { - "endIndex": 7615, - "startIndex": 7585, - "textRun": { - "content": "Adding Google Maps to the app\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.btmxwf909kks", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 7585 - }, - { - "endIndex": 7630, - "paragraph": { - "elements": [ - { - "endIndex": 7629, - "startIndex": 7615, - "textRun": { - "content": "Duration: 5:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 7630, - "startIndex": 7629, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7615 - }, - { - "endIndex": 7658, - "paragraph": { - "elements": [ - { - "endIndex": 7658, - "startIndex": 7630, - "textRun": { - "content": "It’s all about the API keys\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.en66mhmr1ijb", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 7630 - }, - { - "endIndex": 7993, - "paragraph": { - "elements": [ - { - "endIndex": 7744, - "startIndex": 7658, - "textRun": { - "content": "To use Google Maps in your Flutter app, you need to configure an API project with the ", - "textStyle": {} - } - }, - { - "endIndex": 7764, - "startIndex": 7744, - "textRun": { - "content": "Google Maps Platform", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://cloud.google.com/maps-platform/" - }, - "underline": true - } - } - }, - { - "endIndex": 7780, - "startIndex": 7764, - "textRun": { - "content": ", following the ", - "textStyle": {} - } - }, - { - "endIndex": 7816, - "startIndex": 7780, - "textRun": { - "content": "Maps SDK for Android's Using API key", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://developers.google.com/maps/documentation/android-sdk/signup" - }, - "underline": true - } - } - }, - { - "endIndex": 7817, - "startIndex": 7816, - "textRun": { - "content": ",", - "textStyle": {} - } - }, - { - "endIndex": 7818, - "startIndex": 7817, - "textRun": { - "content": " ", - "textStyle": {} - } - }, - { - "endIndex": 7849, - "startIndex": 7818, - "textRun": { - "content": "Maps SDK for iOS' Using API key", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://developers.google.com/maps/documentation/ios-sdk/get-api-key" - }, - "underline": true - } - } - }, - { - "endIndex": 7855, - "startIndex": 7849, - "textRun": { - "content": ", and ", - "textStyle": {} - } - }, - { - "endIndex": 7890, - "startIndex": 7855, - "textRun": { - "content": "Maps JavaScript API’s Using API key", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://developers.google.com/maps/documentation/javascript/get-api-key" - }, - "underline": true - } - } - }, - { - "endIndex": 7993, - "startIndex": 7890, - "textRun": { - "content": ". With API keys in hand, carry out the following steps to configure both Android and iOS applications.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7658 - }, - { - "endIndex": 7994, - "paragraph": { - "elements": [ - { - "endIndex": 7994, - "startIndex": 7993, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 7993 - }, - { - "endIndex": 8031, - "paragraph": { - "elements": [ - { - "endIndex": 8031, - "startIndex": 7994, - "textRun": { - "content": "Adding an API key for an Android app\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.434ea4sutt6b", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 7994 - }, - { - "endIndex": 8239, - "paragraph": { - "elements": [ - { - "endIndex": 8078, - "startIndex": 8031, - "textRun": { - "content": "To add an API key to the Android app, edit the ", - "textStyle": {} - } - }, - { - "endIndex": 8097, - "startIndex": 8078, - "textRun": { - "content": "AndroidManifest.xml", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8106, - "startIndex": 8097, - "textRun": { - "content": " file in ", - "textStyle": {} - } - }, - { - "endIndex": 8126, - "startIndex": 8106, - "textRun": { - "content": "android/app/src/main", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8141, - "startIndex": 8126, - "textRun": { - "content": ". Add a single ", - "textStyle": {} - } - }, - { - "endIndex": 8150, - "startIndex": 8141, - "textRun": { - "content": "meta-data", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8220, - "startIndex": 8150, - "textRun": { - "content": " entry containing the API key created in the previous step inside the ", - "textStyle": {} - } - }, - { - "endIndex": 8231, - "startIndex": 8220, - "textRun": { - "content": "application", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8239, - "startIndex": 8231, - "textRun": { - "content": " node. \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 8031 - }, - { - "endIndex": 8280, - "paragraph": { - "elements": [ - { - "endIndex": 8279, - "startIndex": 8239, - "textRun": { - "content": "android/app/src/main/AndroidManifest.xml", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/google-maps-in-flutter/step_4/android/app/src/main/AndroidManifest.xml" - }, - "underline": true - } - } - }, - { - "endIndex": 8280, - "startIndex": 8279, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.o4cuz5mt8mgq", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 8239 - }, - { - "endIndex": 9789, - "startIndex": 8280, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 9788, - "startIndex": 8281, - "tableCells": [ - { - "content": [ - { - "endIndex": 8352, - "paragraph": { - "elements": [ - { - "endIndex": 8352, - "startIndex": 8283, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8352 - }, - { - "endIndex": 8419, - "paragraph": { - "elements": [ - { - "endIndex": 8419, - "startIndex": 8402, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8466 - }, - { - "endIndex": 8511, - "paragraph": { - "elements": [ - { - "endIndex": 8511, - "startIndex": 8510, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8510 - }, - { - "endIndex": 8568, - "paragraph": { - "elements": [ - { - "endIndex": 8519, - "startIndex": 8511, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 8568, - "startIndex": 8519, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8511 - }, - { - "endIndex": 8633, - "paragraph": { - "elements": [ - { - "endIndex": 8633, - "startIndex": 8568, - "textRun": { - "content": " \n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8633 - }, - { - "endIndex": 8681, - "paragraph": { - "elements": [ - { - "endIndex": 8681, - "startIndex": 8680, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 8680 - }, - { - "endIndex": 8699, - "paragraph": { - "elements": [ - { - "endIndex": 8699, - "startIndex": 8681, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9040 - }, - { - "endIndex": 9119, - "paragraph": { - "elements": [ - { - "endIndex": 9119, - "startIndex": 9096, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9241 - }, - { - "endIndex": 9281, - "paragraph": { - "elements": [ - { - "endIndex": 9281, - "startIndex": 9258, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9421 - }, - { - "endIndex": 9466, - "paragraph": { - "elements": [ - { - "endIndex": 9466, - "startIndex": 9438, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9438 - }, - { - "endIndex": 9534, - "paragraph": { - "elements": [ - { - "endIndex": 9534, - "startIndex": 9466, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9466 - }, - { - "endIndex": 9610, - "paragraph": { - "elements": [ - { - "endIndex": 9610, - "startIndex": 9534, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9534 - }, - { - "endIndex": 9639, - "paragraph": { - "elements": [ - { - "endIndex": 9639, - "startIndex": 9610, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9610 - }, - { - "endIndex": 9659, - "paragraph": { - "elements": [ - { - "endIndex": 9659, - "startIndex": 9639, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9639 - }, - { - "endIndex": 9678, - "paragraph": { - "elements": [ - { - "endIndex": 9678, - "startIndex": 9659, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9722 - }, - { - "endIndex": 9774, - "paragraph": { - "elements": [ - { - "endIndex": 9774, - "startIndex": 9755, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9755 - }, - { - "endIndex": 9786, - "paragraph": { - "elements": [ - { - "endIndex": 9786, - "startIndex": 9774, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9774 - }, - { - "endIndex": 9787, - "paragraph": { - "elements": [ - { - "endIndex": 9787, - "startIndex": 9786, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9786 - }, - { - "endIndex": 9788, - "paragraph": { - "elements": [ - { - "endIndex": 9788, - "startIndex": 9787, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 9787 - } - ], - "endIndex": 9788, - "startIndex": 8282, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 9790, - "paragraph": { - "elements": [ - { - "endIndex": 9790, - "startIndex": 9789, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9789 - }, - { - "endIndex": 9823, - "paragraph": { - "elements": [ - { - "endIndex": 9823, - "startIndex": 9790, - "textRun": { - "content": "Adding an API key for an iOS app\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.rwumwtdz8sbu", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 9790 - }, - { - "endIndex": 10086, - "paragraph": { - "elements": [ - { - "endIndex": 9866, - "startIndex": 9823, - "textRun": { - "content": "To add an API key to the iOS app, edit the ", - "textStyle": {} - } - }, - { - "endIndex": 9883, - "startIndex": 9866, - "textRun": { - "content": "AppDelegate.swift", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 9892, - "startIndex": 9883, - "textRun": { - "content": " file in ", - "textStyle": {} - } - }, - { - "endIndex": 9902, - "startIndex": 9892, - "textRun": { - "content": "ios/Runner", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10086, - "startIndex": 9902, - "textRun": { - "content": ". Unlike Android, adding an API key on iOS requires changes to the source code of the Runner app. The AppDelegate is the core singleton that is part of the app initialization process.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 9823 - }, - { - "endIndex": 10087, - "paragraph": { - "elements": [ - { - "endIndex": 10087, - "startIndex": 10086, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10086 - }, - { - "endIndex": 10320, - "paragraph": { - "elements": [ - { - "endIndex": 10132, - "startIndex": 10087, - "textRun": { - "content": "Make two changes to this file. First, add an ", - "textStyle": {} - } - }, - { - "endIndex": 10139, - "startIndex": 10132, - "textRun": { - "content": "#import", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10204, - "startIndex": 10139, - "textRun": { - "content": " statement to pull in the Google Maps headers, and then call the ", - "textStyle": {} - } - }, - { - "endIndex": 10219, - "startIndex": 10204, - "textRun": { - "content": "provideAPIKey()", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10234, - "startIndex": 10219, - "textRun": { - "content": " method of the ", - "textStyle": {} - } - }, - { - "endIndex": 10245, - "startIndex": 10234, - "textRun": { - "content": "GMSServices", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10320, - "startIndex": 10245, - "textRun": { - "content": " singleton. This API key enables Google Maps to correctly serve map tiles.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10087 - }, - { - "endIndex": 10349, - "paragraph": { - "elements": [ - { - "endIndex": 10348, - "startIndex": 10320, - "textRun": { - "content": "ios/Runner/AppDelegate.swift", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/google-maps-in-flutter/step_4/ios/Runner/AppDelegate.swift" - }, - "underline": true - } - } - }, - { - "endIndex": 10349, - "startIndex": 10348, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.anteseqrbtav", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 10320 - }, - { - "endIndex": 10887, - "startIndex": 10349, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 10886, - "startIndex": 10350, - "tableCells": [ - { - "content": [ - { - "endIndex": 10365, - "paragraph": { - "elements": [ - { - "endIndex": 10365, - "startIndex": 10352, - "textRun": { - "content": "import UIKit\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10352 - }, - { - "endIndex": 10380, - "paragraph": { - "elements": [ - { - "endIndex": 10380, - "startIndex": 10365, - "textRun": { - "content": "import Flutter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10365 - }, - { - "endIndex": 10418, - "paragraph": { - "elements": [ - { - "endIndex": 10418, - "startIndex": 10380, - "textRun": { - "content": "import GoogleMaps // Add this import\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10380 - }, - { - "endIndex": 10419, - "paragraph": { - "elements": [ - { - "endIndex": 10419, - "startIndex": 10418, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10418 - }, - { - "endIndex": 10438, - "paragraph": { - "elements": [ - { - "endIndex": 10438, - "startIndex": 10419, - "textRun": { - "content": "@UIApplicationMain\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10419 - }, - { - "endIndex": 10484, - "paragraph": { - "elements": [ - { - "endIndex": 10484, - "startIndex": 10438, - "textRun": { - "content": "@objc class AppDelegate: FlutterAppDelegate {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10438 - }, - { - "endIndex": 10513, - "paragraph": { - "elements": [ - { - "endIndex": 10513, - "startIndex": 10484, - "textRun": { - "content": " override func application(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10484 - }, - { - "endIndex": 10547, - "paragraph": { - "elements": [ - { - "endIndex": 10547, - "startIndex": 10513, - "textRun": { - "content": " _ application: UIApplication,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10513 - }, - { - "endIndex": 10635, - "paragraph": { - "elements": [ - { - "endIndex": 10635, - "startIndex": 10547, - "textRun": { - "content": " didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10547 - }, - { - "endIndex": 10649, - "paragraph": { - "elements": [ - { - "endIndex": 10649, - "startIndex": 10635, - "textRun": { - "content": " ) -> Bool {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10635 - }, - { - "endIndex": 10700, - "paragraph": { - "elements": [ - { - "endIndex": 10700, - "startIndex": 10649, - "textRun": { - "content": " GeneratedPluginRegistrant.register(with: self)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10649 - }, - { - "endIndex": 10701, - "paragraph": { - "elements": [ - { - "endIndex": 10701, - "startIndex": 10700, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10700 - }, - { - "endIndex": 10743, - "paragraph": { - "elements": [ - { - "endIndex": 10705, - "startIndex": 10701, - "textRun": { - "content": " ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10743, - "startIndex": 10705, - "textRun": { - "content": "// TODO: Add your Google Maps API key\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10701 - }, - { - "endIndex": 10789, - "paragraph": { - "elements": [ - { - "endIndex": 10789, - "startIndex": 10743, - "textRun": { - "content": " GMSServices.provideAPIKey(\"YOUR-API-KEY\")\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10743 - }, - { - "endIndex": 10790, - "paragraph": { - "elements": [ - { - "endIndex": 10790, - "startIndex": 10789, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10789 - }, - { - "endIndex": 10878, - "paragraph": { - "elements": [ - { - "endIndex": 10878, - "startIndex": 10790, - "textRun": { - "content": " return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10790 - }, - { - "endIndex": 10882, - "paragraph": { - "elements": [ - { - "endIndex": 10882, - "startIndex": 10878, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10878 - }, - { - "endIndex": 10884, - "paragraph": { - "elements": [ - { - "endIndex": 10884, - "startIndex": 10882, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10882 - }, - { - "endIndex": 10885, - "paragraph": { - "elements": [ - { - "endIndex": 10885, - "startIndex": 10884, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10884 - }, - { - "endIndex": 10886, - "paragraph": { - "elements": [ - { - "endIndex": 10886, - "startIndex": 10885, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 10885 - } - ], - "endIndex": 10886, - "startIndex": 10351, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 10888, - "paragraph": { - "elements": [ - { - "endIndex": 10888, - "startIndex": 10887, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 10887 - }, - { - "endIndex": 10920, - "paragraph": { - "elements": [ - { - "endIndex": 10920, - "startIndex": 10888, - "textRun": { - "content": "Adding an API key for a Web app\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.5yc7m5vpgm3a", - "namedStyleType": "HEADING_2" - } - }, - "startIndex": 10888 - }, - { - "endIndex": 11073, - "paragraph": { - "elements": [ - { - "endIndex": 10963, - "startIndex": 10920, - "textRun": { - "content": "To add an API key to the Web app, edit the ", - "textStyle": {} - } - }, - { - "endIndex": 10973, - "startIndex": 10963, - "textRun": { - "content": "index.html", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 10982, - "startIndex": 10973, - "textRun": { - "content": " file in ", - "textStyle": {} - } - }, - { - "endIndex": 10985, - "startIndex": 10982, - "textRun": { - "content": "web", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11073, - "startIndex": 10985, - "textRun": { - "content": ". Add a reference to the Maps JavaScript script in the head section, with your API key.\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 10920 - }, - { - "endIndex": 11088, - "paragraph": { - "elements": [ - { - "endIndex": 11087, - "startIndex": 11073, - "textRun": { - "content": "web/index.html", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/google-maps-in-flutter/step_4/web/index.html" - }, - "underline": true - } - } - }, - { - "endIndex": 11088, - "startIndex": 11087, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.5qlnpoq6oucx", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 11073 - }, - { - "endIndex": 11791, - "startIndex": 11088, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 11790, - "startIndex": 11089, - "tableCells": [ - { - "content": [ - { - "endIndex": 11098, - "paragraph": { - "elements": [ - { - "endIndex": 11098, - "startIndex": 11091, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11091 - }, - { - "endIndex": 11116, - "paragraph": { - "elements": [ - { - "endIndex": 11116, - "startIndex": 11098, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11098 - }, - { - "endIndex": 11117, - "paragraph": { - "elements": [ - { - "endIndex": 11117, - "startIndex": 11116, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11116 - }, - { - "endIndex": 11142, - "paragraph": { - "elements": [ - { - "endIndex": 11142, - "startIndex": 11117, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11117 - }, - { - "endIndex": 11198, - "paragraph": { - "elements": [ - { - "endIndex": 11198, - "startIndex": 11142, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11142 - }, - { - "endIndex": 11259, - "paragraph": { - "elements": [ - { - "endIndex": 11259, - "startIndex": 11198, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11198 - }, - { - "endIndex": 11260, - "paragraph": { - "elements": [ - { - "endIndex": 11260, - "startIndex": 11259, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11259 - }, - { - "endIndex": 11293, - "paragraph": { - "elements": [ - { - "endIndex": 11293, - "startIndex": 11260, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11260 - }, - { - "endIndex": 11352, - "paragraph": { - "elements": [ - { - "endIndex": 11352, - "startIndex": 11293, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11293 - }, - { - "endIndex": 11422, - "paragraph": { - "elements": [ - { - "endIndex": 11422, - "startIndex": 11352, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11352 - }, - { - "endIndex": 11498, - "paragraph": { - "elements": [ - { - "endIndex": 11498, - "startIndex": 11422, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11422 - }, - { - "endIndex": 11556, - "paragraph": { - "elements": [ - { - "endIndex": 11556, - "startIndex": 11498, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11498 - }, - { - "endIndex": 11557, - "paragraph": { - "elements": [ - { - "endIndex": 11557, - "startIndex": 11556, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11556 - }, - { - "endIndex": 11608, - "paragraph": { - "elements": [ - { - "endIndex": 11608, - "startIndex": 11557, - "textRun": { - "content": " \n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11557 - }, - { - "endIndex": 11692, - "paragraph": { - "elements": [ - { - "endIndex": 11692, - "startIndex": 11608, - "textRun": { - "content": " \n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11608 - }, - { - "endIndex": 11693, - "paragraph": { - "elements": [ - { - "endIndex": 11693, - "startIndex": 11692, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11692 - }, - { - "endIndex": 11733, - "paragraph": { - "elements": [ - { - "endIndex": 11733, - "startIndex": 11693, - "textRun": { - "content": " google_maps_in_flutter\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11693 - }, - { - "endIndex": 11778, - "paragraph": { - "elements": [ - { - "endIndex": 11778, - "startIndex": 11733, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11733 - }, - { - "endIndex": 11786, - "paragraph": { - "elements": [ - { - "endIndex": 11786, - "startIndex": 11778, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11778 - }, - { - "endIndex": 11787, - "paragraph": { - "elements": [ - { - "endIndex": 11787, - "startIndex": 11786, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11786 - }, - { - "endIndex": 11788, - "paragraph": { - "elements": [ - { - "endIndex": 11788, - "startIndex": 11787, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11787 - }, - { - "endIndex": 11789, - "paragraph": { - "elements": [ - { - "endIndex": 11789, - "startIndex": 11788, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11788 - }, - { - "endIndex": 11790, - "paragraph": { - "elements": [ - { - "endIndex": 11790, - "startIndex": 11789, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11789 - } - ], - "endIndex": 11790, - "startIndex": 11090, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 11792, - "paragraph": { - "elements": [ - { - "endIndex": 11792, - "startIndex": 11791, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 11791 - }, - { - "endIndex": 11820, - "paragraph": { - "elements": [ - { - "endIndex": 11820, - "startIndex": 11792, - "textRun": { - "content": "Putting a map on the screen\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.siyd9f71otj", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 11792 - }, - { - "endIndex": 11895, - "paragraph": { - "elements": [ - { - "endIndex": 11869, - "startIndex": 11820, - "textRun": { - "content": "Now it’s time to get a map on the screen. Update ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 11882, - "startIndex": 11869, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 11895, - "startIndex": 11882, - "textRun": { - "content": " as follows.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 11820 - }, - { - "endIndex": 11909, - "paragraph": { - "elements": [ - { - "endIndex": 11908, - "startIndex": 11895, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/google-maps-in-flutter/step_4/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 11909, - "startIndex": 11908, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.aqw5fitml1t2", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 11895 - }, - { - "endIndex": 12945, - "startIndex": 11909, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 12944, - "startIndex": 11910, - "tableCells": [ - { - "content": [ - { - "endIndex": 11952, - "paragraph": { - "elements": [ - { - "endIndex": 11952, - "startIndex": 11912, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11912 - }, - { - "endIndex": 12015, - "paragraph": { - "elements": [ - { - "endIndex": 12015, - "startIndex": 11952, - "textRun": { - "content": "import 'package:google_maps_flutter/google_maps_flutter.dart';\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 11952 - }, - { - "endIndex": 12016, - "paragraph": { - "elements": [ - { - "endIndex": 12016, - "startIndex": 12015, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12015 - }, - { - "endIndex": 12054, - "paragraph": { - "elements": [ - { - "endIndex": 12054, - "startIndex": 12016, - "textRun": { - "content": "void main() => runApp(const MyApp());\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12016 - }, - { - "endIndex": 12055, - "paragraph": { - "elements": [ - { - "endIndex": 12055, - "startIndex": 12054, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12054 - }, - { - "endIndex": 12092, - "paragraph": { - "elements": [ - { - "endIndex": 12092, - "startIndex": 12055, - "textRun": { - "content": "class MyApp extends StatefulWidget {\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12055 - }, - { - "endIndex": 12120, - "paragraph": { - "elements": [ - { - "endIndex": 12120, - "startIndex": 12092, - "textRun": { - "content": " const MyApp({super.key});\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12092 - }, - { - "endIndex": 12121, - "paragraph": { - "elements": [ - { - "endIndex": 12121, - "startIndex": 12120, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12120 - }, - { - "endIndex": 12133, - "paragraph": { - "elements": [ - { - "endIndex": 12133, - "startIndex": 12121, - "textRun": { - "content": " @override\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12121 - }, - { - "endIndex": 12180, - "paragraph": { - "elements": [ - { - "endIndex": 12180, - "startIndex": 12133, - "textRun": { - "content": " State createState() => _MyAppState();\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12133 - }, - { - "endIndex": 12182, - "paragraph": { - "elements": [ - { - "endIndex": 12182, - "startIndex": 12180, - "textRun": { - "content": "}\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12180 - }, - { - "endIndex": 12183, - "paragraph": { - "elements": [ - { - "endIndex": 12183, - "startIndex": 12182, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12182 - }, - { - "endIndex": 12224, - "paragraph": { - "elements": [ - { - "endIndex": 12224, - "startIndex": 12183, - "textRun": { - "content": "class _MyAppState extends State {\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12183 - }, - { - "endIndex": 12266, - "paragraph": { - "elements": [ - { - "endIndex": 12266, - "startIndex": 12224, - "textRun": { - "content": " late GoogleMapController mapController;\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12224 - }, - { - "endIndex": 12267, - "paragraph": { - "elements": [ - { - "endIndex": 12267, - "startIndex": 12266, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12266 - }, - { - "endIndex": 12330, - "paragraph": { - "elements": [ - { - "endIndex": 12330, - "startIndex": 12267, - "textRun": { - "content": " final LatLng _center = const LatLng(45.521563, -122.677433);\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12267 - }, - { - "endIndex": 12331, - "paragraph": { - "elements": [ - { - "endIndex": 12331, - "startIndex": 12330, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12330 - }, - { - "endIndex": 12386, - "paragraph": { - "elements": [ - { - "endIndex": 12386, - "startIndex": 12331, - "textRun": { - "content": " void _onMapCreated(GoogleMapController controller) {\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12331 - }, - { - "endIndex": 12418, - "paragraph": { - "elements": [ - { - "endIndex": 12418, - "startIndex": 12386, - "textRun": { - "content": " mapController = controller;\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12386 - }, - { - "endIndex": 12422, - "paragraph": { - "elements": [ - { - "endIndex": 12422, - "startIndex": 12418, - "textRun": { - "content": " }\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12418 - }, - { - "endIndex": 12423, - "paragraph": { - "elements": [ - { - "endIndex": 12423, - "startIndex": 12422, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12422 - }, - { - "endIndex": 12435, - "paragraph": { - "elements": [ - { - "endIndex": 12435, - "startIndex": 12423, - "textRun": { - "content": " @override\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12423 - }, - { - "endIndex": 12474, - "paragraph": { - "elements": [ - { - "endIndex": 12474, - "startIndex": 12435, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12435 - }, - { - "endIndex": 12498, - "paragraph": { - "elements": [ - { - "endIndex": 12498, - "startIndex": 12474, - "textRun": { - "content": " return MaterialApp(\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12474 - }, - { - "endIndex": 12522, - "paragraph": { - "elements": [ - { - "endIndex": 12522, - "startIndex": 12498, - "textRun": { - "content": " theme: ThemeData(\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12498 - }, - { - "endIndex": 12550, - "paragraph": { - "elements": [ - { - "endIndex": 12550, - "startIndex": 12522, - "textRun": { - "content": " \n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12522 - }, - { - "endIndex": 12594, - "paragraph": { - "elements": [ - { - "endIndex": 12594, - "startIndex": 12550, - "textRun": { - "content": " colorSchemeSeed: Colors.green[700],\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12550 - }, - { - "endIndex": 12603, - "paragraph": { - "elements": [ - { - "endIndex": 12603, - "startIndex": 12594, - "textRun": { - "content": " ),\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12594 - }, - { - "endIndex": 12625, - "paragraph": { - "elements": [ - { - "endIndex": 12625, - "startIndex": 12603, - "textRun": { - "content": " home: Scaffold(\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12603 - }, - { - "endIndex": 12649, - "paragraph": { - "elements": [ - { - "endIndex": 12649, - "startIndex": 12625, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12625 - }, - { - "endIndex": 12697, - "paragraph": { - "elements": [ - { - "endIndex": 12697, - "startIndex": 12649, - "textRun": { - "content": " title: const Text('Maps Sample App'),\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12649 - }, - { - "endIndex": 12721, - "paragraph": { - "elements": [ - { - "endIndex": 12721, - "startIndex": 12697, - "textRun": { - "content": " elevation: 2,\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12697 - }, - { - "endIndex": 12732, - "paragraph": { - "elements": [ - { - "endIndex": 12732, - "startIndex": 12721, - "textRun": { - "content": " ),\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12721 - }, - { - "endIndex": 12757, - "paragraph": { - "elements": [ - { - "endIndex": 12757, - "startIndex": 12732, - "textRun": { - "content": " body: GoogleMap(\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12732 - }, - { - "endIndex": 12796, - "paragraph": { - "elements": [ - { - "endIndex": 12796, - "startIndex": 12757, - "textRun": { - "content": " onMapCreated: _onMapCreated,\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12757 - }, - { - "endIndex": 12845, - "paragraph": { - "elements": [ - { - "endIndex": 12845, - "startIndex": 12796, - "textRun": { - "content": " initialCameraPosition: CameraPosition(\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12796 - }, - { - "endIndex": 12874, - "paragraph": { - "elements": [ - { - "endIndex": 12874, - "startIndex": 12845, - "textRun": { - "content": " target: _center,\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12845 - }, - { - "endIndex": 12898, - "paragraph": { - "elements": [ - { - "endIndex": 12898, - "startIndex": 12874, - "textRun": { - "content": " zoom: 11.0,\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12874 - }, - { - "endIndex": 12911, - "paragraph": { - "elements": [ - { - "endIndex": 12911, - "startIndex": 12898, - "textRun": { - "content": " ),\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12898 - }, - { - "endIndex": 12922, - "paragraph": { - "elements": [ - { - "endIndex": 12922, - "startIndex": 12911, - "textRun": { - "content": " ),\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12911 - }, - { - "endIndex": 12931, - "paragraph": { - "elements": [ - { - "endIndex": 12931, - "startIndex": 12922, - "textRun": { - "content": " ),\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12922 - }, - { - "endIndex": 12938, - "paragraph": { - "elements": [ - { - "endIndex": 12938, - "startIndex": 12931, - "textRun": { - "content": " );\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12931 - }, - { - "endIndex": 12942, - "paragraph": { - "elements": [ - { - "endIndex": 12942, - "startIndex": 12938, - "textRun": { - "content": " }\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12938 - }, - { - "endIndex": 12944, - "paragraph": { - "elements": [ - { - "endIndex": 12944, - "startIndex": 12942, - "textRun": { - "content": "}\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 12942 - } - ], - "endIndex": 12944, - "startIndex": 11911, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 12946, - "paragraph": { - "elements": [ - { - "endIndex": 12946, - "startIndex": 12945, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 12945 - }, - { - "endIndex": 12962, - "paragraph": { - "elements": [ - { - "endIndex": 12962, - "startIndex": 12946, - "textRun": { - "content": "Running the app\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.g24cz77tf7tj", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 12946 - }, - { - "endIndex": 13227, - "paragraph": { - "elements": [ - { - "endIndex": 13226, - "startIndex": 12962, - "textRun": { - "content": "Run the Flutter app in either iOS or Android to see a single map view, centered on Portland. Alternatively, run up either an Android emulator or an iOS simulator. Feel free to modify the map center to represent your hometown, or somewhere that is important to you.", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13227, - "startIndex": 13226, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - } - } - }, - "startIndex": 12962 - }, - { - "endIndex": 13245, - "startIndex": 13227, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 13244, - "startIndex": 13228, - "tableCells": [ - { - "content": [ - { - "endIndex": 13244, - "paragraph": { - "elements": [ - { - "endIndex": 13243, - "startIndex": 13230, - "textRun": { - "content": "$ flutter run", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 13244, - "startIndex": 13243, - "textRun": { - "content": "\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 13230 - } - ], - "endIndex": 13244, - "startIndex": 13229, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 13246, - "paragraph": { - "elements": [ - { - "endIndex": 13246, - "startIndex": 13245, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13245 - }, - { - "endIndex": 13247, - "paragraph": { - "elements": [ - { - "endIndex": 13247, - "startIndex": 13246, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - } - } - }, - "startIndex": 13246 - }, - { - "endIndex": 13257, - "startIndex": 13247, - "table": { - "columns": 2, - "rows": 1, - "tableRows": [ - { - "endIndex": 13256, - "startIndex": 13248, - "tableCells": [ - { - "content": [ - { - "endIndex": 13252, - "paragraph": { - "elements": [ - { - "endIndex": 13251, - "inlineObjectElement": { - "inlineObjectId": "kix.89ot02lt7ssg", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "startIndex": 13250 - }, - { - "endIndex": 13252, - "startIndex": 13251, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - } - } - }, - "startIndex": 13250 - }, - { - "endIndex": 13253, - "paragraph": { - "elements": [ - { - "endIndex": 13253, - "startIndex": 13252, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - } - } - }, - "startIndex": 13252 - } - ], - "endIndex": 13253, - "startIndex": 13249, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - }, - { - "content": [ - { - "endIndex": 13256, - "paragraph": { - "elements": [ - { - "endIndex": 13255, - "inlineObjectElement": { - "inlineObjectId": "kix.juxcraolrfj0", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "startIndex": 13254 - }, - { - "endIndex": 13256, - "startIndex": 13255, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - } - } - }, - "startIndex": 13254 - } - ], - "endIndex": 13256, - "startIndex": 13253, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - }, - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 13258, - "paragraph": { - "elements": [ - { - "endIndex": 13258, - "startIndex": 13257, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - } - } - }, - "startIndex": 13257 - }, - { - "endIndex": 13280, - "paragraph": { - "elements": [ - { - "endIndex": 13280, - "startIndex": 13258, - "textRun": { - "content": "Put Google on the Map\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.c60hsrd97hl2", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 13258 - }, - { - "endIndex": 13296, - "paragraph": { - "elements": [ - { - "endIndex": 13295, - "startIndex": 13280, - "textRun": { - "content": "Duration: 10:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13296, - "startIndex": 13295, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13280 - }, - { - "endIndex": 13297, - "paragraph": { - "elements": [ - { - "endIndex": 13297, - "startIndex": 13296, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 13296 - }, - { - "endIndex": 13704, - "paragraph": { - "elements": [ - { - "endIndex": 13344, - "startIndex": 13297, - "textRun": { - "content": "Google has many offices around the world, from ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13357, - "startIndex": 13344, - "textRun": { - "content": "North America", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://about.google/locations/?region=north-america" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13359, - "startIndex": 13357, - "textRun": { - "content": ", ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13372, - "startIndex": 13359, - "textRun": { - "content": "Latin America", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://about.google/locations/?region=latin-america" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13374, - "startIndex": 13372, - "textRun": { - "content": ", ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13380, - "startIndex": 13374, - "textRun": { - "content": "Europe", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://about.google/locations/?region=europe" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13382, - "startIndex": 13380, - "textRun": { - "content": ", ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13394, - "startIndex": 13382, - "textRun": { - "content": "Asia Pacific", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://about.google/locations/?region=asia-pacific" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13399, - "startIndex": 13394, - "textRun": { - "content": ", to ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13419, - "startIndex": 13399, - "textRun": { - "content": "Africa & Middle East", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://about.google/locations/?region=africa-middle-east" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13514, - "startIndex": 13419, - "textRun": { - "content": ". The nice thing about these maps, if you investigate them, is that they have an easily usable ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13526, - "startIndex": 13514, - "textRun": { - "content": "API endpoint", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://about.google/static/data/locations.json" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13704, - "startIndex": 13526, - "textRun": { - "content": " for supplying the office location information in JSON format. In this step, you put these office locations on the map. In this step, you will use code generation to parse JSON.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - } - } - }, - "startIndex": 13297 - }, - { - "endIndex": 13829, - "paragraph": { - "elements": [ - { - "endIndex": 13783, - "startIndex": 13704, - "textRun": { - "content": "Add three new Flutter dependencies to the project as follows. Firstly, add the ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 13787, - "startIndex": 13783, - "textRun": { - "content": "http", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/http" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 13829, - "startIndex": 13787, - "textRun": { - "content": " package for making HTTP requests easily.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - } - } - }, - "startIndex": 13704 - }, - { - "endIndex": 14063, - "startIndex": 13829, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 14062, - "startIndex": 13830, - "tableCells": [ - { - "content": [ - { - "endIndex": 13855, - "paragraph": { - "elements": [ - { - "endIndex": 13855, - "startIndex": 13832, - "textRun": { - "content": "$ flutter pub add http\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13832 - }, - { - "endIndex": 13881, - "paragraph": { - "elements": [ - { - "endIndex": 13881, - "startIndex": 13855, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13855 - }, - { - "endIndex": 13913, - "paragraph": { - "elements": [ - { - "endIndex": 13913, - "startIndex": 13881, - "textRun": { - "content": " async 2.8.1 (2.8.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13881 - }, - { - "endIndex": 13927, - "paragraph": { - "elements": [ - { - "endIndex": 13927, - "startIndex": 13913, - "textRun": { - "content": "+ http 0.13.3\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13913 - }, - { - "endIndex": 13947, - "paragraph": { - "elements": [ - { - "endIndex": 13947, - "startIndex": 13927, - "textRun": { - "content": "+ http_parser 4.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13927 - }, - { - "endIndex": 13985, - "paragraph": { - "elements": [ - { - "endIndex": 13985, - "startIndex": 13947, - "textRun": { - "content": " matcher 0.12.10 (0.12.11 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13947 - }, - { - "endIndex": 14003, - "paragraph": { - "elements": [ - { - "endIndex": 14003, - "startIndex": 13985, - "textRun": { - "content": "+ pedantic 1.11.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 13985 - }, - { - "endIndex": 14038, - "paragraph": { - "elements": [ - { - "endIndex": 14038, - "startIndex": 14003, - "textRun": { - "content": " test_api 0.4.2 (0.4.3 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14003 - }, - { - "endIndex": 14062, - "paragraph": { - "elements": [ - { - "endIndex": 14061, - "startIndex": 14038, - "textRun": { - "content": "Changed 3 dependencies!", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 14062, - "startIndex": 14061, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14038 - } - ], - "endIndex": 14062, - "startIndex": 13831, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 14064, - "paragraph": { - "elements": [ - { - "endIndex": 14064, - "startIndex": 14063, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 14063 - }, - { - "endIndex": 14177, - "paragraph": { - "elements": [ - { - "endIndex": 14074, - "startIndex": 14064, - "textRun": { - "content": "Next, add ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 14091, - "startIndex": 14074, - "textRun": { - "content": "json_serializable", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/json_serializable" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 14096, - "startIndex": 14091, - "textRun": { - "content": " and ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 14111, - "startIndex": 14096, - "textRun": { - "content": "json_annotation", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/json_annotation" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 14175, - "startIndex": 14111, - "textRun": { - "content": " for declaring object structure for representing JSON documents.", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 14177, - "startIndex": 14175, - "textRun": { - "content": " \n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - } - } - }, - "startIndex": 14064 - }, - { - "endIndex": 15373, - "startIndex": 14177, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 15372, - "startIndex": 14178, - "tableCells": [ - { - "content": [ - { - "endIndex": 14216, - "paragraph": { - "elements": [ - { - "endIndex": 14216, - "startIndex": 14180, - "textRun": { - "content": "$ flutter pub add json_serializable\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14180 - }, - { - "endIndex": 14242, - "paragraph": { - "elements": [ - { - "endIndex": 14242, - "startIndex": 14216, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14216 - }, - { - "endIndex": 14271, - "paragraph": { - "elements": [ - { - "endIndex": 14271, - "startIndex": 14242, - "textRun": { - "content": "+ _fe_analyzer_shared 25.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14242 - }, - { - "endIndex": 14288, - "paragraph": { - "elements": [ - { - "endIndex": 14288, - "startIndex": 14271, - "textRun": { - "content": "+ analyzer 2.2.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14271 - }, - { - "endIndex": 14301, - "paragraph": { - "elements": [ - { - "endIndex": 14301, - "startIndex": 14288, - "textRun": { - "content": "+ args 2.2.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14288 - }, - { - "endIndex": 14333, - "paragraph": { - "elements": [ - { - "endIndex": 14333, - "startIndex": 14301, - "textRun": { - "content": " async 2.8.1 (2.8.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14301 - }, - { - "endIndex": 14347, - "paragraph": { - "elements": [ - { - "endIndex": 14347, - "startIndex": 14333, - "textRun": { - "content": "+ build 2.1.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14333 - }, - { - "endIndex": 14368, - "paragraph": { - "elements": [ - { - "endIndex": 14368, - "startIndex": 14347, - "textRun": { - "content": "+ build_config 1.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14347 - }, - { - "endIndex": 14389, - "paragraph": { - "elements": [ - { - "endIndex": 14389, - "startIndex": 14368, - "textRun": { - "content": "+ checked_yaml 2.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14368 - }, - { - "endIndex": 14406, - "paragraph": { - "elements": [ - { - "endIndex": 14406, - "startIndex": 14389, - "textRun": { - "content": "+ cli_util 0.3.3\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14389 - }, - { - "endIndex": 14422, - "paragraph": { - "elements": [ - { - "endIndex": 14422, - "startIndex": 14406, - "textRun": { - "content": "+ convert 3.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14406 - }, - { - "endIndex": 14437, - "paragraph": { - "elements": [ - { - "endIndex": 14437, - "startIndex": 14422, - "textRun": { - "content": "+ crypto 3.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14422 - }, - { - "endIndex": 14456, - "paragraph": { - "elements": [ - { - "endIndex": 14456, - "startIndex": 14437, - "textRun": { - "content": "+ dart_style 2.0.3\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14437 - }, - { - "endIndex": 14469, - "paragraph": { - "elements": [ - { - "endIndex": 14469, - "startIndex": 14456, - "textRun": { - "content": "+ file 6.1.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14456 - }, - { - "endIndex": 14482, - "paragraph": { - "elements": [ - { - "endIndex": 14482, - "startIndex": 14469, - "textRun": { - "content": "+ glob 2.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14469 - }, - { - "endIndex": 14506, - "paragraph": { - "elements": [ - { - "endIndex": 14506, - "startIndex": 14482, - "textRun": { - "content": "+ json_annotation 4.1.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14482 - }, - { - "endIndex": 14532, - "paragraph": { - "elements": [ - { - "endIndex": 14532, - "startIndex": 14506, - "textRun": { - "content": "+ json_serializable 5.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14506 - }, - { - "endIndex": 14548, - "paragraph": { - "elements": [ - { - "endIndex": 14548, - "startIndex": 14532, - "textRun": { - "content": "+ logging 1.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14532 - }, - { - "endIndex": 14586, - "paragraph": { - "elements": [ - { - "endIndex": 14586, - "startIndex": 14548, - "textRun": { - "content": " matcher 0.12.10 (0.12.11 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14548 - }, - { - "endIndex": 14609, - "paragraph": { - "elements": [ - { - "endIndex": 14609, - "startIndex": 14586, - "textRun": { - "content": "+ package_config 2.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14586 - }, - { - "endIndex": 14628, - "paragraph": { - "elements": [ - { - "endIndex": 14628, - "startIndex": 14609, - "textRun": { - "content": "+ pub_semver 2.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14609 - }, - { - "endIndex": 14650, - "paragraph": { - "elements": [ - { - "endIndex": 14650, - "startIndex": 14628, - "textRun": { - "content": "+ pubspec_parse 1.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14628 - }, - { - "endIndex": 14669, - "paragraph": { - "elements": [ - { - "endIndex": 14669, - "startIndex": 14650, - "textRun": { - "content": "+ source_gen 1.1.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14650 - }, - { - "endIndex": 14691, - "paragraph": { - "elements": [ - { - "endIndex": 14691, - "startIndex": 14669, - "textRun": { - "content": "+ source_helper 1.2.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14669 - }, - { - "endIndex": 14726, - "paragraph": { - "elements": [ - { - "endIndex": 14726, - "startIndex": 14691, - "textRun": { - "content": " test_api 0.4.2 (0.4.3 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14691 - }, - { - "endIndex": 14742, - "paragraph": { - "elements": [ - { - "endIndex": 14742, - "startIndex": 14726, - "textRun": { - "content": "+ watcher 1.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14726 - }, - { - "endIndex": 14755, - "paragraph": { - "elements": [ - { - "endIndex": 14755, - "startIndex": 14742, - "textRun": { - "content": "+ yaml 3.1.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14742 - }, - { - "endIndex": 14785, - "paragraph": { - "elements": [ - { - "endIndex": 14785, - "startIndex": 14755, - "textRun": { - "content": "Downloading analyzer 2.2.0...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14755 - }, - { - "endIndex": 14827, - "paragraph": { - "elements": [ - { - "endIndex": 14827, - "startIndex": 14785, - "textRun": { - "content": "Downloading _fe_analyzer_shared 25.0.0...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14785 - }, - { - "endIndex": 14852, - "paragraph": { - "elements": [ - { - "endIndex": 14852, - "startIndex": 14827, - "textRun": { - "content": "Changed 22 dependencies!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14827 - }, - { - "endIndex": 14887, - "paragraph": { - "elements": [ - { - "endIndex": 14887, - "startIndex": 14852, - "textRun": { - "content": "$ flutter pub add json_annotation \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14852 - }, - { - "endIndex": 14913, - "paragraph": { - "elements": [ - { - "endIndex": 14913, - "startIndex": 14887, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14887 - }, - { - "endIndex": 14945, - "paragraph": { - "elements": [ - { - "endIndex": 14945, - "startIndex": 14913, - "textRun": { - "content": " async 2.8.2 (2.9.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14913 - }, - { - "endIndex": 14982, - "paragraph": { - "elements": [ - { - "endIndex": 14982, - "startIndex": 14945, - "textRun": { - "content": " characters 1.2.0 (1.2.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14945 - }, - { - "endIndex": 15014, - "paragraph": { - "elements": [ - { - "endIndex": 15014, - "startIndex": 14982, - "textRun": { - "content": " clock 1.1.0 (1.1.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 14982 - }, - { - "endIndex": 15051, - "paragraph": { - "elements": [ - { - "endIndex": 15051, - "startIndex": 15014, - "textRun": { - "content": " fake_async 1.3.0 (1.3.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15014 - }, - { - "endIndex": 15089, - "paragraph": { - "elements": [ - { - "endIndex": 15089, - "startIndex": 15051, - "textRun": { - "content": " matcher 0.12.11 (0.12.12 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15051 - }, - { - "endIndex": 15140, - "paragraph": { - "elements": [ - { - "endIndex": 15140, - "startIndex": 15089, - "textRun": { - "content": " material_color_utilities 0.1.4 (0.1.5 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15089 - }, - { - "endIndex": 15171, - "paragraph": { - "elements": [ - { - "endIndex": 15171, - "startIndex": 15140, - "textRun": { - "content": " meta 1.7.0 (1.8.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15140 - }, - { - "endIndex": 15202, - "paragraph": { - "elements": [ - { - "endIndex": 15202, - "startIndex": 15171, - "textRun": { - "content": " path 1.8.1 (1.8.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15171 - }, - { - "endIndex": 15240, - "paragraph": { - "elements": [ - { - "endIndex": 15240, - "startIndex": 15202, - "textRun": { - "content": " source_span 1.8.2 (1.9.0 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15202 - }, - { - "endIndex": 15281, - "paragraph": { - "elements": [ - { - "endIndex": 15281, - "startIndex": 15240, - "textRun": { - "content": " string_scanner 1.1.0 (1.1.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15240 - }, - { - "endIndex": 15318, - "paragraph": { - "elements": [ - { - "endIndex": 15318, - "startIndex": 15281, - "textRun": { - "content": " term_glyph 1.2.0 (1.2.1 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15281 - }, - { - "endIndex": 15354, - "paragraph": { - "elements": [ - { - "endIndex": 15354, - "startIndex": 15318, - "textRun": { - "content": " test_api 0.4.9 (0.4.12 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15318 - }, - { - "endIndex": 15372, - "paragraph": { - "elements": [ - { - "endIndex": 15372, - "startIndex": 15354, - "textRun": { - "content": "Got dependencies!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15354 - } - ], - "endIndex": 15372, - "startIndex": 14179, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 15374, - "paragraph": { - "elements": [ - { - "endIndex": 15374, - "startIndex": 15373, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - } - } - }, - "startIndex": 15373 - }, - { - "endIndex": 15493, - "paragraph": { - "elements": [ - { - "endIndex": 15387, - "startIndex": 15374, - "textRun": { - "content": "Finally, add ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 15399, - "startIndex": 15387, - "textRun": { - "content": "build_runner", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/build_runner" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 15491, - "startIndex": 15399, - "textRun": { - "content": " as a development time dependency. This will be used for code generation later in this step.", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 15493, - "startIndex": 15491, - "textRun": { - "content": " \n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - } - } - }, - "startIndex": 15374 - }, - { - "endIndex": 16064, - "startIndex": 15493, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 16063, - "startIndex": 15494, - "tableCells": [ - { - "content": [ - { - "endIndex": 15533, - "paragraph": { - "elements": [ - { - "endIndex": 15533, - "startIndex": 15496, - "textRun": { - "content": "$ flutter pub add --dev build_runner\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15496 - }, - { - "endIndex": 15559, - "paragraph": { - "elements": [ - { - "endIndex": 15559, - "startIndex": 15533, - "textRun": { - "content": "Resolving dependencies...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15533 - }, - { - "endIndex": 15591, - "paragraph": { - "elements": [ - { - "endIndex": 15591, - "startIndex": 15559, - "textRun": { - "content": " async 2.8.1 (2.8.2 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15559 - }, - { - "endIndex": 15612, - "paragraph": { - "elements": [ - { - "endIndex": 15612, - "startIndex": 15591, - "textRun": { - "content": "+ build_daemon 3.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15591 - }, - { - "endIndex": 15636, - "paragraph": { - "elements": [ - { - "endIndex": 15636, - "startIndex": 15612, - "textRun": { - "content": "+ build_resolvers 2.0.4\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15612 - }, - { - "endIndex": 15657, - "paragraph": { - "elements": [ - { - "endIndex": 15657, - "startIndex": 15636, - "textRun": { - "content": "+ build_runner 2.1.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15636 - }, - { - "endIndex": 15683, - "paragraph": { - "elements": [ - { - "endIndex": 15683, - "startIndex": 15657, - "textRun": { - "content": "+ build_runner_core 7.1.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15657 - }, - { - "endIndex": 15708, - "paragraph": { - "elements": [ - { - "endIndex": 15708, - "startIndex": 15683, - "textRun": { - "content": "+ built_collection 5.1.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15683 - }, - { - "endIndex": 15728, - "paragraph": { - "elements": [ - { - "endIndex": 15728, - "startIndex": 15708, - "textRun": { - "content": "+ built_value 8.1.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15708 - }, - { - "endIndex": 15749, - "paragraph": { - "elements": [ - { - "endIndex": 15749, - "startIndex": 15728, - "textRun": { - "content": "+ code_builder 4.1.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15728 - }, - { - "endIndex": 15764, - "paragraph": { - "elements": [ - { - "endIndex": 15764, - "startIndex": 15749, - "textRun": { - "content": "+ fixnum 1.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15749 - }, - { - "endIndex": 15795, - "paragraph": { - "elements": [ - { - "endIndex": 15795, - "startIndex": 15764, - "textRun": { - "content": "+ frontend_server_client 2.1.2\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15764 - }, - { - "endIndex": 15810, - "paragraph": { - "elements": [ - { - "endIndex": 15810, - "startIndex": 15795, - "textRun": { - "content": "+ graphs 2.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15795 - }, - { - "endIndex": 15836, - "paragraph": { - "elements": [ - { - "endIndex": 15836, - "startIndex": 15810, - "textRun": { - "content": "+ http_multi_server 3.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15810 - }, - { - "endIndex": 15847, - "paragraph": { - "elements": [ - { - "endIndex": 15847, - "startIndex": 15836, - "textRun": { - "content": "+ io 1.0.3\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15836 - }, - { - "endIndex": 15858, - "paragraph": { - "elements": [ - { - "endIndex": 15858, - "startIndex": 15847, - "textRun": { - "content": "+ js 0.6.3\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15847 - }, - { - "endIndex": 15896, - "paragraph": { - "elements": [ - { - "endIndex": 15896, - "startIndex": 15858, - "textRun": { - "content": " matcher 0.12.10 (0.12.11 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15858 - }, - { - "endIndex": 15909, - "paragraph": { - "elements": [ - { - "endIndex": 15909, - "startIndex": 15896, - "textRun": { - "content": "+ mime 1.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15896 - }, - { - "endIndex": 15922, - "paragraph": { - "elements": [ - { - "endIndex": 15922, - "startIndex": 15909, - "textRun": { - "content": "+ pool 1.5.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15909 - }, - { - "endIndex": 15936, - "paragraph": { - "elements": [ - { - "endIndex": 15936, - "startIndex": 15922, - "textRun": { - "content": "+ shelf 1.2.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15922 - }, - { - "endIndex": 15961, - "paragraph": { - "elements": [ - { - "endIndex": 15961, - "startIndex": 15936, - "textRun": { - "content": "+ shelf_web_socket 1.0.1\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15936 - }, - { - "endIndex": 15996, - "paragraph": { - "elements": [ - { - "endIndex": 15996, - "startIndex": 15961, - "textRun": { - "content": " test_api 0.4.2 (0.4.3 available)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15961 - }, - { - "endIndex": 16011, - "paragraph": { - "elements": [ - { - "endIndex": 16011, - "startIndex": 15996, - "textRun": { - "content": "+ timing 1.0.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 15996 - }, - { - "endIndex": 16038, - "paragraph": { - "elements": [ - { - "endIndex": 16038, - "startIndex": 16011, - "textRun": { - "content": "+ web_socket_channel 2.1.0\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16011 - }, - { - "endIndex": 16063, - "paragraph": { - "elements": [ - { - "endIndex": 16063, - "startIndex": 16038, - "textRun": { - "content": "Changed 19 dependencies!\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 16038 - } - ], - "endIndex": 16063, - "startIndex": 15495, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 16065, - "paragraph": { - "elements": [ - { - "endIndex": 16065, - "startIndex": 16064, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "spaceBelow": { - "magnitude": 18.0, - "unit": "PT" - } - } - }, - "startIndex": 16064 - }, - { - "endIndex": 16099, - "paragraph": { - "elements": [ - { - "endIndex": 16099, - "startIndex": 16065, - "textRun": { - "content": "Parsing JSON with code generation\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.lrs79x3jn1mo", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false - } - }, - "startIndex": 16065 - }, - { - "endIndex": 16291, - "paragraph": { - "elements": [ - { - "endIndex": 16291, - "startIndex": 16099, - "textRun": { - "content": "You might notice that the JSON data returned from the API endpoint has a regular structure. It would be handy to generate the code to marshal that data into objects that you can use in code. \n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16099 - }, - { - "endIndex": 16292, - "paragraph": { - "elements": [ - { - "endIndex": 16292, - "startIndex": 16291, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16291 - }, - { - "endIndex": 16412, - "paragraph": { - "elements": [ - { - "endIndex": 16299, - "startIndex": 16292, - "textRun": { - "content": "In the ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 16306, - "startIndex": 16299, - "textRun": { - "content": "lib/src", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16327, - "startIndex": 16306, - "textRun": { - "content": " directory, create a ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 16341, - "startIndex": 16327, - "textRun": { - "content": "locations.dart", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 16412, - "startIndex": 16341, - "textRun": { - "content": " file and describe the structure of the returned JSON data as follows:\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 16292 - }, - { - "endIndex": 16435, - "paragraph": { - "elements": [ - { - "endIndex": 16434, - "startIndex": 16412, - "textRun": { - "content": "lib/src/locations.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/google-maps-in-flutter/step_5/lib/src/locations.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 16435, - "startIndex": 16434, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.vcffge4pgdix", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 16412 - }, - { - "endIndex": 18877, - "startIndex": 16435, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 18876, - "startIndex": 16436, - "tableCells": [ - { - "content": [ - { - "endIndex": 16461, - "paragraph": { - "elements": [ - { - "endIndex": 16461, - "startIndex": 16438, - "textRun": { - "content": "import 'dart:convert';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16438 - }, - { - "endIndex": 16462, - "paragraph": { - "elements": [ - { - "endIndex": 16462, - "startIndex": 16461, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16461 - }, - { - "endIndex": 16504, - "paragraph": { - "elements": [ - { - "endIndex": 16504, - "startIndex": 16462, - "textRun": { - "content": "import 'package:flutter/foundation.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16462 - }, - { - "endIndex": 16560, - "paragraph": { - "elements": [ - { - "endIndex": 16560, - "startIndex": 16504, - "textRun": { - "content": "import 'package:flutter/services.dart' show rootBundle;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16504 - }, - { - "endIndex": 16601, - "paragraph": { - "elements": [ - { - "endIndex": 16601, - "startIndex": 16560, - "textRun": { - "content": "import 'package:http/http.dart' as http;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16560 - }, - { - "endIndex": 16656, - "paragraph": { - "elements": [ - { - "endIndex": 16656, - "startIndex": 16601, - "textRun": { - "content": "import 'package:json_annotation/json_annotation.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16601 - }, - { - "endIndex": 16657, - "paragraph": { - "elements": [ - { - "endIndex": 16657, - "startIndex": 16656, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16656 - }, - { - "endIndex": 16682, - "paragraph": { - "elements": [ - { - "endIndex": 16682, - "startIndex": 16657, - "textRun": { - "content": "part 'locations.g.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16657 - }, - { - "endIndex": 16683, - "paragraph": { - "elements": [ - { - "endIndex": 16683, - "startIndex": 16682, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16682 - }, - { - "endIndex": 16703, - "paragraph": { - "elements": [ - { - "endIndex": 16703, - "startIndex": 16683, - "textRun": { - "content": "@JsonSerializable()\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16683 - }, - { - "endIndex": 16718, - "paragraph": { - "elements": [ - { - "endIndex": 16718, - "startIndex": 16703, - "textRun": { - "content": "class LatLng {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16703 - }, - { - "endIndex": 16729, - "paragraph": { - "elements": [ - { - "endIndex": 16729, - "startIndex": 16718, - "textRun": { - "content": " LatLng({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16718 - }, - { - "endIndex": 16752, - "paragraph": { - "elements": [ - { - "endIndex": 16752, - "startIndex": 16729, - "textRun": { - "content": " required this.lat,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16729 - }, - { - "endIndex": 16775, - "paragraph": { - "elements": [ - { - "endIndex": 16775, - "startIndex": 16752, - "textRun": { - "content": " required this.lng,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16752 - }, - { - "endIndex": 16781, - "paragraph": { - "elements": [ - { - "endIndex": 16781, - "startIndex": 16775, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16775 - }, - { - "endIndex": 16782, - "paragraph": { - "elements": [ - { - "endIndex": 16782, - "startIndex": 16781, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16781 - }, - { - "endIndex": 16862, - "paragraph": { - "elements": [ - { - "endIndex": 16862, - "startIndex": 16782, - "textRun": { - "content": " factory LatLng.fromJson(Map json) => _$LatLngFromJson(json);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16782 - }, - { - "endIndex": 16919, - "paragraph": { - "elements": [ - { - "endIndex": 16919, - "startIndex": 16862, - "textRun": { - "content": " Map toJson() => _$LatLngToJson(this);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16862 - }, - { - "endIndex": 16920, - "paragraph": { - "elements": [ - { - "endIndex": 16920, - "startIndex": 16919, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16919 - }, - { - "endIndex": 16940, - "paragraph": { - "elements": [ - { - "endIndex": 16940, - "startIndex": 16920, - "textRun": { - "content": " final double lat;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16920 - }, - { - "endIndex": 16960, - "paragraph": { - "elements": [ - { - "endIndex": 16960, - "startIndex": 16940, - "textRun": { - "content": " final double lng;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16940 - }, - { - "endIndex": 16962, - "paragraph": { - "elements": [ - { - "endIndex": 16962, - "startIndex": 16960, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16960 - }, - { - "endIndex": 16963, - "paragraph": { - "elements": [ - { - "endIndex": 16963, - "startIndex": 16962, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16962 - }, - { - "endIndex": 16983, - "paragraph": { - "elements": [ - { - "endIndex": 16983, - "startIndex": 16963, - "textRun": { - "content": "@JsonSerializable()\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16963 - }, - { - "endIndex": 16998, - "paragraph": { - "elements": [ - { - "endIndex": 16998, - "startIndex": 16983, - "textRun": { - "content": "class Region {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16983 - }, - { - "endIndex": 17009, - "paragraph": { - "elements": [ - { - "endIndex": 17009, - "startIndex": 16998, - "textRun": { - "content": " Region({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 16998 - }, - { - "endIndex": 17035, - "paragraph": { - "elements": [ - { - "endIndex": 17035, - "startIndex": 17009, - "textRun": { - "content": " required this.coords,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17009 - }, - { - "endIndex": 17057, - "paragraph": { - "elements": [ - { - "endIndex": 17057, - "startIndex": 17035, - "textRun": { - "content": " required this.id,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17035 - }, - { - "endIndex": 17081, - "paragraph": { - "elements": [ - { - "endIndex": 17081, - "startIndex": 17057, - "textRun": { - "content": " required this.name,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17057 - }, - { - "endIndex": 17105, - "paragraph": { - "elements": [ - { - "endIndex": 17105, - "startIndex": 17081, - "textRun": { - "content": " required this.zoom,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17081 - }, - { - "endIndex": 17111, - "paragraph": { - "elements": [ - { - "endIndex": 17111, - "startIndex": 17105, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17105 - }, - { - "endIndex": 17112, - "paragraph": { - "elements": [ - { - "endIndex": 17112, - "startIndex": 17111, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17111 - }, - { - "endIndex": 17192, - "paragraph": { - "elements": [ - { - "endIndex": 17192, - "startIndex": 17112, - "textRun": { - "content": " factory Region.fromJson(Map json) => _$RegionFromJson(json);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17112 - }, - { - "endIndex": 17249, - "paragraph": { - "elements": [ - { - "endIndex": 17249, - "startIndex": 17192, - "textRun": { - "content": " Map toJson() => _$RegionToJson(this);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17192 - }, - { - "endIndex": 17250, - "paragraph": { - "elements": [ - { - "endIndex": 17250, - "startIndex": 17249, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17249 - }, - { - "endIndex": 17273, - "paragraph": { - "elements": [ - { - "endIndex": 17273, - "startIndex": 17250, - "textRun": { - "content": " final LatLng coords;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17250 - }, - { - "endIndex": 17292, - "paragraph": { - "elements": [ - { - "endIndex": 17292, - "startIndex": 17273, - "textRun": { - "content": " final String id;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17273 - }, - { - "endIndex": 17313, - "paragraph": { - "elements": [ - { - "endIndex": 17313, - "startIndex": 17292, - "textRun": { - "content": " final String name;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17292 - }, - { - "endIndex": 17334, - "paragraph": { - "elements": [ - { - "endIndex": 17334, - "startIndex": 17313, - "textRun": { - "content": " final double zoom;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17313 - }, - { - "endIndex": 17336, - "paragraph": { - "elements": [ - { - "endIndex": 17336, - "startIndex": 17334, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17334 - }, - { - "endIndex": 17337, - "paragraph": { - "elements": [ - { - "endIndex": 17337, - "startIndex": 17336, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17336 - }, - { - "endIndex": 17357, - "paragraph": { - "elements": [ - { - "endIndex": 17357, - "startIndex": 17337, - "textRun": { - "content": "@JsonSerializable()\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17337 - }, - { - "endIndex": 17372, - "paragraph": { - "elements": [ - { - "endIndex": 17372, - "startIndex": 17357, - "textRun": { - "content": "class Office {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17357 - }, - { - "endIndex": 17383, - "paragraph": { - "elements": [ - { - "endIndex": 17383, - "startIndex": 17372, - "textRun": { - "content": " Office({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17372 - }, - { - "endIndex": 17410, - "paragraph": { - "elements": [ - { - "endIndex": 17410, - "startIndex": 17383, - "textRun": { - "content": " required this.address,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17383 - }, - { - "endIndex": 17432, - "paragraph": { - "elements": [ - { - "endIndex": 17432, - "startIndex": 17410, - "textRun": { - "content": " required this.id,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17410 - }, - { - "endIndex": 17457, - "paragraph": { - "elements": [ - { - "endIndex": 17457, - "startIndex": 17432, - "textRun": { - "content": " required this.image,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17432 - }, - { - "endIndex": 17480, - "paragraph": { - "elements": [ - { - "endIndex": 17480, - "startIndex": 17457, - "textRun": { - "content": " required this.lat,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17457 - }, - { - "endIndex": 17503, - "paragraph": { - "elements": [ - { - "endIndex": 17503, - "startIndex": 17480, - "textRun": { - "content": " required this.lng,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17480 - }, - { - "endIndex": 17527, - "paragraph": { - "elements": [ - { - "endIndex": 17527, - "startIndex": 17503, - "textRun": { - "content": " required this.name,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17503 - }, - { - "endIndex": 17552, - "paragraph": { - "elements": [ - { - "endIndex": 17552, - "startIndex": 17527, - "textRun": { - "content": " required this.phone,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17527 - }, - { - "endIndex": 17578, - "paragraph": { - "elements": [ - { - "endIndex": 17578, - "startIndex": 17552, - "textRun": { - "content": " required this.region,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17552 - }, - { - "endIndex": 17584, - "paragraph": { - "elements": [ - { - "endIndex": 17584, - "startIndex": 17578, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17578 - }, - { - "endIndex": 17585, - "paragraph": { - "elements": [ - { - "endIndex": 17585, - "startIndex": 17584, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17584 - }, - { - "endIndex": 17665, - "paragraph": { - "elements": [ - { - "endIndex": 17665, - "startIndex": 17585, - "textRun": { - "content": " factory Office.fromJson(Map json) => _$OfficeFromJson(json);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17585 - }, - { - "endIndex": 17722, - "paragraph": { - "elements": [ - { - "endIndex": 17722, - "startIndex": 17665, - "textRun": { - "content": " Map toJson() => _$OfficeToJson(this);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17665 - }, - { - "endIndex": 17723, - "paragraph": { - "elements": [ - { - "endIndex": 17723, - "startIndex": 17722, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17722 - }, - { - "endIndex": 17747, - "paragraph": { - "elements": [ - { - "endIndex": 17747, - "startIndex": 17723, - "textRun": { - "content": " final String address;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17723 - }, - { - "endIndex": 17766, - "paragraph": { - "elements": [ - { - "endIndex": 17766, - "startIndex": 17747, - "textRun": { - "content": " final String id;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17747 - }, - { - "endIndex": 17788, - "paragraph": { - "elements": [ - { - "endIndex": 17788, - "startIndex": 17766, - "textRun": { - "content": " final String image;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17766 - }, - { - "endIndex": 17808, - "paragraph": { - "elements": [ - { - "endIndex": 17808, - "startIndex": 17788, - "textRun": { - "content": " final double lat;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17788 - }, - { - "endIndex": 17828, - "paragraph": { - "elements": [ - { - "endIndex": 17828, - "startIndex": 17808, - "textRun": { - "content": " final double lng;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17808 - }, - { - "endIndex": 17849, - "paragraph": { - "elements": [ - { - "endIndex": 17849, - "startIndex": 17828, - "textRun": { - "content": " final String name;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17828 - }, - { - "endIndex": 17871, - "paragraph": { - "elements": [ - { - "endIndex": 17871, - "startIndex": 17849, - "textRun": { - "content": " final String phone;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17849 - }, - { - "endIndex": 17894, - "paragraph": { - "elements": [ - { - "endIndex": 17894, - "startIndex": 17871, - "textRun": { - "content": " final String region;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17871 - }, - { - "endIndex": 17896, - "paragraph": { - "elements": [ - { - "endIndex": 17896, - "startIndex": 17894, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17894 - }, - { - "endIndex": 17897, - "paragraph": { - "elements": [ - { - "endIndex": 17897, - "startIndex": 17896, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17896 - }, - { - "endIndex": 17917, - "paragraph": { - "elements": [ - { - "endIndex": 17917, - "startIndex": 17897, - "textRun": { - "content": "@JsonSerializable()\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17897 - }, - { - "endIndex": 17935, - "paragraph": { - "elements": [ - { - "endIndex": 17935, - "startIndex": 17917, - "textRun": { - "content": "class Locations {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17917 - }, - { - "endIndex": 17949, - "paragraph": { - "elements": [ - { - "endIndex": 17949, - "startIndex": 17935, - "textRun": { - "content": " Locations({\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17935 - }, - { - "endIndex": 17976, - "paragraph": { - "elements": [ - { - "endIndex": 17976, - "startIndex": 17949, - "textRun": { - "content": " required this.offices,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17949 - }, - { - "endIndex": 18003, - "paragraph": { - "elements": [ - { - "endIndex": 18003, - "startIndex": 17976, - "textRun": { - "content": " required this.regions,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 17976 - }, - { - "endIndex": 18009, - "paragraph": { - "elements": [ - { - "endIndex": 18009, - "startIndex": 18003, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18003 - }, - { - "endIndex": 18010, - "paragraph": { - "elements": [ - { - "endIndex": 18010, - "startIndex": 18009, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18009 - }, - { - "endIndex": 18069, - "paragraph": { - "elements": [ - { - "endIndex": 18069, - "startIndex": 18010, - "textRun": { - "content": " factory Locations.fromJson(Map json) =>\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18010 - }, - { - "endIndex": 18102, - "paragraph": { - "elements": [ - { - "endIndex": 18102, - "startIndex": 18069, - "textRun": { - "content": " _$LocationsFromJson(json);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18069 - }, - { - "endIndex": 18162, - "paragraph": { - "elements": [ - { - "endIndex": 18162, - "startIndex": 18102, - "textRun": { - "content": " Map toJson() => _$LocationsToJson(this);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18102 - }, - { - "endIndex": 18163, - "paragraph": { - "elements": [ - { - "endIndex": 18163, - "startIndex": 18162, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18162 - }, - { - "endIndex": 18193, - "paragraph": { - "elements": [ - { - "endIndex": 18193, - "startIndex": 18163, - "textRun": { - "content": " final List offices;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18163 - }, - { - "endIndex": 18223, - "paragraph": { - "elements": [ - { - "endIndex": 18223, - "startIndex": 18193, - "textRun": { - "content": " final List regions;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18193 - }, - { - "endIndex": 18225, - "paragraph": { - "elements": [ - { - "endIndex": 18225, - "startIndex": 18223, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18223 - }, - { - "endIndex": 18226, - "paragraph": { - "elements": [ - { - "endIndex": 18226, - "startIndex": 18225, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18225 - }, - { - "endIndex": 18271, - "paragraph": { - "elements": [ - { - "endIndex": 18271, - "startIndex": 18226, - "textRun": { - "content": "Future getGoogleOffices() async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18226 - }, - { - "endIndex": 18351, - "paragraph": { - "elements": [ - { - "endIndex": 18351, - "startIndex": 18271, - "textRun": { - "content": " const googleLocationsURL = 'https://about.google/static/data/locations.json';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18271 - }, - { - "endIndex": 18352, - "paragraph": { - "elements": [ - { - "endIndex": 18352, - "startIndex": 18351, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18351 - }, - { - "endIndex": 18398, - "paragraph": { - "elements": [ - { - "endIndex": 18398, - "startIndex": 18352, - "textRun": { - "content": " // Retrieve the locations of Google offices\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18352 - }, - { - "endIndex": 18406, - "paragraph": { - "elements": [ - { - "endIndex": 18406, - "startIndex": 18398, - "textRun": { - "content": " try {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18398 - }, - { - "endIndex": 18474, - "paragraph": { - "elements": [ - { - "endIndex": 18474, - "startIndex": 18406, - "textRun": { - "content": " final response = await http.get(Uri.parse(googleLocationsURL));\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18406 - }, - { - "endIndex": 18512, - "paragraph": { - "elements": [ - { - "endIndex": 18512, - "startIndex": 18474, - "textRun": { - "content": " if (response.statusCode == 200) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18474 - }, - { - "endIndex": 18545, - "paragraph": { - "elements": [ - { - "endIndex": 18545, - "startIndex": 18512, - "textRun": { - "content": " return Locations.fromJson(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18512 - }, - { - "endIndex": 18608, - "paragraph": { - "elements": [ - { - "endIndex": 18608, - "startIndex": 18545, - "textRun": { - "content": " json.decode(response.body) as Map);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18545 - }, - { - "endIndex": 18614, - "paragraph": { - "elements": [ - { - "endIndex": 18614, - "startIndex": 18608, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18608 - }, - { - "endIndex": 18630, - "paragraph": { - "elements": [ - { - "endIndex": 18630, - "startIndex": 18614, - "textRun": { - "content": " } catch (e) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18614 - }, - { - "endIndex": 18652, - "paragraph": { - "elements": [ - { - "endIndex": 18652, - "startIndex": 18630, - "textRun": { - "content": " if (kDebugMode) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18630 - }, - { - "endIndex": 18668, - "paragraph": { - "elements": [ - { - "endIndex": 18668, - "startIndex": 18652, - "textRun": { - "content": " print(e);\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18652 - }, - { - "endIndex": 18674, - "paragraph": { - "elements": [ - { - "endIndex": 18674, - "startIndex": 18668, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18668 - }, - { - "endIndex": 18678, - "paragraph": { - "elements": [ - { - "endIndex": 18678, - "startIndex": 18674, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18674 - }, - { - "endIndex": 18679, - "paragraph": { - "elements": [ - { - "endIndex": 18679, - "startIndex": 18678, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18678 - }, - { - "endIndex": 18732, - "paragraph": { - "elements": [ - { - "endIndex": 18732, - "startIndex": 18679, - "textRun": { - "content": " // Fallback for when the above HTTP request fails.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18679 - }, - { - "endIndex": 18761, - "paragraph": { - "elements": [ - { - "endIndex": 18761, - "startIndex": 18732, - "textRun": { - "content": " return Locations.fromJson(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18732 - }, - { - "endIndex": 18778, - "paragraph": { - "elements": [ - { - "endIndex": 18778, - "startIndex": 18761, - "textRun": { - "content": " json.decode(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18761 - }, - { - "endIndex": 18838, - "paragraph": { - "elements": [ - { - "endIndex": 18838, - "startIndex": 18778, - "textRun": { - "content": " await rootBundle.loadString('assets/locations.json'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18778 - }, - { - "endIndex": 18869, - "paragraph": { - "elements": [ - { - "endIndex": 18869, - "startIndex": 18838, - "textRun": { - "content": " ) as Map,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18838 - }, - { - "endIndex": 18874, - "paragraph": { - "elements": [ - { - "endIndex": 18874, - "startIndex": 18869, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18869 - }, - { - "endIndex": 18876, - "paragraph": { - "elements": [ - { - "endIndex": 18876, - "startIndex": 18874, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 18874 - } - ], - "endIndex": 18876, - "startIndex": 16437, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 18878, - "paragraph": { - "elements": [ - { - "endIndex": 18878, - "startIndex": 18877, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18877 - }, - { - "endIndex": 19156, - "paragraph": { - "elements": [ - { - "endIndex": 19019, - "startIndex": 18878, - "textRun": { - "content": "Once you’ve added this code, your IDE (if you are using one) should display some red squiggles, as it references a nonexistent sibling file, ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19036, - "startIndex": 19019, - "textRun": { - "content": "locations.g.dart.", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19142, - "startIndex": 19036, - "textRun": { - "content": " This generated file converts between untyped JSON structures and named objects. Create it by running the ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 19154, - "startIndex": 19142, - "textRun": { - "content": "build_runner", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 19156, - "startIndex": 19154, - "textRun": { - "content": ":\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 18878 - }, - { - "endIndex": 19157, - "paragraph": { - "elements": [ - { - "endIndex": 19157, - "startIndex": 19156, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 19156 - }, - { - "endIndex": 20304, - "startIndex": 19157, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 20303, - "startIndex": 19158, - "tableCells": [ - { - "content": [ - { - "endIndex": 19226, - "paragraph": { - "elements": [ - { - "endIndex": 19162, - "startIndex": 19160, - "textRun": { - "content": "$ ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 19226, - "startIndex": 19162, - "textRun": { - "content": "flutter pub run build_runner build --delete-conflicting-outputs\n", - "textStyle": { - "bold": true, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19160 - }, - { - "endIndex": 19260, - "paragraph": { - "elements": [ - { - "endIndex": 19260, - "startIndex": 19226, - "textRun": { - "content": "[INFO] Generating build script...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19226 - }, - { - "endIndex": 19313, - "paragraph": { - "elements": [ - { - "endIndex": 19313, - "startIndex": 19260, - "textRun": { - "content": "[INFO] Generating build script completed, took 357ms\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19260 - }, - { - "endIndex": 19314, - "paragraph": { - "elements": [ - { - "endIndex": 19314, - "startIndex": 19313, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19313 - }, - { - "endIndex": 19358, - "paragraph": { - "elements": [ - { - "endIndex": 19358, - "startIndex": 19314, - "textRun": { - "content": "[INFO] Creating build script snapshot......\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19314 - }, - { - "endIndex": 19421, - "paragraph": { - "elements": [ - { - "endIndex": 19421, - "startIndex": 19358, - "textRun": { - "content": "[INFO] Creating build script snapshot... completed, took 10.5s\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19358 - }, - { - "endIndex": 19422, - "paragraph": { - "elements": [ - { - "endIndex": 19422, - "startIndex": 19421, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19421 - }, - { - "endIndex": 19585, - "paragraph": { - "elements": [ - { - "endIndex": 19585, - "startIndex": 19422, - "textRun": { - "content": "[INFO] There was output on stdout while compiling the build script snapshot, run with `--verbose` to see it (you will need to run a `clean` first to re-snapshot).\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19422 - }, - { - "endIndex": 19586, - "paragraph": { - "elements": [ - { - "endIndex": 19586, - "startIndex": 19585, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19585 - }, - { - "endIndex": 19613, - "paragraph": { - "elements": [ - { - "endIndex": 19613, - "startIndex": 19586, - "textRun": { - "content": "[INFO] Initializing inputs\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19586 - }, - { - "endIndex": 19648, - "paragraph": { - "elements": [ - { - "endIndex": 19648, - "startIndex": 19613, - "textRun": { - "content": "[INFO] Building new asset graph...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19613 - }, - { - "endIndex": 19702, - "paragraph": { - "elements": [ - { - "endIndex": 19702, - "startIndex": 19648, - "textRun": { - "content": "[INFO] Building new asset graph completed, took 646ms\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19648 - }, - { - "endIndex": 19703, - "paragraph": { - "elements": [ - { - "endIndex": 19703, - "startIndex": 19702, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19702 - }, - { - "endIndex": 19759, - "paragraph": { - "elements": [ - { - "endIndex": 19759, - "startIndex": 19703, - "textRun": { - "content": "[INFO] Checking for unexpected pre-existing outputs....\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19703 - }, - { - "endIndex": 19825, - "paragraph": { - "elements": [ - { - "endIndex": 19825, - "startIndex": 19759, - "textRun": { - "content": "[INFO] Deleting 1 declared outputs which already existed on disk.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19759 - }, - { - "endIndex": 19898, - "paragraph": { - "elements": [ - { - "endIndex": 19898, - "startIndex": 19825, - "textRun": { - "content": "[INFO] Checking for unexpected pre-existing outputs. completed, took 3ms\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19825 - }, - { - "endIndex": 19899, - "paragraph": { - "elements": [ - { - "endIndex": 19899, - "startIndex": 19898, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19898 - }, - { - "endIndex": 19923, - "paragraph": { - "elements": [ - { - "endIndex": 19923, - "startIndex": 19899, - "textRun": { - "content": "[INFO] Running build...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19899 - }, - { - "endIndex": 19956, - "paragraph": { - "elements": [ - { - "endIndex": 19956, - "startIndex": 19923, - "textRun": { - "content": "[INFO] Generating SDK summary...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19923 - }, - { - "endIndex": 20000, - "paragraph": { - "elements": [ - { - "endIndex": 20000, - "startIndex": 19956, - "textRun": { - "content": "[INFO] 3.4s elapsed, 0/3 actions completed.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 19956 - }, - { - "endIndex": 20051, - "paragraph": { - "elements": [ - { - "endIndex": 20051, - "startIndex": 20000, - "textRun": { - "content": "[INFO] Generating SDK summary completed, took 3.4s\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20000 - }, - { - "endIndex": 20052, - "paragraph": { - "elements": [ - { - "endIndex": 20052, - "startIndex": 20051, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20051 - }, - { - "endIndex": 20096, - "paragraph": { - "elements": [ - { - "endIndex": 20096, - "startIndex": 20052, - "textRun": { - "content": "[INFO] 4.7s elapsed, 2/3 actions completed.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20052 - }, - { - "endIndex": 20138, - "paragraph": { - "elements": [ - { - "endIndex": 20138, - "startIndex": 20096, - "textRun": { - "content": "[INFO] Running build completed, took 4.7s\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20096 - }, - { - "endIndex": 20139, - "paragraph": { - "elements": [ - { - "endIndex": 20139, - "startIndex": 20138, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20138 - }, - { - "endIndex": 20184, - "paragraph": { - "elements": [ - { - "endIndex": 20184, - "startIndex": 20139, - "textRun": { - "content": "[INFO] Caching finalized dependency graph...\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20139 - }, - { - "endIndex": 20247, - "paragraph": { - "elements": [ - { - "endIndex": 20247, - "startIndex": 20184, - "textRun": { - "content": "[INFO] Caching finalized dependency graph completed, took 36ms\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20184 - }, - { - "endIndex": 20248, - "paragraph": { - "elements": [ - { - "endIndex": 20248, - "startIndex": 20247, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20247 - }, - { - "endIndex": 20303, - "paragraph": { - "elements": [ - { - "endIndex": 20302, - "startIndex": 20248, - "textRun": { - "content": "[INFO] Succeeded after 4.8s with 2 outputs (7 actions)", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 20303, - "startIndex": 20302, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20248 - } - ], - "endIndex": 20303, - "startIndex": 19159, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 20305, - "paragraph": { - "elements": [ - { - "endIndex": 20305, - "startIndex": 20304, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20304 - }, - { - "endIndex": 20741, - "paragraph": { - "elements": [ - { - "endIndex": 20417, - "startIndex": 20305, - "textRun": { - "content": "Your code should now analyze cleanly again. Next, we should add in the fallback locations.json file used in the ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 20433, - "startIndex": 20417, - "textRun": { - "content": "getGoogleOffices", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20741, - "startIndex": 20433, - "textRun": { - "content": " function. One of the reasons for including this fallback is that the static data being loaded in this function is served without CORS headers, and thus will fail to load in a web browser. The Android and iOS Flutter apps don’t need CORS headers, but mobile data access can be finicky at the best of times. \n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20305 - }, - { - "endIndex": 20742, - "paragraph": { - "elements": [ - { - "endIndex": 20742, - "startIndex": 20741, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20741 - }, - { - "endIndex": 20923, - "paragraph": { - "elements": [ - { - "endIndex": 20754, - "startIndex": 20742, - "textRun": { - "content": "Navigate to ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 20801, - "startIndex": 20754, - "textRun": { - "content": "https://about.google/static/data/locations.json", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://about.google/static/data/locations.json" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 20923, - "startIndex": 20801, - "textRun": { - "content": " in your browser, and save the contents into the asset directory. Alternatively, you can use the command line as follows.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20742 - }, - { - "endIndex": 20924, - "paragraph": { - "elements": [ - { - "endIndex": 20924, - "startIndex": 20923, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 20923 - }, - { - "endIndex": 21265, - "startIndex": 20924, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 21264, - "startIndex": 20925, - "tableCells": [ - { - "content": [ - { - "endIndex": 20942, - "paragraph": { - "elements": [ - { - "endIndex": 20942, - "startIndex": 20927, - "textRun": { - "content": "$ mkdir assets\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20927 - }, - { - "endIndex": 20954, - "paragraph": { - "elements": [ - { - "endIndex": 20954, - "startIndex": 20942, - "textRun": { - "content": "$ cd assets\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20942 - }, - { - "endIndex": 21027, - "paragraph": { - "elements": [ - { - "endIndex": 21027, - "startIndex": 20954, - "textRun": { - "content": "$ curl -o locations.json https://about.google/static/data/locations.json\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 20954 - }, - { - "endIndex": 21107, - "paragraph": { - "elements": [ - { - "endIndex": 21107, - "startIndex": 21027, - "textRun": { - "content": " % Total % Received % Xferd Average Speed Time Time Time Current\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21027 - }, - { - "endIndex": 21185, - "paragraph": { - "elements": [ - { - "endIndex": 21185, - "startIndex": 21107, - "textRun": { - "content": " Dload Upload Total Spent Left Speed\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21107 - }, - { - "endIndex": 21264, - "paragraph": { - "elements": [ - { - "endIndex": 21263, - "startIndex": 21185, - "textRun": { - "content": "100 30348 100 30348 0 0 75492 0 --:--:-- --:--:-- --:--:-- 75492", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Consolas", - "weight": 400 - } - } - } - }, - { - "endIndex": 21264, - "startIndex": 21263, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21185 - } - ], - "endIndex": 21264, - "startIndex": 20926, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 21266, - "paragraph": { - "elements": [ - { - "endIndex": 21266, - "startIndex": 21265, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21265 - }, - { - "endIndex": 21368, - "paragraph": { - "elements": [ - { - "endIndex": 21349, - "startIndex": 21266, - "textRun": { - "content": "Now that you have the asset file downloaded, add it to the flutter section of your ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 21361, - "startIndex": 21349, - "textRun": { - "content": "pubspec.yaml", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21368, - "startIndex": 21361, - "textRun": { - "content": " file.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21266 - }, - { - "endIndex": 21382, - "paragraph": { - "elements": [ - { - "endIndex": 21380, - "startIndex": 21368, - "textRun": { - "content": "pubspec.yaml", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/google-maps-in-flutter/step_5/pubspec.yaml" - }, - "underline": true - } - } - }, - { - "endIndex": 21382, - "startIndex": 21380, - "textRun": { - "content": " \n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.z6mljexlaggc", - "namedStyleType": "HEADING_3" - } - }, - "startIndex": 21368 - }, - { - "endIndex": 21463, - "startIndex": 21382, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 21462, - "startIndex": 21383, - "tableCells": [ - { - "content": [ - { - "endIndex": 21394, - "paragraph": { - "elements": [ - { - "endIndex": 21394, - "startIndex": 21385, - "textRun": { - "content": "flutter:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21385 - }, - { - "endIndex": 21423, - "paragraph": { - "elements": [ - { - "endIndex": 21423, - "startIndex": 21394, - "textRun": { - "content": " uses-material-design: true\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21394 - }, - { - "endIndex": 21424, - "paragraph": { - "elements": [ - { - "endIndex": 21424, - "startIndex": 21423, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21423 - }, - { - "endIndex": 21434, - "paragraph": { - "elements": [ - { - "endIndex": 21434, - "startIndex": 21424, - "textRun": { - "content": " assets:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21424 - }, - { - "endIndex": 21462, - "paragraph": { - "elements": [ - { - "endIndex": 21462, - "startIndex": 21434, - "textRun": { - "content": " - assets/locations.json\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": false, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21434 - } - ], - "endIndex": 21462, - "startIndex": 21384, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 21464, - "paragraph": { - "elements": [ - { - "endIndex": 21464, - "startIndex": 21463, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT" - } - }, - "startIndex": 21463 - }, - { - "endIndex": 21465, - "paragraph": { - "elements": [ - { - "endIndex": 21465, - "startIndex": 21464, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21464 - }, - { - "endIndex": 21574, - "paragraph": { - "elements": [ - { - "endIndex": 21476, - "startIndex": 21465, - "textRun": { - "content": "Modify the ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 21485, - "startIndex": 21476, - "textRun": { - "content": "main.dart", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 21574, - "startIndex": 21485, - "textRun": { - "content": " file to request the map data, and then use the returned info to add offices to the map:\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 21465 - }, - { - "endIndex": 21588, - "paragraph": { - "elements": [ - { - "endIndex": 21587, - "startIndex": 21574, - "textRun": { - "content": "lib/main.dart", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://github.com/flutter/codelabs/blob/master/google-maps-in-flutter/step_5/lib/main.dart" - }, - "underline": true - } - } - }, - { - "endIndex": 21588, - "startIndex": 21587, - "textRun": { - "content": "\n", - "textStyle": {} - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.tkosencotov2", - "namedStyleType": "HEADING_3", - "pageBreakBefore": false - } - }, - "startIndex": 21574 - }, - { - "endIndex": 23112, - "startIndex": 21588, - "table": { - "columns": 1, - "rows": 1, - "tableRows": [ - { - "endIndex": 23111, - "startIndex": 21589, - "tableCells": [ - { - "content": [ - { - "endIndex": 21631, - "paragraph": { - "elements": [ - { - "endIndex": 21631, - "startIndex": 21591, - "textRun": { - "content": "import 'package:flutter/material.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21591 - }, - { - "endIndex": 21694, - "paragraph": { - "elements": [ - { - "endIndex": 21694, - "startIndex": 21631, - "textRun": { - "content": "import 'package:google_maps_flutter/google_maps_flutter.dart';\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21631 - }, - { - "endIndex": 21736, - "paragraph": { - "elements": [ - { - "endIndex": 21736, - "startIndex": 21694, - "textRun": { - "content": "import 'src/locations.dart' as locations;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21694 - }, - { - "endIndex": 21737, - "paragraph": { - "elements": [ - { - "endIndex": 21737, - "startIndex": 21736, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21736 - }, - { - "endIndex": 21751, - "paragraph": { - "elements": [ - { - "endIndex": 21751, - "startIndex": 21737, - "textRun": { - "content": "void main() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21737 - }, - { - "endIndex": 21776, - "paragraph": { - "elements": [ - { - "endIndex": 21776, - "startIndex": 21751, - "textRun": { - "content": " runApp(const MyApp());\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21751 - }, - { - "endIndex": 21778, - "paragraph": { - "elements": [ - { - "endIndex": 21778, - "startIndex": 21776, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21776 - }, - { - "endIndex": 21779, - "paragraph": { - "elements": [ - { - "endIndex": 21779, - "startIndex": 21778, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21778 - }, - { - "endIndex": 21816, - "paragraph": { - "elements": [ - { - "endIndex": 21816, - "startIndex": 21779, - "textRun": { - "content": "class MyApp extends StatefulWidget {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21779 - }, - { - "endIndex": 21844, - "paragraph": { - "elements": [ - { - "endIndex": 21844, - "startIndex": 21816, - "textRun": { - "content": " const MyApp({super.key});\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21816 - }, - { - "endIndex": 21845, - "paragraph": { - "elements": [ - { - "endIndex": 21845, - "startIndex": 21844, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21844 - }, - { - "endIndex": 21857, - "paragraph": { - "elements": [ - { - "endIndex": 21857, - "startIndex": 21845, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21845 - }, - { - "endIndex": 21904, - "paragraph": { - "elements": [ - { - "endIndex": 21904, - "startIndex": 21857, - "textRun": { - "content": " State createState() => _MyAppState();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21857 - }, - { - "endIndex": 21906, - "paragraph": { - "elements": [ - { - "endIndex": 21906, - "startIndex": 21904, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21904 - }, - { - "endIndex": 21907, - "paragraph": { - "elements": [ - { - "endIndex": 21907, - "startIndex": 21906, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21906 - }, - { - "endIndex": 21948, - "paragraph": { - "elements": [ - { - "endIndex": 21948, - "startIndex": 21907, - "textRun": { - "content": "class _MyAppState extends State {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21907 - }, - { - "endIndex": 21991, - "paragraph": { - "elements": [ - { - "endIndex": 21991, - "startIndex": 21948, - "textRun": { - "content": " final Map _markers = {};\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21948 - }, - { - "endIndex": 22060, - "paragraph": { - "elements": [ - { - "endIndex": 22060, - "startIndex": 21991, - "textRun": { - "content": " Future _onMapCreated(GoogleMapController controller) async {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 21991 - }, - { - "endIndex": 22122, - "paragraph": { - "elements": [ - { - "endIndex": 22122, - "startIndex": 22060, - "textRun": { - "content": " final googleOffices = await locations.getGoogleOffices();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22060 - }, - { - "endIndex": 22140, - "paragraph": { - "elements": [ - { - "endIndex": 22140, - "startIndex": 22122, - "textRun": { - "content": " setState(() {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22122 - }, - { - "endIndex": 22164, - "paragraph": { - "elements": [ - { - "endIndex": 22164, - "startIndex": 22140, - "textRun": { - "content": " _markers.clear();\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22140 - }, - { - "endIndex": 22216, - "paragraph": { - "elements": [ - { - "endIndex": 22216, - "startIndex": 22164, - "textRun": { - "content": " for (final office in googleOffices.offices) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22164 - }, - { - "endIndex": 22247, - "paragraph": { - "elements": [ - { - "endIndex": 22247, - "startIndex": 22216, - "textRun": { - "content": " final marker = Marker(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22216 - }, - { - "endIndex": 22290, - "paragraph": { - "elements": [ - { - "endIndex": 22290, - "startIndex": 22247, - "textRun": { - "content": " markerId: MarkerId(office.name),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22247 - }, - { - "endIndex": 22342, - "paragraph": { - "elements": [ - { - "endIndex": 22342, - "startIndex": 22290, - "textRun": { - "content": " position: LatLng(office.lat, office.lng),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22290 - }, - { - "endIndex": 22376, - "paragraph": { - "elements": [ - { - "endIndex": 22376, - "startIndex": 22342, - "textRun": { - "content": " infoWindow: InfoWindow(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22342 - }, - { - "endIndex": 22408, - "paragraph": { - "elements": [ - { - "endIndex": 22408, - "startIndex": 22376, - "textRun": { - "content": " title: office.name,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22376 - }, - { - "endIndex": 22445, - "paragraph": { - "elements": [ - { - "endIndex": 22445, - "startIndex": 22408, - "textRun": { - "content": " snippet: office.address,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22408 - }, - { - "endIndex": 22458, - "paragraph": { - "elements": [ - { - "endIndex": 22458, - "startIndex": 22445, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22445 - }, - { - "endIndex": 22469, - "paragraph": { - "elements": [ - { - "endIndex": 22469, - "startIndex": 22458, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22458 - }, - { - "endIndex": 22509, - "paragraph": { - "elements": [ - { - "endIndex": 22509, - "startIndex": 22469, - "textRun": { - "content": " _markers[office.name] = marker;\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22469 - }, - { - "endIndex": 22517, - "paragraph": { - "elements": [ - { - "endIndex": 22517, - "startIndex": 22509, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22509 - }, - { - "endIndex": 22525, - "paragraph": { - "elements": [ - { - "endIndex": 22525, - "startIndex": 22517, - "textRun": { - "content": " });\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22517 - }, - { - "endIndex": 22529, - "paragraph": { - "elements": [ - { - "endIndex": 22529, - "startIndex": 22525, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22525 - }, - { - "endIndex": 22530, - "paragraph": { - "elements": [ - { - "endIndex": 22530, - "startIndex": 22529, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22529 - }, - { - "endIndex": 22542, - "paragraph": { - "elements": [ - { - "endIndex": 22542, - "startIndex": 22530, - "textRun": { - "content": " @override\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22530 - }, - { - "endIndex": 22581, - "paragraph": { - "elements": [ - { - "endIndex": 22581, - "startIndex": 22542, - "textRun": { - "content": " Widget build(BuildContext context) {\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22542 - }, - { - "endIndex": 22605, - "paragraph": { - "elements": [ - { - "endIndex": 22605, - "startIndex": 22581, - "textRun": { - "content": " return MaterialApp(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22581 - }, - { - "endIndex": 22629, - "paragraph": { - "elements": [ - { - "endIndex": 22629, - "startIndex": 22605, - "textRun": { - "content": " theme: ThemeData(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22605 - }, - { - "endIndex": 22657, - "paragraph": { - "elements": [ - { - "endIndex": 22657, - "startIndex": 22629, - "textRun": { - "content": " \n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22629 - }, - { - "endIndex": 22701, - "paragraph": { - "elements": [ - { - "endIndex": 22701, - "startIndex": 22657, - "textRun": { - "content": " colorSchemeSeed: Colors.green[700],\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22657 - }, - { - "endIndex": 22710, - "paragraph": { - "elements": [ - { - "endIndex": 22710, - "startIndex": 22701, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22701 - }, - { - "endIndex": 22732, - "paragraph": { - "elements": [ - { - "endIndex": 22732, - "startIndex": 22710, - "textRun": { - "content": " home: Scaffold(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22710 - }, - { - "endIndex": 22756, - "paragraph": { - "elements": [ - { - "endIndex": 22756, - "startIndex": 22732, - "textRun": { - "content": " appBar: AppBar(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22732 - }, - { - "endIndex": 22812, - "paragraph": { - "elements": [ - { - "endIndex": 22812, - "startIndex": 22756, - "textRun": { - "content": " title: const Text('Google Office Locations'),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22756 - }, - { - "endIndex": 22836, - "paragraph": { - "elements": [ - { - "endIndex": 22836, - "startIndex": 22812, - "textRun": { - "content": " elevation: 2,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22812 - }, - { - "endIndex": 22847, - "paragraph": { - "elements": [ - { - "endIndex": 22847, - "startIndex": 22836, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22836 - }, - { - "endIndex": 22872, - "paragraph": { - "elements": [ - { - "endIndex": 22872, - "startIndex": 22847, - "textRun": { - "content": " body: GoogleMap(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22847 - }, - { - "endIndex": 22911, - "paragraph": { - "elements": [ - { - "endIndex": 22911, - "startIndex": 22872, - "textRun": { - "content": " onMapCreated: _onMapCreated,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22872 - }, - { - "endIndex": 22966, - "paragraph": { - "elements": [ - { - "endIndex": 22966, - "startIndex": 22911, - "textRun": { - "content": " initialCameraPosition: const CameraPosition(\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22911 - }, - { - "endIndex": 23000, - "paragraph": { - "elements": [ - { - "endIndex": 23000, - "startIndex": 22966, - "textRun": { - "content": " target: LatLng(0, 0),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 22966 - }, - { - "endIndex": 23021, - "paragraph": { - "elements": [ - { - "endIndex": 23021, - "startIndex": 23000, - "textRun": { - "content": " zoom: 2,\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23000 - }, - { - "endIndex": 23034, - "paragraph": { - "elements": [ - { - "endIndex": 23034, - "startIndex": 23021, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23021 - }, - { - "endIndex": 23078, - "paragraph": { - "elements": [ - { - "endIndex": 23078, - "startIndex": 23034, - "textRun": { - "content": " markers: _markers.values.toSet(),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23034 - }, - { - "endIndex": 23089, - "paragraph": { - "elements": [ - { - "endIndex": 23089, - "startIndex": 23078, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23078 - }, - { - "endIndex": 23098, - "paragraph": { - "elements": [ - { - "endIndex": 23098, - "startIndex": 23089, - "textRun": { - "content": " ),\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23089 - }, - { - "endIndex": 23105, - "paragraph": { - "elements": [ - { - "endIndex": 23105, - "startIndex": 23098, - "textRun": { - "content": " );\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23098 - }, - { - "endIndex": 23109, - "paragraph": { - "elements": [ - { - "endIndex": 23109, - "startIndex": 23105, - "textRun": { - "content": " }\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23105 - }, - { - "endIndex": 23111, - "paragraph": { - "elements": [ - { - "endIndex": 23111, - "startIndex": 23109, - "textRun": { - "content": "}\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "avoidWidowAndOrphan": false, - "direction": "LEFT_TO_RIGHT", - "lineSpacing": 100.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23109 - } - ], - "endIndex": 23111, - "startIndex": 21590, - "tableCellStyle": { - "backgroundColor": {}, - "columnSpan": 1, - "contentAlignment": "TOP", - "paddingBottom": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingLeft": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingRight": { - "magnitude": 5.0, - "unit": "PT" - }, - "paddingTop": { - "magnitude": 5.0, - "unit": "PT" - }, - "rowSpan": 1 - } - } - ], - "tableRowStyle": { - "minRowHeight": { - "unit": "PT" - } - } - } - ], - "tableStyle": { - "tableColumnProperties": [ - { - "widthType": "EVENLY_DISTRIBUTED" - } - ] - } - } - }, - { - "endIndex": 23113, - "paragraph": { - "elements": [ - { - "endIndex": 23113, - "startIndex": 23112, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23112 - }, - { - "endIndex": 23153, - "paragraph": { - "elements": [ - { - "endIndex": 23153, - "startIndex": 23113, - "textRun": { - "content": "This code performs several operations: \n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23113 - }, - { - "endIndex": 23154, - "paragraph": { - "elements": [ - { - "endIndex": 23154, - "startIndex": 23153, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23153 - }, - { - "endIndex": 23455, - "paragraph": { - "bullet": { - "listId": "kix.rza4cz1vbnb5", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false - } - }, - "elements": [ - { - "endIndex": 23157, - "startIndex": 23154, - "textRun": { - "content": "In ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23170, - "startIndex": 23157, - "textRun": { - "content": "_onMapCreated", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23226, - "startIndex": 23170, - "textRun": { - "content": ", it uses the JSON parsing code from the previous step, ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23231, - "startIndex": 23226, - "textRun": { - "content": "await", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23295, - "startIndex": 23231, - "textRun": { - "content": "ing until it’s loaded. It then uses the returned data to create ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23301, - "startIndex": 23295, - "textRun": { - "content": "Marker", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23312, - "startIndex": 23301, - "textRun": { - "content": "s inside a ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23322, - "startIndex": 23312, - "textRun": { - "content": "setState()", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23455, - "startIndex": 23322, - "textRun": { - "content": " callback. Once the app receives new markers, setState flags Flutter to repaint the screen, causing the office locations to display.\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23154 - }, - { - "endIndex": 23456, - "paragraph": { - "elements": [ - { - "endIndex": 23456, - "startIndex": 23455, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23455 - }, - { - "endIndex": 23658, - "paragraph": { - "bullet": { - "listId": "kix.jah968f0rvh1", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false - } - }, - "elements": [ - { - "endIndex": 23484, - "startIndex": 23456, - "textRun": { - "content": "The markers are stored in a ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23487, - "startIndex": 23484, - "textRun": { - "content": "Map", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23516, - "startIndex": 23487, - "textRun": { - "content": " that is associated with the ", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23525, - "startIndex": 23516, - "textRun": { - "content": "GoogleMap", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 23658, - "startIndex": 23525, - "textRun": { - "content": " widget. This links the markers to the correct map. You could, of course, have multiple maps and display different markers in each. \n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23456 - }, - { - "endIndex": 23660, - "paragraph": { - "elements": [ - { - "endIndex": 23659, - "inlineObjectElement": { - "inlineObjectId": "kix.ez1fb9v1361v", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "startIndex": 23658 - }, - { - "endIndex": 23660, - "startIndex": 23659, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23658 - }, - { - "endIndex": 23661, - "paragraph": { - "elements": [ - { - "endIndex": 23661, - "startIndex": 23660, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23660 - }, - { - "endIndex": 23950, - "paragraph": { - "elements": [ - { - "endIndex": 23950, - "startIndex": 23661, - "textRun": { - "content": "Here’s a screenshot of what you have accomplished. There are many interesting additions that can be made at this point. For example, you could add a list view of the offices that moves and zooms the map when the user clicks an office but, as they say, this exercise is left to the reader!\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23661 - }, - { - "endIndex": 23951, - "paragraph": { - "elements": [ - { - "endIndex": 23951, - "startIndex": 23950, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23950 - }, - { - "endIndex": 23953, - "paragraph": { - "elements": [ - { - "endIndex": 23952, - "horizontalRule": { - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "startIndex": 23951 - }, - { - "endIndex": 23953, - "startIndex": 23952, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 23951 - }, - { - "endIndex": 23964, - "paragraph": { - "elements": [ - { - "endIndex": 23963, - "startIndex": 23953, - "textRun": { - "content": "Next steps", - "textStyle": { - "fontSize": { - "magnitude": 18.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - }, - { - "endIndex": 23964, - "startIndex": 23963, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 20.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.wyjmgdlwi2kp", - "namedStyleType": "HEADING_1", - "pageBreakBefore": false - } - }, - "startIndex": 23953 - }, - { - "endIndex": 23979, - "paragraph": { - "elements": [ - { - "endIndex": 23978, - "startIndex": 23964, - "textRun": { - "content": "Duration: 0:00", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.7176471, - "green": 0.7176471, - "red": 0.7176471 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 23979, - "startIndex": 23978, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23964 - }, - { - "endIndex": 23996, - "paragraph": { - "elements": [ - { - "endIndex": 23996, - "startIndex": 23979, - "textRun": { - "content": "Congratulations!\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.4w8rovwn8ql", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 18.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6.0, - "unit": "PT" - } - } - }, - "startIndex": 23979 - }, - { - "endIndex": 24123, - "paragraph": { - "elements": [ - { - "endIndex": 24123, - "startIndex": 23996, - "textRun": { - "content": "You have completed the codelab and have built a Flutter app with a Google Map! You’ve also interacted with a JSON Web Service.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 23996 - }, - { - "endIndex": 24140, - "paragraph": { - "elements": [ - { - "endIndex": 24140, - "startIndex": 24123, - "textRun": { - "content": "Other next steps\n", - "textStyle": { - "bold": false, - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.8ahw5cvmt2v7", - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 18.0, - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 6.0, - "unit": "PT" - } - } - }, - "startIndex": 24123 - }, - { - "endIndex": 24386, - "paragraph": { - "elements": [ - { - "endIndex": 24386, - "startIndex": 24140, - "textRun": { - "content": "This codelab has built an experience to visualise a number of points on a map. There are a number of mobile apps that build on this capability to serve a lot of different user needs. There are other resources that can help you take this further:\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24140 - }, - { - "endIndex": 24466, - "paragraph": { - "bullet": { - "listId": "kix.ed3ilj3kkhq2", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 24432, - "startIndex": 24386, - "textRun": { - "content": "Build Mobile Apps With Flutter and Google Maps", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://www.youtube.com/watch?v=RpQLFAFqMlw" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 24466, - "startIndex": 24432, - "textRun": { - "content": " (a talk given at Cloud Next '19)\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24386 - }, - { - "endIndex": 24633, - "paragraph": { - "bullet": { - "listId": "kix.ed3ilj3kkhq2", - "textStyle": { - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 24483, - "startIndex": 24466, - "textRun": { - "content": "Hadrien Lejard’s ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 24505, - "startIndex": 24483, - "textRun": { - "content": "google_maps_webservice", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://pub.dev/packages/google_maps_webservice" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Courier New", - "weight": 400 - } - } - } - }, - { - "endIndex": 24561, - "startIndex": 24505, - "textRun": { - "content": " package which makes the Google Maps Web Services, like ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 24575, - "startIndex": 24561, - "textRun": { - "content": "Directions API", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://developers.google.com/maps/documentation/directions/start" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 24577, - "startIndex": 24575, - "textRun": { - "content": ", ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 24596, - "startIndex": 24577, - "textRun": { - "content": "Distance Matrix API", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://developers.google.com/maps/documentation/distance-matrix/start" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 24602, - "startIndex": 24596, - "textRun": { - "content": ", and ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 24612, - "startIndex": 24602, - "textRun": { - "content": "Places API", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://cloud.google.com/maps-platform/places/" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 24633, - "startIndex": 24612, - "textRun": { - "content": " really easy to use.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24466 - }, - { - "endIndex": 24795, - "paragraph": { - "bullet": { - "listId": "kix.8budch7w7arn", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - "elements": [ - { - "endIndex": 24710, - "startIndex": 24633, - "textRun": { - "content": "If you want to look at different options for using an API via JSON REST, see ", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 24738, - "startIndex": 24710, - "textRun": { - "content": "Andrew Brogdon’s Medium post", - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.8, - "green": 0.33333334, - "red": 0.06666667 - } - } - }, - "link": { - "url": "https://medium.com/flutter-io/some-options-for-deserializing-json-with-flutter-7481325a4450" - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - }, - { - "endIndex": 24795, - "startIndex": 24738, - "textRun": { - "content": " for a range of options for working with JSON REST APIs.\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spacingMode": "COLLAPSE_LISTS" - } - }, - "startIndex": 24633 - }, - { - "endIndex": 24796, - "paragraph": { - "elements": [ - { - "endIndex": 24796, - "startIndex": 24795, - "textRun": { - "content": "\n", - "textStyle": { - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 24795 - }, - { - "endIndex": 24797, - "paragraph": { - "elements": [ - { - "endIndex": 24797, - "startIndex": 24796, - "textRun": { - "content": "\n", - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - } - } - ], - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false - } - }, - "startIndex": 24796 - } - ] - }, - "documentId": "1kwYB2RE1EXYMOt7F5fm-0nrY6BA1AyWsBXz2vlfTfxA", - "documentStyle": { - "background": { - "color": {} - }, - "marginBottom": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginFooter": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginHeader": { - "magnitude": 36.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 72.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 72.0, - "unit": "PT" - }, - "pageNumberStart": 1, - "pageSize": { - "height": { - "magnitude": 792.0, - "unit": "PT" - }, - "width": { - "magnitude": 612.0, - "unit": "PT" - } - } - }, - "inlineObjects": { - "kix.1p75kdspyuxq": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/P1r5JJ2p10_bnJI4mYUfKiGZ7wkmVH2a1329yqfsQa_s3Cg79Z2RcHD0CnZvXBSFKKDkybK1wZRGqgBpA68LHKJiI82xNzOT_pEz5QYvtqqKFeyqZ1BCG7MbIdTwmud5fMuSxjQTzKuGqs_oWe2HOLq-UBUzxlFVIFQOxnSJvw-8Km7gsHx7DSBGxBmrhg4799YKyk4", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 401.0, - "unit": "PT" - }, - "width": { - "magnitude": 223.5, - "unit": "PT" - } - } - } - }, - "objectId": "kix.1p75kdspyuxq" - }, - "kix.89ot02lt7ssg": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh4.googleusercontent.com/UJk6BfNwtRnM9jE4MRvQopq3qCGYCLRtNkXJFgfGfbvEkylQ8z2P6PztSvqubU7v6sCOTaKi3rbWLzmoyTM_noJlh7whLqeOApQ6EAor5OWt_MRB3pWumqXprntUoZEknuSs1IrVHX29Pu2wQ0x_88iozQaR1YHGWVFzgK1tUaXKX1oP7vZKTMpacfidaCQ5Ub-hDjE", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 442.875, - "unit": "PT" - }, - "width": { - "magnitude": 247.1860465116279, - "unit": "PT" - } - } - } - }, - "objectId": "kix.89ot02lt7ssg" - }, - "kix.ez1fb9v1361v": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/nXSNC0_slaui5AScJTilWsKfDD5DkOzOPfXKZueIbh4Q28g32WGKjGrtxG524zgbNBcBlyVIuyporikCpA_paPbTJ33Q3ufhKV4LFsqxzSdvE_XlYIGsYpgsnaXdT-xZT4XHAV3ejoK-riQJLWaWxuhLtDGNbVwjI2NfZkblOvgFYmicmxXwbotw0QhVS-Mh9sxns2E", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 412.125, - "unit": "PT" - }, - "width": { - "magnitude": 229.61249999999998, - "unit": "PT" - } - } - } - }, - "objectId": "kix.ez1fb9v1361v" - }, - "kix.juxcraolrfj0": { - "inlineObjectProperties": { - "embeddedObject": { - "embeddedObjectBorder": { - "color": { - "color": { - "rgbColor": {} - } - }, - "dashStyle": "SOLID", - "propertyState": "NOT_RENDERED", - "width": { - "unit": "PT" - } - }, - "imageProperties": { - "contentUri": "https://lh6.googleusercontent.com/WgWK8X6fd29gZi6xJmmZXJQ2CG720Kw6yExRLNwYtAs3_-zmqpezplwWsqmKo_R8XSWkxupkZiUETO8s7-nPSJjtJotL37awQLm7zfdK2ifIDbruxc7tdSSdfb3FshR5INeW2SPBmMNukYbGl8mPWnrynDSdo8GF3OlpYAgWaND67hCPMxKGJG0Oh1zjKliqMdXcVGQ", - "cropProperties": {} - }, - "marginBottom": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginLeft": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginRight": { - "magnitude": 9.0, - "unit": "PT" - }, - "marginTop": { - "magnitude": 9.0, - "unit": "PT" - }, - "size": { - "height": { - "magnitude": 394.875, - "unit": "PT" - }, - "width": { - "magnitude": 196.3262195121951, - "unit": "PT" - } - } - } - }, - "objectId": "kix.juxcraolrfj0" - } - }, - "lists": { - "kix.1tjhv41sn0xa": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.1ztzk92hrth8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2ctr6ys6ni0e": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2jnyqucbt2t6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.2whi3gkwlssd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3cjxume1ox5j": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.3l2774habcsr": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4x1zl3kbw569": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.4yb7edsq6e7h": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5hb992swn8xf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5jdr984vfzt1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.5q2x329ym1hh": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.26666668, - "green": 0.26666668, - "red": 0.26666668 - } - } - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6f05htw8422z": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6j918luqnpw7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.6m37iee3p8wg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7or0vngkfvx7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.7uh5pgoi33tb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.83lp1z9knfuo": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.8bm96xhzoe5y": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.8budch7w7arn": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.98e48u1wcy7a": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.98vmteiu60y4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9u3cg917bqs8": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9ueckdtpugb1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9uhh20xkbn6m": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.9z83l2c17pcu": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.agpmvda4vr7h": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.anq6omciu13j": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.b7qotwh7gtna": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.bmk2w9stijyg": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.c7ejcv2rhol9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cbv3p81ktfkm": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.cw1c2jqsuto": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ed3ilj3kkhq2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.f3mtn21egf47": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.f9bz4vrobr4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fa4ji89str8f": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.fj7194xw5fjn": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g801zwj9tdo5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g846847cbhgd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.g8ukrj6l25im": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.gawmxw84fbl": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.gpkppvve7lf6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.hnxe8uaki5ye": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.huc4gmkwuq3u": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.ighvy8mje2ni": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 342.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 360.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 378.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 396.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 414.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 432.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.imsafi72ulmz": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.j2ckn4bxfuh7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jah968f0rvh1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.jkp7jly57b9l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.k0g7fgw2pxb9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kh0gu8ggzrfl": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.kjyum9q5klsd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l2nxb9cf1l7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.l9tvvj4pt5te": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.lwtrs6k81vg0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.nw9e0rbdtf2n": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.o6y9eyfrksu6": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.o72pyift6jdv": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.oerq1n8ypay0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.pcizye4e9dah": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.phibiqsq7jjd": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.pvf8i7z50kj2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.q5glzqgk6j58": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.q759u59r2yjj": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qk785s5gz3e7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qnkbj287noea": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qvkatskfprp3": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.qx7bo6w9dag0": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.r51tyrttcax1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.r8m6khspk25u": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rrgd3s9e8n6q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rup19lwpb96r": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.rza4cz1vbnb5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.s154rj5xcbab": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.s3ytlwab2m4": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.slxd9egkb7ci": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.sqqfdjlv2hm9": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tismz98me1tb": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.tobmpp8mbh7q": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.uye62wdrnhk7": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.v58qrdjinxbw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vc2fcwdxd37v": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.vwvs454chlx5": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wa0nkis9zlxf": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.wvtqhihdjvtw": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.x2xqmh4hm4pa": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Arial", - "weight": 400 - } - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.xj4zd89gdvlp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphType": "GLYPH_TYPE_UNSPECIFIED", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.y4auuiny9mus": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 342.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 360.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 378.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 396.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.yadiw4lw6xu2": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z1u1i7qvii2l": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z25dkq3ogzpp": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z2hyt12r7kc1": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.z46ih1vlabol": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%2.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%5.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6.", - "glyphType": "DECIMAL", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7.", - "glyphType": "ALPHA", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "END", - "glyphFormat": "%8.", - "glyphType": "ROMAN", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - }, - "kix.zgjdicbyim0z": { - "listProperties": { - "nestingLevels": [ - { - "bulletAlignment": "START", - "glyphFormat": "%0", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 18.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 36.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%1", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 54.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 72.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%2", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 90.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 108.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%3", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 126.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 144.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%4", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 162.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 180.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%5", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 198.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 216.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%6", - "glyphSymbol": "●", - "indentFirstLine": { - "magnitude": 234.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 252.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%7", - "glyphSymbol": "○", - "indentFirstLine": { - "magnitude": 270.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 288.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - }, - { - "bulletAlignment": "START", - "glyphFormat": "%8", - "glyphSymbol": "■", - "indentFirstLine": { - "magnitude": 306.0, - "unit": "PT" - }, - "indentStart": { - "magnitude": 324.0, - "unit": "PT" - }, - "startNumber": 1, - "textStyle": { - "underline": false - } - } - ] - } - } - }, - "namedStyles": { - "styles": [ - { - "namedStyleType": "NORMAL_TEXT", - "paragraphStyle": { - "alignment": "START", - "avoidWidowAndOrphan": true, - "borderBetween": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderBottom": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderLeft": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderRight": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "borderTop": { - "color": {}, - "dashStyle": "SOLID", - "padding": { - "unit": "PT" - }, - "width": { - "unit": "PT" - } - }, - "direction": "LEFT_TO_RIGHT", - "indentEnd": { - "unit": "PT" - }, - "indentFirstLine": { - "unit": "PT" - }, - "indentStart": { - "unit": "PT" - }, - "keepLinesTogether": false, - "keepWithNext": false, - "lineSpacing": 115.0, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "shading": { - "backgroundColor": {} - }, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "unit": "PT" - }, - "spacingMode": "NEVER_COLLAPSE" - }, - "textStyle": { - "backgroundColor": {}, - "baselineOffset": "NONE", - "bold": false, - "fontSize": { - "magnitude": 11.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": {} - } - }, - "italic": false, - "smallCaps": false, - "strikethrough": false, - "underline": false, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_1", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.6fjw6cht0bf", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_1", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 16.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_2", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.ecgsg25eeya7", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_2", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_3", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.4pgk284l6s7z", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_3", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "bold": true, - "fontSize": { - "magnitude": 12.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_4", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.9ujhi55jbp4b", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_4", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "underline": true, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_5", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.yjfswb1t0sub", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_5", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "HEADING_6", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.91dfhsx5n4l3", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "HEADING_6", - "pageBreakBefore": false, - "spaceAbove": { - "magnitude": 8.0, - "unit": "PT" - } - }, - "textStyle": { - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - }, - { - "namedStyleType": "TITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "headingId": "h.uvzknuxefxg9", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "TITLE", - "pageBreakBefore": false - }, - "textStyle": { - "fontSize": { - "magnitude": 21.0, - "unit": "PT" - }, - "weightedFontFamily": { - "fontFamily": "Roboto", - "weight": 400 - } - } - }, - { - "namedStyleType": "SUBTITLE", - "paragraphStyle": { - "direction": "LEFT_TO_RIGHT", - "keepLinesTogether": true, - "keepWithNext": true, - "namedStyleType": "NORMAL_TEXT", - "pageBreakBefore": false, - "spaceAbove": { - "unit": "PT" - }, - "spaceBelow": { - "magnitude": 10.0, - "unit": "PT" - } - }, - "textStyle": { - "fontSize": { - "magnitude": 13.0, - "unit": "PT" - }, - "foregroundColor": { - "color": { - "rgbColor": { - "blue": 0.4, - "green": 0.4, - "red": 0.4 - } - } - }, - "italic": true, - "weightedFontFamily": { - "fontFamily": "Trebuchet MS", - "weight": 400 - } - } - } - ] - }, - "revisionId": "ANeT5PQaq4V_xuNmz8wVcYiUd65adTPMM67i__JctWPcmS5SXgnhEW5c-RQlHUEAMS3X3dNpFRQY_08xDoLxYQ", - "suggestionsViewMode": "PREVIEW_WITHOUT_SUGGESTIONS", - "title": "Adding Google Maps to a Flutter app codelab" -} \ No newline at end of file diff --git a/tooling/codelab_rebuild/bin/codelab_rebuild.dart b/tooling/codelab_rebuild/bin/codelab_rebuild.dart index d57b6c5f37..f6753d0bac 100644 --- a/tooling/codelab_rebuild/bin/codelab_rebuild.dart +++ b/tooling/codelab_rebuild/bin/codelab_rebuild.dart @@ -13,8 +13,9 @@ void main(List arguments) { }); if (arguments.length != 1) { - Logger('main') - .severe('Usage: codelab_rebuild path/to/codelab_rebuild.yaml'); + Logger( + 'main', + ).severe('Usage: codelab_rebuild path/to/codelab_rebuild.yaml'); exit(1); } diff --git a/tooling/codelab_rebuild/lib/src/blueprint.dart b/tooling/codelab_rebuild/lib/src/blueprint.dart index 0a7f796c94..dbc825f9ac 100644 --- a/tooling/codelab_rebuild/lib/src/blueprint.dart +++ b/tooling/codelab_rebuild/lib/src/blueprint.dart @@ -14,11 +14,7 @@ part 'blueprint.g.dart'; final _logger = Logger('blueprint'); -@JsonSerializable( - anyMap: true, - checked: true, - disallowUnrecognizedKeys: true, -) +@JsonSerializable(anyMap: true, checked: true, disallowUnrecognizedKeys: true) class Blueprint { @JsonKey(required: true) final String name; @@ -62,10 +58,7 @@ class Blueprint { } factory Blueprint.fromString(String yaml) { - return checkedYamlDecode( - yaml, - (m) => Blueprint.fromJson(m!), - ); + return checkedYamlDecode(yaml, (m) => Blueprint.fromJson(m!)); } /// Rebuild a blueprint in a target directory. @@ -77,11 +70,7 @@ class Blueprint { String toString() => 'Blueprint: ${toJson()}'; } -@JsonSerializable( - anyMap: true, - checked: true, - disallowUnrecognizedKeys: true, -) +@JsonSerializable(anyMap: true, checked: true, disallowUnrecognizedKeys: true) class BlueprintStep { @JsonKey(required: true) final String name; @@ -273,21 +262,24 @@ class BlueprintStep { // We can't have patch and patch-u and patch-c if (patch != null && patchU != null && patchC != null) { _logger.warning( - 'Invalid step, multiple of patch, patch-u and patch-c specified: $name'); + 'Invalid step, multiple of patch, patch-u and patch-c specified: $name', + ); return false; } // If we have replace-contents, we need a file to apply it to. if (replaceContents != null && path == null) { - _logger - .warning('Invalid step, replace-contents with no target path: $name'); + _logger.warning( + 'Invalid step, replace-contents with no target path: $name', + ); return false; } // If we have base64-contents, we need a file to apply it to. if (base64Contents != null && path == null) { - _logger - .warning('Invalid step, base64-contents with no target path: $name'); + _logger.warning( + 'Invalid step, base64-contents with no target path: $name', + ); return false; } @@ -312,7 +304,8 @@ class BlueprintStep { // If we have a stripLinesContaining, we need a path to strip if (stripLinesContaining != null && path == null) { _logger.warning( - 'Invalid step, strip-lines-containing with no target path: $name'); + 'Invalid step, strip-lines-containing with no target path: $name', + ); return false; } @@ -322,7 +315,8 @@ class BlueprintStep { iphoneosDeploymentTarget == null && macosxDeploymentTarget == null) { _logger.warning( - 'Invalid step, xcode-add-file with no xcode-project-path, iphoneos-deployment-target or macosx-deployment-target: $name'); + 'Invalid step, xcode-add-file with no xcode-project-path, iphoneos-deployment-target or macosx-deployment-target: $name', + ); return false; } @@ -349,7 +343,8 @@ class BlueprintStep { xcodeAddFile != null || xcodeProjectPath != null)) { _logger.warning( - 'Invalid step, patch with command(s), replace-contents, or base64-contents: $name'); + 'Invalid step, patch with command(s), replace-contents, or base64-contents: $name', + ); return false; } @@ -364,11 +359,7 @@ class BlueprintStep { String toString() => 'BlueprintStep: ${toJson()}'; } -@JsonSerializable( - anyMap: true, - checked: true, - disallowUnrecognizedKeys: true, -) +@JsonSerializable(anyMap: true, checked: true, disallowUnrecognizedKeys: true) class FromTo { final String from; final String to; diff --git a/tooling/codelab_rebuild/lib/src/blueprint.g.dart b/tooling/codelab_rebuild/lib/src/blueprint.g.dart index 577c7f4e8b..1315b1266f 100644 --- a/tooling/codelab_rebuild/lib/src/blueprint.g.dart +++ b/tooling/codelab_rebuild/lib/src/blueprint.g.dart @@ -6,151 +6,169 @@ part of 'blueprint.dart'; // JsonSerializableGenerator // ************************************************************************** -Blueprint _$BlueprintFromJson(Map json) => $checkedCreate( - 'Blueprint', - json, - ($checkedConvert) { - $checkKeys( - json, - allowedKeys: const ['name', 'steps'], - requiredKeys: const ['name', 'steps'], - ); - final val = Blueprint( - name: $checkedConvert('name', (v) => v as String), - steps: $checkedConvert( - 'steps', - (v) => (v as List) +Blueprint _$BlueprintFromJson(Map json) => + $checkedCreate('Blueprint', json, ($checkedConvert) { + $checkKeys( + json, + allowedKeys: const ['name', 'steps'], + requiredKeys: const ['name', 'steps'], + ); + final val = Blueprint( + name: $checkedConvert('name', (v) => v as String), + steps: $checkedConvert( + 'steps', + (v) => + (v as List) .map((e) => BlueprintStep.fromJson(e as Map)) - .toList()), - ); - return val; - }, - ); + .toList(), + ), + ); + return val; + }); Map _$BlueprintToJson(Blueprint instance) => { - 'name': instance.name, - 'steps': instance.steps, - }; + 'name': instance.name, + 'steps': instance.steps, +}; BlueprintStep _$BlueprintStepFromJson(Map json) => $checkedCreate( - 'BlueprintStep', + 'BlueprintStep', + json, + ($checkedConvert) { + $checkKeys( json, - ($checkedConvert) { - $checkKeys( - json, - allowedKeys: const [ - 'name', - 'steps', - 'path', - 'base64-contents', - 'patch', - 'patch-u', - 'patch-c', - 'replace-contents', - 'platforms', - 'dart', - 'flutter', - 'git', - 'pod', - 'rm', - 'mkdir', - 'mkdirs', - 'rmdir', - 'rmdirs', - 'copydir', - 'copy', - 'renamedir', - 'rename', - 'retrieve-url', - 'tar', - '7z', - 'strip-lines-containing', - 'stop', - 'xcode-add-file', - 'xcode-project-path', - 'iphoneos-deployment-target', - 'macosx-deployment-target', - 'full-screen-macos-main-menu-xib' - ], - requiredKeys: const ['name'], - ); - final val = BlueprintStep( - name: $checkedConvert('name', (v) => v as String), - steps: $checkedConvert( - 'steps', - (v) => - (v as List?) - ?.map((e) => BlueprintStep.fromJson(e as Map)) - .toList() ?? - const []), - base64Contents: - $checkedConvert('base64-contents', (v) => v as String?), - patch: $checkedConvert('patch', (v) => v as String?), - patchU: $checkedConvert('patch-u', (v) => v as String?), - patchC: $checkedConvert('patch-c', (v) => v as String?), - path: $checkedConvert('path', (v) => v as String?), - replaceContents: - $checkedConvert('replace-contents', (v) => v as String?), - mkdir: $checkedConvert('mkdir', (v) => v as String?), - mkdirs: $checkedConvert( - 'mkdirs', - (v) => - (v as List?)?.map((e) => e as String).toList() ?? - const []), - rmdir: $checkedConvert('rmdir', (v) => v as String?), - rmdirs: $checkedConvert( - 'rmdirs', - (v) => - (v as List?)?.map((e) => e as String).toList() ?? - const []), - copydir: $checkedConvert( - 'copydir', (v) => v == null ? null : FromTo.fromJson(v as Map)), - copy: $checkedConvert( - 'copy', (v) => v == null ? null : FromTo.fromJson(v as Map)), - renamedir: $checkedConvert( - 'renamedir', (v) => v == null ? null : FromTo.fromJson(v as Map)), - rename: $checkedConvert( - 'rename', (v) => v == null ? null : FromTo.fromJson(v as Map)), - platforms: $checkedConvert('platforms', - (v) => (v as List?)?.map((e) => e as String).toList()), - dart: $checkedConvert('dart', (v) => v as String?), - flutter: $checkedConvert('flutter', (v) => v as String?), - git: $checkedConvert('git', (v) => v as String?), - rm: $checkedConvert('rm', (v) => v as String?), - pod: $checkedConvert('pod', (v) => v as String?), - retrieveUrl: $checkedConvert('retrieve-url', (v) => v as String?), - tar: $checkedConvert('tar', (v) => v as String?), - sevenZip: $checkedConvert('7z', (v) => v as String?), - stripLinesContaining: - $checkedConvert('strip-lines-containing', (v) => v as String?), - stop: $checkedConvert('stop', (v) => v as bool?), - xcodeAddFile: $checkedConvert('xcode-add-file', (v) => v as String?), - xcodeProjectPath: - $checkedConvert('xcode-project-path', (v) => v as String?), - macOsMainMenuXib: $checkedConvert( - 'full-screen-macos-main-menu-xib', (v) => v as String?), - iphoneosDeploymentTarget: $checkedConvert( - 'iphoneos-deployment-target', (v) => v as String?), - macosxDeploymentTarget: - $checkedConvert('macosx-deployment-target', (v) => v as String?), - ); - return val; - }, - fieldKeyMap: const { - 'base64Contents': 'base64-contents', - 'patchU': 'patch-u', - 'patchC': 'patch-c', - 'replaceContents': 'replace-contents', - 'retrieveUrl': 'retrieve-url', - 'sevenZip': '7z', - 'stripLinesContaining': 'strip-lines-containing', - 'xcodeAddFile': 'xcode-add-file', - 'xcodeProjectPath': 'xcode-project-path', - 'macOsMainMenuXib': 'full-screen-macos-main-menu-xib', - 'iphoneosDeploymentTarget': 'iphoneos-deployment-target', - 'macosxDeploymentTarget': 'macosx-deployment-target' - }, + allowedKeys: const [ + 'name', + 'steps', + 'path', + 'base64-contents', + 'patch', + 'patch-u', + 'patch-c', + 'replace-contents', + 'platforms', + 'dart', + 'flutter', + 'git', + 'pod', + 'rm', + 'mkdir', + 'mkdirs', + 'rmdir', + 'rmdirs', + 'copydir', + 'copy', + 'renamedir', + 'rename', + 'retrieve-url', + 'tar', + '7z', + 'strip-lines-containing', + 'stop', + 'xcode-add-file', + 'xcode-project-path', + 'iphoneos-deployment-target', + 'macosx-deployment-target', + 'full-screen-macos-main-menu-xib', + ], + requiredKeys: const ['name'], ); + final val = BlueprintStep( + name: $checkedConvert('name', (v) => v as String), + steps: $checkedConvert( + 'steps', + (v) => + (v as List?) + ?.map((e) => BlueprintStep.fromJson(e as Map)) + .toList() ?? + const [], + ), + base64Contents: $checkedConvert('base64-contents', (v) => v as String?), + patch: $checkedConvert('patch', (v) => v as String?), + patchU: $checkedConvert('patch-u', (v) => v as String?), + patchC: $checkedConvert('patch-c', (v) => v as String?), + path: $checkedConvert('path', (v) => v as String?), + replaceContents: $checkedConvert('replace-contents', (v) => v as String?), + mkdir: $checkedConvert('mkdir', (v) => v as String?), + mkdirs: $checkedConvert( + 'mkdirs', + (v) => + (v as List?)?.map((e) => e as String).toList() ?? const [], + ), + rmdir: $checkedConvert('rmdir', (v) => v as String?), + rmdirs: $checkedConvert( + 'rmdirs', + (v) => + (v as List?)?.map((e) => e as String).toList() ?? const [], + ), + copydir: $checkedConvert( + 'copydir', + (v) => v == null ? null : FromTo.fromJson(v as Map), + ), + copy: $checkedConvert( + 'copy', + (v) => v == null ? null : FromTo.fromJson(v as Map), + ), + renamedir: $checkedConvert( + 'renamedir', + (v) => v == null ? null : FromTo.fromJson(v as Map), + ), + rename: $checkedConvert( + 'rename', + (v) => v == null ? null : FromTo.fromJson(v as Map), + ), + platforms: $checkedConvert( + 'platforms', + (v) => (v as List?)?.map((e) => e as String).toList(), + ), + dart: $checkedConvert('dart', (v) => v as String?), + flutter: $checkedConvert('flutter', (v) => v as String?), + git: $checkedConvert('git', (v) => v as String?), + rm: $checkedConvert('rm', (v) => v as String?), + pod: $checkedConvert('pod', (v) => v as String?), + retrieveUrl: $checkedConvert('retrieve-url', (v) => v as String?), + tar: $checkedConvert('tar', (v) => v as String?), + sevenZip: $checkedConvert('7z', (v) => v as String?), + stripLinesContaining: $checkedConvert( + 'strip-lines-containing', + (v) => v as String?, + ), + stop: $checkedConvert('stop', (v) => v as bool?), + xcodeAddFile: $checkedConvert('xcode-add-file', (v) => v as String?), + xcodeProjectPath: $checkedConvert( + 'xcode-project-path', + (v) => v as String?, + ), + macOsMainMenuXib: $checkedConvert( + 'full-screen-macos-main-menu-xib', + (v) => v as String?, + ), + iphoneosDeploymentTarget: $checkedConvert( + 'iphoneos-deployment-target', + (v) => v as String?, + ), + macosxDeploymentTarget: $checkedConvert( + 'macosx-deployment-target', + (v) => v as String?, + ), + ); + return val; + }, + fieldKeyMap: const { + 'base64Contents': 'base64-contents', + 'patchU': 'patch-u', + 'patchC': 'patch-c', + 'replaceContents': 'replace-contents', + 'retrieveUrl': 'retrieve-url', + 'sevenZip': '7z', + 'stripLinesContaining': 'strip-lines-containing', + 'xcodeAddFile': 'xcode-add-file', + 'xcodeProjectPath': 'xcode-project-path', + 'macOsMainMenuXib': 'full-screen-macos-main-menu-xib', + 'iphoneosDeploymentTarget': 'iphoneos-deployment-target', + 'macosxDeploymentTarget': 'macosx-deployment-target', + }, +); Map _$BlueprintStepToJson(BlueprintStep instance) => { @@ -188,23 +206,17 @@ Map _$BlueprintStepToJson(BlueprintStep instance) => 'full-screen-macos-main-menu-xib': instance.macOsMainMenuXib, }; -FromTo _$FromToFromJson(Map json) => $checkedCreate( - 'FromTo', - json, - ($checkedConvert) { - $checkKeys( - json, - allowedKeys: const ['from', 'to'], - ); - final val = FromTo( - from: $checkedConvert('from', (v) => v as String), - to: $checkedConvert('to', (v) => v as String), - ); - return val; - }, - ); +FromTo _$FromToFromJson(Map json) => + $checkedCreate('FromTo', json, ($checkedConvert) { + $checkKeys(json, allowedKeys: const ['from', 'to']); + final val = FromTo( + from: $checkedConvert('from', (v) => v as String), + to: $checkedConvert('to', (v) => v as String), + ); + return val; + }); Map _$FromToToJson(FromTo instance) => { - 'from': instance.from, - 'to': instance.to, - }; + 'from': instance.from, + 'to': instance.to, +}; diff --git a/tooling/codelab_rebuild/lib/src/rebuild_blueprint.dart b/tooling/codelab_rebuild/lib/src/rebuild_blueprint.dart index 295c2f20a0..8e653d5aa6 100644 --- a/tooling/codelab_rebuild/lib/src/rebuild_blueprint.dart +++ b/tooling/codelab_rebuild/lib/src/rebuild_blueprint.dart @@ -41,7 +41,8 @@ Future _buildBlueprintStep(Directory cwd, BlueprintStep step) async { if (platforms != null) { if (!platforms.contains(Platform.operatingSystem)) { _logger.info( - 'Skipping because ${Platform.operatingSystem} is not in [${platforms.join(',')}].'); + 'Skipping because ${Platform.operatingSystem} is not in [${platforms.join(',')}].', + ); return; } } @@ -58,17 +59,19 @@ Future _buildBlueprintStep(Directory cwd, BlueprintStep step) async { final dir = step.mkdir; if (dir != null) { _mkdir( - step.path != null - ? p.join(cwd.path, step.path, dir) - : p.join(cwd.path, dir), - step: step); + step.path != null + ? p.join(cwd.path, step.path, dir) + : p.join(cwd.path, dir), + step: step, + ); } else { for (final dir in step.mkdirs) { _mkdir( - step.path != null - ? p.join(cwd.path, step.path, dir) - : p.join(cwd.path, dir), - step: step); + step.path != null + ? p.join(cwd.path, step.path, dir) + : p.join(cwd.path, dir), + step: step, + ); } } return; @@ -78,17 +81,19 @@ Future _buildBlueprintStep(Directory cwd, BlueprintStep step) async { final dir = step.rmdir; if (dir != null) { _rmdir( - step.path != null - ? p.join(cwd.path, step.path, dir) - : p.join(cwd.path, dir), - step: step); + step.path != null + ? p.join(cwd.path, step.path, dir) + : p.join(cwd.path, dir), + step: step, + ); } else { for (final dir in step.rmdirs) { _rmdir( - step.path != null - ? p.join(cwd.path, step.path, dir) - : p.join(cwd.path, dir), - step: step); + step.path != null + ? p.join(cwd.path, step.path, dir) + : p.join(cwd.path, dir), + step: step, + ); } } return; @@ -98,14 +103,16 @@ Future _buildBlueprintStep(Directory cwd, BlueprintStep step) async { if (renamedir != null) { if (step.path != null) { _renamedir( - from: p.join(cwd.path, step.path, renamedir.from), - to: p.join(cwd.path, step.path, renamedir.to), - step: step); + from: p.join(cwd.path, step.path, renamedir.from), + to: p.join(cwd.path, step.path, renamedir.to), + step: step, + ); } else { _renamedir( - from: p.join(cwd.path, renamedir.from), - to: p.join(cwd.path, renamedir.to), - step: step); + from: p.join(cwd.path, renamedir.from), + to: p.join(cwd.path, renamedir.to), + step: step, + ); } return; } @@ -114,14 +121,16 @@ Future _buildBlueprintStep(Directory cwd, BlueprintStep step) async { if (rename != null) { if (step.path != null) { _rename( - from: p.join(cwd.path, step.path, rename.from), - to: p.join(cwd.path, step.path, rename.to), - step: step); + from: p.join(cwd.path, step.path, rename.from), + to: p.join(cwd.path, step.path, rename.to), + step: step, + ); } else { _rename( - from: p.join(cwd.path, rename.from), - to: p.join(cwd.path, rename.to), - step: step); + from: p.join(cwd.path, rename.from), + to: p.join(cwd.path, rename.to), + step: step, + ); } return; } @@ -130,14 +139,16 @@ Future _buildBlueprintStep(Directory cwd, BlueprintStep step) async { if (cpdir != null) { if (step.path != null) { _cpdir( - from: p.join(cwd.path, step.path, cpdir.from), - to: p.join(cwd.path, step.path, cpdir.to), - step: step); + from: p.join(cwd.path, step.path, cpdir.from), + to: p.join(cwd.path, step.path, cpdir.to), + step: step, + ); } else { _cpdir( - from: p.join(cwd.path, cpdir.from), - to: p.join(cwd.path, cpdir.to), - step: step); + from: p.join(cwd.path, cpdir.from), + to: p.join(cwd.path, cpdir.to), + step: step, + ); } return; } @@ -146,14 +157,16 @@ Future _buildBlueprintStep(Directory cwd, BlueprintStep step) async { if (cp != null) { if (step.path != null) { _cp( - from: p.join(cwd.path, step.path, cp.from), - to: p.join(cwd.path, step.path, cp.to), - step: step); + from: p.join(cwd.path, step.path, cp.from), + to: p.join(cwd.path, step.path, cp.to), + step: step, + ); } else { _cp( - from: p.join(cwd.path, cp.from), - to: p.join(cwd.path, cp.to), - step: step); + from: p.join(cwd.path, cp.from), + to: p.join(cwd.path, cp.to), + step: step, + ); } return; } @@ -196,12 +209,7 @@ Future _buildBlueprintStep(Directory cwd, BlueprintStep step) async { final dart = step.dart; if (dart != null) { - await _runNamedCommand( - command: 'dart', - step: step, - cwd: cwd, - args: dart, - ); + await _runNamedCommand(command: 'dart', step: step, cwd: cwd, args: dart); return; } @@ -231,23 +239,13 @@ Future _buildBlueprintStep(Directory cwd, BlueprintStep step) async { final tar = step.tar; if (tar != null) { - await _runNamedCommand( - command: 'tar', - step: step, - cwd: cwd, - args: tar, - ); + await _runNamedCommand(command: 'tar', step: step, cwd: cwd, args: tar); return; } final sevenZip = step.sevenZip; if (sevenZip != null) { - await _runNamedCommand( - command: '7z', - step: step, - cwd: cwd, - args: sevenZip, - ); + await _runNamedCommand(command: '7z', step: step, cwd: cwd, args: sevenZip); return; } @@ -277,10 +275,7 @@ project = Xcodeproj::Project.open("$xcodeProjectPath") group = project.main_group["Runner"] project.targets.first.add_file_references([group.new_file("$xcodeAddFile")]) project.save -''' - .split('\n') - .map((str) => "-e '$str'") - .join(' '); +'''.split('\n').map((str) => "-e '$str'").join(' '); } else if (iphoneosDeploymentTarget != null && iphoneosDeploymentTarget.isNotEmpty) { script = ''' @@ -289,10 +284,7 @@ project = Xcodeproj::Project.open("$xcodeProjectPath") group = project.main_group["Runner"] project.targets.each { |t| t.build_configurations.each { |c| c.build_settings["IPHONEOS_DEPLOYMENT_TARGET"] ||= $iphoneosDeploymentTarget } } project.save -''' - .split('\n') - .map((str) => "-e '$str'") - .join(' '); +'''.split('\n').map((str) => "-e '$str'").join(' '); } else if (macosxDeploymentTarget != null && macosxDeploymentTarget.isNotEmpty) { script = ''' @@ -301,23 +293,22 @@ project = Xcodeproj::Project.open("$xcodeProjectPath") group = project.main_group["Runner"] project.targets.each { |t| t.build_configurations.each { |c| c.build_settings["MACOSX_DEPLOYMENT_TARGET"] ||= $macosxDeploymentTarget } } project.save -''' - .split('\n') - .map((str) => "-e '$str'") - .join(' '); +'''.split('\n').map((str) => "-e '$str'").join(' '); } else { _logger.severe( - 'xcode-add-file requires xcode-project-path, iphoneos-deployment-target' - ' or macosx-deployment-target: ${step.name}'); + 'xcode-add-file requires xcode-project-path, iphoneos-deployment-target' + ' or macosx-deployment-target: ${step.name}', + ); exit(-1); } await _runNamedCommand( - command: 'ruby', - step: step, - cwd: cwd, - args: script, - exitOnStdErr: false); + command: 'ruby', + step: step, + cwd: cwd, + args: script, + exitOnStdErr: false, + ); return; } // Modifies a macOS MainMenu.xib file to make the titlebar transparent, @@ -345,7 +336,8 @@ project.save final path = step.path; if (path == null) { _logger.severe( - 'patch, base64-contents and replace-contents require a path: ${step.name}'); + 'patch, base64-contents and replace-contents require a path: ${step.name}', + ); exit(-1); } @@ -362,14 +354,19 @@ project.save late final Process process; if (patch != null) { - process = - await Process.start('patch', [fullPath], workingDirectory: cwd.path); + process = await Process.start('patch', [ + fullPath, + ], workingDirectory: cwd.path); } else if (patchC != null) { - process = await Process.start('patch', ['-c', fullPath], - workingDirectory: cwd.path); + process = await Process.start('patch', [ + '-c', + fullPath, + ], workingDirectory: cwd.path); } else if (patchU != null) { - process = await Process.start('patch', ['-u', fullPath], - workingDirectory: cwd.path); + process = await Process.start('patch', [ + '-u', + fullPath, + ], workingDirectory: cwd.path); } process.stderr.transform(utf8.decoder).listen((str) { seenError = true; @@ -394,8 +391,9 @@ project.save final base64Contents = step.base64Contents; if (base64Contents != null) { - File(p.join(cwd.path, path)) - .writeAsBytesSync(base64Decode(base64Contents.split('\n').join(''))); + File( + p.join(cwd.path, path), + ).writeAsBytesSync(base64Decode(base64Contents.split('\n').join(''))); return; } @@ -418,8 +416,9 @@ Future _runNamedCommand({ bool exitOnStdErr = true, }) async { var seenStdErr = false; - final String workingDirectory = p - .canonicalize(step.path != null ? p.join(cwd.path, step.path) : cwd.path); + final String workingDirectory = p.canonicalize( + step.path != null ? p.join(cwd.path, step.path) : cwd.path, + ); final shellSplit = io.shellSplit(args); final process = await Process.start( command, diff --git a/tooling/codelab_rebuild/pubspec.yaml b/tooling/codelab_rebuild/pubspec.yaml index a5f226d7a0..01f31448be 100644 --- a/tooling/codelab_rebuild/pubspec.yaml +++ b/tooling/codelab_rebuild/pubspec.yaml @@ -3,7 +3,7 @@ description: Rebuild codelabs from a yaml file. version: 1.0.1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 dependencies: checked_yaml: ^2.0.1 diff --git a/tooling/codelab_rebuild/test/load_config_test.dart b/tooling/codelab_rebuild/test/load_config_test.dart index e0a426b91c..437e5364c2 100644 --- a/tooling/codelab_rebuild/test/load_config_test.dart +++ b/tooling/codelab_rebuild/test/load_config_test.dart @@ -59,9 +59,13 @@ steps: expect(blueprint.steps[0].steps[1].isValid, equals(true)); expect(blueprint.steps[0].steps[2].isValid, equals(true)); expect(blueprint.steps[0].steps[2].name, equals('blueprint')); - expect(blueprint.steps[0].steps[2].path, - equals('cupertino_store/analysis_options.yaml')); - expect(blueprint.steps[0].steps[2].replaceContents, equals(''' + expect( + blueprint.steps[0].steps[2].path, + equals('cupertino_store/analysis_options.yaml'), + ); + expect( + blueprint.steps[0].steps[2].replaceContents, + equals(''' # Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -77,16 +81,16 @@ steps: # limitations under the License. include: ../../analysis_options.yaml -''')); +'''), + ); expect(blueprint.steps[0].steps[3].isValid, equals(true)); expect(blueprint.steps[0].steps[4].isValid, equals(true)); expect(blueprint.steps[0].steps[5].isValid, equals(true)); - expect(blueprint.steps[0].steps[5].name, - equals('Remove the Android, Web, and Desktop runners')); expect( - blueprint.steps[0].steps[5].path, - equals('cupertino_store'), + blueprint.steps[0].steps[5].name, + equals('Remove the Android, Web, and Desktop runners'), ); + expect(blueprint.steps[0].steps[5].path, equals('cupertino_store')); expect( blueprint.steps[0].steps[5].rmdirs, equals(['android', 'linux', 'macos', 'web', 'windows']), diff --git a/webview_flutter/codelab_rebuild.yaml b/webview_flutter/codelab_rebuild.yaml index 4e7f557000..0b4436f356 100644 --- a/webview_flutter/codelab_rebuild.yaml +++ b/webview_flutter/codelab_rebuild.yaml @@ -42,8 +42,8 @@ steps: - name: Add webview_flutter path: webview_in_flutter flutter: pub add webview_flutter - - name: Patch android/app/build.gradle - path: webview_in_flutter/android/app/build.gradle + - name: Patch android/app/build.gradle.kts + path: webview_in_flutter/android/app/build.gradle.kts patch-u: | --- b/webview_flutter/step_03/android/app/build.gradle +++ a/webview_flutter/step_03/android/app/build.gradle @@ -56,30 +56,6 @@ steps: targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName - - name: Patch android/settings.gradle - path: webview_in_flutter/android/settings.gradle - patch-u: | - --- b/boring_to_beautiful/step_01/android/settings.gradle - +++ a/boring_to_beautiful/step_01/android/settings.gradle - @@ -18,7 +18,7 @@ pluginManagement { - - plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - - id "com.android.application" version "8.1.0" apply false - + id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false - } - - name: Patch android/gradle/wrapper/gradle-wrapper.properties - path: webview_in_flutter/android/gradle/wrapper/gradle-wrapper.properties - patch-u: | - --- b/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties - +++ a/boring_to_beautiful/step_01/android/gradle/wrapper/gradle-wrapper.properties - @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME - distributionPath=wrapper/dists - zipStoreBase=GRADLE_USER_HOME - zipStorePath=wrapper/dists - -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip - +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip - name: Build iOS platforms: [ macos ] path: webview_in_flutter @@ -102,47 +78,36 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; - + void main() { - runApp( - MaterialApp( - theme: ThemeData(), - home: const WebViewApp(), - ), - ); + runApp(MaterialApp(theme: ThemeData(), home: const WebViewApp())); } - + class WebViewApp extends StatefulWidget { const WebViewApp({super.key}); - + @override State createState() => _WebViewAppState(); } - + class _WebViewAppState extends State { late final WebViewController controller; - + @override void initState() { super.initState(); - controller = WebViewController() - ..loadRequest( - Uri.parse('https://flutter.dev'), - ); + controller = + WebViewController()..loadRequest(Uri.parse('https://flutter.dev')); } - + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Flutter WebView'), - ), - body: WebViewWidget( - controller: controller, - ), + appBar: AppBar(title: const Text('Flutter WebView')), + body: WebViewWidget(controller: controller), ); } } @@ -168,55 +133,52 @@ steps: import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; - + class WebViewStack extends StatefulWidget { const WebViewStack({super.key}); - + @override State createState() => _WebViewStackState(); } - + class _WebViewStackState extends State { var loadingPercentage = 0; late final WebViewController controller; - + @override void initState() { super.initState(); - controller = WebViewController() - ..setNavigationDelegate(NavigationDelegate( - onPageStarted: (url) { - setState(() { - loadingPercentage = 0; - }); - }, - onProgress: (progress) { - setState(() { - loadingPercentage = progress; - }); - }, - onPageFinished: (url) { - setState(() { - loadingPercentage = 100; - }); - }, - )) - ..loadRequest( - Uri.parse('https://flutter.dev'), - ); + controller = + WebViewController() + ..setNavigationDelegate( + NavigationDelegate( + onPageStarted: (url) { + setState(() { + loadingPercentage = 0; + }); + }, + onProgress: (progress) { + setState(() { + loadingPercentage = progress; + }); + }, + onPageFinished: (url) { + setState(() { + loadingPercentage = 100; + }); + }, + ), + ) + ..loadRequest(Uri.parse('https://flutter.dev')); } - + @override Widget build(BuildContext context) { return Stack( children: [ - WebViewWidget( - controller: controller, - ), + WebViewWidget(controller: controller), if (loadingPercentage < 100) - LinearProgressIndicator( - value: loadingPercentage / 100.0, - ), + LinearProgressIndicator(value: loadingPercentage / 100.0), ], ); } @@ -235,8 +197,8 @@ steps: +import 'src/web_view_stack.dart'; void main() { - runApp( - @@ -22,26 +23,13 @@ class WebViewApp extends StatefulWidget { + runApp(MaterialApp(theme: ThemeData(), home: const WebViewApp())); + @@ -17,20 +18,11 @@ class WebViewApp extends StatefulWidget { } class _WebViewAppState extends State { @@ -245,21 +207,15 @@ steps: - @override - void initState() { - super.initState(); - - controller = WebViewController() - - ..loadRequest( - - Uri.parse('https://flutter.dev'), - - ); + - controller = + - WebViewController()..loadRequest(Uri.parse('https://flutter.dev')); - } - @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Flutter WebView'), - ), - - body: WebViewWidget( - - controller: controller, - - ), + appBar: AppBar(title: const Text('Flutter WebView')), + - body: WebViewWidget(controller: controller), + body: const WebViewStack(), ); } @@ -344,7 +300,7 @@ steps: import 'src/web_view_stack.dart'; void main() { - @@ -23,13 +25,27 @@ class WebViewApp extends StatefulWidget { + @@ -18,11 +20,23 @@ class WebViewApp extends StatefulWidget { } class _WebViewAppState extends State { @@ -353,22 +309,19 @@ steps: + @override + void initState() { + super.initState(); - + controller = WebViewController() - + ..loadRequest( - + Uri.parse('https://flutter.dev'), - + ); + + controller = + + WebViewController()..loadRequest(Uri.parse('https://flutter.dev')); + } + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Flutter WebView'), - + actions: [ - + NavigationControls(controller: controller), - + ], - ), + - appBar: AppBar(title: const Text('Flutter WebView')), - body: const WebViewStack(), + + appBar: AppBar( + + title: const Text('Flutter WebView'), + + actions: [NavigationControls(controller: controller)], + + ), + body: WebViewStack(controller: controller), ); } @@ -389,7 +342,7 @@ steps: @override State createState() => _WebViewStackState(); - @@ -14,13 +16,12 @@ class WebViewStack extends StatefulWidget { + @@ -14,40 +16,36 @@ class WebViewStack extends StatefulWidget { class _WebViewStackState extends State { var loadingPercentage = 0; @@ -398,35 +351,58 @@ steps: @override void initState() { super.initState(); - - controller = WebViewController() - - ..setNavigationDelegate(NavigationDelegate( + - controller = + - WebViewController() + - ..setNavigationDelegate( + - NavigationDelegate( + - onPageStarted: (url) { + - setState(() { + - loadingPercentage = 0; + - }); + - }, + - onProgress: (progress) { + - setState(() { + - loadingPercentage = progress; + - }); + - }, + - onPageFinished: (url) { + - setState(() { + - loadingPercentage = 100; + - }); + - }, + - ), + - ) + - ..loadRequest(Uri.parse('https://flutter.dev')); + widget.controller.setNavigationDelegate( + NavigationDelegate( - onPageStarted: (url) { - setState(() { - loadingPercentage = 0; - @@ -36,10 +37,8 @@ class _WebViewStackState extends State { - loadingPercentage = 100; - }); - }, - - )) - - ..loadRequest( - - Uri.parse('https://flutter.dev'), - - ); + + onPageStarted: (url) { + + setState(() { + + loadingPercentage = 0; + + }); + + }, + + onProgress: (progress) { + + setState(() { + + loadingPercentage = progress; + + }); + + }, + + onPageFinished: (url) { + + setState(() { + + loadingPercentage = 100; + + }); + + }, + ), + ); } @override - @@ -47,7 +46,7 @@ class _WebViewStackState extends State { + Widget build(BuildContext context) { return Stack( children: [ - WebViewWidget( - - controller: controller, - + controller: widget.controller, - ), + - WebViewWidget(controller: controller), + + WebViewWidget(controller: widget.controller), if (loadingPercentage < 100) - LinearProgressIndicator( + LinearProgressIndicator(value: loadingPercentage / 100.0), + ], - name: Copy step_06 copydir: from: webview_in_flutter @@ -440,7 +416,7 @@ steps: patch-u: | --- b/webview_flutter/step_07/lib/src/web_view_stack.dart +++ a/webview_flutter/step_07/lib/src/web_view_stack.dart - @@ -37,6 +37,20 @@ class _WebViewStackState extends State { + @@ -37,6 +37,16 @@ class _WebViewStackState extends State { loadingPercentage = 100; }); }, @@ -448,11 +424,7 @@ steps: + final host = Uri.parse(navigation.url).host; + if (host.contains('youtube.com')) { + ScaffoldMessenger.of(context).showSnackBar( - + SnackBar( - + content: Text( - + 'Blocking navigation to $host', - + ), - + ), + + SnackBar(content: Text('Blocking navigation to $host')), + ); + return NavigationDecision.prevent; + } @@ -475,19 +447,17 @@ steps: // Copyright 2022 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - + import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; - - enum _MenuOptions { - navigationDelegate, - } - + + enum _MenuOptions { navigationDelegate } + class Menu extends StatelessWidget { const Menu({required this.controller, super.key}); - + final WebViewController controller; - + @override Widget build(BuildContext context) { return PopupMenuButton<_MenuOptions>( @@ -497,12 +467,13 @@ steps: await controller.loadRequest(Uri.parse('https://youtube.com')); } }, - itemBuilder: (context) => [ - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.navigationDelegate, - child: Text('Navigate to YouTube'), - ), - ], + itemBuilder: + (context) => [ + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.navigationDelegate, + child: Text('Navigate to YouTube'), + ), + ], ); } } @@ -519,14 +490,18 @@ steps: import 'src/navigation_controls.dart'; import 'src/web_view_stack.dart'; - @@ -43,6 +44,7 @@ class _WebViewAppState extends State { + @@ -34,7 +35,10 @@ class _WebViewAppState extends State { + return Scaffold( + appBar: AppBar( title: const Text('Flutter WebView'), - actions: [ - NavigationControls(controller: controller), + - actions: [NavigationControls(controller: controller)], + + actions: [ + + NavigationControls(controller: controller), + Menu(controller: controller), - ], + + ], ), body: WebViewStack(controller: controller), + ); - name: Copy step_08 copydir: from: webview_in_flutter @@ -540,12 +515,12 @@ steps: patch-u: | --- b/webview_flutter/step_09/lib/src/menu.dart +++ a/webview_flutter/step_09/lib/src/menu.dart - @@ -7,20 +7,34 @@ import 'package:webview_flutter/webview_flutter.dart'; + @@ -5,20 +5,34 @@ + import 'package:flutter/material.dart'; + import 'package:webview_flutter/webview_flutter.dart'; - enum _MenuOptions { - navigationDelegate, - + userAgent, - } + -enum _MenuOptions { navigationDelegate } + +enum _MenuOptions { navigationDelegate, userAgent } -class Menu extends StatelessWidget { +class Menu extends StatefulWidget { @@ -565,27 +540,28 @@ steps: switch (value) { case _MenuOptions.navigationDelegate: - await controller.loadRequest(Uri.parse('https://youtube.com')); - + await widget.controller - + .loadRequest(Uri.parse('https://youtube.com')); + + await widget.controller.loadRequest( + + Uri.parse('https://youtube.com'), + + ); + case _MenuOptions.userAgent: + final userAgent = await widget.controller + .runJavaScriptReturningResult('navigator.userAgent'); + if (!context.mounted) return; - + ScaffoldMessenger.of(context).showSnackBar(SnackBar( - + content: Text('$userAgent'), - + )); + + ScaffoldMessenger.of( + + context, + + ).showSnackBar(SnackBar(content: Text('$userAgent'))); } }, - itemBuilder: (context) => [ - @@ -28,6 +42,10 @@ class Menu extends StatelessWidget { - value: _MenuOptions.navigationDelegate, - child: Text('Navigate to YouTube'), - ), - + const PopupMenuItem<_MenuOptions>( - + value: _MenuOptions.userAgent, - + child: Text('Show user-agent'), - + ), - ], + itemBuilder: + @@ -27,6 +41,10 @@ class Menu extends StatelessWidget { + value: _MenuOptions.navigationDelegate, + child: Text('Navigate to YouTube'), + ), + + const PopupMenuItem<_MenuOptions>( + + value: _MenuOptions.userAgent, + + child: Text('Show user-agent'), + + ), + ], ); } - name: Patch lib/src/web_view_stack.dart @@ -593,7 +569,7 @@ steps: patch-u: | --- b/webview_flutter/step_09/lib/src/web_view_stack.dart +++ a/webview_flutter/step_09/lib/src/web_view_stack.dart - @@ -20,39 +20,41 @@ class _WebViewStackState extends State { + @@ -20,35 +20,37 @@ class _WebViewStackState extends State { @override void initState() { super.initState(); @@ -618,9 +594,14 @@ steps: - final host = Uri.parse(navigation.url).host; - if (host.contains('youtube.com')) { - ScaffoldMessenger.of(context).showSnackBar( - - SnackBar( - - content: Text( - - 'Blocking navigation to $host', + - SnackBar(content: Text('Blocking navigation to $host')), + - ); + - return NavigationDecision.prevent; + - } + - return NavigationDecision.navigate; + - }, + - ), + - ); + widget.controller + ..setNavigationDelegate( + NavigationDelegate( @@ -643,19 +624,7 @@ steps: + final host = Uri.parse(navigation.url).host; + if (host.contains('youtube.com')) { + ScaffoldMessenger.of(context).showSnackBar( - + SnackBar( - + content: Text( - + 'Blocking navigation to $host', - + ), - ), - - ), - - ); - - return NavigationDecision.prevent; - - } - - return NavigationDecision.navigate; - - }, - - ), - - ); + + SnackBar(content: Text('Blocking navigation to $host')), + ); + return NavigationDecision.prevent; + } @@ -680,18 +649,19 @@ steps: patch-u: | --- b/webview_flutter/step_10/lib/src/menu.dart +++ a/webview_flutter/step_10/lib/src/menu.dart - @@ -8,6 +8,7 @@ import 'package:webview_flutter/webview_flutter.dart'; - enum _MenuOptions { - navigationDelegate, - userAgent, - + javascriptChannel, - } + @@ -5,7 +5,7 @@ + import 'package:flutter/material.dart'; + import 'package:webview_flutter/webview_flutter.dart'; + + -enum _MenuOptions { navigationDelegate, userAgent } + +enum _MenuOptions { navigationDelegate, userAgent, javascriptChannel } class Menu extends StatefulWidget { - @@ -35,6 +36,19 @@ class _MenuState extends State { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text('$userAgent'), - )); + const Menu({required this.controller, super.key}); + @@ -33,6 +33,19 @@ class _MenuState extends State { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('$userAgent'))); + case _MenuOptions.javascriptChannel: + await widget.controller.runJavaScript(''' +var req = new XMLHttpRequest(); @@ -707,16 +677,16 @@ steps: +req.send();'''); } }, - itemBuilder: (context) => [ - @@ -46,6 +60,10 @@ class _MenuState extends State { - value: _MenuOptions.userAgent, - child: Text('Show user-agent'), - ), - + const PopupMenuItem<_MenuOptions>( - + value: _MenuOptions.javascriptChannel, - + child: Text('Lookup IP Address'), - + ), - ], + itemBuilder: + @@ -45,6 +58,10 @@ class _MenuState extends State { + value: _MenuOptions.userAgent, + child: Text('Show user-agent'), + ), + + const PopupMenuItem<_MenuOptions>( + + value: _MenuOptions.javascriptChannel, + + child: Text('Lookup IP Address'), + + ), + ], ); } - name: Patch lib/src/web_view_stack.dart @@ -724,7 +694,7 @@ steps: patch-u: | --- b/webview_flutter/step_10/lib/src/web_view_stack.dart +++ a/webview_flutter/step_10/lib/src/web_view_stack.dart - @@ -54,7 +54,14 @@ class _WebViewStackState extends State { + @@ -50,7 +50,15 @@ class _WebViewStackState extends State { }, ), ) @@ -733,8 +703,9 @@ steps: + ..addJavaScriptChannel( + 'SnackBar', + onMessageReceived: (message) { - + ScaffoldMessenger.of(context) - + .showSnackBar(SnackBar(content: Text(message.message))); + + ScaffoldMessenger.of( + + context, + + ).showSnackBar(SnackBar(content: Text(message.message))); + }, + ); } @@ -753,19 +724,25 @@ steps: patch-u: | --- b/webview_flutter/step_11/lib/src/menu.dart +++ a/webview_flutter/step_11/lib/src/menu.dart - @@ -9,6 +9,11 @@ enum _MenuOptions { - navigationDelegate, - userAgent, - javascriptChannel, + @@ -5,7 +5,16 @@ + import 'package:flutter/material.dart'; + import 'package:webview_flutter/webview_flutter.dart'; + + -enum _MenuOptions { navigationDelegate, userAgent, javascriptChannel } + +enum _MenuOptions { + + navigationDelegate, + + userAgent, + + javascriptChannel, + listCookies, + clearCookies, + addCookie, + setCookie, + removeCookie, - } + +} class Menu extends StatefulWidget { - @@ -21,6 +26,8 @@ class Menu extends StatefulWidget { + const Menu({required this.controller, super.key}); + @@ -17,6 +26,8 @@ class Menu extends StatefulWidget { } class _MenuState extends State { @@ -774,7 +751,7 @@ steps: @override Widget build(BuildContext context) { return PopupMenuButton<_MenuOptions>( - @@ -49,6 +56,16 @@ req.onload = function() { + @@ -46,6 +57,16 @@ req.onload = function() { } } req.send();'''); @@ -790,38 +767,39 @@ steps: + await _onRemoveCookie(widget.controller); } }, - itemBuilder: (context) => [ - @@ -64,7 +81,87 @@ req.send();'''); - value: _MenuOptions.javascriptChannel, - child: Text('Lookup IP Address'), - ), - + const PopupMenuItem<_MenuOptions>( - + value: _MenuOptions.clearCookies, - + child: Text('Clear cookies'), - + ), - + const PopupMenuItem<_MenuOptions>( - + value: _MenuOptions.listCookies, - + child: Text('List cookies'), - + ), - + const PopupMenuItem<_MenuOptions>( - + value: _MenuOptions.addCookie, - + child: Text('Add cookie'), - + ), - + const PopupMenuItem<_MenuOptions>( - + value: _MenuOptions.setCookie, - + child: Text('Set cookie'), - + ), - + const PopupMenuItem<_MenuOptions>( - + value: _MenuOptions.removeCookie, - + child: Text('Remove cookie'), - + ), - ], + itemBuilder: + @@ -62,7 +83,81 @@ req.send();'''); + value: _MenuOptions.javascriptChannel, + child: Text('Lookup IP Address'), + ), + + const PopupMenuItem<_MenuOptions>( + + value: _MenuOptions.clearCookies, + + child: Text('Clear cookies'), + + ), + + const PopupMenuItem<_MenuOptions>( + + value: _MenuOptions.listCookies, + + child: Text('List cookies'), + + ), + + const PopupMenuItem<_MenuOptions>( + + value: _MenuOptions.addCookie, + + child: Text('Add cookie'), + + ), + + const PopupMenuItem<_MenuOptions>( + + value: _MenuOptions.setCookie, + + child: Text('Set cookie'), + + ), + + const PopupMenuItem<_MenuOptions>( + + value: _MenuOptions.removeCookie, + + child: Text('Remove cookie'), + + ), + ], ); } + + Future _onListCookies(WebViewController controller) async { - + final String cookies = await controller - + .runJavaScriptReturningResult('document.cookie') as String; + + final String cookies = + + await controller.runJavaScriptReturningResult('document.cookie') + + as String; + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( @@ -837,11 +815,9 @@ steps: + message = 'There were no cookies to clear.'; + } + if (!mounted) return; - + ScaffoldMessenger.of(context).showSnackBar( - + SnackBar( - + content: Text(message), - + ), - + ); + + ScaffoldMessenger.of( + + context, + + ).showSnackBar(SnackBar(content: Text(message))); + } + + Future _onAddCookie(WebViewController controller) async { @@ -849,11 +825,9 @@ steps: + date.setTime(date.getTime()+(30*24*60*60*1000)); + document.cookie = "FirstName=John; expires=" + date.toGMTString();'''); + if (!mounted) return; - + ScaffoldMessenger.of(context).showSnackBar( - + const SnackBar( - + content: Text('Custom cookie added.'), - + ), - + ); + + ScaffoldMessenger.of( + + context, + + ).showSnackBar(const SnackBar(content: Text('Custom cookie added.'))); + } + + Future _onSetCookie(WebViewController controller) async { @@ -861,22 +835,19 @@ steps: + const WebViewCookie(name: 'foo', value: 'bar', domain: 'flutter.dev'), + ); + if (!mounted) return; - + ScaffoldMessenger.of(context).showSnackBar( - + const SnackBar( - + content: Text('Custom cookie is set.'), - + ), - + ); + + ScaffoldMessenger.of( + + context, + + ).showSnackBar(const SnackBar(content: Text('Custom cookie is set.'))); + } + + Future _onRemoveCookie(WebViewController controller) async { + await controller.runJavaScript( - + 'document.cookie="FirstName=John; expires=Thu, 01 Jan 1970 00:00:00 UTC" '); - + if (!mounted) return; - + ScaffoldMessenger.of(context).showSnackBar( - + const SnackBar( - + content: Text('Custom cookie removed.'), - + ), + + 'document.cookie="FirstName=John; expires=Thu, 01 Jan 1970 00:00:00 UTC" ', + ); + + if (!mounted) return; + + ScaffoldMessenger.of( + + context, + + ).showSnackBar(const SnackBar(content: Text('Custom cookie removed.'))); + } } - name: Copy step_11 @@ -951,7 +922,7 @@ steps: } class Menu extends StatefulWidget { - @@ -66,6 +90,15 @@ req.send();'''); + @@ -67,6 +91,15 @@ req.send();'''); await _onSetCookie(widget.controller); case _MenuOptions.removeCookie: await _onRemoveCookie(widget.controller); @@ -966,38 +937,42 @@ steps: + await _onLoadHtmlStringExample(widget.controller, context); } }, - itemBuilder: (context) => [ - @@ -101,6 +134,18 @@ req.send();'''); - value: _MenuOptions.removeCookie, - child: Text('Remove cookie'), - ), - + const PopupMenuItem<_MenuOptions>( - + value: _MenuOptions.loadFlutterAsset, - + child: Text('Load Flutter Asset'), - + ), - + const PopupMenuItem<_MenuOptions>( - + value: _MenuOptions.loadHtmlString, - + child: Text('Load HTML string'), - + ), - + const PopupMenuItem<_MenuOptions>( - + value: _MenuOptions.loadLocalFile, - + child: Text('Load local file'), - + ), - ], + itemBuilder: + @@ -103,6 +136,18 @@ req.send();'''); + value: _MenuOptions.removeCookie, + child: Text('Remove cookie'), + ), + + const PopupMenuItem<_MenuOptions>( + + value: _MenuOptions.loadFlutterAsset, + + child: Text('Load Flutter Asset'), + + ), + + const PopupMenuItem<_MenuOptions>( + + value: _MenuOptions.loadHtmlString, + + child: Text('Load HTML string'), + + ), + + const PopupMenuItem<_MenuOptions>( + + value: _MenuOptions.loadLocalFile, + + child: Text('Load local file'), + + ), + ], ); } - @@ -164,4 +209,31 @@ req.send();'''); - ), - ); + @@ -160,4 +205,37 @@ req.send();'''); + context, + ).showSnackBar(const SnackBar(content: Text('Custom cookie removed.'))); } + + Future _onLoadFlutterAssetExample( - + WebViewController controller, BuildContext context) async { + + WebViewController controller, + + BuildContext context, + + ) async { + await controller.loadFlutterAsset('assets/www/index.html'); + } + + Future _onLoadLocalFileExample( - + WebViewController controller, BuildContext context) async { + + WebViewController controller, + + BuildContext context, + + ) async { + final String pathToIndex = await _prepareLocalFile(); + + await controller.loadFile(pathToIndex); @@ -1014,7 +989,9 @@ steps: + } + + Future _onLoadHtmlStringExample( - + WebViewController controller, BuildContext context) async { + + WebViewController controller, + + BuildContext context, + + ) async { + await controller.loadHtmlString(kExamplePage); + } } diff --git a/webview_flutter/step_03/android/.gitignore b/webview_flutter/step_03/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/webview_flutter/step_03/android/.gitignore +++ b/webview_flutter/step_03/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/webview_flutter/step_03/android/app/build.gradle b/webview_flutter/step_03/android/app/build.gradle deleted file mode 100644 index 9e345ad06f..0000000000 --- a/webview_flutter/step_03/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.webview_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.webview_in_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/webview_flutter/step_03/android/app/build.gradle.kts b/webview_flutter/step_03/android/app/build.gradle.kts new file mode 100644 index 0000000000..bab26ab815 --- /dev/null +++ b/webview_flutter/step_03/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.webview_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.webview_in_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/webview_flutter/step_03/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt b/webview_flutter/step_03/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt index c92fab4c95..77ec42b157 100644 --- a/webview_flutter/step_03/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt +++ b/webview_flutter/step_03/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.webview_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/webview_flutter/step_03/android/build.gradle b/webview_flutter/step_03/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/webview_flutter/step_03/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/webview_flutter/step_03/android/build.gradle.kts b/webview_flutter/step_03/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/webview_flutter/step_03/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/webview_flutter/step_03/android/gradle.properties b/webview_flutter/step_03/android/gradle.properties index 2597170821..f018a61817 100644 --- a/webview_flutter/step_03/android/gradle.properties +++ b/webview_flutter/step_03/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/webview_flutter/step_03/android/gradle/wrapper/gradle-wrapper.properties b/webview_flutter/step_03/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/webview_flutter/step_03/android/gradle/wrapper/gradle-wrapper.properties +++ b/webview_flutter/step_03/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/webview_flutter/step_03/android/settings.gradle b/webview_flutter/step_03/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/webview_flutter/step_03/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/webview_flutter/step_03/android/settings.gradle.kts b/webview_flutter/step_03/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/webview_flutter/step_03/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/webview_flutter/step_03/ios/Podfile b/webview_flutter/step_03/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/webview_flutter/step_03/ios/Podfile +++ b/webview_flutter/step_03/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/webview_flutter/step_03/ios/Runner.xcodeproj/project.pbxproj b/webview_flutter/step_03/ios/Runner.xcodeproj/project.pbxproj index 33a5c8648f..36b4ec4e3f 100644 --- a/webview_flutter/step_03/ios/Runner.xcodeproj/project.pbxproj +++ b/webview_flutter/step_03/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */; }; + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,18 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 8BD91403B27036C97AF986BC /* Frameworks */ = { + 3B66D334861BB935E0AA5B2A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */, + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */, + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - F63F2644D6A311A3CF56B07D /* Pods */, - F8F455E54E4A52608FD3C2DC /* Frameworks */, + CF4FD2BB36757D12859FA741 /* Pods */, + FA957D827CD1F0DB67A08E52 /* Frameworks */, ); sourceTree = ""; }; @@ -142,25 +142,25 @@ path = Runner; sourceTree = ""; }; - F63F2644D6A311A3CF56B07D /* Pods */ = { + CF4FD2BB36757D12859FA741 /* Pods */ = { isa = PBXGroup; children = ( - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */, - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */, - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */, - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */, - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */, - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */, + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */, + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */, + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */, + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */, + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */, + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; sourceTree = ""; }; - F8F455E54E4A52608FD3C2DC /* Frameworks */ = { + FA957D827CD1F0DB67A08E52 /* Frameworks */ = { isa = PBXGroup; children = ( - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */, - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */, + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */, + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */, + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 8BD91403B27036C97AF986BC /* Frameworks */, + 3B66D334861BB935E0AA5B2A /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */, + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */, + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */ = { + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */ = { + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/webview_flutter/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/webview_flutter/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/webview_flutter/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/webview_flutter/step_03/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/webview_flutter/step_03/lib/main.dart b/webview_flutter/step_03/lib/main.dart index 8e94089121..7b7f5b6f36 100644 --- a/webview_flutter/step_03/lib/main.dart +++ b/webview_flutter/step_03/lib/main.dart @@ -29,7 +29,6 @@ class MyApp extends StatelessWidget { // This works for code too, not just values: Most code changes can be // tested with just a hot reload. colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - useMaterial3: true, ), home: const MyHomePage(title: 'Flutter Demo Home Page'), ); @@ -105,9 +104,7 @@ class _MyHomePageState extends State { // wireframe for each widget. mainAxisAlignment: MainAxisAlignment.center, children: [ - const Text( - 'You have pushed the button this many times:', - ), + const Text('You have pushed the button this many times:'), Text( '$_counter', style: Theme.of(context).textTheme.headlineMedium, diff --git a/webview_flutter/step_03/pubspec.yaml b/webview_flutter/step_03/pubspec.yaml index e989e3ad0d..903226b47b 100644 --- a/webview_flutter/step_03/pubspec.yaml +++ b/webview_flutter/step_03/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/webview_flutter/step_04/android/.gitignore b/webview_flutter/step_04/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/webview_flutter/step_04/android/.gitignore +++ b/webview_flutter/step_04/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/webview_flutter/step_04/android/app/build.gradle b/webview_flutter/step_04/android/app/build.gradle deleted file mode 100644 index 9e345ad06f..0000000000 --- a/webview_flutter/step_04/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.webview_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.webview_in_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/webview_flutter/step_04/android/app/build.gradle.kts b/webview_flutter/step_04/android/app/build.gradle.kts new file mode 100644 index 0000000000..bab26ab815 --- /dev/null +++ b/webview_flutter/step_04/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.webview_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.webview_in_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/webview_flutter/step_04/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt b/webview_flutter/step_04/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt index c92fab4c95..77ec42b157 100644 --- a/webview_flutter/step_04/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt +++ b/webview_flutter/step_04/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.webview_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/webview_flutter/step_04/android/build.gradle b/webview_flutter/step_04/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/webview_flutter/step_04/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/webview_flutter/step_04/android/build.gradle.kts b/webview_flutter/step_04/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/webview_flutter/step_04/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/webview_flutter/step_04/android/gradle.properties b/webview_flutter/step_04/android/gradle.properties index 2597170821..f018a61817 100644 --- a/webview_flutter/step_04/android/gradle.properties +++ b/webview_flutter/step_04/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/webview_flutter/step_04/android/gradle/wrapper/gradle-wrapper.properties b/webview_flutter/step_04/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/webview_flutter/step_04/android/gradle/wrapper/gradle-wrapper.properties +++ b/webview_flutter/step_04/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/webview_flutter/step_04/android/settings.gradle b/webview_flutter/step_04/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/webview_flutter/step_04/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/webview_flutter/step_04/android/settings.gradle.kts b/webview_flutter/step_04/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/webview_flutter/step_04/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/webview_flutter/step_04/ios/Podfile b/webview_flutter/step_04/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/webview_flutter/step_04/ios/Podfile +++ b/webview_flutter/step_04/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/webview_flutter/step_04/ios/Runner.xcodeproj/project.pbxproj b/webview_flutter/step_04/ios/Runner.xcodeproj/project.pbxproj index 33a5c8648f..36b4ec4e3f 100644 --- a/webview_flutter/step_04/ios/Runner.xcodeproj/project.pbxproj +++ b/webview_flutter/step_04/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */; }; + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,18 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 8BD91403B27036C97AF986BC /* Frameworks */ = { + 3B66D334861BB935E0AA5B2A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */, + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */, + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - F63F2644D6A311A3CF56B07D /* Pods */, - F8F455E54E4A52608FD3C2DC /* Frameworks */, + CF4FD2BB36757D12859FA741 /* Pods */, + FA957D827CD1F0DB67A08E52 /* Frameworks */, ); sourceTree = ""; }; @@ -142,25 +142,25 @@ path = Runner; sourceTree = ""; }; - F63F2644D6A311A3CF56B07D /* Pods */ = { + CF4FD2BB36757D12859FA741 /* Pods */ = { isa = PBXGroup; children = ( - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */, - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */, - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */, - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */, - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */, - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */, + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */, + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */, + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */, + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */, + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */, + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; sourceTree = ""; }; - F8F455E54E4A52608FD3C2DC /* Frameworks */ = { + FA957D827CD1F0DB67A08E52 /* Frameworks */ = { isa = PBXGroup; children = ( - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */, - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */, + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */, + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */, + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 8BD91403B27036C97AF986BC /* Frameworks */, + 3B66D334861BB935E0AA5B2A /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */, + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */, + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */ = { + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */ = { + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/webview_flutter/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/webview_flutter/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/webview_flutter/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/webview_flutter/step_04/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/webview_flutter/step_04/lib/main.dart b/webview_flutter/step_04/lib/main.dart index b11b830f9d..a628aab5b0 100644 --- a/webview_flutter/step_04/lib/main.dart +++ b/webview_flutter/step_04/lib/main.dart @@ -6,12 +6,7 @@ import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; void main() { - runApp( - MaterialApp( - theme: ThemeData(), - home: const WebViewApp(), - ), - ); + runApp(MaterialApp(theme: ThemeData(), home: const WebViewApp())); } class WebViewApp extends StatefulWidget { @@ -27,21 +22,15 @@ class _WebViewAppState extends State { @override void initState() { super.initState(); - controller = WebViewController() - ..loadRequest( - Uri.parse('https://flutter.dev'), - ); + controller = + WebViewController()..loadRequest(Uri.parse('https://flutter.dev')); } @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Flutter WebView'), - ), - body: WebViewWidget( - controller: controller, - ), + appBar: AppBar(title: const Text('Flutter WebView')), + body: WebViewWidget(controller: controller), ); } } diff --git a/webview_flutter/step_04/pubspec.yaml b/webview_flutter/step_04/pubspec.yaml index e989e3ad0d..903226b47b 100644 --- a/webview_flutter/step_04/pubspec.yaml +++ b/webview_flutter/step_04/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/webview_flutter/step_05/android/.gitignore b/webview_flutter/step_05/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/webview_flutter/step_05/android/.gitignore +++ b/webview_flutter/step_05/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/webview_flutter/step_05/android/app/build.gradle b/webview_flutter/step_05/android/app/build.gradle deleted file mode 100644 index 9e345ad06f..0000000000 --- a/webview_flutter/step_05/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.webview_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.webview_in_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/webview_flutter/step_05/android/app/build.gradle.kts b/webview_flutter/step_05/android/app/build.gradle.kts new file mode 100644 index 0000000000..bab26ab815 --- /dev/null +++ b/webview_flutter/step_05/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.webview_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.webview_in_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/webview_flutter/step_05/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt b/webview_flutter/step_05/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt index c92fab4c95..77ec42b157 100644 --- a/webview_flutter/step_05/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt +++ b/webview_flutter/step_05/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.webview_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/webview_flutter/step_05/android/build.gradle b/webview_flutter/step_05/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/webview_flutter/step_05/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/webview_flutter/step_05/android/build.gradle.kts b/webview_flutter/step_05/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/webview_flutter/step_05/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/webview_flutter/step_05/android/gradle.properties b/webview_flutter/step_05/android/gradle.properties index 2597170821..f018a61817 100644 --- a/webview_flutter/step_05/android/gradle.properties +++ b/webview_flutter/step_05/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/webview_flutter/step_05/android/gradle/wrapper/gradle-wrapper.properties b/webview_flutter/step_05/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/webview_flutter/step_05/android/gradle/wrapper/gradle-wrapper.properties +++ b/webview_flutter/step_05/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/webview_flutter/step_05/android/settings.gradle b/webview_flutter/step_05/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/webview_flutter/step_05/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/webview_flutter/step_05/android/settings.gradle.kts b/webview_flutter/step_05/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/webview_flutter/step_05/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/webview_flutter/step_05/ios/Podfile b/webview_flutter/step_05/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/webview_flutter/step_05/ios/Podfile +++ b/webview_flutter/step_05/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/webview_flutter/step_05/ios/Runner.xcodeproj/project.pbxproj b/webview_flutter/step_05/ios/Runner.xcodeproj/project.pbxproj index 33a5c8648f..36b4ec4e3f 100644 --- a/webview_flutter/step_05/ios/Runner.xcodeproj/project.pbxproj +++ b/webview_flutter/step_05/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */; }; + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,18 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 8BD91403B27036C97AF986BC /* Frameworks */ = { + 3B66D334861BB935E0AA5B2A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */, + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */, + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - F63F2644D6A311A3CF56B07D /* Pods */, - F8F455E54E4A52608FD3C2DC /* Frameworks */, + CF4FD2BB36757D12859FA741 /* Pods */, + FA957D827CD1F0DB67A08E52 /* Frameworks */, ); sourceTree = ""; }; @@ -142,25 +142,25 @@ path = Runner; sourceTree = ""; }; - F63F2644D6A311A3CF56B07D /* Pods */ = { + CF4FD2BB36757D12859FA741 /* Pods */ = { isa = PBXGroup; children = ( - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */, - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */, - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */, - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */, - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */, - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */, + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */, + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */, + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */, + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */, + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */, + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; sourceTree = ""; }; - F8F455E54E4A52608FD3C2DC /* Frameworks */ = { + FA957D827CD1F0DB67A08E52 /* Frameworks */ = { isa = PBXGroup; children = ( - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */, - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */, + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */, + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */, + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 8BD91403B27036C97AF986BC /* Frameworks */, + 3B66D334861BB935E0AA5B2A /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */, + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */, + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */ = { + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */ = { + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/webview_flutter/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/webview_flutter/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/webview_flutter/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/webview_flutter/step_05/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/webview_flutter/step_05/lib/main.dart b/webview_flutter/step_05/lib/main.dart index 6f8cf5fc41..c83639e7fa 100644 --- a/webview_flutter/step_05/lib/main.dart +++ b/webview_flutter/step_05/lib/main.dart @@ -7,12 +7,7 @@ import 'package:flutter/material.dart'; import 'src/web_view_stack.dart'; void main() { - runApp( - MaterialApp( - theme: ThemeData(), - home: const WebViewApp(), - ), - ); + runApp(MaterialApp(theme: ThemeData(), home: const WebViewApp())); } class WebViewApp extends StatefulWidget { @@ -26,9 +21,7 @@ class _WebViewAppState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Flutter WebView'), - ), + appBar: AppBar(title: const Text('Flutter WebView')), body: const WebViewStack(), ); } diff --git a/webview_flutter/step_05/lib/src/web_view_stack.dart b/webview_flutter/step_05/lib/src/web_view_stack.dart index 90999968f8..e8b5755e9b 100644 --- a/webview_flutter/step_05/lib/src/web_view_stack.dart +++ b/webview_flutter/step_05/lib/src/web_view_stack.dart @@ -19,40 +19,37 @@ class _WebViewStackState extends State { @override void initState() { super.initState(); - controller = WebViewController() - ..setNavigationDelegate(NavigationDelegate( - onPageStarted: (url) { - setState(() { - loadingPercentage = 0; - }); - }, - onProgress: (progress) { - setState(() { - loadingPercentage = progress; - }); - }, - onPageFinished: (url) { - setState(() { - loadingPercentage = 100; - }); - }, - )) - ..loadRequest( - Uri.parse('https://flutter.dev'), - ); + controller = + WebViewController() + ..setNavigationDelegate( + NavigationDelegate( + onPageStarted: (url) { + setState(() { + loadingPercentage = 0; + }); + }, + onProgress: (progress) { + setState(() { + loadingPercentage = progress; + }); + }, + onPageFinished: (url) { + setState(() { + loadingPercentage = 100; + }); + }, + ), + ) + ..loadRequest(Uri.parse('https://flutter.dev')); } @override Widget build(BuildContext context) { return Stack( children: [ - WebViewWidget( - controller: controller, - ), + WebViewWidget(controller: controller), if (loadingPercentage < 100) - LinearProgressIndicator( - value: loadingPercentage / 100.0, - ), + LinearProgressIndicator(value: loadingPercentage / 100.0), ], ); } diff --git a/webview_flutter/step_05/pubspec.yaml b/webview_flutter/step_05/pubspec.yaml index e989e3ad0d..903226b47b 100644 --- a/webview_flutter/step_05/pubspec.yaml +++ b/webview_flutter/step_05/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/webview_flutter/step_06/android/.gitignore b/webview_flutter/step_06/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/webview_flutter/step_06/android/.gitignore +++ b/webview_flutter/step_06/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/webview_flutter/step_06/android/app/build.gradle b/webview_flutter/step_06/android/app/build.gradle deleted file mode 100644 index 9e345ad06f..0000000000 --- a/webview_flutter/step_06/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.webview_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.webview_in_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/webview_flutter/step_06/android/app/build.gradle.kts b/webview_flutter/step_06/android/app/build.gradle.kts new file mode 100644 index 0000000000..bab26ab815 --- /dev/null +++ b/webview_flutter/step_06/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.webview_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.webview_in_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/webview_flutter/step_06/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt b/webview_flutter/step_06/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt index c92fab4c95..77ec42b157 100644 --- a/webview_flutter/step_06/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt +++ b/webview_flutter/step_06/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.webview_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/webview_flutter/step_06/android/build.gradle b/webview_flutter/step_06/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/webview_flutter/step_06/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/webview_flutter/step_06/android/build.gradle.kts b/webview_flutter/step_06/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/webview_flutter/step_06/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/webview_flutter/step_06/android/gradle.properties b/webview_flutter/step_06/android/gradle.properties index 2597170821..f018a61817 100644 --- a/webview_flutter/step_06/android/gradle.properties +++ b/webview_flutter/step_06/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/webview_flutter/step_06/android/gradle/wrapper/gradle-wrapper.properties b/webview_flutter/step_06/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/webview_flutter/step_06/android/gradle/wrapper/gradle-wrapper.properties +++ b/webview_flutter/step_06/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/webview_flutter/step_06/android/settings.gradle b/webview_flutter/step_06/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/webview_flutter/step_06/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/webview_flutter/step_06/android/settings.gradle.kts b/webview_flutter/step_06/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/webview_flutter/step_06/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/webview_flutter/step_06/ios/Podfile b/webview_flutter/step_06/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/webview_flutter/step_06/ios/Podfile +++ b/webview_flutter/step_06/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/webview_flutter/step_06/ios/Runner.xcodeproj/project.pbxproj b/webview_flutter/step_06/ios/Runner.xcodeproj/project.pbxproj index 33a5c8648f..36b4ec4e3f 100644 --- a/webview_flutter/step_06/ios/Runner.xcodeproj/project.pbxproj +++ b/webview_flutter/step_06/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */; }; + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,18 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 8BD91403B27036C97AF986BC /* Frameworks */ = { + 3B66D334861BB935E0AA5B2A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */, + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */, + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - F63F2644D6A311A3CF56B07D /* Pods */, - F8F455E54E4A52608FD3C2DC /* Frameworks */, + CF4FD2BB36757D12859FA741 /* Pods */, + FA957D827CD1F0DB67A08E52 /* Frameworks */, ); sourceTree = ""; }; @@ -142,25 +142,25 @@ path = Runner; sourceTree = ""; }; - F63F2644D6A311A3CF56B07D /* Pods */ = { + CF4FD2BB36757D12859FA741 /* Pods */ = { isa = PBXGroup; children = ( - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */, - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */, - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */, - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */, - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */, - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */, + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */, + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */, + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */, + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */, + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */, + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; sourceTree = ""; }; - F8F455E54E4A52608FD3C2DC /* Frameworks */ = { + FA957D827CD1F0DB67A08E52 /* Frameworks */ = { isa = PBXGroup; children = ( - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */, - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */, + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */, + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */, + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 8BD91403B27036C97AF986BC /* Frameworks */, + 3B66D334861BB935E0AA5B2A /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */, + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */, + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */ = { + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */ = { + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/webview_flutter/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/webview_flutter/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/webview_flutter/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/webview_flutter/step_06/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/webview_flutter/step_06/lib/main.dart b/webview_flutter/step_06/lib/main.dart index 46d9f1518b..a699edb3f9 100644 --- a/webview_flutter/step_06/lib/main.dart +++ b/webview_flutter/step_06/lib/main.dart @@ -9,12 +9,7 @@ import 'src/navigation_controls.dart'; import 'src/web_view_stack.dart'; void main() { - runApp( - MaterialApp( - theme: ThemeData(), - home: const WebViewApp(), - ), - ); + runApp(MaterialApp(theme: ThemeData(), home: const WebViewApp())); } class WebViewApp extends StatefulWidget { @@ -30,10 +25,8 @@ class _WebViewAppState extends State { @override void initState() { super.initState(); - controller = WebViewController() - ..loadRequest( - Uri.parse('https://flutter.dev'), - ); + controller = + WebViewController()..loadRequest(Uri.parse('https://flutter.dev')); } @override @@ -41,9 +34,7 @@ class _WebViewAppState extends State { return Scaffold( appBar: AppBar( title: const Text('Flutter WebView'), - actions: [ - NavigationControls(controller: controller), - ], + actions: [NavigationControls(controller: controller)], ), body: WebViewStack(controller: controller), ); diff --git a/webview_flutter/step_06/lib/src/web_view_stack.dart b/webview_flutter/step_06/lib/src/web_view_stack.dart index b906d76ec9..9b1563eff6 100644 --- a/webview_flutter/step_06/lib/src/web_view_stack.dart +++ b/webview_flutter/step_06/lib/src/web_view_stack.dart @@ -45,13 +45,9 @@ class _WebViewStackState extends State { Widget build(BuildContext context) { return Stack( children: [ - WebViewWidget( - controller: widget.controller, - ), + WebViewWidget(controller: widget.controller), if (loadingPercentage < 100) - LinearProgressIndicator( - value: loadingPercentage / 100.0, - ), + LinearProgressIndicator(value: loadingPercentage / 100.0), ], ); } diff --git a/webview_flutter/step_06/pubspec.yaml b/webview_flutter/step_06/pubspec.yaml index e989e3ad0d..903226b47b 100644 --- a/webview_flutter/step_06/pubspec.yaml +++ b/webview_flutter/step_06/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/webview_flutter/step_07/android/.gitignore b/webview_flutter/step_07/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/webview_flutter/step_07/android/.gitignore +++ b/webview_flutter/step_07/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/webview_flutter/step_07/android/app/build.gradle b/webview_flutter/step_07/android/app/build.gradle deleted file mode 100644 index 9e345ad06f..0000000000 --- a/webview_flutter/step_07/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.webview_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.webview_in_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/webview_flutter/step_07/android/app/build.gradle.kts b/webview_flutter/step_07/android/app/build.gradle.kts new file mode 100644 index 0000000000..bab26ab815 --- /dev/null +++ b/webview_flutter/step_07/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.webview_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.webview_in_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/webview_flutter/step_07/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt b/webview_flutter/step_07/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt index c92fab4c95..77ec42b157 100644 --- a/webview_flutter/step_07/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt +++ b/webview_flutter/step_07/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.webview_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/webview_flutter/step_07/android/build.gradle b/webview_flutter/step_07/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/webview_flutter/step_07/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/webview_flutter/step_07/android/build.gradle.kts b/webview_flutter/step_07/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/webview_flutter/step_07/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/webview_flutter/step_07/android/gradle.properties b/webview_flutter/step_07/android/gradle.properties index 2597170821..f018a61817 100644 --- a/webview_flutter/step_07/android/gradle.properties +++ b/webview_flutter/step_07/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/webview_flutter/step_07/android/gradle/wrapper/gradle-wrapper.properties b/webview_flutter/step_07/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/webview_flutter/step_07/android/gradle/wrapper/gradle-wrapper.properties +++ b/webview_flutter/step_07/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/webview_flutter/step_07/android/settings.gradle b/webview_flutter/step_07/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/webview_flutter/step_07/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/webview_flutter/step_07/android/settings.gradle.kts b/webview_flutter/step_07/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/webview_flutter/step_07/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/webview_flutter/step_07/ios/Podfile b/webview_flutter/step_07/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/webview_flutter/step_07/ios/Podfile +++ b/webview_flutter/step_07/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/webview_flutter/step_07/ios/Runner.xcodeproj/project.pbxproj b/webview_flutter/step_07/ios/Runner.xcodeproj/project.pbxproj index 33a5c8648f..36b4ec4e3f 100644 --- a/webview_flutter/step_07/ios/Runner.xcodeproj/project.pbxproj +++ b/webview_flutter/step_07/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */; }; + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,18 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 8BD91403B27036C97AF986BC /* Frameworks */ = { + 3B66D334861BB935E0AA5B2A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */, + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */, + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - F63F2644D6A311A3CF56B07D /* Pods */, - F8F455E54E4A52608FD3C2DC /* Frameworks */, + CF4FD2BB36757D12859FA741 /* Pods */, + FA957D827CD1F0DB67A08E52 /* Frameworks */, ); sourceTree = ""; }; @@ -142,25 +142,25 @@ path = Runner; sourceTree = ""; }; - F63F2644D6A311A3CF56B07D /* Pods */ = { + CF4FD2BB36757D12859FA741 /* Pods */ = { isa = PBXGroup; children = ( - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */, - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */, - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */, - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */, - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */, - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */, + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */, + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */, + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */, + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */, + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */, + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; sourceTree = ""; }; - F8F455E54E4A52608FD3C2DC /* Frameworks */ = { + FA957D827CD1F0DB67A08E52 /* Frameworks */ = { isa = PBXGroup; children = ( - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */, - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */, + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */, + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */, + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 8BD91403B27036C97AF986BC /* Frameworks */, + 3B66D334861BB935E0AA5B2A /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */, + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */, + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */ = { + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */ = { + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/webview_flutter/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/webview_flutter/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/webview_flutter/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/webview_flutter/step_07/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/webview_flutter/step_07/lib/main.dart b/webview_flutter/step_07/lib/main.dart index 46d9f1518b..a699edb3f9 100644 --- a/webview_flutter/step_07/lib/main.dart +++ b/webview_flutter/step_07/lib/main.dart @@ -9,12 +9,7 @@ import 'src/navigation_controls.dart'; import 'src/web_view_stack.dart'; void main() { - runApp( - MaterialApp( - theme: ThemeData(), - home: const WebViewApp(), - ), - ); + runApp(MaterialApp(theme: ThemeData(), home: const WebViewApp())); } class WebViewApp extends StatefulWidget { @@ -30,10 +25,8 @@ class _WebViewAppState extends State { @override void initState() { super.initState(); - controller = WebViewController() - ..loadRequest( - Uri.parse('https://flutter.dev'), - ); + controller = + WebViewController()..loadRequest(Uri.parse('https://flutter.dev')); } @override @@ -41,9 +34,7 @@ class _WebViewAppState extends State { return Scaffold( appBar: AppBar( title: const Text('Flutter WebView'), - actions: [ - NavigationControls(controller: controller), - ], + actions: [NavigationControls(controller: controller)], ), body: WebViewStack(controller: controller), ); diff --git a/webview_flutter/step_07/lib/src/web_view_stack.dart b/webview_flutter/step_07/lib/src/web_view_stack.dart index af453976f0..438415539b 100644 --- a/webview_flutter/step_07/lib/src/web_view_stack.dart +++ b/webview_flutter/step_07/lib/src/web_view_stack.dart @@ -41,11 +41,7 @@ class _WebViewStackState extends State { final host = Uri.parse(navigation.url).host; if (host.contains('youtube.com')) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - 'Blocking navigation to $host', - ), - ), + SnackBar(content: Text('Blocking navigation to $host')), ); return NavigationDecision.prevent; } @@ -59,13 +55,9 @@ class _WebViewStackState extends State { Widget build(BuildContext context) { return Stack( children: [ - WebViewWidget( - controller: widget.controller, - ), + WebViewWidget(controller: widget.controller), if (loadingPercentage < 100) - LinearProgressIndicator( - value: loadingPercentage / 100.0, - ), + LinearProgressIndicator(value: loadingPercentage / 100.0), ], ); } diff --git a/webview_flutter/step_07/pubspec.yaml b/webview_flutter/step_07/pubspec.yaml index e989e3ad0d..903226b47b 100644 --- a/webview_flutter/step_07/pubspec.yaml +++ b/webview_flutter/step_07/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/webview_flutter/step_08/android/.gitignore b/webview_flutter/step_08/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/webview_flutter/step_08/android/.gitignore +++ b/webview_flutter/step_08/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/webview_flutter/step_08/android/app/build.gradle b/webview_flutter/step_08/android/app/build.gradle deleted file mode 100644 index 9e345ad06f..0000000000 --- a/webview_flutter/step_08/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.webview_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.webview_in_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/webview_flutter/step_08/android/app/build.gradle.kts b/webview_flutter/step_08/android/app/build.gradle.kts new file mode 100644 index 0000000000..bab26ab815 --- /dev/null +++ b/webview_flutter/step_08/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.webview_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.webview_in_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/webview_flutter/step_08/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt b/webview_flutter/step_08/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt index c92fab4c95..77ec42b157 100644 --- a/webview_flutter/step_08/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt +++ b/webview_flutter/step_08/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.webview_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/webview_flutter/step_08/android/build.gradle b/webview_flutter/step_08/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/webview_flutter/step_08/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/webview_flutter/step_08/android/build.gradle.kts b/webview_flutter/step_08/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/webview_flutter/step_08/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/webview_flutter/step_08/android/gradle.properties b/webview_flutter/step_08/android/gradle.properties index 2597170821..f018a61817 100644 --- a/webview_flutter/step_08/android/gradle.properties +++ b/webview_flutter/step_08/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/webview_flutter/step_08/android/gradle/wrapper/gradle-wrapper.properties b/webview_flutter/step_08/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/webview_flutter/step_08/android/gradle/wrapper/gradle-wrapper.properties +++ b/webview_flutter/step_08/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/webview_flutter/step_08/android/settings.gradle b/webview_flutter/step_08/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/webview_flutter/step_08/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/webview_flutter/step_08/android/settings.gradle.kts b/webview_flutter/step_08/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/webview_flutter/step_08/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/webview_flutter/step_08/ios/Podfile b/webview_flutter/step_08/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/webview_flutter/step_08/ios/Podfile +++ b/webview_flutter/step_08/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/webview_flutter/step_08/ios/Runner.xcodeproj/project.pbxproj b/webview_flutter/step_08/ios/Runner.xcodeproj/project.pbxproj index 33a5c8648f..36b4ec4e3f 100644 --- a/webview_flutter/step_08/ios/Runner.xcodeproj/project.pbxproj +++ b/webview_flutter/step_08/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */; }; + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,18 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 8BD91403B27036C97AF986BC /* Frameworks */ = { + 3B66D334861BB935E0AA5B2A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */, + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */, + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - F63F2644D6A311A3CF56B07D /* Pods */, - F8F455E54E4A52608FD3C2DC /* Frameworks */, + CF4FD2BB36757D12859FA741 /* Pods */, + FA957D827CD1F0DB67A08E52 /* Frameworks */, ); sourceTree = ""; }; @@ -142,25 +142,25 @@ path = Runner; sourceTree = ""; }; - F63F2644D6A311A3CF56B07D /* Pods */ = { + CF4FD2BB36757D12859FA741 /* Pods */ = { isa = PBXGroup; children = ( - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */, - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */, - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */, - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */, - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */, - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */, + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */, + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */, + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */, + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */, + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */, + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; sourceTree = ""; }; - F8F455E54E4A52608FD3C2DC /* Frameworks */ = { + FA957D827CD1F0DB67A08E52 /* Frameworks */ = { isa = PBXGroup; children = ( - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */, - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */, + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */, + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */, + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 8BD91403B27036C97AF986BC /* Frameworks */, + 3B66D334861BB935E0AA5B2A /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */, + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */, + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */ = { + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */ = { + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/webview_flutter/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/webview_flutter/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/webview_flutter/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/webview_flutter/step_08/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/webview_flutter/step_08/lib/main.dart b/webview_flutter/step_08/lib/main.dart index 408df99f92..0fea4617df 100644 --- a/webview_flutter/step_08/lib/main.dart +++ b/webview_flutter/step_08/lib/main.dart @@ -10,12 +10,7 @@ import 'src/navigation_controls.dart'; import 'src/web_view_stack.dart'; void main() { - runApp( - MaterialApp( - theme: ThemeData(), - home: const WebViewApp(), - ), - ); + runApp(MaterialApp(theme: ThemeData(), home: const WebViewApp())); } class WebViewApp extends StatefulWidget { @@ -31,10 +26,8 @@ class _WebViewAppState extends State { @override void initState() { super.initState(); - controller = WebViewController() - ..loadRequest( - Uri.parse('https://flutter.dev'), - ); + controller = + WebViewController()..loadRequest(Uri.parse('https://flutter.dev')); } @override diff --git a/webview_flutter/step_08/lib/src/menu.dart b/webview_flutter/step_08/lib/src/menu.dart index 0373d6fe65..08e90e9ace 100644 --- a/webview_flutter/step_08/lib/src/menu.dart +++ b/webview_flutter/step_08/lib/src/menu.dart @@ -5,9 +5,7 @@ import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; -enum _MenuOptions { - navigationDelegate, -} +enum _MenuOptions { navigationDelegate } class Menu extends StatelessWidget { const Menu({required this.controller, super.key}); @@ -23,12 +21,13 @@ class Menu extends StatelessWidget { await controller.loadRequest(Uri.parse('https://youtube.com')); } }, - itemBuilder: (context) => [ - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.navigationDelegate, - child: Text('Navigate to YouTube'), - ), - ], + itemBuilder: + (context) => [ + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.navigationDelegate, + child: Text('Navigate to YouTube'), + ), + ], ); } } diff --git a/webview_flutter/step_08/lib/src/web_view_stack.dart b/webview_flutter/step_08/lib/src/web_view_stack.dart index af453976f0..438415539b 100644 --- a/webview_flutter/step_08/lib/src/web_view_stack.dart +++ b/webview_flutter/step_08/lib/src/web_view_stack.dart @@ -41,11 +41,7 @@ class _WebViewStackState extends State { final host = Uri.parse(navigation.url).host; if (host.contains('youtube.com')) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - 'Blocking navigation to $host', - ), - ), + SnackBar(content: Text('Blocking navigation to $host')), ); return NavigationDecision.prevent; } @@ -59,13 +55,9 @@ class _WebViewStackState extends State { Widget build(BuildContext context) { return Stack( children: [ - WebViewWidget( - controller: widget.controller, - ), + WebViewWidget(controller: widget.controller), if (loadingPercentage < 100) - LinearProgressIndicator( - value: loadingPercentage / 100.0, - ), + LinearProgressIndicator(value: loadingPercentage / 100.0), ], ); } diff --git a/webview_flutter/step_08/pubspec.yaml b/webview_flutter/step_08/pubspec.yaml index e989e3ad0d..903226b47b 100644 --- a/webview_flutter/step_08/pubspec.yaml +++ b/webview_flutter/step_08/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/webview_flutter/step_09/android/.gitignore b/webview_flutter/step_09/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/webview_flutter/step_09/android/.gitignore +++ b/webview_flutter/step_09/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/webview_flutter/step_09/android/app/build.gradle b/webview_flutter/step_09/android/app/build.gradle deleted file mode 100644 index 9e345ad06f..0000000000 --- a/webview_flutter/step_09/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.webview_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.webview_in_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/webview_flutter/step_09/android/app/build.gradle.kts b/webview_flutter/step_09/android/app/build.gradle.kts new file mode 100644 index 0000000000..bab26ab815 --- /dev/null +++ b/webview_flutter/step_09/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.webview_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.webview_in_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/webview_flutter/step_09/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt b/webview_flutter/step_09/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt index c92fab4c95..77ec42b157 100644 --- a/webview_flutter/step_09/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt +++ b/webview_flutter/step_09/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.webview_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/webview_flutter/step_09/android/build.gradle b/webview_flutter/step_09/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/webview_flutter/step_09/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/webview_flutter/step_09/android/build.gradle.kts b/webview_flutter/step_09/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/webview_flutter/step_09/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/webview_flutter/step_09/android/gradle.properties b/webview_flutter/step_09/android/gradle.properties index 2597170821..f018a61817 100644 --- a/webview_flutter/step_09/android/gradle.properties +++ b/webview_flutter/step_09/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/webview_flutter/step_09/android/gradle/wrapper/gradle-wrapper.properties b/webview_flutter/step_09/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/webview_flutter/step_09/android/gradle/wrapper/gradle-wrapper.properties +++ b/webview_flutter/step_09/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/webview_flutter/step_09/android/settings.gradle b/webview_flutter/step_09/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/webview_flutter/step_09/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/webview_flutter/step_09/android/settings.gradle.kts b/webview_flutter/step_09/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/webview_flutter/step_09/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/webview_flutter/step_09/ios/Podfile b/webview_flutter/step_09/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/webview_flutter/step_09/ios/Podfile +++ b/webview_flutter/step_09/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/webview_flutter/step_09/ios/Runner.xcodeproj/project.pbxproj b/webview_flutter/step_09/ios/Runner.xcodeproj/project.pbxproj index 33a5c8648f..36b4ec4e3f 100644 --- a/webview_flutter/step_09/ios/Runner.xcodeproj/project.pbxproj +++ b/webview_flutter/step_09/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */; }; + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,18 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 8BD91403B27036C97AF986BC /* Frameworks */ = { + 3B66D334861BB935E0AA5B2A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */, + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */, + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - F63F2644D6A311A3CF56B07D /* Pods */, - F8F455E54E4A52608FD3C2DC /* Frameworks */, + CF4FD2BB36757D12859FA741 /* Pods */, + FA957D827CD1F0DB67A08E52 /* Frameworks */, ); sourceTree = ""; }; @@ -142,25 +142,25 @@ path = Runner; sourceTree = ""; }; - F63F2644D6A311A3CF56B07D /* Pods */ = { + CF4FD2BB36757D12859FA741 /* Pods */ = { isa = PBXGroup; children = ( - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */, - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */, - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */, - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */, - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */, - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */, + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */, + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */, + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */, + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */, + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */, + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; sourceTree = ""; }; - F8F455E54E4A52608FD3C2DC /* Frameworks */ = { + FA957D827CD1F0DB67A08E52 /* Frameworks */ = { isa = PBXGroup; children = ( - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */, - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */, + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */, + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */, + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 8BD91403B27036C97AF986BC /* Frameworks */, + 3B66D334861BB935E0AA5B2A /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */, + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */, + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */ = { + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */ = { + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/webview_flutter/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/webview_flutter/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/webview_flutter/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/webview_flutter/step_09/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/webview_flutter/step_09/lib/main.dart b/webview_flutter/step_09/lib/main.dart index 408df99f92..0fea4617df 100644 --- a/webview_flutter/step_09/lib/main.dart +++ b/webview_flutter/step_09/lib/main.dart @@ -10,12 +10,7 @@ import 'src/navigation_controls.dart'; import 'src/web_view_stack.dart'; void main() { - runApp( - MaterialApp( - theme: ThemeData(), - home: const WebViewApp(), - ), - ); + runApp(MaterialApp(theme: ThemeData(), home: const WebViewApp())); } class WebViewApp extends StatefulWidget { @@ -31,10 +26,8 @@ class _WebViewAppState extends State { @override void initState() { super.initState(); - controller = WebViewController() - ..loadRequest( - Uri.parse('https://flutter.dev'), - ); + controller = + WebViewController()..loadRequest(Uri.parse('https://flutter.dev')); } @override diff --git a/webview_flutter/step_09/lib/src/menu.dart b/webview_flutter/step_09/lib/src/menu.dart index e805721e51..676fd04601 100644 --- a/webview_flutter/step_09/lib/src/menu.dart +++ b/webview_flutter/step_09/lib/src/menu.dart @@ -5,10 +5,7 @@ import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; -enum _MenuOptions { - navigationDelegate, - userAgent, -} +enum _MenuOptions { navigationDelegate, userAgent } class Menu extends StatefulWidget { const Menu({required this.controller, super.key}); @@ -26,27 +23,29 @@ class _MenuState extends State { onSelected: (value) async { switch (value) { case _MenuOptions.navigationDelegate: - await widget.controller - .loadRequest(Uri.parse('https://youtube.com')); + await widget.controller.loadRequest( + Uri.parse('https://youtube.com'), + ); case _MenuOptions.userAgent: final userAgent = await widget.controller .runJavaScriptReturningResult('navigator.userAgent'); if (!context.mounted) return; - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text('$userAgent'), - )); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('$userAgent'))); } }, - itemBuilder: (context) => [ - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.navigationDelegate, - child: Text('Navigate to YouTube'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.userAgent, - child: Text('Show user-agent'), - ), - ], + itemBuilder: + (context) => [ + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.navigationDelegate, + child: Text('Navigate to YouTube'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.userAgent, + child: Text('Show user-agent'), + ), + ], ); } } diff --git a/webview_flutter/step_09/lib/src/web_view_stack.dart b/webview_flutter/step_09/lib/src/web_view_stack.dart index 107f626284..9c7556772a 100644 --- a/webview_flutter/step_09/lib/src/web_view_stack.dart +++ b/webview_flutter/step_09/lib/src/web_view_stack.dart @@ -42,11 +42,7 @@ class _WebViewStackState extends State { final host = Uri.parse(navigation.url).host; if (host.contains('youtube.com')) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - 'Blocking navigation to $host', - ), - ), + SnackBar(content: Text('Blocking navigation to $host')), ); return NavigationDecision.prevent; } @@ -61,13 +57,9 @@ class _WebViewStackState extends State { Widget build(BuildContext context) { return Stack( children: [ - WebViewWidget( - controller: widget.controller, - ), + WebViewWidget(controller: widget.controller), if (loadingPercentage < 100) - LinearProgressIndicator( - value: loadingPercentage / 100.0, - ), + LinearProgressIndicator(value: loadingPercentage / 100.0), ], ); } diff --git a/webview_flutter/step_09/pubspec.yaml b/webview_flutter/step_09/pubspec.yaml index e989e3ad0d..903226b47b 100644 --- a/webview_flutter/step_09/pubspec.yaml +++ b/webview_flutter/step_09/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/webview_flutter/step_10/android/.gitignore b/webview_flutter/step_10/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/webview_flutter/step_10/android/.gitignore +++ b/webview_flutter/step_10/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/webview_flutter/step_10/android/app/build.gradle b/webview_flutter/step_10/android/app/build.gradle deleted file mode 100644 index 9e345ad06f..0000000000 --- a/webview_flutter/step_10/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.webview_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.webview_in_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/webview_flutter/step_10/android/app/build.gradle.kts b/webview_flutter/step_10/android/app/build.gradle.kts new file mode 100644 index 0000000000..bab26ab815 --- /dev/null +++ b/webview_flutter/step_10/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.webview_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.webview_in_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/webview_flutter/step_10/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt b/webview_flutter/step_10/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt index c92fab4c95..77ec42b157 100644 --- a/webview_flutter/step_10/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt +++ b/webview_flutter/step_10/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.webview_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/webview_flutter/step_10/android/build.gradle b/webview_flutter/step_10/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/webview_flutter/step_10/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/webview_flutter/step_10/android/build.gradle.kts b/webview_flutter/step_10/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/webview_flutter/step_10/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/webview_flutter/step_10/android/gradle.properties b/webview_flutter/step_10/android/gradle.properties index 2597170821..f018a61817 100644 --- a/webview_flutter/step_10/android/gradle.properties +++ b/webview_flutter/step_10/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/webview_flutter/step_10/android/gradle/wrapper/gradle-wrapper.properties b/webview_flutter/step_10/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/webview_flutter/step_10/android/gradle/wrapper/gradle-wrapper.properties +++ b/webview_flutter/step_10/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/webview_flutter/step_10/android/settings.gradle b/webview_flutter/step_10/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/webview_flutter/step_10/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/webview_flutter/step_10/android/settings.gradle.kts b/webview_flutter/step_10/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/webview_flutter/step_10/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/webview_flutter/step_10/ios/Podfile b/webview_flutter/step_10/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/webview_flutter/step_10/ios/Podfile +++ b/webview_flutter/step_10/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/webview_flutter/step_10/ios/Runner.xcodeproj/project.pbxproj b/webview_flutter/step_10/ios/Runner.xcodeproj/project.pbxproj index 33a5c8648f..36b4ec4e3f 100644 --- a/webview_flutter/step_10/ios/Runner.xcodeproj/project.pbxproj +++ b/webview_flutter/step_10/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */; }; + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,18 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 8BD91403B27036C97AF986BC /* Frameworks */ = { + 3B66D334861BB935E0AA5B2A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */, + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */, + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - F63F2644D6A311A3CF56B07D /* Pods */, - F8F455E54E4A52608FD3C2DC /* Frameworks */, + CF4FD2BB36757D12859FA741 /* Pods */, + FA957D827CD1F0DB67A08E52 /* Frameworks */, ); sourceTree = ""; }; @@ -142,25 +142,25 @@ path = Runner; sourceTree = ""; }; - F63F2644D6A311A3CF56B07D /* Pods */ = { + CF4FD2BB36757D12859FA741 /* Pods */ = { isa = PBXGroup; children = ( - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */, - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */, - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */, - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */, - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */, - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */, + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */, + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */, + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */, + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */, + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */, + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; sourceTree = ""; }; - F8F455E54E4A52608FD3C2DC /* Frameworks */ = { + FA957D827CD1F0DB67A08E52 /* Frameworks */ = { isa = PBXGroup; children = ( - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */, - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */, + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */, + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */, + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 8BD91403B27036C97AF986BC /* Frameworks */, + 3B66D334861BB935E0AA5B2A /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */, + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */, + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */ = { + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */ = { + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/webview_flutter/step_10/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/webview_flutter/step_10/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/webview_flutter/step_10/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/webview_flutter/step_10/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/webview_flutter/step_10/lib/main.dart b/webview_flutter/step_10/lib/main.dart index 408df99f92..0fea4617df 100644 --- a/webview_flutter/step_10/lib/main.dart +++ b/webview_flutter/step_10/lib/main.dart @@ -10,12 +10,7 @@ import 'src/navigation_controls.dart'; import 'src/web_view_stack.dart'; void main() { - runApp( - MaterialApp( - theme: ThemeData(), - home: const WebViewApp(), - ), - ); + runApp(MaterialApp(theme: ThemeData(), home: const WebViewApp())); } class WebViewApp extends StatefulWidget { @@ -31,10 +26,8 @@ class _WebViewAppState extends State { @override void initState() { super.initState(); - controller = WebViewController() - ..loadRequest( - Uri.parse('https://flutter.dev'), - ); + controller = + WebViewController()..loadRequest(Uri.parse('https://flutter.dev')); } @override diff --git a/webview_flutter/step_10/lib/src/menu.dart b/webview_flutter/step_10/lib/src/menu.dart index 8fe93797ce..dbb41ed88d 100644 --- a/webview_flutter/step_10/lib/src/menu.dart +++ b/webview_flutter/step_10/lib/src/menu.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; -enum _MenuOptions { - navigationDelegate, - userAgent, - javascriptChannel, -} +enum _MenuOptions { navigationDelegate, userAgent, javascriptChannel } class Menu extends StatefulWidget { const Menu({required this.controller, super.key}); @@ -27,15 +23,16 @@ class _MenuState extends State { onSelected: (value) async { switch (value) { case _MenuOptions.navigationDelegate: - await widget.controller - .loadRequest(Uri.parse('https://youtube.com')); + await widget.controller.loadRequest( + Uri.parse('https://youtube.com'), + ); case _MenuOptions.userAgent: final userAgent = await widget.controller .runJavaScriptReturningResult('navigator.userAgent'); if (!context.mounted) return; - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text('$userAgent'), - )); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('$userAgent'))); case _MenuOptions.javascriptChannel: await widget.controller.runJavaScript(''' var req = new XMLHttpRequest(); @@ -51,20 +48,21 @@ req.onload = function() { req.send();'''); } }, - itemBuilder: (context) => [ - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.navigationDelegate, - child: Text('Navigate to YouTube'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.userAgent, - child: Text('Show user-agent'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.javascriptChannel, - child: Text('Lookup IP Address'), - ), - ], + itemBuilder: + (context) => [ + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.navigationDelegate, + child: Text('Navigate to YouTube'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.userAgent, + child: Text('Show user-agent'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.javascriptChannel, + child: Text('Lookup IP Address'), + ), + ], ); } } diff --git a/webview_flutter/step_10/lib/src/web_view_stack.dart b/webview_flutter/step_10/lib/src/web_view_stack.dart index dba36955e9..42a5508cc8 100644 --- a/webview_flutter/step_10/lib/src/web_view_stack.dart +++ b/webview_flutter/step_10/lib/src/web_view_stack.dart @@ -42,11 +42,7 @@ class _WebViewStackState extends State { final host = Uri.parse(navigation.url).host; if (host.contains('youtube.com')) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - 'Blocking navigation to $host', - ), - ), + SnackBar(content: Text('Blocking navigation to $host')), ); return NavigationDecision.prevent; } @@ -58,8 +54,9 @@ class _WebViewStackState extends State { ..addJavaScriptChannel( 'SnackBar', onMessageReceived: (message) { - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar(content: Text(message.message))); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(message.message))); }, ); } @@ -68,13 +65,9 @@ class _WebViewStackState extends State { Widget build(BuildContext context) { return Stack( children: [ - WebViewWidget( - controller: widget.controller, - ), + WebViewWidget(controller: widget.controller), if (loadingPercentage < 100) - LinearProgressIndicator( - value: loadingPercentage / 100.0, - ), + LinearProgressIndicator(value: loadingPercentage / 100.0), ], ); } diff --git a/webview_flutter/step_10/pubspec.yaml b/webview_flutter/step_10/pubspec.yaml index e989e3ad0d..903226b47b 100644 --- a/webview_flutter/step_10/pubspec.yaml +++ b/webview_flutter/step_10/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/webview_flutter/step_11/android/.gitignore b/webview_flutter/step_11/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/webview_flutter/step_11/android/.gitignore +++ b/webview_flutter/step_11/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/webview_flutter/step_11/android/app/build.gradle b/webview_flutter/step_11/android/app/build.gradle deleted file mode 100644 index 9e345ad06f..0000000000 --- a/webview_flutter/step_11/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.webview_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.webview_in_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/webview_flutter/step_11/android/app/build.gradle.kts b/webview_flutter/step_11/android/app/build.gradle.kts new file mode 100644 index 0000000000..bab26ab815 --- /dev/null +++ b/webview_flutter/step_11/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.webview_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.webview_in_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/webview_flutter/step_11/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt b/webview_flutter/step_11/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt index c92fab4c95..77ec42b157 100644 --- a/webview_flutter/step_11/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt +++ b/webview_flutter/step_11/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.webview_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/webview_flutter/step_11/android/build.gradle b/webview_flutter/step_11/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/webview_flutter/step_11/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/webview_flutter/step_11/android/build.gradle.kts b/webview_flutter/step_11/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/webview_flutter/step_11/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/webview_flutter/step_11/android/gradle.properties b/webview_flutter/step_11/android/gradle.properties index 2597170821..f018a61817 100644 --- a/webview_flutter/step_11/android/gradle.properties +++ b/webview_flutter/step_11/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/webview_flutter/step_11/android/gradle/wrapper/gradle-wrapper.properties b/webview_flutter/step_11/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/webview_flutter/step_11/android/gradle/wrapper/gradle-wrapper.properties +++ b/webview_flutter/step_11/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/webview_flutter/step_11/android/settings.gradle b/webview_flutter/step_11/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/webview_flutter/step_11/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/webview_flutter/step_11/android/settings.gradle.kts b/webview_flutter/step_11/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/webview_flutter/step_11/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/webview_flutter/step_11/ios/Podfile b/webview_flutter/step_11/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/webview_flutter/step_11/ios/Podfile +++ b/webview_flutter/step_11/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/webview_flutter/step_11/ios/Runner.xcodeproj/project.pbxproj b/webview_flutter/step_11/ios/Runner.xcodeproj/project.pbxproj index 33a5c8648f..36b4ec4e3f 100644 --- a/webview_flutter/step_11/ios/Runner.xcodeproj/project.pbxproj +++ b/webview_flutter/step_11/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */; }; + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,18 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 8BD91403B27036C97AF986BC /* Frameworks */ = { + 3B66D334861BB935E0AA5B2A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */, + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */, + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - F63F2644D6A311A3CF56B07D /* Pods */, - F8F455E54E4A52608FD3C2DC /* Frameworks */, + CF4FD2BB36757D12859FA741 /* Pods */, + FA957D827CD1F0DB67A08E52 /* Frameworks */, ); sourceTree = ""; }; @@ -142,25 +142,25 @@ path = Runner; sourceTree = ""; }; - F63F2644D6A311A3CF56B07D /* Pods */ = { + CF4FD2BB36757D12859FA741 /* Pods */ = { isa = PBXGroup; children = ( - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */, - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */, - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */, - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */, - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */, - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */, + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */, + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */, + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */, + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */, + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */, + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; sourceTree = ""; }; - F8F455E54E4A52608FD3C2DC /* Frameworks */ = { + FA957D827CD1F0DB67A08E52 /* Frameworks */ = { isa = PBXGroup; children = ( - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */, - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */, + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */, + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */, + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 8BD91403B27036C97AF986BC /* Frameworks */, + 3B66D334861BB935E0AA5B2A /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */, + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */, + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */ = { + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */ = { + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/webview_flutter/step_11/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/webview_flutter/step_11/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/webview_flutter/step_11/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/webview_flutter/step_11/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/webview_flutter/step_11/lib/main.dart b/webview_flutter/step_11/lib/main.dart index 408df99f92..0fea4617df 100644 --- a/webview_flutter/step_11/lib/main.dart +++ b/webview_flutter/step_11/lib/main.dart @@ -10,12 +10,7 @@ import 'src/navigation_controls.dart'; import 'src/web_view_stack.dart'; void main() { - runApp( - MaterialApp( - theme: ThemeData(), - home: const WebViewApp(), - ), - ); + runApp(MaterialApp(theme: ThemeData(), home: const WebViewApp())); } class WebViewApp extends StatefulWidget { @@ -31,10 +26,8 @@ class _WebViewAppState extends State { @override void initState() { super.initState(); - controller = WebViewController() - ..loadRequest( - Uri.parse('https://flutter.dev'), - ); + controller = + WebViewController()..loadRequest(Uri.parse('https://flutter.dev')); } @override diff --git a/webview_flutter/step_11/lib/src/menu.dart b/webview_flutter/step_11/lib/src/menu.dart index 238b96bf0d..83bfa0bd69 100644 --- a/webview_flutter/step_11/lib/src/menu.dart +++ b/webview_flutter/step_11/lib/src/menu.dart @@ -34,15 +34,16 @@ class _MenuState extends State { onSelected: (value) async { switch (value) { case _MenuOptions.navigationDelegate: - await widget.controller - .loadRequest(Uri.parse('https://youtube.com')); + await widget.controller.loadRequest( + Uri.parse('https://youtube.com'), + ); case _MenuOptions.userAgent: final userAgent = await widget.controller .runJavaScriptReturningResult('navigator.userAgent'); if (!context.mounted) return; - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text('$userAgent'), - )); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('$userAgent'))); case _MenuOptions.javascriptChannel: await widget.controller.runJavaScript(''' var req = new XMLHttpRequest(); @@ -68,46 +69,48 @@ req.send();'''); await _onRemoveCookie(widget.controller); } }, - itemBuilder: (context) => [ - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.navigationDelegate, - child: Text('Navigate to YouTube'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.userAgent, - child: Text('Show user-agent'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.javascriptChannel, - child: Text('Lookup IP Address'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.clearCookies, - child: Text('Clear cookies'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.listCookies, - child: Text('List cookies'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.addCookie, - child: Text('Add cookie'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.setCookie, - child: Text('Set cookie'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.removeCookie, - child: Text('Remove cookie'), - ), - ], + itemBuilder: + (context) => [ + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.navigationDelegate, + child: Text('Navigate to YouTube'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.userAgent, + child: Text('Show user-agent'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.javascriptChannel, + child: Text('Lookup IP Address'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.clearCookies, + child: Text('Clear cookies'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.listCookies, + child: Text('List cookies'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.addCookie, + child: Text('Add cookie'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.setCookie, + child: Text('Set cookie'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.removeCookie, + child: Text('Remove cookie'), + ), + ], ); } Future _onListCookies(WebViewController controller) async { - final String cookies = await controller - .runJavaScriptReturningResult('document.cookie') as String; + final String cookies = + await controller.runJavaScriptReturningResult('document.cookie') + as String; if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( @@ -123,11 +126,9 @@ req.send();'''); message = 'There were no cookies to clear.'; } if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(message), - ), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(message))); } Future _onAddCookie(WebViewController controller) async { @@ -135,11 +136,9 @@ req.send();'''); date.setTime(date.getTime()+(30*24*60*60*1000)); document.cookie = "FirstName=John; expires=" + date.toGMTString();'''); if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Custom cookie added.'), - ), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('Custom cookie added.'))); } Future _onSetCookie(WebViewController controller) async { @@ -147,21 +146,18 @@ req.send();'''); const WebViewCookie(name: 'foo', value: 'bar', domain: 'flutter.dev'), ); if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Custom cookie is set.'), - ), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('Custom cookie is set.'))); } Future _onRemoveCookie(WebViewController controller) async { await controller.runJavaScript( - 'document.cookie="FirstName=John; expires=Thu, 01 Jan 1970 00:00:00 UTC" '); - if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Custom cookie removed.'), - ), + 'document.cookie="FirstName=John; expires=Thu, 01 Jan 1970 00:00:00 UTC" ', ); + if (!mounted) return; + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('Custom cookie removed.'))); } } diff --git a/webview_flutter/step_11/lib/src/web_view_stack.dart b/webview_flutter/step_11/lib/src/web_view_stack.dart index dba36955e9..42a5508cc8 100644 --- a/webview_flutter/step_11/lib/src/web_view_stack.dart +++ b/webview_flutter/step_11/lib/src/web_view_stack.dart @@ -42,11 +42,7 @@ class _WebViewStackState extends State { final host = Uri.parse(navigation.url).host; if (host.contains('youtube.com')) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - 'Blocking navigation to $host', - ), - ), + SnackBar(content: Text('Blocking navigation to $host')), ); return NavigationDecision.prevent; } @@ -58,8 +54,9 @@ class _WebViewStackState extends State { ..addJavaScriptChannel( 'SnackBar', onMessageReceived: (message) { - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar(content: Text(message.message))); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(message.message))); }, ); } @@ -68,13 +65,9 @@ class _WebViewStackState extends State { Widget build(BuildContext context) { return Stack( children: [ - WebViewWidget( - controller: widget.controller, - ), + WebViewWidget(controller: widget.controller), if (loadingPercentage < 100) - LinearProgressIndicator( - value: loadingPercentage / 100.0, - ), + LinearProgressIndicator(value: loadingPercentage / 100.0), ], ); } diff --git a/webview_flutter/step_11/pubspec.yaml b/webview_flutter/step_11/pubspec.yaml index e989e3ad0d..903226b47b 100644 --- a/webview_flutter/step_11/pubspec.yaml +++ b/webview_flutter/step_11/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/webview_flutter/step_12/android/.gitignore b/webview_flutter/step_12/android/.gitignore index 55afd919c6..be3943c96d 100644 --- a/webview_flutter/step_12/android/.gitignore +++ b/webview_flutter/step_12/android/.gitignore @@ -5,6 +5,7 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +.cxx/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/webview_flutter/step_12/android/app/build.gradle b/webview_flutter/step_12/android/app/build.gradle deleted file mode 100644 index 9e345ad06f..0000000000 --- a/webview_flutter/step_12/android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -android { - namespace = "com.example.webview_in_flutter" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.webview_in_flutter" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 21 - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/webview_flutter/step_12/android/app/build.gradle.kts b/webview_flutter/step_12/android/app/build.gradle.kts new file mode 100644 index 0000000000..bab26ab815 --- /dev/null +++ b/webview_flutter/step_12/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.webview_in_flutter" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.webview_in_flutter" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 21 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/webview_flutter/step_12/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt b/webview_flutter/step_12/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt index c92fab4c95..77ec42b157 100644 --- a/webview_flutter/step_12/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt +++ b/webview_flutter/step_12/android/app/src/main/kotlin/com/example/webview_in_flutter/MainActivity.kt @@ -2,4 +2,4 @@ package com.example.webview_in_flutter import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/webview_flutter/step_12/android/build.gradle b/webview_flutter/step_12/android/build.gradle deleted file mode 100644 index d2ffbffa4c..0000000000 --- a/webview_flutter/step_12/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/webview_flutter/step_12/android/build.gradle.kts b/webview_flutter/step_12/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/webview_flutter/step_12/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/webview_flutter/step_12/android/gradle.properties b/webview_flutter/step_12/android/gradle.properties index 2597170821..f018a61817 100644 --- a/webview_flutter/step_12/android/gradle.properties +++ b/webview_flutter/step_12/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true diff --git a/webview_flutter/step_12/android/gradle/wrapper/gradle-wrapper.properties b/webview_flutter/step_12/android/gradle/wrapper/gradle-wrapper.properties index ac3b47926e..afa1e8eb0a 100644 --- a/webview_flutter/step_12/android/gradle/wrapper/gradle-wrapper.properties +++ b/webview_flutter/step_12/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/webview_flutter/step_12/android/settings.gradle b/webview_flutter/step_12/android/settings.gradle deleted file mode 100644 index 870557f404..0000000000 --- a/webview_flutter/step_12/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.7.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false -} - -include ":app" diff --git a/webview_flutter/step_12/android/settings.gradle.kts b/webview_flutter/step_12/android/settings.gradle.kts new file mode 100644 index 0000000000..a439442c20 --- /dev/null +++ b/webview_flutter/step_12/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") diff --git a/webview_flutter/step_12/ios/Podfile b/webview_flutter/step_12/ios/Podfile index d97f17e223..e549ee22f3 100644 --- a/webview_flutter/step_12/ios/Podfile +++ b/webview_flutter/step_12/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do diff --git a/webview_flutter/step_12/ios/Runner.xcodeproj/project.pbxproj b/webview_flutter/step_12/ios/Runner.xcodeproj/project.pbxproj index 33a5c8648f..36b4ec4e3f 100644 --- a/webview_flutter/step_12/ios/Runner.xcodeproj/project.pbxproj +++ b/webview_flutter/step_12/ios/Runner.xcodeproj/project.pbxproj @@ -8,14 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */; }; + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,15 +44,18 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -60,19 +63,16 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 8BD91403B27036C97AF986BC /* Frameworks */ = { + 3B66D334861BB935E0AA5B2A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 31479052545DDD179EFE8A5C /* Pods_RunnerTests.framework in Frameworks */, + B40C265E5831FBD23B3F364C /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B96F1001A70DA20C32E6A305 /* Pods_Runner.framework in Frameworks */, + 611DFC8F1B1C8B9105613AB0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,8 +113,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - F63F2644D6A311A3CF56B07D /* Pods */, - F8F455E54E4A52608FD3C2DC /* Frameworks */, + CF4FD2BB36757D12859FA741 /* Pods */, + FA957D827CD1F0DB67A08E52 /* Frameworks */, ); sourceTree = ""; }; @@ -142,25 +142,25 @@ path = Runner; sourceTree = ""; }; - F63F2644D6A311A3CF56B07D /* Pods */ = { + CF4FD2BB36757D12859FA741 /* Pods */ = { isa = PBXGroup; children = ( - D16B9600360FB15D60BA641C /* Pods-Runner.debug.xcconfig */, - 3C169D78D079BC79EDFEB1AE /* Pods-Runner.release.xcconfig */, - F438268D67C152642F56B8FB /* Pods-Runner.profile.xcconfig */, - F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */, - 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */, - B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */, + 7981457B89C1AC94EA7CA93C /* Pods-Runner.debug.xcconfig */, + 54404A547415BEDCF72F307F /* Pods-Runner.release.xcconfig */, + 7A828CFD13BDC64556446F4A /* Pods-Runner.profile.xcconfig */, + F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */, + 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */, + 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; sourceTree = ""; }; - F8F455E54E4A52608FD3C2DC /* Frameworks */ = { + FA957D827CD1F0DB67A08E52 /* Frameworks */ = { isa = PBXGroup; children = ( - 53EDFFA97E9E71E95EFA31A8 /* Pods_Runner.framework */, - C35F2F224DC440079D8363A5 /* Pods_RunnerTests.framework */, + B0FB4B730765CE8DBDBFC066 /* Pods_Runner.framework */, + 8525846C34591CB6EE95E83C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -172,10 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */, + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 8BD91403B27036C97AF986BC /* Frameworks */, + 3B66D334861BB935E0AA5B2A /* Frameworks */, ); buildRules = ( ); @@ -191,14 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */, + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */, + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,7 +270,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 110959E97EFDA1D5F2A167AD /* [CP] Check Pods Manifest.lock */ = { + 2D43C2E242E6C3150E603174 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -308,58 +308,58 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 8278F8317FD1F9C93AF5F553 /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( ); + name = "Run Script"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 9A11FF5941C2C45A8CD70B57 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - E82F46FDCE8E89F20F0A61D7 /* [CP] Embed Pods Frameworks */ = { + D6E8DF81E74F65CD1959167A /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -487,7 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F570A838560C9AFEB7AE149D /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F29F9A8C993CCCFD5E2C7D1B /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -505,7 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B69F6FC9D7B9F08AE1751AE /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 5F36D4A55FE42A73C1099C1A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -521,7 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B102F36EAABE6AACC4603FC7 /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 6D2C4B0FF3775AEEFCC32BA4 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/webview_flutter/step_12/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/webview_flutter/step_12/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5dfe1..15cada4838 100644 --- a/webview_flutter/step_12/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/webview_flutter/step_12/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/webview_flutter/step_12/lib/main.dart b/webview_flutter/step_12/lib/main.dart index 408df99f92..0fea4617df 100644 --- a/webview_flutter/step_12/lib/main.dart +++ b/webview_flutter/step_12/lib/main.dart @@ -10,12 +10,7 @@ import 'src/navigation_controls.dart'; import 'src/web_view_stack.dart'; void main() { - runApp( - MaterialApp( - theme: ThemeData(), - home: const WebViewApp(), - ), - ); + runApp(MaterialApp(theme: ThemeData(), home: const WebViewApp())); } class WebViewApp extends StatefulWidget { @@ -31,10 +26,8 @@ class _WebViewAppState extends State { @override void initState() { super.initState(); - controller = WebViewController() - ..loadRequest( - Uri.parse('https://flutter.dev'), - ); + controller = + WebViewController()..loadRequest(Uri.parse('https://flutter.dev')); } @override diff --git a/webview_flutter/step_12/lib/src/menu.dart b/webview_flutter/step_12/lib/src/menu.dart index f3d076f4a5..7023f07681 100644 --- a/webview_flutter/step_12/lib/src/menu.dart +++ b/webview_flutter/step_12/lib/src/menu.dart @@ -58,15 +58,16 @@ class _MenuState extends State { onSelected: (value) async { switch (value) { case _MenuOptions.navigationDelegate: - await widget.controller - .loadRequest(Uri.parse('https://youtube.com')); + await widget.controller.loadRequest( + Uri.parse('https://youtube.com'), + ); case _MenuOptions.userAgent: final userAgent = await widget.controller .runJavaScriptReturningResult('navigator.userAgent'); if (!context.mounted) return; - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text('$userAgent'), - )); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('$userAgent'))); case _MenuOptions.javascriptChannel: await widget.controller.runJavaScript(''' var req = new XMLHttpRequest(); @@ -101,58 +102,60 @@ req.send();'''); await _onLoadHtmlStringExample(widget.controller, context); } }, - itemBuilder: (context) => [ - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.navigationDelegate, - child: Text('Navigate to YouTube'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.userAgent, - child: Text('Show user-agent'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.javascriptChannel, - child: Text('Lookup IP Address'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.clearCookies, - child: Text('Clear cookies'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.listCookies, - child: Text('List cookies'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.addCookie, - child: Text('Add cookie'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.setCookie, - child: Text('Set cookie'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.removeCookie, - child: Text('Remove cookie'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.loadFlutterAsset, - child: Text('Load Flutter Asset'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.loadHtmlString, - child: Text('Load HTML string'), - ), - const PopupMenuItem<_MenuOptions>( - value: _MenuOptions.loadLocalFile, - child: Text('Load local file'), - ), - ], + itemBuilder: + (context) => [ + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.navigationDelegate, + child: Text('Navigate to YouTube'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.userAgent, + child: Text('Show user-agent'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.javascriptChannel, + child: Text('Lookup IP Address'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.clearCookies, + child: Text('Clear cookies'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.listCookies, + child: Text('List cookies'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.addCookie, + child: Text('Add cookie'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.setCookie, + child: Text('Set cookie'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.removeCookie, + child: Text('Remove cookie'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.loadFlutterAsset, + child: Text('Load Flutter Asset'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.loadHtmlString, + child: Text('Load HTML string'), + ), + const PopupMenuItem<_MenuOptions>( + value: _MenuOptions.loadLocalFile, + child: Text('Load local file'), + ), + ], ); } Future _onListCookies(WebViewController controller) async { - final String cookies = await controller - .runJavaScriptReturningResult('document.cookie') as String; + final String cookies = + await controller.runJavaScriptReturningResult('document.cookie') + as String; if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( @@ -168,11 +171,9 @@ req.send();'''); message = 'There were no cookies to clear.'; } if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(message), - ), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(message))); } Future _onAddCookie(WebViewController controller) async { @@ -180,11 +181,9 @@ req.send();'''); date.setTime(date.getTime()+(30*24*60*60*1000)); document.cookie = "FirstName=John; expires=" + date.toGMTString();'''); if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Custom cookie added.'), - ), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('Custom cookie added.'))); } Future _onSetCookie(WebViewController controller) async { @@ -192,31 +191,32 @@ req.send();'''); const WebViewCookie(name: 'foo', value: 'bar', domain: 'flutter.dev'), ); if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Custom cookie is set.'), - ), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('Custom cookie is set.'))); } Future _onRemoveCookie(WebViewController controller) async { await controller.runJavaScript( - 'document.cookie="FirstName=John; expires=Thu, 01 Jan 1970 00:00:00 UTC" '); - if (!mounted) return; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Custom cookie removed.'), - ), + 'document.cookie="FirstName=John; expires=Thu, 01 Jan 1970 00:00:00 UTC" ', ); + if (!mounted) return; + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('Custom cookie removed.'))); } Future _onLoadFlutterAssetExample( - WebViewController controller, BuildContext context) async { + WebViewController controller, + BuildContext context, + ) async { await controller.loadFlutterAsset('assets/www/index.html'); } Future _onLoadLocalFileExample( - WebViewController controller, BuildContext context) async { + WebViewController controller, + BuildContext context, + ) async { final String pathToIndex = await _prepareLocalFile(); await controller.loadFile(pathToIndex); @@ -233,7 +233,9 @@ req.send();'''); } Future _onLoadHtmlStringExample( - WebViewController controller, BuildContext context) async { + WebViewController controller, + BuildContext context, + ) async { await controller.loadHtmlString(kExamplePage); } } diff --git a/webview_flutter/step_12/lib/src/web_view_stack.dart b/webview_flutter/step_12/lib/src/web_view_stack.dart index dba36955e9..42a5508cc8 100644 --- a/webview_flutter/step_12/lib/src/web_view_stack.dart +++ b/webview_flutter/step_12/lib/src/web_view_stack.dart @@ -42,11 +42,7 @@ class _WebViewStackState extends State { final host = Uri.parse(navigation.url).host; if (host.contains('youtube.com')) { ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - 'Blocking navigation to $host', - ), - ), + SnackBar(content: Text('Blocking navigation to $host')), ); return NavigationDecision.prevent; } @@ -58,8 +54,9 @@ class _WebViewStackState extends State { ..addJavaScriptChannel( 'SnackBar', onMessageReceived: (message) { - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar(content: Text(message.message))); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(message.message))); }, ); } @@ -68,13 +65,9 @@ class _WebViewStackState extends State { Widget build(BuildContext context) { return Stack( children: [ - WebViewWidget( - controller: widget.controller, - ), + WebViewWidget(controller: widget.controller), if (loadingPercentage < 100) - LinearProgressIndicator( - value: loadingPercentage / 100.0, - ), + LinearProgressIndicator(value: loadingPercentage / 100.0), ], ); } diff --git a/webview_flutter/step_12/pubspec.yaml b/webview_flutter/step_12/pubspec.yaml index 56f3497def..963a9bd892 100644 --- a/webview_flutter/step_12/pubspec.yaml +++ b/webview_flutter/step_12/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.2 + sdk: ^3.7.0-0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions